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