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