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);
/* 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");

View File

@ -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;
};

View File

@ -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);

View File

@ -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);

View File

@ -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);

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 = {
.name = "rdma",
.type = SPDK_NVME_TRANSPORT_RDMA,
.transport_init = spdk_nvmf_rdma_init,
.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;
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;
}

View File

@ -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];
}
}

View File

@ -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;

View File

@ -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);

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_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);