nvmf: Use trtype enum in transport instead of strings

Change-Id: Ie05f58e677107072fea6cc7702bab47a077cb595
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/370743
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
Ben Walker 2017-07-13 12:36:44 -07:00 committed by Daniel Verkamp
parent 402288ac68
commit 29f6172a56
11 changed files with 79 additions and 56 deletions

View File

@ -75,9 +75,9 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct nvmf_tgt_subsystem *tg
spdk_json_write_object_begin(w); spdk_json_write_object_begin(w);
/* NOTE: "transport" is kept for compatibility; new code should use "trtype" */ /* NOTE: "transport" is kept for compatibility; new code should use "trtype" */
spdk_json_write_name(w, "transport"); 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_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) { if (adrfam) {
spdk_json_write_name(w, "adrfam"); spdk_json_write_name(w, "adrfam");

View File

@ -41,6 +41,7 @@
#include "spdk/stdinc.h" #include "spdk/stdinc.h"
#include "spdk/env.h" #include "spdk/env.h"
#include "spdk/nvme.h"
#include "spdk/nvmf_spec.h" #include "spdk/nvmf_spec.h"
#include "spdk/queue.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); typedef void (*spdk_nvmf_subsystem_disconnect_fn)(void *cb_ctx, struct spdk_nvmf_conn *conn);
struct spdk_nvmf_listen_addr { struct spdk_nvmf_listen_addr {
enum spdk_nvme_transport_type trtype;
char *traddr; char *traddr;
char *trsvcid; char *trsvcid;
char *trname;
enum spdk_nvmf_adrfam adrfam; enum spdk_nvmf_adrfam adrfam;
TAILQ_ENTRY(spdk_nvmf_listen_addr) link; TAILQ_ENTRY(spdk_nvmf_listen_addr) link;
}; };

View File

@ -99,7 +99,7 @@ nvmf_update_discovery_log(void)
entry->subtype = subsystem->subtype; entry->subtype = subsystem->subtype;
snprintf(entry->subnqn, sizeof(entry->subnqn), "%s", subsystem->subnqn); 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); assert(transport != NULL);
transport->listen_addr_discover(listen_addr, entry); transport->listen_addr_discover(listen_addr, entry);

View File

@ -97,13 +97,15 @@ spdk_nvmf_tgt_fini(void)
} }
struct spdk_nvmf_listen_addr * 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) const char *trsvcid)
{ {
struct spdk_nvmf_listen_addr *listen_addr; struct spdk_nvmf_listen_addr *listen_addr;
const struct spdk_nvmf_transport *transport; const struct spdk_nvmf_transport *transport;
transport = spdk_nvmf_transport_get(trname); transport = spdk_nvmf_transport_get(trtype);
if (!transport) { if (!transport) {
return NULL; return NULL;
} }
@ -113,6 +115,7 @@ spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, c
return NULL; return NULL;
} }
listen_addr->trtype = trtype;
listen_addr->adrfam = adrfam; listen_addr->adrfam = adrfam;
listen_addr->traddr = strdup(traddr); 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; 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; return listen_addr;
} }
@ -144,7 +139,7 @@ spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr)
{ {
const struct spdk_nvmf_transport *transport; const struct spdk_nvmf_transport *transport;
transport = spdk_nvmf_transport_get(addr->trname); transport = spdk_nvmf_transport_get(addr->trtype);
assert(transport != NULL); assert(transport != NULL);
transport->listen_addr_remove(addr); transport->listen_addr_remove(addr);
@ -154,7 +149,6 @@ spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr)
void void
spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr) spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr)
{ {
free(addr->trname);
free(addr->trsvcid); free(addr->trsvcid);
free(addr->traddr); free(addr->traddr);
free(addr); free(addr);

View File

@ -91,7 +91,7 @@ struct spdk_nvmf_tgt {
extern struct spdk_nvmf_tgt g_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); 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_destroy(struct spdk_nvmf_listen_addr *addr);
void spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr); void spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr);

View File

@ -1592,7 +1592,7 @@ spdk_nvmf_rdma_conn_is_idle(struct spdk_nvmf_conn *conn)
} }
const struct spdk_nvmf_transport spdk_nvmf_transport_rdma = { const struct spdk_nvmf_transport spdk_nvmf_transport_rdma = {
.name = "rdma", .type = SPDK_NVME_TRANSPORT_RDMA,
.transport_init = spdk_nvmf_rdma_init, .transport_init = spdk_nvmf_rdma_init,
.transport_fini = spdk_nvmf_rdma_fini, .transport_fini = spdk_nvmf_rdma_fini,

View File

@ -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; struct spdk_nvmf_listen_addr *listen_addr;
const struct spdk_nvmf_transport *transport; const struct spdk_nvmf_transport *transport;
enum spdk_nvme_transport_type trtype;
int rc; 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) { 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) && (listen_addr->adrfam == adrfam) &&
(strcmp(listen_addr->traddr, traddr) == 0) && (strcmp(listen_addr->traddr, traddr) == 0) &&
(strcmp(listen_addr->trsvcid, trsvcid) == 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) { if (!transport) {
SPDK_ERRLOG("Unknown transport '%s'\n", trname); SPDK_ERRLOG("Unknown transport '%s'\n", trname);
return NULL; 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) { if (!listen_addr) {
return NULL; return NULL;
} }

View File

@ -59,7 +59,8 @@ spdk_nvmf_transport_init(void)
for (i = 0; i != NUM_TRANSPORTS; i++) { 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, 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) { 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 { } else {
count++; count++;
} }
@ -76,7 +77,8 @@ spdk_nvmf_transport_fini(void)
for (i = 0; i != NUM_TRANSPORTS; i++) { for (i = 0; i != NUM_TRANSPORTS; i++) {
if (g_transports[i]->transport_fini() < 0) { 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 { } else {
count++; count++;
} }
@ -96,12 +98,12 @@ spdk_nvmf_acceptor_poll(void)
} }
const struct spdk_nvmf_transport * 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; size_t i;
for (i = 0; i != NUM_TRANSPORTS; 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]; return g_transports[i];
} }
} }

