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