xref: /spdk/test/unit/lib/iscsi/tgt_node.c/tgt_node_ut.c (revision f8abbede89d30584d2a4f8427b13896f8591b873)
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