From 29f6172a56f4ab47c93b55fcea757725a3404141 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Thu, 13 Jul 2017 12:36:44 -0700 Subject: [PATCH] nvmf: Use trtype enum in transport instead of strings Change-Id: Ie05f58e677107072fea6cc7702bab47a077cb595 Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/370743 Reviewed-by: Daniel Verkamp Tested-by: SPDK Automated Test System --- app/nvmf_tgt/nvmf_rpc.c | 4 +- include/spdk/nvmf.h | 3 +- lib/nvmf/ctrlr_discovery.c | 2 +- lib/nvmf/nvmf.c | 18 +++------ lib/nvmf/nvmf_internal.h | 2 +- lib/nvmf/rdma.c | 2 +- lib/nvmf/subsystem.c | 13 ++++-- lib/nvmf/transport.c | 10 +++-- lib/nvmf/transport.h | 7 ++-- .../ctrlr_discovery.c/ctrlr_discovery_ut.c | 34 ++++++++++------ test/unit/lib/nvmf/subsystem.c/subsystem_ut.c | 40 +++++++++++-------- 11 files changed, 79 insertions(+), 56 deletions(-) diff --git a/app/nvmf_tgt/nvmf_rpc.c b/app/nvmf_tgt/nvmf_rpc.c index e9ab38a73..eb353f941 100644 --- a/app/nvmf_tgt/nvmf_rpc.c +++ b/app/nvmf_tgt/nvmf_rpc.c @@ -75,9 +75,9 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct nvmf_tgt_subsystem *tg 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, listen_addr->trname); + spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trtype)); spdk_json_write_name(w, "trtype"); - spdk_json_write_string(w, listen_addr->trname); + spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trtype)); if (adrfam) { spdk_json_write_name(w, "adrfam"); diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index 4da6658b2..f7451140c 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -41,6 +41,7 @@ #include "spdk/stdinc.h" #include "spdk/env.h" +#include "spdk/nvme.h" #include "spdk/nvmf_spec.h" #include "spdk/queue.h" @@ -67,9 +68,9 @@ 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; - char *trname; enum spdk_nvmf_adrfam adrfam; TAILQ_ENTRY(spdk_nvmf_listen_addr) link; }; diff --git a/lib/nvmf/ctrlr_discovery.c b/lib/nvmf/ctrlr_discovery.c index 1d4493c9a..b758150f8 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->trname); + transport = spdk_nvmf_transport_get(listen_addr->trtype); assert(transport != NULL); transport->listen_addr_discover(listen_addr, entry); diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index d4db36f94..c287f402a 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -97,13 +97,15 @@ spdk_nvmf_tgt_fini(void) } struct spdk_nvmf_listen_addr * -spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, const char *traddr, +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 *listen_addr; const struct spdk_nvmf_transport *transport; - transport = spdk_nvmf_transport_get(trname); + transport = spdk_nvmf_transport_get(trtype); if (!transport) { return NULL; } @@ -113,6 +115,7 @@ spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, c return NULL; } + listen_addr->trtype = trtype; listen_addr->adrfam = adrfam; listen_addr->traddr = strdup(traddr); @@ -128,14 +131,6 @@ spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, c return NULL; } - listen_addr->trname = strdup(trname); - if (!listen_addr->trname) { - free(listen_addr->traddr); - free(listen_addr->trsvcid); - free(listen_addr); - return NULL; - } - return listen_addr; } @@ -144,7 +139,7 @@ spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) { const struct spdk_nvmf_transport *transport; - transport = spdk_nvmf_transport_get(addr->trname); + transport = spdk_nvmf_transport_get(addr->trtype); assert(transport != NULL); transport->listen_addr_remove(addr); @@ -154,7 +149,6 @@ spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) void spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr) { - free(addr->trname); free(addr->trsvcid); free(addr->traddr); free(addr); diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index a870b220c..5d814430f 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -91,7 +91,7 @@ struct spdk_nvmf_tgt { extern struct spdk_nvmf_tgt g_nvmf_tgt; -struct spdk_nvmf_listen_addr *spdk_nvmf_listen_addr_create(const char *trname, +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); void spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr); void spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr); diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 396ca3f1f..2c6ea3288 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -1592,7 +1592,7 @@ spdk_nvmf_rdma_conn_is_idle(struct spdk_nvmf_conn *conn) } const struct spdk_nvmf_transport spdk_nvmf_transport_rdma = { - .name = "rdma", + .type = SPDK_NVME_TRANSPORT_RDMA, .transport_init = spdk_nvmf_rdma_init, .transport_fini = spdk_nvmf_rdma_fini, diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 935b3ce67..00b13e342 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -264,10 +264,17 @@ spdk_nvmf_tgt_listen(const char *trname, enum spdk_nvmf_adrfam adrfam, const cha { 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 ((strcmp(listen_addr->trname, trname) == 0) && + if (trtype == listen_addr->trtype && (listen_addr->adrfam == adrfam) && (strcmp(listen_addr->traddr, traddr) == 0) && (strcmp(listen_addr->trsvcid, trsvcid) == 0)) { @@ -275,13 +282,13 @@ spdk_nvmf_tgt_listen(const char *trname, enum spdk_nvmf_adrfam adrfam, const cha } } - transport = spdk_nvmf_transport_get(trname); + transport = spdk_nvmf_transport_get(trtype); if (!transport) { SPDK_ERRLOG("Unknown transport '%s'\n", trname); return NULL; } - listen_addr = spdk_nvmf_listen_addr_create(trname, adrfam, traddr, trsvcid); + listen_addr = spdk_nvmf_listen_addr_create(trtype, adrfam, traddr, trsvcid); if (!listen_addr) { return NULL; } diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index 1b9b0bccc..a6cbe25bf 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -59,7 +59,8 @@ spdk_nvmf_transport_init(void) for (i = 0; i != NUM_TRANSPORTS; i++) { if (g_transports[i]->transport_init(g_nvmf_tgt.max_queue_depth, g_nvmf_tgt.max_io_size, g_nvmf_tgt.in_capsule_data_size) < 0) { - SPDK_NOTICELOG("%s transport init failed\n", g_transports[i]->name); + SPDK_NOTICELOG("Transport type %s init failed\n", + spdk_nvme_transport_id_trtype_str(g_transports[i]->type)); } else { count++; } @@ -76,7 +77,8 @@ spdk_nvmf_transport_fini(void) for (i = 0; i != NUM_TRANSPORTS; i++) { if (g_transports[i]->transport_fini() < 0) { - SPDK_NOTICELOG("%s transport fini failed\n", g_transports[i]->name); + SPDK_NOTICELOG("Transport type %s fini failed\n", + spdk_nvme_transport_id_trtype_str(g_transports[i]->type)); } else { count++; } @@ -96,12 +98,12 @@ spdk_nvmf_acceptor_poll(void) } const struct spdk_nvmf_transport * -spdk_nvmf_transport_get(const char *name) +spdk_nvmf_transport_get(enum spdk_nvme_transport_type type) { size_t i; for (i = 0; i != NUM_TRANSPORTS; i++) { - if (strcasecmp(name, g_transports[i]->name) == 0) { + if (type == g_transports[i]->type) { return g_transports[i]; } } diff --git a/lib/nvmf/transport.h b/lib/nvmf/transport.h index 2c6959e7d..7e930c846 100644 --- a/lib/nvmf/transport.h +++ b/lib/nvmf/transport.h @@ -36,15 +36,16 @@ #include "spdk/stdinc.h" +#include "spdk/nvme.h" #include "spdk/nvmf.h" struct spdk_nvmf_listen_addr; struct spdk_nvmf_transport { /** - * Name of the transport. + * Transport type */ - const char *name; + enum spdk_nvme_transport_type type; /** * Initialize the transport. @@ -125,7 +126,7 @@ struct spdk_nvmf_transport { int spdk_nvmf_transport_init(void); int spdk_nvmf_transport_fini(void); -const struct spdk_nvmf_transport *spdk_nvmf_transport_get(const char *name); +const struct spdk_nvmf_transport *spdk_nvmf_transport_get(enum spdk_nvme_transport_type type); extern const struct spdk_nvmf_transport spdk_nvmf_transport_rdma; 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 b3ea43bfe..e028cf2c3 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,7 +46,7 @@ struct spdk_nvmf_tgt g_nvmf_tgt = { }; struct spdk_nvmf_listen_addr * -spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, +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 *listen_addr; @@ -69,14 +69,7 @@ spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, return NULL; } - listen_addr->trname = strdup(trname); - if (!listen_addr->trname) { - free(listen_addr->traddr); - free(listen_addr->trsvcid); - free(listen_addr); - return NULL; - } - + listen_addr->trtype = trtype; listen_addr->adrfam = adrfam; return listen_addr; @@ -120,15 +113,32 @@ static const struct spdk_nvmf_transport test_transport1 = { }; const struct spdk_nvmf_transport * -spdk_nvmf_transport_get(const char *trname) +spdk_nvmf_transport_get(enum spdk_nvme_transport_type trtype) { - if (!strcasecmp(trname, "test_transport1")) { + if (trtype == SPDK_NVME_TRANSPORT_RDMA) { return &test_transport1; } return NULL; } +int +spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const char *str) +{ + if (trtype == NULL || str == NULL) { + return -EINVAL; + } + + if (strcasecmp(str, "PCIe") == 0) { + *trtype = SPDK_NVME_TRANSPORT_PCIE; + } else if (strcasecmp(str, "RDMA") == 0) { + *trtype = SPDK_NVME_TRANSPORT_RDMA; + } else { + return -ENOENT; + } + return 0; +} + void spdk_nvmf_session_destruct(struct spdk_nvmf_session *session) { @@ -227,7 +237,7 @@ test_discovery_log(void) NULL, NULL, NULL); SPDK_CU_ASSERT_FATAL(subsystem != NULL); - listen_addr = spdk_nvmf_tgt_listen("test_transport1", SPDK_NVMF_ADRFAM_IPV4, "1234", "5678"); + listen_addr = spdk_nvmf_tgt_listen("RDMA", SPDK_NVMF_ADRFAM_IPV4, "1234", "5678"); 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 241fa7678..3f864d031 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -46,7 +46,8 @@ 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(const char *trname, enum spdk_nvmf_adrfam adrfam, const char *traddr, +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 *listen_addr; @@ -69,14 +70,7 @@ spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, c return NULL; } - listen_addr->trname = strdup(trname); - if (!listen_addr->trname) { - free(listen_addr->traddr); - free(listen_addr->trsvcid); - free(listen_addr); - return NULL; - } - + listen_addr->trtype = trtype; listen_addr->adrfam = adrfam; return listen_addr; @@ -85,7 +79,6 @@ spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, c void spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) { - free(addr->trname); free(addr->trsvcid); free(addr->traddr); free(addr); @@ -116,15 +109,32 @@ static const struct spdk_nvmf_transport test_transport1 = { }; const struct spdk_nvmf_transport * -spdk_nvmf_transport_get(const char *trname) +spdk_nvmf_transport_get(enum spdk_nvme_transport_type trtype) { - if (!strcasecmp(trname, "test_transport1")) { + if (trtype == SPDK_NVME_TRANSPORT_RDMA) { return &test_transport1; } return NULL; } +int +spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const char *str) +{ + if (trtype == NULL || str == NULL) { + return -EINVAL; + } + + if (strcasecmp(str, "PCIe") == 0) { + *trtype = SPDK_NVME_TRANSPORT_PCIE; + } else if (strcasecmp(str, "RDMA") == 0) { + *trtype = SPDK_NVME_TRANSPORT_RDMA; + } else { + return -ENOENT; + } + return 0; +} + int32_t spdk_nvme_ctrlr_process_admin_completions(struct spdk_nvme_ctrlr *ctrlr) { @@ -173,18 +183,16 @@ test_spdk_nvmf_tgt_listen(void) struct spdk_nvmf_listen_addr *listen_addr; /* Invalid trname */ - const char *trname = "test_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(trname, adrfam, traddr, trsvcid) == NULL); + CU_ASSERT(spdk_nvmf_tgt_listen("INVALID", adrfam, traddr, trsvcid) == NULL); /* Listen addr is not create and create valid listen addr */ - trname = "test_transport1"; adrfam = SPDK_NVMF_ADRFAM_IPV4; traddr = "192.168.3.11"; trsvcid = "3320"; - listen_addr = spdk_nvmf_tgt_listen(trname, adrfam, traddr, trsvcid); + listen_addr = spdk_nvmf_tgt_listen("RDMA", adrfam, traddr, trsvcid); SPDK_CU_ASSERT_FATAL(listen_addr != NULL); CU_ASSERT(listen_addr->traddr != NULL); CU_ASSERT(listen_addr->trsvcid != NULL);