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