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