View File

@ -36,15 +36,16 @@
#include "spdk/stdinc.h" #include "spdk/stdinc.h"
#include "spdk/nvme.h"
#include "spdk/nvmf.h" #include "spdk/nvmf.h"
struct spdk_nvmf_listen_addr; struct spdk_nvmf_listen_addr;
struct spdk_nvmf_transport { struct spdk_nvmf_transport {
/** /**
* Name of the transport. * Transport type
*/ */
const char *name; enum spdk_nvme_transport_type type;
/** /**
* Initialize the transport. * Initialize the transport.
@ -125,7 +126,7 @@ struct spdk_nvmf_transport {
int spdk_nvmf_transport_init(void); int spdk_nvmf_transport_init(void);
int spdk_nvmf_transport_fini(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; extern const struct spdk_nvmf_transport spdk_nvmf_transport_rdma;

View File

@ -46,7 +46,7 @@ struct spdk_nvmf_tgt g_nvmf_tgt = {
}; };
struct spdk_nvmf_listen_addr * 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) const char *traddr, const char *trsvcid)
{ {
struct spdk_nvmf_listen_addr *listen_addr; 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; return NULL;
} }
listen_addr->trname = strdup(trname); listen_addr->trtype = trtype;
if (!listen_addr->trname) {
free(listen_addr->traddr);
free(listen_addr->trsvcid);
free(listen_addr);
return NULL;
}
listen_addr->adrfam = adrfam; listen_addr->adrfam = adrfam;
return listen_addr; return listen_addr;
@ -120,15 +113,32 @@ static const struct spdk_nvmf_transport test_transport1 = {
}; };
const struct spdk_nvmf_transport * 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 &test_transport1;
} }
return NULL; 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 void
spdk_nvmf_session_destruct(struct spdk_nvmf_session *session) spdk_nvmf_session_destruct(struct spdk_nvmf_session *session)
{ {
@ -227,7 +237,7 @@ test_discovery_log(void)
NULL, NULL, NULL); NULL, NULL, NULL);
SPDK_CU_ASSERT_FATAL(subsystem != 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(listen_addr != NULL);
SPDK_CU_ASSERT_FATAL(spdk_nvmf_subsystem_add_listener(subsystem, listen_addr) == 0); SPDK_CU_ASSERT_FATAL(spdk_nvmf_subsystem_add_listener(subsystem, listen_addr) == 0);

View File

@ -46,7 +46,8 @@ SPDK_LOG_REGISTER_TRACE_FLAG("nvmf", SPDK_TRACE_NVMF)
struct spdk_nvmf_tgt g_nvmf_tgt; struct spdk_nvmf_tgt g_nvmf_tgt;
struct spdk_nvmf_listen_addr * 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) const char *trsvcid)
{ {
struct spdk_nvmf_listen_addr *listen_addr; 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; return NULL;
} }
listen_addr->trname = strdup(trname); listen_addr->trtype = trtype;
if (!listen_addr->trname) {
free(listen_addr->traddr);
free(listen_addr->trsvcid);
free(listen_addr);
return NULL;
}
listen_addr->adrfam = adrfam; listen_addr->adrfam = adrfam;
return listen_addr; return listen_addr;
@ -85,7 +79,6 @@ spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, c
void void
spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr)
{ {
free(addr->trname);
free(addr->trsvcid); free(addr->trsvcid);
free(addr->traddr); free(addr->traddr);
free(addr); free(addr);
@ -116,15 +109,32 @@ static const struct spdk_nvmf_transport test_transport1 = {
}; };
const struct spdk_nvmf_transport * 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 &test_transport1;
} }
return NULL; 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 int32_t
spdk_nvme_ctrlr_process_admin_completions(struct spdk_nvme_ctrlr *ctrlr) 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; struct spdk_nvmf_listen_addr *listen_addr;
/* Invalid trname */ /* Invalid trname */
const char *trname = "test_invalid_trname";
enum spdk_nvmf_adrfam adrfam = SPDK_NVMF_ADRFAM_IPV4; enum spdk_nvmf_adrfam adrfam = SPDK_NVMF_ADRFAM_IPV4;
const char *traddr = "192.168.100.1"; const char *traddr = "192.168.100.1";
const char *trsvcid = "4420"; 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 */ /* Listen addr is not create and create valid listen addr */
trname = "test_transport1";
adrfam = SPDK_NVMF_ADRFAM_IPV4; adrfam = SPDK_NVMF_ADRFAM_IPV4;
traddr = "192.168.3.11"; traddr = "192.168.3.11";
trsvcid = "3320"; 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); SPDK_CU_ASSERT_FATAL(listen_addr != NULL);
CU_ASSERT(listen_addr->traddr != NULL); CU_ASSERT(listen_addr->traddr != NULL);
CU_ASSERT(listen_addr->trsvcid != NULL); CU_ASSERT(listen_addr->trsvcid != NULL);