diff --git a/app/nvmf_tgt/conf.c b/app/nvmf_tgt/conf.c index e8dd722cb..306f46509 100644 --- a/app/nvmf_tgt/conf.c +++ b/app/nvmf_tgt/conf.c @@ -428,8 +428,7 @@ spdk_nvmf_construct_subsystem(const char *name, int32_t lcore, for (i = 0; i < num_listen_addresses; i++) { int nic_numa_node = spdk_get_ifaddr_numa_node(addresses[i].traddr); unsigned subsys_numa_node = spdk_env_get_socket_id(app_subsys->lcore); - const char *adrfam_str; - enum spdk_nvmf_adrfam adrfam; + struct spdk_nvme_transport_id trid = {}; if (nic_numa_node >= 0) { if (subsys_numa_node != (unsigned)nic_numa_node) { @@ -443,27 +442,23 @@ spdk_nvmf_construct_subsystem(const char *name, int32_t lcore, } } - if (addresses[i].transport == NULL) { + if (spdk_nvme_transport_id_parse_trtype(&trid.trtype, addresses[i].transport)) { SPDK_ERRLOG("Missing listen address transport type\n"); goto error; } - adrfam_str = addresses[i].adrfam; - if (adrfam_str == NULL) { - adrfam_str = "IPv4"; + if (spdk_nvme_transport_id_parse_adrfam(&trid.adrfam, addresses[i].adrfam)) { + trid.adrfam = SPDK_NVMF_ADRFAM_IPV4; } - if (spdk_nvme_transport_id_parse_adrfam(&adrfam, adrfam_str)) { - SPDK_ERRLOG("Unknown address family '%s'\n", adrfam_str); - goto error; - } + snprintf(trid.traddr, sizeof(trid.traddr), "%s", addresses[i].traddr); + snprintf(trid.trsvcid, sizeof(trid.trsvcid), "%s", addresses[i].trsvcid); - listen_addr = spdk_nvmf_tgt_listen(addresses[i].transport, adrfam, - addresses[i].traddr, addresses[i].trsvcid); + listen_addr = spdk_nvmf_tgt_listen(&trid); if (listen_addr == NULL) { SPDK_ERRLOG("Failed to listen on transport %s, adrfam %s, traddr %s, trsvcid %s\n", addresses[i].transport, - adrfam_str, + addresses[i].adrfam, addresses[i].traddr, addresses[i].trsvcid); goto error; diff --git a/app/nvmf_tgt/nvmf_rpc.c b/app/nvmf_tgt/nvmf_rpc.c index eb353f941..ce8b185b9 100644 --- a/app/nvmf_tgt/nvmf_rpc.c +++ b/app/nvmf_tgt/nvmf_rpc.c @@ -70,24 +70,19 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct nvmf_tgt_subsystem *tg TAILQ_FOREACH(allowed_listener, &subsystem->allowed_listeners, link) { listen_addr = allowed_listener->listen_addr; - const char *adrfam = spdk_nvme_transport_id_adrfam_str(listen_addr->adrfam); spdk_json_write_object_begin(w); /* NOTE: "transport" is kept for compatibility; new code should use "trtype" */ spdk_json_write_name(w, "transport"); - spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trtype)); + spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trid.trtype)); spdk_json_write_name(w, "trtype"); - spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trtype)); - - if (adrfam) { - spdk_json_write_name(w, "adrfam"); - spdk_json_write_string(w, adrfam); - } - + spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trid.trtype)); + spdk_json_write_name(w, "adrfam"); + spdk_json_write_string(w, spdk_nvme_transport_id_adrfam_str(listen_addr->trid.adrfam)); spdk_json_write_name(w, "traddr"); - spdk_json_write_string(w, listen_addr->traddr); + spdk_json_write_string(w, listen_addr->trid.traddr); spdk_json_write_name(w, "trsvcid"); - spdk_json_write_string(w, listen_addr->trsvcid); + spdk_json_write_string(w, listen_addr->trid.trsvcid); spdk_json_write_object_end(w); } spdk_json_write_array_end(w); diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index f7451140c..00259bbab 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -68,10 +68,7 @@ typedef void (*spdk_nvmf_subsystem_connect_fn)(void *cb_ctx, struct spdk_nvmf_re typedef void (*spdk_nvmf_subsystem_disconnect_fn)(void *cb_ctx, struct spdk_nvmf_conn *conn); struct spdk_nvmf_listen_addr { - enum spdk_nvme_transport_type trtype; - char *traddr; - char *trsvcid; - enum spdk_nvmf_adrfam adrfam; + struct spdk_nvme_transport_id trid; TAILQ_ENTRY(spdk_nvmf_listen_addr) link; }; @@ -138,8 +135,7 @@ struct spdk_nvmf_subsystem *spdk_nvmf_find_subsystem(const char *subnqn); bool spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn); -struct spdk_nvmf_listen_addr *spdk_nvmf_tgt_listen(const char *trname, enum spdk_nvmf_adrfam adrfam, - const char *traddr, const char *trsvcid); +struct spdk_nvmf_listen_addr *spdk_nvmf_tgt_listen(struct spdk_nvme_transport_id *trid); int spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_listen_addr *listen_addr); diff --git a/lib/nvmf/ctrlr_discovery.c b/lib/nvmf/ctrlr_discovery.c index b758150f8..5fcd19a57 100644 --- a/lib/nvmf/ctrlr_discovery.c +++ b/lib/nvmf/ctrlr_discovery.c @@ -99,7 +99,7 @@ nvmf_update_discovery_log(void) entry->subtype = subsystem->subtype; snprintf(entry->subnqn, sizeof(entry->subnqn), "%s", subsystem->subnqn); - transport = spdk_nvmf_transport_get(listen_addr->trtype); + transport = spdk_nvmf_transport_get(listen_addr->trid.trtype); assert(transport != NULL); transport->listen_addr_discover(listen_addr, entry); diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index c287f402a..5fe9765e2 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -97,15 +97,12 @@ spdk_nvmf_tgt_fini(void) } struct spdk_nvmf_listen_addr * -spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, - enum spdk_nvmf_adrfam adrfam, - const char *traddr, - const char *trsvcid) +spdk_nvmf_listen_addr_create(struct spdk_nvme_transport_id *trid) { struct spdk_nvmf_listen_addr *listen_addr; const struct spdk_nvmf_transport *transport; - transport = spdk_nvmf_transport_get(trtype); + transport = spdk_nvmf_transport_get(trid->trtype); if (!transport) { return NULL; } @@ -115,21 +112,7 @@ spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, return NULL; } - listen_addr->trtype = trtype; - listen_addr->adrfam = adrfam; - - listen_addr->traddr = strdup(traddr); - if (!listen_addr->traddr) { - free(listen_addr); - return NULL; - } - - listen_addr->trsvcid = strdup(trsvcid); - if (!listen_addr->trsvcid) { - free(listen_addr->traddr); - free(listen_addr); - return NULL; - } + listen_addr->trid = *trid; return listen_addr; } @@ -139,18 +122,10 @@ spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) { const struct spdk_nvmf_transport *transport; - transport = spdk_nvmf_transport_get(addr->trtype); + transport = spdk_nvmf_transport_get(addr->trid.trtype); assert(transport != NULL); transport->listen_addr_remove(addr); - spdk_nvmf_listen_addr_cleanup(addr); -} - -void -spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr) -{ - free(addr->trsvcid); - free(addr->traddr); free(addr); } diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index 5d814430f..54c279ff1 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -91,10 +91,8 @@ struct spdk_nvmf_tgt { extern struct spdk_nvmf_tgt g_nvmf_tgt; -struct spdk_nvmf_listen_addr *spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, - enum spdk_nvmf_adrfam adrfam, const char *traddr, const char *trsvcid); +struct spdk_nvmf_listen_addr *spdk_nvmf_listen_addr_create(struct spdk_nvme_transport_id *trid); void spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr); -void spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr); #define OBJECT_NVMF_IO 0x30 diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 2c6ea3288..59ab6b2b5 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -178,8 +178,7 @@ struct spdk_nvmf_rdma_session { }; struct spdk_nvmf_rdma_listen_addr { - char *traddr; - char *trsvcid; + struct spdk_nvme_transport_id trid; struct rdma_cm_id *id; struct ibv_device_attr attr; struct ibv_comp_channel *comp_channel; @@ -950,8 +949,6 @@ spdk_nvmf_rdma_listen_addr_free(struct spdk_nvmf_rdma_listen_addr *addr) return; } - free(addr->traddr); - free(addr->trsvcid); free(addr); } static int @@ -975,8 +972,7 @@ spdk_nvmf_rdma_listen_remove(struct spdk_nvmf_listen_addr *listen_addr) pthread_mutex_lock(&g_rdma.lock); TAILQ_FOREACH_SAFE(addr, &g_rdma.listen_addrs, link, tmp) { - if ((!strcasecmp(addr->traddr, listen_addr->traddr)) && - (!strcasecmp(addr->trsvcid, listen_addr->trsvcid))) { + if (spdk_nvme_transport_id_compare(&listen_addr->trid, &addr->trid) == 0) { assert(addr->ref > 0); addr->ref--; if (!addr->ref) { @@ -1016,7 +1012,7 @@ spdk_nvmf_rdma_addr_listen_init(struct spdk_nvmf_rdma_listen_addr *addr) addr->is_listened = true; SPDK_NOTICELOG("*** NVMf Target Listening on %s port %d ***\n", - addr->traddr, ntohs(rdma_get_src_port(addr->id))); + addr->trid.traddr, ntohs(rdma_get_src_port(addr->id))); } static void @@ -1103,8 +1099,7 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_listen_addr *listen_addr) pthread_mutex_lock(&g_rdma.lock); assert(g_rdma.event_channel != NULL); TAILQ_FOREACH(addr, &g_rdma.listen_addrs, link) { - if ((!strcasecmp(addr->traddr, listen_addr->traddr)) && - (!strcasecmp(addr->trsvcid, listen_addr->trsvcid))) { + if (spdk_nvme_transport_id_compare(&listen_addr->trid, &addr->trid) == 0) { addr->ref++; /* Already listening at this address */ pthread_mutex_unlock(&g_rdma.lock); @@ -1118,19 +1113,7 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_listen_addr *listen_addr) return -1; } - addr->traddr = strdup(listen_addr->traddr); - if (!addr->traddr) { - spdk_nvmf_rdma_listen_addr_free(addr); - pthread_mutex_unlock(&g_rdma.lock); - return -1; - } - - addr->trsvcid = strdup(listen_addr->trsvcid); - if (!addr->trsvcid) { - spdk_nvmf_rdma_listen_addr_free(addr); - pthread_mutex_unlock(&g_rdma.lock); - return -1; - } + addr->trid = listen_addr->trid; rc = rdma_create_id(g_rdma.event_channel, &addr->id, addr, RDMA_PS_TCP); if (rc < 0) { @@ -1142,8 +1125,8 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_listen_addr *listen_addr) memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = inet_addr(addr->traddr); - saddr.sin_port = htons((uint16_t)strtoul(addr->trsvcid, NULL, 10)); + saddr.sin_addr.s_addr = inet_addr(addr->trid.traddr); + saddr.sin_port = htons((uint16_t)strtoul(addr->trid.trsvcid, NULL, 10)); rc = rdma_bind_addr(addr->id, (struct sockaddr *)&saddr); if (rc < 0) { SPDK_ERRLOG("rdma_bind_addr() failed\n"); @@ -1197,11 +1180,11 @@ spdk_nvmf_rdma_discover(struct spdk_nvmf_listen_addr *listen_addr, struct spdk_nvmf_discovery_log_page_entry *entry) { entry->trtype = SPDK_NVMF_TRTYPE_RDMA; - entry->adrfam = listen_addr->adrfam; + entry->adrfam = listen_addr->trid.adrfam; entry->treq.secure_channel = SPDK_NVMF_TREQ_SECURE_CHANNEL_NOT_SPECIFIED; - spdk_strcpy_pad(entry->trsvcid, listen_addr->trsvcid, sizeof(entry->trsvcid), ' '); - spdk_strcpy_pad(entry->traddr, listen_addr->traddr, sizeof(entry->traddr), ' '); + spdk_strcpy_pad(entry->trsvcid, listen_addr->trid.trsvcid, sizeof(entry->trsvcid), ' '); + spdk_strcpy_pad(entry->traddr, listen_addr->trid.traddr, sizeof(entry->traddr), ' '); entry->tsas.rdma.rdma_qptype = SPDK_NVMF_RDMA_QPTYPE_RELIABLE_CONNECTED; entry->tsas.rdma.rdma_prtype = SPDK_NVMF_RDMA_PRTYPE_NONE; diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 00b13e342..b264b7651 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -259,44 +259,33 @@ spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem) } struct spdk_nvmf_listen_addr * -spdk_nvmf_tgt_listen(const char *trname, enum spdk_nvmf_adrfam adrfam, const char *traddr, - const char *trsvcid) +spdk_nvmf_tgt_listen(struct spdk_nvme_transport_id *trid) { struct spdk_nvmf_listen_addr *listen_addr; const struct spdk_nvmf_transport *transport; - enum spdk_nvme_transport_type trtype; int rc; - rc = spdk_nvme_transport_id_parse_trtype(&trtype, trname); - if (rc) { - SPDK_ERRLOG("Invalid transport type '%s'", trname); - return NULL; - } - TAILQ_FOREACH(listen_addr, &g_nvmf_tgt.listen_addrs, link) { - if (trtype == listen_addr->trtype && - (listen_addr->adrfam == adrfam) && - (strcmp(listen_addr->traddr, traddr) == 0) && - (strcmp(listen_addr->trsvcid, trsvcid) == 0)) { + if (spdk_nvme_transport_id_compare(&listen_addr->trid, trid) == 0) { return listen_addr; } } - transport = spdk_nvmf_transport_get(trtype); + transport = spdk_nvmf_transport_get(trid->trtype); if (!transport) { - SPDK_ERRLOG("Unknown transport '%s'\n", trname); + SPDK_ERRLOG("Unknown transport '%u'\n", trid->trtype); return NULL; } - listen_addr = spdk_nvmf_listen_addr_create(trtype, adrfam, traddr, trsvcid); + listen_addr = spdk_nvmf_listen_addr_create(trid); if (!listen_addr) { return NULL; } rc = transport->listen_addr_add(listen_addr); if (rc < 0) { - spdk_nvmf_listen_addr_cleanup(listen_addr); - SPDK_ERRLOG("Unable to listen on address '%s'\n", traddr); + free(listen_addr); + SPDK_ERRLOG("Unable to listen on address '%s'\n", trid->traddr); return NULL; } diff --git a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c index e028cf2c3..f79b312d4 100644 --- a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c +++ b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c @@ -46,8 +46,7 @@ struct spdk_nvmf_tgt g_nvmf_tgt = { }; struct spdk_nvmf_listen_addr * -spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, enum spdk_nvmf_adrfam adrfam, - const char *traddr, const char *trsvcid) +spdk_nvmf_listen_addr_create(struct spdk_nvme_transport_id *trid) { struct spdk_nvmf_listen_addr *listen_addr; @@ -56,29 +55,15 @@ spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, enum spdk_nvm return NULL; } - listen_addr->traddr = strdup(traddr); - if (!listen_addr->traddr) { - free(listen_addr); - return NULL; - } - - listen_addr->trsvcid = strdup(trsvcid); - if (!listen_addr->trsvcid) { - free(listen_addr->traddr); - free(listen_addr); - return NULL; - } - - listen_addr->trtype = trtype; - listen_addr->adrfam = adrfam; + listen_addr->trid = *trid; return listen_addr; } void -spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr) +spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) { - return; + free(addr); } int @@ -139,6 +124,13 @@ spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const return 0; } +int +spdk_nvme_transport_id_compare(const struct spdk_nvme_transport_id *trid1, + const struct spdk_nvme_transport_id *trid2) +{ + return 0; +} + void spdk_nvmf_session_destruct(struct spdk_nvmf_session *session) { @@ -225,6 +217,7 @@ test_discovery_log(void) struct spdk_nvmf_discovery_log_page *disc_log; struct spdk_nvmf_discovery_log_page_entry *entry; struct spdk_nvmf_listen_addr *listen_addr; + struct spdk_nvme_transport_id trid = {}; /* Reset discovery-related globals */ g_nvmf_tgt.discovery_genctr = 0; @@ -237,7 +230,11 @@ test_discovery_log(void) NULL, NULL, NULL); SPDK_CU_ASSERT_FATAL(subsystem != NULL); - listen_addr = spdk_nvmf_tgt_listen("RDMA", SPDK_NVMF_ADRFAM_IPV4, "1234", "5678"); + trid.trtype = SPDK_NVME_TRANSPORT_RDMA; + trid.adrfam = SPDK_NVMF_ADRFAM_IPV4; + snprintf(trid.traddr, sizeof(trid.traddr), "1234"); + snprintf(trid.trsvcid, sizeof(trid.trsvcid), "5678"); + listen_addr = spdk_nvmf_tgt_listen(&trid); SPDK_CU_ASSERT_FATAL(listen_addr != NULL); SPDK_CU_ASSERT_FATAL(spdk_nvmf_subsystem_add_listener(subsystem, listen_addr) == 0); diff --git a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c index 3f864d031..05dd01c9f 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -46,9 +46,7 @@ SPDK_LOG_REGISTER_TRACE_FLAG("nvmf", SPDK_TRACE_NVMF) struct spdk_nvmf_tgt g_nvmf_tgt; struct spdk_nvmf_listen_addr * -spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, enum spdk_nvmf_adrfam adrfam, - const char *traddr, - const char *trsvcid) +spdk_nvmf_listen_addr_create(struct spdk_nvme_transport_id *trid) { struct spdk_nvmf_listen_addr *listen_addr; @@ -57,21 +55,7 @@ spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, enum spdk_nvm return NULL; } - listen_addr->traddr = strdup(traddr); - if (!listen_addr->traddr) { - free(listen_addr); - return NULL; - } - - listen_addr->trsvcid = strdup(trsvcid); - if (!listen_addr->trsvcid) { - free(listen_addr->traddr); - free(listen_addr); - return NULL; - } - - listen_addr->trtype = trtype; - listen_addr->adrfam = adrfam; + listen_addr->trid = *trid; return listen_addr; } @@ -79,17 +63,9 @@ spdk_nvmf_listen_addr_create(enum spdk_nvme_transport_type trtype, enum spdk_nvm void spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) { - free(addr->trsvcid); - free(addr->traddr); free(addr); } -void -spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr) -{ - return; -} - static int test_transport1_listen_addr_add(struct spdk_nvmf_listen_addr *listen_addr) { @@ -135,6 +111,13 @@ spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const return 0; } +int +spdk_nvme_transport_id_compare(const struct spdk_nvme_transport_id *trid1, + const struct spdk_nvme_transport_id *trid2) +{ + return 0; +} + int32_t spdk_nvme_ctrlr_process_admin_completions(struct spdk_nvme_ctrlr *ctrlr) { @@ -181,21 +164,21 @@ static void test_spdk_nvmf_tgt_listen(void) { struct spdk_nvmf_listen_addr *listen_addr; + struct spdk_nvme_transport_id trid = {}; - /* Invalid trname */ - enum spdk_nvmf_adrfam adrfam = SPDK_NVMF_ADRFAM_IPV4; - const char *traddr = "192.168.100.1"; - const char *trsvcid = "4420"; - CU_ASSERT(spdk_nvmf_tgt_listen("INVALID", adrfam, traddr, trsvcid) == NULL); + /* Invalid trtype */ + trid.trtype = 55; + trid.adrfam = SPDK_NVMF_ADRFAM_IPV4; + snprintf(trid.traddr, sizeof(trid.traddr), "192.168.100.1"); + snprintf(trid.trsvcid, sizeof(trid.trsvcid), "4420"); + CU_ASSERT(spdk_nvmf_tgt_listen(&trid) == NULL); - /* Listen addr is not create and create valid listen addr */ - adrfam = SPDK_NVMF_ADRFAM_IPV4; - traddr = "192.168.3.11"; - trsvcid = "3320"; - listen_addr = spdk_nvmf_tgt_listen("RDMA", adrfam, traddr, trsvcid); + trid.trtype = SPDK_NVME_TRANSPORT_RDMA; + trid.adrfam = SPDK_NVMF_ADRFAM_IPV4; + snprintf(trid.traddr, sizeof(trid.traddr), "192.168.100.1"); + snprintf(trid.trsvcid, sizeof(trid.trsvcid), "4420"); + listen_addr = spdk_nvmf_tgt_listen(&trid); SPDK_CU_ASSERT_FATAL(listen_addr != NULL); - CU_ASSERT(listen_addr->traddr != NULL); - CU_ASSERT(listen_addr->trsvcid != NULL); spdk_nvmf_listen_addr_destroy(listen_addr); }