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