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