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 *
spdk_scsi_dev_get_lun(struct spdk_scsi_dev * dev,int lun_id)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
spdk_scsi_dev_add_lun(struct spdk_scsi_dev * dev,const char * bdev_name,int lun_id,void (* hotremove_cb)(const struct spdk_scsi_lun *,void *),void * hotremove_ctx)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
add_lun_test_cases(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
allow_any_allowed(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
allow_ipv6_allowed(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
allow_ipv6_denied(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
allow_ipv6_invalid(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
allow_ipv4_allowed(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
allow_ipv4_denied(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
allow_ipv4_invalid(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
node_access_allowed(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
node_access_denied_by_empty_netmask(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
node_access_multi_initiator_groups_cases(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
allow_iscsi_name_multi_maps_case(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
chap_param_test_cases(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
main(int argc,char ** argv)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