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