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