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