xref: /spdk/test/unit/lib/iscsi/tgt_node.c/tgt_node_ut.c (revision 8afdeef3becfe9409cc9e7372bd0bc10e8b7d46d)
1  /*   SPDX-License-Identifier: BSD-3-Clause
2   *   Copyright (C) 2016 Intel Corporation.
3   *   All rights reserved.
4   */
5  
6  #include "spdk/stdinc.h"
7  
8  #include "spdk/scsi.h"
9  
10  #include "CUnit/Basic.h"
11  #include "spdk_internal/mock.h"
12  
13  #include "../common.c"
14  #include "iscsi/tgt_node.c"
15  #include "scsi/scsi_internal.h"
16  #include "unit/lib/json_mock.c"
17  #include "common/lib/test_env.c"
18  
19  struct spdk_iscsi_globals g_iscsi;
20  
21  DEFINE_STUB(spdk_scsi_dev_get_id,
22  	    int,
23  	    (const struct spdk_scsi_dev *dev),
24  	    0);
25  
26  DEFINE_STUB(spdk_scsi_lun_get_bdev_name,
27  	    const char *,
28  	    (const struct spdk_scsi_lun *lun),
29  	    NULL);
30  
31  DEFINE_STUB(spdk_scsi_lun_get_id,
32  	    int,
33  	    (const struct spdk_scsi_lun *lun),
34  	    0);
35  
36  DEFINE_STUB(spdk_sock_is_ipv6, bool, (struct spdk_sock *sock), false);
37  
38  DEFINE_STUB(spdk_sock_is_ipv4, bool, (struct spdk_sock *sock), false);
39  
40  DEFINE_STUB(iscsi_portal_grp_find_by_tag,
41  	    struct spdk_iscsi_portal_grp *, (int tag), NULL);
42  
43  DEFINE_STUB(iscsi_init_grp_find_by_tag, struct spdk_iscsi_init_grp *,
44  	    (int tag), NULL);
45  
46  DEFINE_STUB_V(iscsi_op_abort_task_set,
47  	      (struct spdk_iscsi_task *task, uint8_t function));
48  
49  DEFINE_STUB(iscsi_parse_redirect_addr,
50  	    int,
51  	    (struct sockaddr_storage *sa, const char *host, const char *port),
52  	    0);
53  
54  DEFINE_STUB(iscsi_portal_grp_find_portal_by_addr,
55  	    struct spdk_iscsi_portal *,
56  	    (struct spdk_iscsi_portal_grp *pg, const char *host, const char *port),
57  	    NULL);
58  
59  struct spdk_scsi_lun *
60  spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id)
61  {
62  	struct spdk_scsi_lun *lun;
63  
64  	TAILQ_FOREACH(lun, &dev->luns, tailq) {
65  		if (lun->id == lun_id) {
66  			break;
67  		}
68  	}
69  
70  	return lun;
71  }
72  
73  int
74  spdk_scsi_dev_add_lun(struct spdk_scsi_dev *dev, const char *bdev_name, int lun_id,
75  		      void (*hotremove_cb)(const struct spdk_scsi_lun *, void *),
76  		      void *hotremove_ctx)
77  {
78  	if (bdev_name == NULL) {
79  		return -1;
80  	} else {
81  		return 0;
82  	}
83  }
84  
85  DEFINE_STUB(spdk_scsi_dev_get_first_lun,
86  	    struct spdk_scsi_lun *,
87  	    (struct spdk_scsi_dev *dev),
88  	    NULL);
89  
90  DEFINE_STUB(spdk_scsi_dev_get_next_lun,
91  	    struct spdk_scsi_lun *,
92  	    (struct spdk_scsi_lun *prev_lun),
93  	    NULL);
94  
95  static void
96  add_lun_test_cases(void)
97  {
98  	struct spdk_iscsi_tgt_node tgtnode = {};
99  	int lun_id = 0;
100  	char *bdev_name = NULL;
101  	struct spdk_scsi_dev scsi_dev = {};
102  	int rc;
103  
104  	/* case 1 */
105  	tgtnode.num_active_conns = 1;
106  
107  	rc = iscsi_tgt_node_add_lun(&tgtnode, bdev_name, lun_id);
108  	CU_ASSERT(rc != 0);
109  
110  	/* case 2 */
111  	tgtnode.num_active_conns = 0;
112  	lun_id = -2;
113  
114  	rc = iscsi_tgt_node_add_lun(&tgtnode, bdev_name, lun_id);
115  	CU_ASSERT(rc != 0);
116  
117  	/* case 3 */
118  	lun_id = SPDK_SCSI_DEV_MAX_LUN;
119  
120  	rc = iscsi_tgt_node_add_lun(&tgtnode, bdev_name, lun_id);
121  	CU_ASSERT(rc != 0);
122  
123  	/* case 4 */
124  	lun_id = -1;
125  	tgtnode.dev = NULL;
126  
127  	rc = iscsi_tgt_node_add_lun(&tgtnode, bdev_name, lun_id);
128  	CU_ASSERT(rc != 0);
129  
130  	/* case 5 */
131  	tgtnode.dev = &scsi_dev;
132  
133  	rc = iscsi_tgt_node_add_lun(&tgtnode, bdev_name, lun_id);
134  	CU_ASSERT(rc != 0);
135  
136  	/* case 6 */
137  	bdev_name = "LUN0";
138  
139  	rc = iscsi_tgt_node_add_lun(&tgtnode, bdev_name, lun_id);
140  	CU_ASSERT(rc == 0);
141  }
142  
143  static void
144  allow_any_allowed(void)
145  {
146  	bool result;
147  	char *netmask;
148  	char *addr1, *addr2;
149  
150  	netmask = "ANY";
151  	addr1 = "2001:ad6:1234:5678:9abc::";
152  	addr2 = "192.168.2.1";
153  
154  	result = iscsi_netmask_allow_addr(netmask, addr1);
155  	CU_ASSERT(result == true);
156  
157  	result = iscsi_netmask_allow_addr(netmask, addr2);
158  	CU_ASSERT(result == true);
159  }
160  
161  static void
162  allow_ipv6_allowed(void)
163  {
164  	bool result;
165  	char *netmask;
166  	char *addr;
167  
168  	netmask = "[2001:ad6:1234::]/48";
169  	addr = "2001:ad6:1234:5678:9abc::";
170  
171  	result = iscsi_ipv6_netmask_allow_addr(netmask, addr);
172  	CU_ASSERT(result == true);
173  
174  	result = iscsi_netmask_allow_addr(netmask, addr);
175  	CU_ASSERT(result == true);
176  
177  	/* Netmask prefix bits == 128 (all bits must match) */
178  	netmask = "[2001:ad6:1234:5678:9abc::1]/128";
179  	addr = "2001:ad6:1234:5678:9abc::1";
180  	result = iscsi_ipv6_netmask_allow_addr(netmask, addr);
181  	CU_ASSERT(result == true);
182  }
183  
184  static void
185  allow_ipv6_denied(void)
186  {
187  	bool result;
188  	char *netmask;
189  	char *addr;
190  
191  	netmask = "[2001:ad6:1234::]/56";
192  	addr = "2001:ad6:1234:5678:9abc::";
193  
194  	result = iscsi_ipv6_netmask_allow_addr(netmask, addr);
195  	CU_ASSERT(result == false);
196  
197  	result = iscsi_netmask_allow_addr(netmask, addr);
198  	CU_ASSERT(result == false);
199  
200  	/* Netmask prefix bits == 128 (all bits must match) */
201  	netmask = "[2001:ad6:1234:5678:9abc::1]/128";
202  	addr = "2001:ad6:1234:5678:9abc::2";
203  	result = iscsi_ipv6_netmask_allow_addr(netmask, addr);
204  	CU_ASSERT(result == false);
205  }
206  
207  static void
208  allow_ipv6_invalid(void)
209  {
210  	bool result;
211  	char *netmask;
212  	char *addr;
213  
214  	/* Netmask prefix bits > 128 */
215  	netmask = "[2001:ad6:1234::]/129";
216  	addr = "2001:ad6:1234:5678:9abc::";
217  	result = iscsi_ipv6_netmask_allow_addr(netmask, addr);
218  	CU_ASSERT(result == false);
219  
220  	/* Netmask prefix bits == 0 */
221  	netmask = "[2001:ad6:1234::]/0";
222  	addr = "2001:ad6:1234:5678:9abc::";
223  	result = iscsi_ipv6_netmask_allow_addr(netmask, addr);
224  	CU_ASSERT(result == false);
225  
226  	/* Netmask prefix bits < 0 */
227  	netmask = "[2001:ad6:1234::]/-1";
228  	addr = "2001:ad6:1234:5678:9abc::";
229  	result = iscsi_ipv6_netmask_allow_addr(netmask, addr);
230  	CU_ASSERT(result == false);
231  }
232  
233  static void
234  allow_ipv4_allowed(void)
235  {
236  	bool result;
237  	char *netmask;
238  	char *addr;
239  
240  	netmask = "192.168.2.0/24";
241  	addr = "192.168.2.1";
242  
243  	result = iscsi_ipv4_netmask_allow_addr(netmask, addr);
244  	CU_ASSERT(result == true);
245  
246  	result = iscsi_netmask_allow_addr(netmask, addr);
247  	CU_ASSERT(result == true);
248  
249  	/* Netmask prefix == 32 (all bits must match) */
250  	netmask = "192.168.2.1/32";
251  	addr = "192.168.2.1";
252  	result = iscsi_ipv4_netmask_allow_addr(netmask, addr);
253  	CU_ASSERT(result == true);
254  }
255  
256  static void
257  allow_ipv4_denied(void)
258  {
259  	bool result;
260  	char *netmask;
261  	char *addr;
262  
263  	netmask = "192.168.2.0";
264  	addr  = "192.168.2.1";
265  
266  	result = iscsi_ipv4_netmask_allow_addr(netmask, addr);
267  	CU_ASSERT(result == false);
268  
269  	result = iscsi_netmask_allow_addr(netmask, addr);
270  	CU_ASSERT(result == false);
271  
272  	/* Netmask prefix == 32 (all bits must match) */
273  	netmask = "192.168.2.1/32";
274  	addr = "192.168.2.2";
275  	result = iscsi_ipv4_netmask_allow_addr(netmask, addr);
276  	CU_ASSERT(result == false);
277  }
278  
279  static void
280  allow_ipv4_invalid(void)
281  {
282  	bool result;
283  	char *netmask;
284  	char *addr;
285  
286  	/* Netmask prefix bits > 32 */
287  	netmask = "192.168.2.0/33";
288  	addr = "192.168.2.1";
289  	result = iscsi_ipv4_netmask_allow_addr(netmask, addr);
290  	CU_ASSERT(result == false);
291  
292  	/* Netmask prefix bits == 0 */
293  	netmask = "192.168.2.0/0";
294  	addr = "192.168.2.1";
295  	result = iscsi_ipv4_netmask_allow_addr(netmask, addr);
296  	CU_ASSERT(result == false);
297  
298  	/* Netmask prefix bits < 0 */
299  	netmask = "192.168.2.0/-1";
300  	addr = "192.168.2.1";
301  	result = iscsi_ipv4_netmask_allow_addr(netmask, addr);
302  	CU_ASSERT(result == false);
303  }
304  
305  static void
306  node_access_allowed(void)
307  {
308  	struct spdk_iscsi_tgt_node tgtnode = {};
309  	struct spdk_iscsi_portal_grp pg = {};
310  	struct spdk_iscsi_init_grp ig = {};
311  	struct spdk_iscsi_conn conn = {};
312  	struct spdk_iscsi_portal portal = {};
313  	struct spdk_iscsi_initiator_name iname = {};
314  	struct spdk_iscsi_initiator_netmask imask = {};
315  	struct spdk_scsi_dev scsi_dev = {};
316  	struct spdk_iscsi_pg_map *pg_map;
317  	char *iqn, *addr;
318  	bool result;
319  
320  	/* portal group initialization */
321  	pg.tag = 1;
322  
323  	/* initiator group initialization */
324  	ig.tag = 1;
325  
326  	ig.ninitiators = 1;
327  	snprintf(iname.name, sizeof(iname.name), "iqn.2017-10.spdk.io:0001");
328  	TAILQ_INIT(&ig.initiator_head);
329  	TAILQ_INSERT_TAIL(&ig.initiator_head, &iname, tailq);
330  
331  	ig.nnetmasks = 1;
332  	snprintf(imask.mask, sizeof(imask.mask), "192.168.2.0/24");
333  	TAILQ_INIT(&ig.netmask_head);
334  	TAILQ_INSERT_TAIL(&ig.netmask_head, &imask, tailq);
335  
336  	/* target initialization */
337  	snprintf(tgtnode.name, sizeof(tgtnode.name), "iqn.2017-10.spdk.io:0001");
338  	TAILQ_INIT(&tgtnode.pg_map_head);
339  
340  	snprintf(scsi_dev.name, sizeof(scsi_dev.name), "iqn.2017-10.spdk.io:0001");
341  	tgtnode.dev = &scsi_dev;
342  
343  	pg_map = iscsi_tgt_node_add_pg_map(&tgtnode, &pg);
344  	iscsi_pg_map_add_ig_map(pg_map, &ig);
345  
346  	/* portal initialization */
347  	portal.group = &pg;
348  	snprintf(portal.host, sizeof(portal.host), "192.168.2.0");
349  	snprintf(portal.port, sizeof(portal.port), "3260");
350  
351  	/* input for UT */
352  	conn.portal = &portal;
353  
354  	iqn = "iqn.2017-10.spdk.io:0001";
355  	addr = "192.168.2.1";
356  
357  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
358  	CU_ASSERT(result == true);
359  
360  	iscsi_pg_map_delete_ig_map(pg_map, &ig);
361  	iscsi_tgt_node_delete_pg_map(&tgtnode, &pg);
362  }
363  
364  static void
365  node_access_denied_by_empty_netmask(void)
366  {
367  	struct spdk_iscsi_tgt_node tgtnode = {};
368  	struct spdk_iscsi_portal_grp pg = {};
369  	struct spdk_iscsi_init_grp ig = {};
370  	struct spdk_iscsi_conn conn = {};
371  	struct spdk_iscsi_portal portal = {};
372  	struct spdk_iscsi_initiator_name iname = {};
373  	struct spdk_scsi_dev scsi_dev = {};
374  	struct spdk_iscsi_pg_map *pg_map;
375  	char *iqn, *addr;
376  	bool result;
377  
378  	/* portal group initialization */
379  	pg.tag = 1;
380  
381  	/* initiator group initialization */
382  	ig.tag = 1;
383  
384  	ig.ninitiators = 1;
385  	snprintf(iname.name, sizeof(iname.name), "iqn.2017-10.spdk.io:0001");
386  	TAILQ_INIT(&ig.initiator_head);
387  	TAILQ_INSERT_TAIL(&ig.initiator_head, &iname, tailq);
388  
389  	ig.nnetmasks = 0;
390  	TAILQ_INIT(&ig.netmask_head);
391  
392  	/* target initialization */
393  	snprintf(tgtnode.name, sizeof(tgtnode.name), "iqn.2017-10.spdk.io:0001");
394  	TAILQ_INIT(&tgtnode.pg_map_head);
395  
396  	snprintf(scsi_dev.name, sizeof(scsi_dev.name), "iqn.2017-10.spdk.io:0001");
397  	tgtnode.dev = &scsi_dev;
398  
399  	pg_map = iscsi_tgt_node_add_pg_map(&tgtnode, &pg);
400  	iscsi_pg_map_add_ig_map(pg_map, &ig);
401  
402  	/* portal initialization */
403  	portal.group = &pg;
404  	snprintf(portal.host, sizeof(portal.host), "192.168.2.0");
405  	snprintf(portal.port, sizeof(portal.port), "3260");
406  
407  	/* input for UT */
408  	conn.portal = &portal;
409  
410  	iqn = "iqn.2017-10.spdk.io:0001";
411  	addr = "192.168.3.1";
412  
413  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
414  	CU_ASSERT(result == false);
415  
416  	iscsi_pg_map_delete_ig_map(pg_map, &ig);
417  	iscsi_tgt_node_delete_pg_map(&tgtnode, &pg);
418  }
419  
420  #define IQN1	"iqn.2017-11.spdk.io:0001"
421  #define NO_IQN1	"!iqn.2017-11.spdk.io:0001"
422  #define IQN2	"iqn.2017-11.spdk.io:0002"
423  #define IP1	"192.168.2.0"
424  #define	IP2	"192.168.2.1"
425  
426  static void
427  node_access_multi_initiator_groups_cases(void)
428  {
429  	struct spdk_iscsi_tgt_node tgtnode = {};
430  	struct spdk_iscsi_conn conn = {};
431  	struct spdk_iscsi_portal_grp pg = {};
432  	struct spdk_iscsi_portal portal = {};
433  	struct spdk_iscsi_init_grp ig1 = {}, ig2 = {};
434  	struct spdk_iscsi_initiator_name iname1 = {}, iname2 = {};
435  	struct spdk_iscsi_initiator_netmask imask1 = {}, imask2 = {};
436  	struct spdk_scsi_dev scsi_dev = {};
437  	struct spdk_iscsi_pg_map *pg_map;
438  	char *iqn, *addr;
439  	bool result;
440  
441  	/* target initialization */
442  	snprintf(tgtnode.name, sizeof(tgtnode.name), IQN1);
443  	TAILQ_INIT(&tgtnode.pg_map_head);
444  
445  	snprintf(scsi_dev.name, sizeof(scsi_dev.name), IQN1);
446  	tgtnode.dev = &scsi_dev;
447  
448  	/* initiator group initialization */
449  	ig1.tag = 1;
450  	TAILQ_INIT(&ig1.initiator_head);
451  	TAILQ_INIT(&ig1.netmask_head);
452  
453  	ig1.ninitiators = 1;
454  	TAILQ_INSERT_TAIL(&ig1.initiator_head, &iname1, tailq);
455  
456  	ig1.nnetmasks = 1;
457  	TAILQ_INSERT_TAIL(&ig1.netmask_head, &imask1, tailq);
458  
459  	ig2.tag = 2;
460  	TAILQ_INIT(&ig2.initiator_head);
461  	TAILQ_INIT(&ig2.netmask_head);
462  
463  	ig2.ninitiators = 1;
464  	TAILQ_INSERT_TAIL(&ig2.initiator_head, &iname2, tailq);
465  
466  	ig2.nnetmasks = 1;
467  	TAILQ_INSERT_TAIL(&ig2.netmask_head, &imask2, tailq);
468  
469  	/* portal group initialization */
470  	pg.tag = 1;
471  
472  	pg_map = iscsi_tgt_node_add_pg_map(&tgtnode, &pg);
473  	iscsi_pg_map_add_ig_map(pg_map, &ig1);
474  	iscsi_pg_map_add_ig_map(pg_map, &ig2);
475  
476  	/* portal initialization */
477  	portal.group = &pg;
478  	snprintf(portal.host, sizeof(portal.host), IP1);
479  	snprintf(portal.port, sizeof(portal.port), "3260");
480  
481  	/* connection initialization */
482  	conn.portal = &portal;
483  
484  	iqn = IQN1;
485  	addr = IP1;
486  
487  	/*
488  	 * case 1:
489  	 * +-------------------------------------------+---------+
490  	 * | IG1                 | IG2                 |         |
491  	 * +-------------------------------------------+         |
492  	 * | name      | addr    | name      | addr    | result  |
493  	 * +-------------------------------------------+---------+
494  	 * +-------------------------------------------+---------+
495  	 * | denied    | -       | -         | -       | denied  |
496  	 * +-------------------------------------------+---------+
497  	 */
498  	snprintf(iname1.name, sizeof(iname1.name), NO_IQN1);
499  
500  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
501  	CU_ASSERT(result == false);
502  
503  	/*
504  	 * case 2:
505  	 * +-------------------------------------------+---------+
506  	 * | IG1                 | IG2                 |         |
507  	 * +-------------------------------------------+         |
508  	 * | name      | addr    | name      | addr    | result  |
509  	 * +-------------------------------------------+---------+
510  	 * +-------------------------------------------+---------+
511  	 * | allowed   | allowed | -         | -       | allowed |
512  	 * +-------------------------------------------+---------+
513  	 */
514  	snprintf(iname1.name, sizeof(iname1.name), IQN1);
515  	snprintf(imask1.mask, sizeof(imask1.mask), IP1);
516  
517  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
518  	CU_ASSERT(result == true);
519  
520  	/*
521  	 * case 3:
522  	 * +-------------------------------------------+---------+
523  	 * | IG1                 | IG2                 |         |
524  	 * +-------------------------------------------+         |
525  	 * | name      | addr    | name     | addr     | result  |
526  	 * +-------------------------------------------+---------+
527  	 * +-------------------------------------------+---------+
528  	 * | allowed   | denied  | denied   | -        | denied  |
529  	 * +-------------------------------------------+---------+
530  	 */
531  	snprintf(iname1.name, sizeof(iname1.name), IQN1);
532  	snprintf(imask1.mask, sizeof(imask1.mask), IP2);
533  	snprintf(iname2.name, sizeof(iname2.name), NO_IQN1);
534  
535  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
536  	CU_ASSERT(result == false);
537  
538  	/*
539  	 * case 4:
540  	 * +-------------------------------------------+---------+
541  	 * | IG1                 | IG2                 |         |
542  	 * +-------------------------------------------+         |
543  	 * | name      | addr    | name      | addr    | result  |
544  	 * +-------------------------------------------+---------+
545  	 * +-------------------------------------------+---------+
546  	 * | allowed   | denied  | allowed   | allowed | allowed |
547  	 * +-------------------------------------------+---------+
548  	 */
549  	snprintf(iname1.name, sizeof(iname1.name), IQN1);
550  	snprintf(imask1.mask, sizeof(imask1.mask), IP2);
551  	snprintf(iname2.name, sizeof(iname2.name), IQN1);
552  	snprintf(imask2.mask, sizeof(imask2.mask), IP1);
553  
554  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
555  	CU_ASSERT(result == true);
556  
557  	/*
558  	 * case 5:
559  	 * +---------------------------------------------+---------+
560  	 * | IG1                 | IG2                   |         |
561  	 * +---------------------------------------------+         |
562  	 * | name      | addr    | name        | addr    | result  |
563  	 * +---------------------------------------------+---------+
564  	 * +---------------------------------------------+---------+
565  	 * | allowed   | denied  | allowed     | denied  | denied  |
566  	 * +---------------------------------------------+---------+
567  	 */
568  	snprintf(iname1.name, sizeof(iname1.name), IQN1);
569  	snprintf(imask1.mask, sizeof(imask1.mask), IP2);
570  	snprintf(iname2.name, sizeof(iname2.name), IQN1);
571  	snprintf(imask2.mask, sizeof(imask2.mask), IP2);
572  
573  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
574  	CU_ASSERT(result == false);
575  
576  	/*
577  	 * case 6:
578  	 * +---------------------------------------------+---------+
579  	 * | IG1                 | IG2                   |         |
580  	 * +---------------------------------------------+         |
581  	 * | name      | addr    | name        | addr    | result  |
582  	 * +---------------------------------------------+---------+
583  	 * +---------------------------------------------+---------+
584  	 * | allowed   | denied  | not found   | -       | denied  |
585  	 * +---------------------------------------------+---------+
586  	 */
587  	snprintf(iname1.name, sizeof(iname1.name), IQN1);
588  	snprintf(imask1.mask, sizeof(imask1.mask), IP2);
589  	snprintf(iname2.name, sizeof(iname2.name), IQN2);
590  
591  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
592  	CU_ASSERT(result == false);
593  
594  	/*
595  	 * case 7:
596  	 * +---------------------------------------------+---------+
597  	 * | IG1                   | IG2                 |         |
598  	 * +---------------------------------------------+         |
599  	 * | name        | addr    | name      | addr    | result  |
600  	 * +---------------------------------------------+---------+
601  	 * +---------------------------------------------+---------+
602  	 * | not found   | -       | denied    | -       | denied  |
603  	 * +---------------------------------------------+---------+
604  	 */
605  	snprintf(iname1.name, sizeof(iname1.name), IQN2);
606  	snprintf(iname2.name, sizeof(iname2.name), NO_IQN1);
607  
608  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
609  	CU_ASSERT(result == false);
610  
611  	/*
612  	 * case 8:
613  	 * +---------------------------------------------+---------+
614  	 * | IG1                   | IG2                 |         |
615  	 * +---------------------------------------------+         |
616  	 * | name        | addr    | name      | addr    | result  |
617  	 * +---------------------------------------------+---------+
618  	 * +---------------------------------------------+---------+
619  	 * | not found   | -       | allowed   | allowed | allowed |
620  	 * +---------------------------------------------+---------+
621  	 */
622  	snprintf(iname1.name, sizeof(iname1.name), IQN2);
623  	snprintf(iname2.name, sizeof(iname2.name), IQN1);
624  	snprintf(imask2.mask, sizeof(imask2.mask), IP1);
625  
626  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
627  	CU_ASSERT(result == true);
628  
629  	/*
630  	 * case 9:
631  	 * +---------------------------------------------+---------+
632  	 * | IG1                   | IG2                 |         |
633  	 * +---------------------------------------------+         |
634  	 * | name        | addr    | name      | addr    | result  |
635  	 * +---------------------------------------------+---------+
636  	 * +---------------------------------------------+---------+
637  	 * | not found   | -       | allowed   | denied  | denied  |
638  	 * +---------------------------------------------+---------+
639  	 */
640  	snprintf(iname1.name, sizeof(iname1.name), IQN2);
641  	snprintf(iname2.name, sizeof(iname2.name), IQN1);
642  	snprintf(imask2.mask, sizeof(imask2.mask), IP2);
643  
644  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
645  	CU_ASSERT(result == false);
646  
647  	/*
648  	 * case 10:
649  	 * +---------------------------------------------+---------+
650  	 * | IG1                   | IG2                 |         |
651  	 * +---------------------------------------------+         |
652  	 * | name        | addr    | name      | addr    | result  |
653  	 * +---------------------------------------------+---------+
654  	 * +---------------------------------------------+---------+
655  	 * | not found   | -       | not found | -       | denied  |
656  	 * +---------------------------------------------+---------+
657  	 */
658  	snprintf(iname1.name, sizeof(iname1.name), IQN2);
659  	snprintf(iname2.name, sizeof(iname2.name), IQN2);
660  
661  	result = iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
662  	CU_ASSERT(result == false);
663  
664  	iscsi_pg_map_delete_ig_map(pg_map, &ig1);
665  	iscsi_pg_map_delete_ig_map(pg_map, &ig2);
666  	iscsi_tgt_node_delete_pg_map(&tgtnode, &pg);
667  }
668  
669  static void
670  allow_iscsi_name_multi_maps_case(void)
671  {
672  	struct spdk_iscsi_tgt_node tgtnode = {};
673  	struct spdk_iscsi_portal_grp pg1 = {}, pg2 = {};
674  	struct spdk_iscsi_init_grp ig = {};
675  	struct spdk_iscsi_initiator_name iname = {};
676  	struct spdk_iscsi_pg_map *pg_map1, *pg_map2;
677  	struct spdk_scsi_dev scsi_dev = {};
678  	char *iqn;
679  	bool result;
680  
681  	/* target initialization */
682  	TAILQ_INIT(&tgtnode.pg_map_head);
683  
684  	snprintf(scsi_dev.name, sizeof(scsi_dev.name), IQN1);
685  	tgtnode.dev = &scsi_dev;
686  
687  	/* initiator group initialization */
688  	TAILQ_INIT(&ig.initiator_head);
689  
690  	ig.ninitiators = 1;
691  	TAILQ_INSERT_TAIL(&ig.initiator_head, &iname, tailq);
692  
693  	/* portal group initialization */
694  	pg1.tag = 1;
695  	pg2.tag = 1;
696  
697  	pg_map1 = iscsi_tgt_node_add_pg_map(&tgtnode, &pg1);
698  	pg_map2 = iscsi_tgt_node_add_pg_map(&tgtnode, &pg2);
699  	iscsi_pg_map_add_ig_map(pg_map1, &ig);
700  	iscsi_pg_map_add_ig_map(pg_map2, &ig);
701  
702  	/* test for IG1 <-> PG1, PG2 case */
703  	iqn = IQN1;
704  
705  	snprintf(iname.name, sizeof(iname.name), IQN1);
706  
707  	result = iscsi_tgt_node_allow_iscsi_name(&tgtnode, iqn);
708  	CU_ASSERT(result == true);
709  
710  	snprintf(iname.name, sizeof(iname.name), IQN2);
711  
712  	result = iscsi_tgt_node_allow_iscsi_name(&tgtnode, iqn);
713  	CU_ASSERT(result == false);
714  
715  	iscsi_pg_map_delete_ig_map(pg_map1, &ig);
716  	iscsi_pg_map_delete_ig_map(pg_map2, &ig);
717  	iscsi_tgt_node_delete_pg_map(&tgtnode, &pg1);
718  	iscsi_tgt_node_delete_pg_map(&tgtnode, &pg2);
719  }
720  
721  /*
722   * static bool
723   * iscsi_check_chap_params(bool disable_chap, bool require_chap,
724   *                              bool mutual_chap, int chap_group);
725   */
726  static void
727  chap_param_test_cases(void)
728  {
729  	/* Auto */
730  	CU_ASSERT(iscsi_check_chap_params(false, false, false, 0) == true);
731  
732  	/* None */
733  	CU_ASSERT(iscsi_check_chap_params(true, false, false, 0) == true);
734  
735  	/* CHAP */
736  	CU_ASSERT(iscsi_check_chap_params(false, true, false, 0) == true);
737  
738  	/* CHAP Mutual */
739  	CU_ASSERT(iscsi_check_chap_params(false, true, true, 0) == true);
740  
741  	/* Check mutual exclusiveness of disabled and required */
742  	CU_ASSERT(iscsi_check_chap_params(true, true, false, 0) == false);
743  
744  	/* Mutual requires Required */
745  	CU_ASSERT(iscsi_check_chap_params(false, false, true, 0) == false);
746  
747  	/* Remaining combinations */
748  	CU_ASSERT(iscsi_check_chap_params(true, false, true, 0) == false);
749  	CU_ASSERT(iscsi_check_chap_params(true, true, true, 0) == false);
750  
751  	/* Valid auth group ID */
752  	CU_ASSERT(iscsi_check_chap_params(false, false, false, 1) == true);
753  
754  	/* Invalid auth group ID */
755  	CU_ASSERT(iscsi_check_chap_params(false, false, false, -1) == false);
756  }
757  
758  int
759  main(int argc, char **argv)
760  {
761  	CU_pSuite	suite = NULL;
762  	unsigned int	num_failures;
763  
764  	CU_initialize_registry();
765  
766  	suite = CU_add_suite("iscsi_target_node_suite", NULL, NULL);
767  
768  	CU_ADD_TEST(suite, add_lun_test_cases);
769  	CU_ADD_TEST(suite, allow_any_allowed);
770  	CU_ADD_TEST(suite, allow_ipv6_allowed);
771  	CU_ADD_TEST(suite, allow_ipv6_denied);
772  	CU_ADD_TEST(suite, allow_ipv6_invalid);
773  	CU_ADD_TEST(suite, allow_ipv4_allowed);
774  	CU_ADD_TEST(suite, allow_ipv4_denied);
775  	CU_ADD_TEST(suite, allow_ipv4_invalid);
776  	CU_ADD_TEST(suite, node_access_allowed);
777  	CU_ADD_TEST(suite, node_access_denied_by_empty_netmask);
778  	CU_ADD_TEST(suite, node_access_multi_initiator_groups_cases);
779  	CU_ADD_TEST(suite, allow_iscsi_name_multi_maps_case);
780  	CU_ADD_TEST(suite, chap_param_test_cases);
781  
782  	num_failures = spdk_ut_run_tests(argc, argv, NULL);
783  	CU_cleanup_registry();
784  	return num_failures;
785  }
786