Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2017 Intel Corporation.
3 : : * All rights reserved.
4 : : * Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
5 : : */
6 : :
7 : : #include "spdk/stdinc.h"
8 : :
9 : : #include "spdk_internal/cunit.h"
10 : : #include "spdk_internal/mock.h"
11 : :
12 : : #include "common/lib/test_env.c"
13 : : #include "spdk/bdev_module.h"
14 : : #include "nvmf/ctrlr_discovery.c"
15 : : #include "nvmf/subsystem.c"
16 : :
17 : 5 : SPDK_LOG_REGISTER_COMPONENT(nvmf)
18 : :
19 : 0 : DEFINE_STUB_V(spdk_bdev_module_release_bdev,
20 : : (struct spdk_bdev *bdev));
21 : :
22 : 0 : DEFINE_STUB(spdk_bdev_get_block_size, uint32_t,
23 : : (const struct spdk_bdev *bdev), 512);
24 : :
25 : 0 : DEFINE_STUB(spdk_nvmf_transport_stop_listen,
26 : : int,
27 : : (struct spdk_nvmf_transport *transport,
28 : : const struct spdk_nvme_transport_id *trid), 0);
29 : :
30 : 10 : DEFINE_STUB(spdk_nvmf_transport_get_first,
31 : : struct spdk_nvmf_transport *,
32 : : (struct spdk_nvmf_tgt *tgt), NULL);
33 : :
34 : 0 : DEFINE_STUB(spdk_nvmf_transport_get_next,
35 : : struct spdk_nvmf_transport *,
36 : : (struct spdk_nvmf_transport *transport), NULL);
37 : :
38 : 0 : DEFINE_STUB_V(spdk_bdev_close, (struct spdk_bdev_desc *desc));
39 : :
40 : 0 : DEFINE_STUB_V(nvmf_ctrlr_async_event_discovery_log_change_notice, (void *ctx));
41 : :
42 : 0 : DEFINE_STUB(spdk_nvmf_qpair_disconnect, int,
43 : : (struct spdk_nvmf_qpair *qpair,
44 : : nvmf_qpair_disconnect_cb cb_fn, void *ctx), 0);
45 : :
46 : 0 : DEFINE_STUB(spdk_bdev_open_ext, int,
47 : : (const char *bdev_name, bool write, spdk_bdev_event_cb_t event_cb,
48 : : void *event_ctx, struct spdk_bdev_desc **desc), 0);
49 : :
50 : 0 : DEFINE_STUB(spdk_bdev_desc_get_bdev, struct spdk_bdev *,
51 : : (struct spdk_bdev_desc *desc), NULL);
52 : :
53 : 0 : DEFINE_STUB(spdk_bdev_get_md_size, uint32_t,
54 : : (const struct spdk_bdev *bdev), 0);
55 : :
56 [ # # ]: 0 : DEFINE_STUB(spdk_bdev_is_md_interleaved, bool,
57 : : (const struct spdk_bdev *bdev), false);
58 : :
59 : 0 : DEFINE_STUB(spdk_bdev_module_claim_bdev, int,
60 : : (struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
61 : : struct spdk_bdev_module *module), 0);
62 : :
63 [ # # ]: 0 : DEFINE_STUB(spdk_bdev_io_type_supported, bool,
64 : : (struct spdk_bdev *bdev, enum spdk_bdev_io_type io_type), false);
65 : :
66 : 0 : DEFINE_STUB_V(nvmf_ctrlr_reservation_notice_log,
67 : : (struct spdk_nvmf_ctrlr *ctrlr, struct spdk_nvmf_ns *ns,
68 : : enum spdk_nvme_reservation_notification_log_page_type type));
69 : :
70 : 0 : DEFINE_STUB(spdk_nvmf_request_complete, int,
71 : : (struct spdk_nvmf_request *req), -1);
72 : :
73 : 0 : DEFINE_STUB(nvmf_ctrlr_async_event_ana_change_notice, int,
74 : : (struct spdk_nvmf_ctrlr *ctrlr), 0);
75 : :
76 : 0 : DEFINE_STUB(spdk_nvme_transport_id_trtype_str, const char *,
77 : : (enum spdk_nvme_transport_type trtype), NULL);
78 : :
79 [ # # ]: 0 : DEFINE_STUB(spdk_bdev_is_zoned, bool, (const struct spdk_bdev *bdev), false);
80 : :
81 : 0 : DEFINE_STUB(spdk_bdev_get_max_zone_append_size, uint32_t,
82 : : (const struct spdk_bdev *bdev), 0);
83 : :
84 : : const char *
85 : 0 : spdk_bdev_get_name(const struct spdk_bdev *bdev)
86 : : {
87 : 0 : return "test";
88 : : }
89 : :
90 : : const struct spdk_uuid *
91 : 0 : spdk_bdev_get_uuid(const struct spdk_bdev *bdev)
92 : : {
93 : 0 : return &bdev->uuid;
94 : : }
95 : :
96 : : int
97 : 135 : spdk_nvme_transport_id_compare(const struct spdk_nvme_transport_id *trid1,
98 : : const struct spdk_nvme_transport_id *trid2)
99 : : {
100 [ + + + + : 185 : return !(trid1->trtype == trid2->trtype && strcasecmp(trid1->traddr, trid2->traddr) == 0 &&
- + + + ]
101 [ + + - + : 50 : strcasecmp(trid1->trsvcid, trid2->trsvcid) == 0);
+ + ]
102 : : }
103 : :
104 : : int
105 : 0 : spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
106 : : const struct spdk_nvme_transport_id *trid, struct spdk_nvmf_listen_opts *opts)
107 : : {
108 : 0 : return 0;
109 : : }
110 : :
111 : : static struct spdk_nvmf_listener g_listener = {};
112 : :
113 : : struct spdk_nvmf_listener *
114 : 35 : nvmf_transport_find_listener(struct spdk_nvmf_transport *transport,
115 : : const struct spdk_nvme_transport_id *trid)
116 : : {
117 : : struct spdk_nvmf_listener *listener;
118 : :
119 [ + + ]: 35 : if (TAILQ_EMPTY(&transport->listeners)) {
120 : 5 : return &g_listener;
121 : : }
122 : :
123 [ + - ]: 60 : TAILQ_FOREACH(listener, &transport->listeners, link) {
124 [ + + ]: 60 : if (spdk_nvme_transport_id_compare(&listener->trid, trid) == 0) {
125 : 30 : return listener;
126 : : }
127 : : }
128 : :
129 : 0 : return NULL;
130 : : }
131 : :
132 : : void
133 : 235 : nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport,
134 : : struct spdk_nvme_transport_id *trid,
135 : : struct spdk_nvmf_discovery_log_page_entry *entry)
136 : : {
137 : 235 : transport->ops->listener_discover(transport, trid, entry);
138 : 235 : }
139 : :
140 : : static void
141 : 25 : test_dummy_listener_discover(struct spdk_nvmf_transport *transport,
142 : : struct spdk_nvme_transport_id *trid, struct spdk_nvmf_discovery_log_page_entry *entry)
143 : : {
144 : 25 : entry->trtype = 42;
145 : 25 : }
146 : :
147 : : struct spdk_nvmf_transport_ops g_transport_ops = { .listener_discover = test_dummy_listener_discover };
148 : :
149 : : static struct spdk_nvmf_transport g_transport = {
150 : : .ops = &g_transport_ops
151 : : };
152 : :
153 : : int
154 : 0 : spdk_nvmf_transport_create_async(const char *transport_name,
155 : : struct spdk_nvmf_transport_opts *tprt_opts,
156 : : spdk_nvmf_transport_create_done_cb cb_fn, void *cb_arg)
157 : : {
158 [ # # # # : 0 : if (strcasecmp(transport_name, spdk_nvme_transport_id_trtype_str(SPDK_NVME_TRANSPORT_RDMA))) {
# # ]
159 : 0 : cb_fn(cb_arg, &g_transport);
160 : 0 : return 0;
161 : : }
162 : :
163 : 0 : return -1;
164 : : }
165 : :
166 : : struct spdk_nvmf_subsystem *
167 : 90 : spdk_nvmf_tgt_find_subsystem(struct spdk_nvmf_tgt *tgt, const char *subnqn)
168 : : {
169 : 90 : return NULL;
170 : : }
171 : :
172 : : DEFINE_RETURN_MOCK(spdk_nvmf_tgt_get_transport, struct spdk_nvmf_transport *);
173 : : struct spdk_nvmf_transport *
174 : 35 : spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt, const char *transport_name)
175 : : {
176 [ + + + + ]: 35 : HANDLE_RETURN_MOCK(spdk_nvmf_tgt_get_transport);
177 : 5 : return &g_transport;
178 : : }
179 : :
180 : : int
181 : 0 : spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const char *str)
182 : : {
183 [ # # # # ]: 0 : if (trtype == NULL || str == NULL) {
184 : 0 : return -EINVAL;
185 : : }
186 : :
187 [ # # # # ]: 0 : if (strcasecmp(str, "PCIe") == 0) {
188 : 0 : *trtype = SPDK_NVME_TRANSPORT_PCIE;
189 [ # # # # ]: 0 : } else if (strcasecmp(str, "RDMA") == 0) {
190 : 0 : *trtype = SPDK_NVME_TRANSPORT_RDMA;
191 : : } else {
192 : 0 : return -ENOENT;
193 : : }
194 : 0 : return 0;
195 : : }
196 : :
197 : : void
198 : 0 : nvmf_ctrlr_ns_changed(struct spdk_nvmf_ctrlr *ctrlr, uint32_t nsid)
199 : : {
200 : 0 : }
201 : :
202 : : void
203 : 0 : nvmf_ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr)
204 : : {
205 : 0 : }
206 : :
207 : : int
208 : 0 : nvmf_poll_group_update_subsystem(struct spdk_nvmf_poll_group *group,
209 : : struct spdk_nvmf_subsystem *subsystem)
210 : : {
211 : 0 : return 0;
212 : : }
213 : :
214 : : int
215 : 0 : nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
216 : : struct spdk_nvmf_subsystem *subsystem,
217 : : spdk_nvmf_poll_group_mod_done cb_fn, void *cb_arg)
218 : : {
219 : 0 : return 0;
220 : : }
221 : :
222 : : void
223 : 0 : nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
224 : : struct spdk_nvmf_subsystem *subsystem,
225 : : spdk_nvmf_poll_group_mod_done cb_fn, void *cb_arg)
226 : : {
227 : 0 : }
228 : :
229 : : void
230 : 0 : nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group,
231 : : struct spdk_nvmf_subsystem *subsystem,
232 : : uint32_t nsid,
233 : : spdk_nvmf_poll_group_mod_done cb_fn, void *cb_arg)
234 : : {
235 : 0 : }
236 : :
237 : : void
238 : 0 : nvmf_poll_group_resume_subsystem(struct spdk_nvmf_poll_group *group,
239 : : struct spdk_nvmf_subsystem *subsystem,
240 : : spdk_nvmf_poll_group_mod_done cb_fn, void *cb_arg)
241 : : {
242 : 0 : }
243 : :
244 : : static void
245 : 35 : _subsystem_add_listen_done(void *cb_arg, int status)
246 : : {
247 [ - + ]: 35 : SPDK_CU_ASSERT_FATAL(status == 0);
248 : 35 : }
249 : :
250 : : static void
251 : 45 : test_gen_trid(struct spdk_nvme_transport_id *trid, enum spdk_nvme_transport_type trtype,
252 : : enum spdk_nvmf_adrfam adrfam, const char *tradd, const char *trsvcid)
253 : : {
254 [ - + ]: 45 : snprintf(trid->traddr, sizeof(trid->traddr), "%s", tradd);
255 [ - + ]: 45 : snprintf(trid->trsvcid, sizeof(trid->trsvcid), "%s", trsvcid);
256 : 45 : trid->adrfam = adrfam;
257 : 45 : trid->trtype = trtype;
258 [ + + - ]: 45 : switch (trtype) {
259 : 25 : case SPDK_NVME_TRANSPORT_RDMA:
260 [ - + ]: 25 : snprintf(trid->trstring, SPDK_NVMF_TRSTRING_MAX_LEN, "%s", SPDK_NVME_TRANSPORT_NAME_RDMA);
261 : 25 : break;
262 : 20 : case SPDK_NVME_TRANSPORT_TCP:
263 [ - + ]: 20 : snprintf(trid->trstring, SPDK_NVMF_TRSTRING_MAX_LEN, "%s", SPDK_NVME_TRANSPORT_NAME_TCP);
264 : 20 : break;
265 : 0 : default:
266 [ # # ]: 0 : SPDK_CU_ASSERT_FATAL(0 && "not supported by test");
267 : : }
268 : 45 : }
269 : :
270 : : static void
271 : 5 : test_discovery_log(void)
272 : : {
273 : 5 : struct spdk_nvmf_tgt tgt = {};
274 : : struct spdk_nvmf_subsystem *subsystem;
275 : 4 : uint8_t buffer[8192];
276 : 4 : struct iovec iov;
277 : : struct spdk_nvmf_discovery_log_page *disc_log;
278 : : struct spdk_nvmf_discovery_log_page_entry *entry;
279 : 5 : struct spdk_nvme_transport_id trid = {};
280 : 5 : const char *hostnqn = "nqn.2016-06.io.spdk:host1";
281 : : int rc;
282 : :
283 : 5 : iov.iov_base = buffer;
284 : 5 : iov.iov_len = 8192;
285 : :
286 : 5 : tgt.max_subsystems = 1024;
287 : 5 : tgt.subsystem_ids = spdk_bit_array_create(tgt.max_subsystems);
288 : 5 : RB_INIT(&tgt.subsystems);
289 : :
290 : : /* Add one subsystem and verify that the discovery log contains it */
291 : 5 : subsystem = spdk_nvmf_subsystem_create(&tgt, "nqn.2016-06.io.spdk:subsystem1",
292 : : SPDK_NVMF_SUBTYPE_NVME, 0);
293 [ - + ]: 5 : SPDK_CU_ASSERT_FATAL(subsystem != NULL);
294 : :
295 : 5 : rc = spdk_nvmf_subsystem_add_host(subsystem, hostnqn, NULL);
296 : 5 : CU_ASSERT(rc == 0);
297 : :
298 : : /* Get only genctr (first field in the header) */
299 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
300 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
301 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, sizeof(disc_log->genctr),
302 : : &trid);
303 : : /* No listeners yet on new subsystem, so genctr should still be 0. */
304 : 5 : CU_ASSERT(disc_log->genctr == 0);
305 : :
306 : 5 : test_gen_trid(&trid, SPDK_NVME_TRANSPORT_RDMA, SPDK_NVMF_ADRFAM_IPV4, "1234", "5678");
307 : 5 : spdk_nvmf_subsystem_add_listener(subsystem, &trid, _subsystem_add_listen_done, NULL);
308 : 5 : subsystem->state = SPDK_NVMF_SUBSYSTEM_ACTIVE;
309 : :
310 : : /* Get only genctr (first field in the header) */
311 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
312 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
313 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, sizeof(disc_log->genctr),
314 : : &trid);
315 : 5 : CU_ASSERT(disc_log->genctr == 1); /* one added subsystem and listener */
316 : :
317 : : /* Get only the header, no entries */
318 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
319 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
320 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, sizeof(*disc_log),
321 : : &trid);
322 : 5 : CU_ASSERT(disc_log->genctr == 1);
323 : 5 : CU_ASSERT(disc_log->numrec == 1);
324 : :
325 : : /* Offset 0, exact size match */
326 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
327 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
328 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0,
329 : : sizeof(*disc_log) + sizeof(disc_log->entries[0]), &trid);
330 : 5 : CU_ASSERT(disc_log->genctr != 0);
331 : 5 : CU_ASSERT(disc_log->numrec == 1);
332 : 5 : CU_ASSERT(disc_log->entries[0].trtype == 42);
333 : :
334 : : /* Offset 0, oversize buffer */
335 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
336 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
337 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, sizeof(buffer), &trid);
338 : 5 : CU_ASSERT(disc_log->genctr != 0);
339 : 5 : CU_ASSERT(disc_log->numrec == 1);
340 : 5 : CU_ASSERT(disc_log->entries[0].trtype == 42);
341 : 5 : CU_ASSERT(spdk_mem_all_zero(buffer + sizeof(*disc_log) + sizeof(disc_log->entries[0]),
342 : : sizeof(buffer) - (sizeof(*disc_log) + sizeof(disc_log->entries[0]))));
343 : :
344 : : /* Get just the first entry, no header */
345 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
346 : 5 : entry = (struct spdk_nvmf_discovery_log_page_entry *)buffer;
347 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1,
348 : : offsetof(struct spdk_nvmf_discovery_log_page, entries[0]), sizeof(*entry), &trid);
349 : 5 : CU_ASSERT(entry->trtype == 42);
350 : :
351 : : /* remove the host and verify that the discovery log contains nothing */
352 : 5 : rc = spdk_nvmf_subsystem_remove_host(subsystem, hostnqn);
353 : 5 : CU_ASSERT(rc == 0);
354 : :
355 : : /* Get only the header, no entries */
356 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
357 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
358 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, sizeof(*disc_log),
359 : : &trid);
360 : 5 : CU_ASSERT(disc_log->genctr != 0);
361 : 5 : CU_ASSERT(disc_log->numrec == 0);
362 : :
363 : : /* destroy the subsystem and verify that the discovery log contains nothing */
364 : 5 : subsystem->state = SPDK_NVMF_SUBSYSTEM_INACTIVE;
365 : 5 : rc = spdk_nvmf_subsystem_destroy(subsystem, NULL, NULL);
366 : 5 : CU_ASSERT(rc == 0);
367 : :
368 : : /* Get only the header, no entries */
369 [ - + ]: 5 : memset(buffer, 0xCC, sizeof(buffer));
370 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
371 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, sizeof(*disc_log),
372 : : &trid);
373 : 5 : CU_ASSERT(disc_log->genctr != 0);
374 : 5 : CU_ASSERT(disc_log->numrec == 0);
375 : :
376 : 5 : spdk_bit_array_free(&tgt.subsystem_ids);
377 : 5 : }
378 : :
379 : : static void
380 : 110 : test_rdma_discover(struct spdk_nvmf_transport *transport, struct spdk_nvme_transport_id *trid,
381 : : struct spdk_nvmf_discovery_log_page_entry *entry)
382 : : {
383 : 110 : entry->trtype = SPDK_NVMF_TRTYPE_RDMA;
384 : 110 : entry->adrfam = trid->adrfam;
385 [ - + - + ]: 110 : memcpy(entry->traddr, trid->traddr, sizeof(entry->traddr));
386 [ - + - + ]: 110 : memcpy(entry->trsvcid, trid->trsvcid, sizeof(entry->trsvcid));
387 : 110 : }
388 : :
389 : : static void
390 : 100 : test_tcp_discover(struct spdk_nvmf_transport *transport, struct spdk_nvme_transport_id *trid,
391 : : struct spdk_nvmf_discovery_log_page_entry *entry)
392 : : {
393 : 100 : entry->trtype = SPDK_NVMF_TRTYPE_TCP;
394 : 100 : entry->adrfam = trid->adrfam;
395 [ - + - + ]: 100 : memcpy(entry->traddr, trid->traddr, sizeof(entry->traddr));
396 [ - + - + ]: 100 : memcpy(entry->trsvcid, trid->trsvcid, sizeof(entry->trsvcid));
397 : 100 : }
398 : :
399 : : static void
400 : 5 : test_discovery_log_with_filters(void)
401 : : {
402 : 5 : struct spdk_nvmf_tgt tgt = {};
403 : 5 : struct spdk_nvmf_transport_ops rdma_tr_ops = { .listener_discover = test_rdma_discover }, tcp_tr_ops
404 : : = { .listener_discover = test_tcp_discover };
405 : 5 : struct spdk_nvmf_transport rdma_tr = {.ops = &rdma_tr_ops }, tcp_tr = { .ops = &tcp_tr_ops };
406 : : struct spdk_nvmf_subsystem *subsystem;
407 : 5 : const char *hostnqn = "nqn.2016-06.io.spdk:host1";
408 : 4 : uint8_t buffer[8192];
409 : 4 : struct iovec iov;
410 : : struct spdk_nvmf_discovery_log_page *disc_log;
411 : 5 : struct spdk_nvmf_listener rdma_listener_1 = {}, rdma_listener_2 = {}, rdma_listener_3 = {},
412 : 5 : tcp_listener_1 = {}, tcp_listener_2 = {}, tcp_listener_3 = {};
413 : 5 : struct spdk_nvme_transport_id rdma_trid_1 = {}, rdma_trid_2 = {}, rdma_trid_3 = {}, rdma_trid_4 = {},
414 : 5 : tcp_trid_1 = {}, tcp_trid_2 = {}, tcp_trid_3 = {}, tcp_trid_4 = {};
415 : 5 : struct spdk_nvmf_referral ref1 = {}, ref2 = {};
416 : :
417 : 5 : iov.iov_base = buffer;
418 : 5 : iov.iov_len = 8192;
419 : :
420 : 5 : tgt.max_subsystems = 4;
421 : 5 : tgt.subsystem_ids = spdk_bit_array_create(tgt.max_subsystems);
422 : 5 : RB_INIT(&tgt.subsystems);
423 : :
424 : 5 : subsystem = spdk_nvmf_subsystem_create(&tgt, "nqn.2016-06.io.spdk:subsystem1",
425 : : SPDK_NVMF_SUBTYPE_NVME, 0);
426 : 5 : subsystem->flags.allow_any_host = true;
427 [ - + ]: 5 : SPDK_CU_ASSERT_FATAL(subsystem != NULL);
428 : :
429 : 5 : TAILQ_INIT(&tgt.referrals);
430 : :
431 : 5 : test_gen_trid(&rdma_trid_1, SPDK_NVME_TRANSPORT_RDMA, SPDK_NVMF_ADRFAM_IPV4, "10.10.10.10", "4420");
432 : 5 : test_gen_trid(&rdma_trid_2, SPDK_NVME_TRANSPORT_RDMA, SPDK_NVMF_ADRFAM_IPV4, "11.11.11.11", "4420");
433 : 5 : test_gen_trid(&rdma_trid_3, SPDK_NVME_TRANSPORT_RDMA, SPDK_NVMF_ADRFAM_IPV4, "10.10.10.10", "4421");
434 : 5 : test_gen_trid(&rdma_trid_4, SPDK_NVME_TRANSPORT_RDMA, SPDK_NVMF_ADRFAM_IPV4, "10.10.10.10", "4430");
435 : 5 : test_gen_trid(&tcp_trid_1, SPDK_NVME_TRANSPORT_TCP, SPDK_NVMF_ADRFAM_IPV4, "11.11.11.11", "4421");
436 : 5 : test_gen_trid(&tcp_trid_2, SPDK_NVME_TRANSPORT_TCP, SPDK_NVMF_ADRFAM_IPV4, "10.10.10.10", "4422");
437 : 5 : test_gen_trid(&tcp_trid_3, SPDK_NVME_TRANSPORT_TCP, SPDK_NVMF_ADRFAM_IPV4, "11.11.11.11", "4422");
438 : 5 : test_gen_trid(&tcp_trid_4, SPDK_NVME_TRANSPORT_TCP, SPDK_NVMF_ADRFAM_IPV4, "11.11.11.11", "4430");
439 : :
440 : 5 : rdma_listener_1.trid = rdma_trid_1;
441 : 5 : rdma_listener_2.trid = rdma_trid_2;
442 : 5 : rdma_listener_3.trid = rdma_trid_3;
443 : 5 : TAILQ_INIT(&rdma_tr.listeners);
444 : 5 : TAILQ_INSERT_TAIL(&rdma_tr.listeners, &rdma_listener_1, link);
445 : 5 : TAILQ_INSERT_TAIL(&rdma_tr.listeners, &rdma_listener_2, link);
446 : 5 : TAILQ_INSERT_TAIL(&rdma_tr.listeners, &rdma_listener_3, link);
447 : :
448 : 5 : tcp_listener_1.trid = tcp_trid_1;
449 : 5 : tcp_listener_2.trid = tcp_trid_2;
450 : 5 : tcp_listener_3.trid = tcp_trid_3;
451 : 5 : TAILQ_INIT(&tcp_tr.listeners);
452 : 5 : TAILQ_INSERT_TAIL(&tcp_tr.listeners, &tcp_listener_1, link);
453 : 5 : TAILQ_INSERT_TAIL(&tcp_tr.listeners, &tcp_listener_2, link);
454 : 5 : TAILQ_INSERT_TAIL(&tcp_tr.listeners, &tcp_listener_3, link);
455 : :
456 : 5 : MOCK_SET(spdk_nvmf_tgt_get_transport, &rdma_tr);
457 : 5 : spdk_nvmf_subsystem_add_listener(subsystem, &rdma_trid_1, _subsystem_add_listen_done, NULL);
458 : 5 : spdk_nvmf_subsystem_add_listener(subsystem, &rdma_trid_2, _subsystem_add_listen_done, NULL);
459 : 5 : spdk_nvmf_subsystem_add_listener(subsystem, &rdma_trid_3, _subsystem_add_listen_done, NULL);
460 : 5 : MOCK_SET(spdk_nvmf_tgt_get_transport, &tcp_tr);
461 : 5 : spdk_nvmf_subsystem_add_listener(subsystem, &tcp_trid_1, _subsystem_add_listen_done, NULL);
462 : 5 : spdk_nvmf_subsystem_add_listener(subsystem, &tcp_trid_2, _subsystem_add_listen_done, NULL);
463 : 5 : spdk_nvmf_subsystem_add_listener(subsystem, &tcp_trid_3, _subsystem_add_listen_done, NULL);
464 : 5 : MOCK_CLEAR(spdk_nvmf_tgt_get_transport);
465 : :
466 : 5 : subsystem->state = SPDK_NVMF_SUBSYSTEM_ACTIVE;
467 : :
468 : 5 : ref1.trid = rdma_trid_4;
469 : :
470 : 5 : ref1.entry.trtype = rdma_trid_4.trtype;
471 : 5 : ref1.entry.adrfam = rdma_trid_4.adrfam;
472 : 5 : ref1.entry.subtype = SPDK_NVMF_SUBTYPE_DISCOVERY;
473 : 5 : ref1.entry.treq.secure_channel = SPDK_NVMF_TREQ_SECURE_CHANNEL_NOT_REQUIRED;
474 : 5 : ref1.entry.cntlid = 0xffff;
475 : 5 : memcpy(ref1.entry.trsvcid, rdma_trid_4.trsvcid, sizeof(ref1.entry.trsvcid));
476 : 5 : memcpy(ref1.entry.traddr, rdma_trid_4.traddr, sizeof(ref1.entry.traddr));
477 : 5 : snprintf(ref1.entry.subnqn, sizeof(ref1.entry.subnqn), "%s", SPDK_NVMF_DISCOVERY_NQN);
478 : :
479 : 5 : ref2.trid = tcp_trid_4;
480 : :
481 : 5 : ref2.entry.trtype = tcp_trid_4.trtype;
482 : 5 : ref2.entry.adrfam = tcp_trid_4.adrfam;
483 : 5 : ref2.entry.subtype = SPDK_NVMF_SUBTYPE_DISCOVERY;
484 : 5 : ref2.entry.treq.secure_channel = SPDK_NVMF_TREQ_SECURE_CHANNEL_NOT_REQUIRED;
485 : 5 : ref2.entry.cntlid = 0xffff;
486 : 5 : memcpy(ref2.entry.trsvcid, tcp_trid_4.trsvcid, sizeof(ref2.entry.trsvcid));
487 : 5 : memcpy(ref2.entry.traddr, tcp_trid_4.traddr, sizeof(ref2.entry.traddr));
488 : 5 : snprintf(ref2.entry.subnqn, sizeof(ref2.entry.subnqn), "%s", SPDK_NVMF_DISCOVERY_NQN);
489 : :
490 [ - + ]: 5 : TAILQ_INSERT_HEAD(&tgt.referrals, &ref1, link);
491 [ + - ]: 5 : TAILQ_INSERT_HEAD(&tgt.referrals, &ref2, link);
492 : :
493 : 5 : nvmf_update_discovery_log(&tgt, NULL);
494 : :
495 : 5 : disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
496 : 5 : memset(buffer, 0, sizeof(buffer));
497 : :
498 : : /* Test case 1 - check that all trids are reported */
499 : 5 : tgt.discovery_filter = SPDK_NVMF_TGT_DISCOVERY_MATCH_ANY;
500 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_1);
501 : 5 : CU_ASSERT(disc_log->numrec == 8);
502 : :
503 : : /* Test case 2 - check that only entries of the same transport type are returned */
504 : 5 : tgt.discovery_filter = SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_TYPE;
505 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_1);
506 : 5 : CU_ASSERT(disc_log->numrec == 5);
507 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_1.trtype);
508 : 5 : CU_ASSERT(disc_log->entries[1].trtype == rdma_trid_1.trtype);
509 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_1.trtype);
510 : 5 : CU_ASSERT(disc_log->entries[3].trtype == tcp_trid_4.trtype);
511 : 5 : CU_ASSERT(disc_log->entries[4].trtype == rdma_trid_4.trtype);
512 : :
513 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_1);
514 : 5 : CU_ASSERT(disc_log->numrec == 5);
515 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_1.trtype);
516 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_1.trtype);
517 : 5 : CU_ASSERT(disc_log->entries[2].trtype == tcp_trid_1.trtype);
518 : 5 : CU_ASSERT(disc_log->entries[3].trtype == tcp_trid_1.trtype);
519 : 5 : CU_ASSERT(disc_log->entries[4].trtype == rdma_trid_4.trtype);
520 : :
521 : : /* Test case 3 - check that only entries of the same transport address are returned */
522 : 5 : tgt.discovery_filter = SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_ADDRESS;
523 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_1);
524 : 5 : CU_ASSERT(disc_log->numrec == 5);
525 : : /* 1 tcp and 3 rdma */
526 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_1.traddr) == 0);
527 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, rdma_trid_1.traddr) == 0);
528 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_1.traddr) == 0);
529 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[3].traddr, tcp_trid_4.traddr) == 0);
530 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[4].traddr, rdma_trid_4.traddr) == 0);
531 : :
532 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_1);
533 : 5 : CU_ASSERT(disc_log->numrec == 5);
534 : : /* 1 rdma and 3 tcp */
535 : 5 : CU_ASSERT((disc_log->entries[0].trtype ^ disc_log->entries[1].trtype ^ disc_log->entries[2].trtype)
536 : : != 0);
537 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_1.traddr) == 0);
538 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_1.traddr) == 0);
539 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, tcp_trid_1.traddr) == 0);
540 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[3].traddr, tcp_trid_1.traddr) == 0);
541 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[4].traddr, rdma_trid_4.traddr) == 0);
542 : :
543 : : /* Test case 4 - check that only entries of the same transport address and type returned */
544 : 5 : tgt.discovery_filter = SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_TYPE |
545 : : SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_ADDRESS;
546 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_1);
547 : 5 : CU_ASSERT(disc_log->numrec == 4);
548 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_1.traddr) == 0);
549 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, rdma_trid_1.traddr) == 0);
550 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, tcp_trid_4.traddr) == 0);
551 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[3].traddr, rdma_trid_4.traddr) == 0);
552 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_1.trtype);
553 : 5 : CU_ASSERT(disc_log->entries[1].trtype == rdma_trid_1.trtype);
554 : 5 : CU_ASSERT(disc_log->entries[2].trtype == tcp_trid_4.trtype);
555 : 5 : CU_ASSERT(disc_log->entries[3].trtype == rdma_trid_4.trtype);
556 : :
557 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_2);
558 : 5 : CU_ASSERT(disc_log->numrec == 3);
559 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_2.traddr) == 0);
560 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
561 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
562 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_2.trtype);
563 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
564 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
565 : :
566 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_1);
567 : 5 : CU_ASSERT(disc_log->numrec == 4);
568 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_1.traddr) == 0);
569 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_1.traddr) == 0);
570 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, tcp_trid_4.traddr) == 0);
571 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[3].traddr, rdma_trid_4.traddr) == 0);
572 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_1.trtype);
573 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_1.trtype);
574 : 5 : CU_ASSERT(disc_log->entries[2].trtype == tcp_trid_4.trtype);
575 : 5 : CU_ASSERT(disc_log->entries[3].trtype == rdma_trid_4.trtype);
576 : :
577 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_2);
578 : 5 : CU_ASSERT(disc_log->numrec == 3);
579 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_2.traddr) == 0);
580 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
581 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
582 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_2.trtype);
583 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
584 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
585 : :
586 : : /* Test case 5 - check that only entries of the same transport address and type returned */
587 : 5 : tgt.discovery_filter = SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_TYPE |
588 : : SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_SVCID;
589 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_1);
590 : 5 : CU_ASSERT(disc_log->numrec == 4);
591 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_1.trsvcid) == 0);
592 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, rdma_trid_2.trsvcid) == 0);
593 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, tcp_trid_4.trsvcid) == 0);
594 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[3].trsvcid, rdma_trid_4.trsvcid) == 0);
595 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_1.trtype);
596 : 5 : CU_ASSERT(disc_log->entries[1].trtype == rdma_trid_2.trtype);
597 : 5 : CU_ASSERT(disc_log->entries[2].trtype == tcp_trid_4.trtype);
598 : 5 : CU_ASSERT(disc_log->entries[3].trtype == rdma_trid_4.trtype);
599 : :
600 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_3);
601 : 5 : CU_ASSERT(disc_log->numrec == 3);
602 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_3.trsvcid) == 0);
603 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
604 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
605 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_3.trtype);
606 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
607 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
608 : :
609 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_1);
610 : 5 : CU_ASSERT(disc_log->numrec == 3);
611 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_1.trsvcid) == 0);
612 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
613 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
614 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_1.trtype);
615 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
616 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
617 : :
618 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_2);
619 : 5 : CU_ASSERT(disc_log->numrec == 4);
620 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_2.trsvcid) == 0);
621 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_2.trsvcid) == 0);
622 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, tcp_trid_4.trsvcid) == 0);
623 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[3].trsvcid, rdma_trid_4.trsvcid) == 0);
624 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_2.trtype);
625 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_2.trtype);
626 : 5 : CU_ASSERT(disc_log->entries[2].trtype == tcp_trid_4.trtype);
627 : 5 : CU_ASSERT(disc_log->entries[3].trtype == rdma_trid_4.trtype);
628 : :
629 : : /* Test case 6 - check that only entries of the same transport address and type returned.
630 : : * That also implies trtype since RDMA and TCP listeners can't occupy the same socket */
631 : 5 : tgt.discovery_filter = SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_ADDRESS |
632 : : SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_SVCID;
633 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_1);
634 : 5 : CU_ASSERT(disc_log->numrec == 3);
635 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_1.traddr) == 0);
636 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
637 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
638 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_1.trsvcid) == 0);
639 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
640 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
641 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_1.trtype);
642 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
643 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
644 : :
645 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_2);
646 : 5 : CU_ASSERT(disc_log->numrec == 3);
647 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_2.traddr) == 0);
648 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
649 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
650 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_2.trsvcid) == 0);
651 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
652 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
653 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_2.trtype);
654 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
655 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
656 : :
657 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_3);
658 : 5 : CU_ASSERT(disc_log->numrec == 3);
659 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_3.traddr) == 0);
660 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
661 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
662 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_3.trsvcid) == 0);
663 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
664 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
665 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_3.trtype);
666 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
667 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
668 : :
669 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_1);
670 : 5 : CU_ASSERT(disc_log->numrec == 3);
671 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_1.traddr) == 0);
672 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
673 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
674 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_1.trsvcid) == 0);
675 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
676 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
677 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_1.trtype);
678 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
679 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
680 : :
681 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_2);
682 : 5 : CU_ASSERT(disc_log->numrec == 3);
683 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_2.traddr) == 0);
684 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
685 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
686 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_2.trsvcid) == 0);
687 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
688 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
689 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_2.trtype);
690 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
691 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
692 : :
693 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_3);
694 : 5 : CU_ASSERT(disc_log->numrec == 3);
695 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_3.traddr) == 0);
696 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
697 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
698 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_3.trsvcid) == 0);
699 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
700 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
701 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_3.trtype);
702 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
703 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
704 : :
705 : : /* Test case 7 - check that only entries of the same transport address, svcid and type returned */
706 : 5 : tgt.discovery_filter = SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_TYPE |
707 : : SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_ADDRESS |
708 : : SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_SVCID;
709 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_1);
710 : 5 : CU_ASSERT(disc_log->numrec == 3);
711 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_1.traddr) == 0);
712 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
713 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
714 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_1.trsvcid) == 0);
715 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
716 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
717 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_1.trtype);
718 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
719 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
720 : :
721 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_2);
722 : 5 : CU_ASSERT(disc_log->numrec == 3);
723 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_2.traddr) == 0);
724 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
725 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
726 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_2.trsvcid) == 0);
727 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
728 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
729 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_2.trtype);
730 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
731 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
732 : :
733 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &rdma_trid_3);
734 : 5 : CU_ASSERT(disc_log->numrec == 3);
735 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, rdma_trid_3.traddr) == 0);
736 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
737 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
738 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, rdma_trid_3.trsvcid) == 0);
739 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
740 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
741 : 5 : CU_ASSERT(disc_log->entries[0].trtype == rdma_trid_3.trtype);
742 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
743 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
744 : :
745 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_1);
746 : 5 : CU_ASSERT(disc_log->numrec == 3);
747 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_1.traddr) == 0);
748 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
749 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
750 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_1.trsvcid) == 0);
751 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
752 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
753 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_1.trtype);
754 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
755 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
756 : :
757 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_2);
758 : 5 : CU_ASSERT(disc_log->numrec == 3);
759 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_2.traddr) == 0);
760 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
761 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
762 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_2.trsvcid) == 0);
763 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
764 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
765 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_2.trtype);
766 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
767 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
768 : :
769 : 5 : nvmf_get_discovery_log_page(&tgt, hostnqn, &iov, 1, 0, 8192, &tcp_trid_3);
770 : 5 : CU_ASSERT(disc_log->numrec == 3);
771 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].traddr, tcp_trid_3.traddr) == 0);
772 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].traddr, tcp_trid_4.traddr) == 0);
773 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].traddr, rdma_trid_4.traddr) == 0);
774 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[0].trsvcid, tcp_trid_3.trsvcid) == 0);
775 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[1].trsvcid, tcp_trid_4.trsvcid) == 0);
776 [ - + ]: 5 : CU_ASSERT(strcasecmp(disc_log->entries[2].trsvcid, rdma_trid_4.trsvcid) == 0);
777 : 5 : CU_ASSERT(disc_log->entries[0].trtype == tcp_trid_3.trtype);
778 : 5 : CU_ASSERT(disc_log->entries[1].trtype == tcp_trid_4.trtype);
779 : 5 : CU_ASSERT(disc_log->entries[2].trtype == rdma_trid_4.trtype);
780 : :
781 : 5 : subsystem->state = SPDK_NVMF_SUBSYSTEM_INACTIVE;
782 : 5 : spdk_nvmf_subsystem_destroy(subsystem, NULL, NULL);
783 : 5 : spdk_bit_array_free(&tgt.subsystem_ids);
784 : 5 : }
785 : :
786 : : int
787 : 5 : main(int argc, char **argv)
788 : : {
789 : 5 : CU_pSuite suite = NULL;
790 : : unsigned int num_failures;
791 : :
792 : 5 : CU_initialize_registry();
793 : :
794 : 5 : suite = CU_add_suite("nvmf", NULL, NULL);
795 : :
796 : 5 : CU_ADD_TEST(suite, test_discovery_log);
797 : 5 : CU_ADD_TEST(suite, test_discovery_log_with_filters);
798 : :
799 : 5 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
800 : 5 : CU_cleanup_registry();
801 : 5 : return num_failures;
802 : : }
|