diff --git a/libnvme/src/nvme/fabrics.c b/libnvme/src/nvme/fabrics.c index e365b5bb38..129aa134d3 100644 --- a/libnvme/src/nvme/fabrics.c +++ b/libnvme/src/nvme/fabrics.c @@ -968,13 +968,15 @@ static const char *lookup_context(struct nvme_global_ctx *ctx, nvme_ctrl_t c) nvme_for_each_host(ctx, h) { nvme_for_each_subsystem(h, s) { - if (__nvme_lookup_ctrl(s, nvme_ctrl_get_transport(c), - nvme_ctrl_get_traddr(c), - NULL, - NULL, - nvme_ctrl_get_trsvcid(c), - NULL, - NULL)) + struct nvmf_context fctx = { + .transport = nvme_ctrl_get_transport(c), + .traddr = nvme_ctrl_get_traddr(c), + .host_traddr = NULL, + .host_iface = NULL, + .trsvcid = nvme_ctrl_get_trsvcid(c), + .subsysnqn = NULL, + }; + if (nvme_ctrl_find(s, &fctx)) return nvme_subsystem_get_application(s); } } @@ -997,14 +999,16 @@ __public int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c, s = nvme_lookup_subsystem(h, NULL, nvme_ctrl_get_subsysnqn(c)); if (s) { nvme_ctrl_t fc; - - fc = __nvme_lookup_ctrl(s, nvme_ctrl_get_transport(c), - nvme_ctrl_get_traddr(c), - nvme_ctrl_get_host_traddr(c), - nvme_ctrl_get_host_iface(c), - nvme_ctrl_get_trsvcid(c), - NULL, - NULL); + struct nvmf_context fctx = { + .transport = nvme_ctrl_get_transport(c), + .traddr = nvme_ctrl_get_traddr(c), + .host_traddr = nvme_ctrl_get_host_traddr(c), + .host_iface = nvme_ctrl_get_trsvcid(c), + .trsvcid = nvme_ctrl_get_trsvcid(c), + .subsysnqn = NULL, + }; + + fc = nvme_ctrl_find(s, &fctx); if (fc) { const char *key; @@ -1094,12 +1098,10 @@ __public int nvmf_connect_ctrl(nvme_ctrl_t c) static int nvmf_connect_disc_entry(nvme_host_t h, struct nvmf_disc_log_entry *e, - const char *host_traddr, const char *host_iface, + struct nvmf_context *fctx, const struct nvme_fabrics_config *cfg, bool *discover, nvme_ctrl_t *cp) { - char *traddr = NULL, *trsvcid = NULL; - const char *transport; nvme_ctrl_t c; int ret; @@ -1109,8 +1111,8 @@ static int nvmf_connect_disc_entry(nvme_host_t h, switch (e->adrfam) { case NVMF_ADDR_FAMILY_IP4: case NVMF_ADDR_FAMILY_IP6: - traddr = e->traddr; - trsvcid = e->trsvcid; + fctx->traddr = e->traddr; + fctx->trsvcid = e->trsvcid; break; default: nvme_msg(h->ctx, LOG_ERR, @@ -1122,7 +1124,7 @@ static int nvmf_connect_disc_entry(nvme_host_t h, case NVMF_TRTYPE_FC: switch (e->adrfam) { case NVMF_ADDR_FAMILY_FC: - traddr = e->traddr; + fctx->traddr = e->traddr; break; default: nvme_msg(h->ctx, LOG_ERR, @@ -1132,7 +1134,7 @@ static int nvmf_connect_disc_entry(nvme_host_t h, } break; case NVMF_TRTYPE_LOOP: - traddr = strlen(e->traddr) ? e->traddr : NULL; + fctx->traddr = strlen(e->traddr) ? e->traddr : NULL; break; default: nvme_msg(h->ctx, LOG_ERR, "skipping unsupported transport %d\n", @@ -1140,18 +1142,18 @@ static int nvmf_connect_disc_entry(nvme_host_t h, return -EINVAL; } - transport = nvmf_trtype_str(e->trtype); + fctx->transport = nvmf_trtype_str(e->trtype); + fctx->subsysnqn = e->subnqn; nvme_msg(h->ctx, LOG_DEBUG, "lookup ctrl " "(transport: %s, traddr: %s, trsvcid %s)\n", - transport, traddr, trsvcid); + fctx->transport, fctx->traddr, fctx->trsvcid); - ret = nvme_create_ctrl(h->ctx, e->subnqn, transport, traddr, - host_traddr, host_iface, trsvcid, &c); + ret = _nvme_create_ctrl(h->ctx, fctx, &c); if (ret) { nvme_msg(h->ctx, LOG_DEBUG, "skipping discovery entry, " "failed to allocate %s controller with traddr %s\n", - transport, traddr); + fctx->transport, fctx->traddr); return ret; } @@ -1812,13 +1814,7 @@ static nvme_ctrl_t lookup_ctrl(nvme_host_t h, struct nvmf_context *fctx) nvme_ctrl_t c; nvme_for_each_subsystem(h, s) { - c = nvme_ctrl_find(s, - fctx->transport, - fctx->traddr, - fctx->trsvcid, - fctx->subsysnqn, - fctx->host_traddr, - fctx->host_iface); + c = nvme_ctrl_find(s, fctx); if (c) return c; } @@ -1996,8 +1992,7 @@ static int _nvmf_discovery(struct nvme_global_ctx *ctx, disconnect = false; } - err = nvmf_connect_disc_entry(h, e, nfctx.host_traddr, - nfctx.host_iface, nfctx.cfg, + err = nvmf_connect_disc_entry(h, e, &nfctx, nfctx.cfg, &discover, &child); nfctx.cfg->keep_alive_tmo = tmo; @@ -2072,9 +2067,7 @@ static int __create_discovery_ctrl(struct nvme_global_ctx *ctx, nvme_ctrl_t c; int tmo, ret; - ret = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport, - fctx->traddr, fctx->host_traddr, - fctx->host_iface, fctx->trsvcid, &c); + ret = _nvme_create_ctrl(ctx, fctx, &c); if (ret) return ret; @@ -2432,14 +2425,11 @@ __public int nvmf_config_modify(struct nvme_global_ctx *ctx, return -ENODEV; } - c = nvme_lookup_ctrl(s, fctx->transport, fctx->traddr, - fctx->host_traddr, fctx->host_iface, - fctx->trsvcid, NULL); + c = nvme_lookup_ctrl(s, fctx, NULL); if (!c) { nvme_msg(ctx, LOG_ERR, "Failed to lookup controller\n"); return -ENODEV; } - if (fctx->ctrlkey) nvme_ctrl_set_dhchap_ctrl_key(c, fctx->ctrlkey); @@ -2554,9 +2544,7 @@ static int nbft_connect(struct nvme_global_ctx *ctx, if (c && nvme_ctrl_get_name(c)) return 0; - ret = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport, - fctx->traddr, fctx->host_traddr, - fctx->host_iface, fctx->trsvcid, &c); + ret = _nvme_create_ctrl(ctx, fctx, &c); if (ret) return ret; @@ -2653,8 +2641,7 @@ static int nbft_discovery(struct nvme_global_ctx *ctx, if (e->subtype == NVME_NQN_DISC) { nvme_ctrl_t child; - ret = nvmf_connect_disc_entry(h, e, - nfctx.host_traddr, nfctx.host_iface, + ret = nvmf_connect_disc_entry(h, e, &nfctx, defcfg, NULL, &child); if (ret) continue; @@ -2936,10 +2923,7 @@ __public int nvmf_discovery(struct nvme_global_ctx *ctx, struct nvmf_context *fc ret = nvme_scan_ctrl(ctx, fctx->device, &c); if (!ret) { /* Check if device matches command-line options */ - if (!nvme_ctrl_match_config(c, fctx->transport, - fctx->traddr, fctx->trsvcid, - fctx->subsysnqn, fctx->host_traddr, - fctx->host_iface)) { + if (!_nvme_ctrl_match_config(c, fctx)) { nvme_msg(ctx, LOG_ERR, "ctrl device %s found, ignoring non matching command-line options\n", fctx->device); @@ -3037,9 +3021,7 @@ __public int nvmf_connect(struct nvme_global_ctx *ctx, struct nvmf_context *fctx return -EALREADY; } - err = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport, - fctx->traddr, fctx->host_traddr, fctx->host_iface, - fctx->trsvcid, &c); + err = _nvme_create_ctrl(ctx, fctx, &c); if (err) return err; diff --git a/libnvme/src/nvme/json.c b/libnvme/src/nvme/json.c index 329c6e72ca..f42f3a26e2 100644 --- a/libnvme/src/nvme/json.c +++ b/libnvme/src/nvme/json.c @@ -83,27 +83,25 @@ static void json_parse_port(nvme_subsystem_t s, struct json_object *port_obj) { nvme_ctrl_t c; struct json_object *attr_obj; - const char *transport, *traddr = NULL; - const char *host_traddr = NULL, *host_iface = NULL, *trsvcid = NULL; + struct nvmf_context fctx = {}; attr_obj = json_object_object_get(port_obj, "transport"); if (!attr_obj) return; - transport = json_object_get_string(attr_obj); + fctx.transport = json_object_get_string(attr_obj); attr_obj = json_object_object_get(port_obj, "traddr"); if (attr_obj) - traddr = json_object_get_string(attr_obj); + fctx.traddr = json_object_get_string(attr_obj); attr_obj = json_object_object_get(port_obj, "host_traddr"); if (attr_obj) - host_traddr = json_object_get_string(attr_obj); + fctx.host_traddr = json_object_get_string(attr_obj); attr_obj = json_object_object_get(port_obj, "host_iface"); if (attr_obj) - host_iface = json_object_get_string(attr_obj); + fctx.host_iface = json_object_get_string(attr_obj); attr_obj = json_object_object_get(port_obj, "trsvcid"); if (attr_obj) - trsvcid = json_object_get_string(attr_obj); - c = nvme_lookup_ctrl(s, transport, traddr, host_traddr, - host_iface, trsvcid, NULL); + fctx.trsvcid = json_object_get_string(attr_obj); + c = nvme_lookup_ctrl(s, &fctx, NULL); if (!c) return; json_update_attributes(c, port_obj); diff --git a/libnvme/src/nvme/private.h b/libnvme/src/nvme/private.h index 82873fcd6b..1f92efbc19 100644 --- a/libnvme/src/nvme/private.h +++ b/libnvme/src/nvme/private.h @@ -381,10 +381,10 @@ int __nvme_transport_handle_open_mi(struct nvme_transport_handle *hdl, const cha int __nvme_transport_handle_init_mi(struct nvme_transport_handle *hdl); void __nvme_transport_handle_close_mi(struct nvme_transport_handle *hdl); -nvme_ctrl_t __nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, - const char *traddr, const char *host_traddr, - const char *host_iface, const char *trsvcid, - const char *subsysnqn, nvme_ctrl_t p); +int _nvme_create_ctrl(struct nvme_global_ctx *ctx, + struct nvmf_context *fctx, + nvme_ctrl_t *cp); +bool _nvme_ctrl_match_config(struct nvme_ctrl *c, struct nvmf_context *fctx); void *__nvme_alloc(size_t len); @@ -395,14 +395,10 @@ nvme_host_t nvme_lookup_host(struct nvme_global_ctx *ctx, const char *hostnqn, nvme_subsystem_t nvme_lookup_subsystem(struct nvme_host *h, const char *name, const char *subsysnqn); -nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, - const char *traddr, const char *host_traddr, - const char *host_iface, const char *trsvcid, +nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, + struct nvmf_context *fctx, nvme_ctrl_t p); -nvme_ctrl_t nvme_ctrl_find(nvme_subsystem_t s, const char *transport, - const char *traddr, const char *trsvcid, - const char *subsysnqn, const char *host_traddr, - const char *host_iface); +nvme_ctrl_t nvme_ctrl_find(nvme_subsystem_t s, struct nvmf_context *fctx); void __nvme_free_host(nvme_host_t h); diff --git a/libnvme/src/nvme/tree.c b/libnvme/src/nvme/tree.c index 0d836b436a..010dd3ce93 100644 --- a/libnvme/src/nvme/tree.c +++ b/libnvme/src/nvme/tree.c @@ -1062,26 +1062,24 @@ __public void nvmf_default_config(struct nvme_fabrics_config *cfg) cfg->ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO; } -__public int nvme_create_ctrl(struct nvme_global_ctx *ctx, - const char *subsysnqn, const char *transport, - const char *traddr, const char *host_traddr, - const char *host_iface, const char *trsvcid, - nvme_ctrl_t *cp) +int _nvme_create_ctrl(struct nvme_global_ctx *ctx, + struct nvmf_context *fctx, + nvme_ctrl_t *cp) { struct nvme_ctrl *c; - if (!transport) { + if (!fctx->transport) { nvme_msg(ctx, LOG_ERR, "No transport specified\n"); return -EINVAL; } - if (strncmp(transport, "loop", 4) && - strncmp(transport, "pcie", 4) && - strncmp(transport, "apple-nvme", 10) && !traddr) { + if (strncmp(fctx->transport, "loop", 4) && + strncmp(fctx->transport, "pcie", 4) && + strncmp(fctx->transport, "apple-nvme", 10) && !fctx->traddr) { nvme_msg(ctx, LOG_ERR, "No transport address for '%s'\n", - transport); + fctx->transport); return -EINVAL; } - if (!subsysnqn) { + if (!fctx->subsysnqn) { nvme_msg(ctx, LOG_ERR, "No subsystem NQN specified\n"); return -EINVAL; } @@ -1095,25 +1093,44 @@ __public int nvme_create_ctrl(struct nvme_global_ctx *ctx, list_head_init(&c->namespaces); list_head_init(&c->paths); list_node_init(&c->entry); - c->transport = strdup(transport); - c->subsysnqn = strdup(subsysnqn); - if (traddr) - c->traddr = strdup(traddr); - if (host_traddr) { - if (traddr_is_hostname(transport, host_traddr)) - hostname2traddr(ctx, host_traddr, &c->host_traddr); + c->transport = strdup(fctx->transport); + c->subsysnqn = strdup(fctx->subsysnqn); + if (fctx->traddr) + c->traddr = strdup(fctx->traddr); + if (fctx->host_traddr) { + if (traddr_is_hostname(fctx->transport, fctx->host_traddr)) + hostname2traddr(ctx, fctx->host_traddr, + &c->host_traddr); if (!c->host_traddr) - c->host_traddr = strdup(host_traddr); + c->host_traddr = strdup(fctx->host_traddr); } - if (host_iface) - c->host_iface = strdup(host_iface); - if (trsvcid) - c->trsvcid = strdup(trsvcid); + if (fctx->host_iface) + c->host_iface = strdup(fctx->host_iface); + if (fctx->trsvcid) + c->trsvcid = strdup(fctx->trsvcid); *cp = c; return 0; } +__public int nvme_create_ctrl(struct nvme_global_ctx *ctx, + const char *subsysnqn, const char *transport, + const char *traddr, const char *host_traddr, + const char *host_iface, const char *trsvcid, + nvme_ctrl_t *cp) +{ + struct nvmf_context fctx = { + .transport = transport, + .traddr = traddr, + .host_traddr = host_traddr, + .host_iface = host_iface, + .trsvcid = trsvcid, + .subsysnqn = subsysnqn, + }; + + return _nvme_create_ctrl(ctx, &fctx, cp); +} + /** * _tcp_ctrl_match_host_traddr_no_src_addr() - Match host_traddr w/o src_addr * @c: An existing controller instance @@ -1393,23 +1410,20 @@ static bool _match_ctrl(struct nvme_ctrl *c, struct candidate_args *candidate) */ static ctrl_match_t _candidate_init(struct nvme_global_ctx *ctx, struct candidate_args *candidate, - const char *transport, - const char *traddr, - const char *trsvcid, - const char *subsysnqn, - const char *host_traddr, - const char *host_iface) + struct nvmf_context *fctx) { memset(candidate, 0, sizeof(*candidate)); - candidate->traddr = traddr; - candidate->trsvcid = trsvcid; - candidate->transport = transport; - candidate->subsysnqn = subsysnqn; - candidate->host_iface = streqcase0(host_iface, "none") ? NULL : host_iface; - candidate->host_traddr = streqcase0(host_traddr, "none") ? NULL : host_traddr; + candidate->traddr = fctx->traddr; + candidate->trsvcid = fctx->trsvcid; + candidate->transport = fctx->transport; + candidate->subsysnqn = fctx->subsysnqn; + candidate->host_iface = streqcase0(fctx->host_iface, "none") ? + NULL : fctx->host_iface; + candidate->host_traddr = streqcase0(fctx->host_traddr, "none") ? + NULL : fctx->host_traddr; - if (streq0(subsysnqn, NVME_DISC_SUBSYS_NAME)) { + if (streq0(fctx->subsysnqn, NVME_DISC_SUBSYS_NAME)) { /* Since TP8013, the NQN of discovery controllers can be the * well-known NQN (i.e. nqn.2014-08.org.nvmexpress.discovery) or * a unique NQN. A DC created using the well-known NQN may later @@ -1421,13 +1435,13 @@ static ctrl_match_t _candidate_init(struct nvme_global_ctx *ctx, candidate->well_known_nqn = true; } - if (streq0(transport, "tcp")) { + if (streq0(fctx->transport, "tcp")) { candidate->iface_list = nvme_getifaddrs(ctx); /* TCP only */ candidate->addreq = nvme_ipaddrs_eq; return _tcp_match_ctrl; } - if (streq0(transport, "rdma")) { + if (streq0(fctx->transport, "rdma")) { candidate->addreq = nvme_ipaddrs_eq; return _match_ctrl; } @@ -1437,19 +1451,16 @@ static ctrl_match_t _candidate_init(struct nvme_global_ctx *ctx, return _match_ctrl; } -nvme_ctrl_t __nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, - const char *traddr, const char *host_traddr, - const char *host_iface, const char *trsvcid, - const char *subsysnqn, nvme_ctrl_t p) +static nvme_ctrl_t __nvme_ctrl_find(nvme_subsystem_t s, + struct nvmf_context *fctx, + nvme_ctrl_t p) { struct candidate_args candidate = {}; struct nvme_ctrl *c, *matching_c = NULL; ctrl_match_t ctrl_match; /* Init candidate and get the matching function to use */ - ctrl_match = _candidate_init(s->h->ctx, &candidate, transport, traddr, - trsvcid, subsysnqn, host_traddr, - host_iface); + ctrl_match = _candidate_init(s->h->ctx, &candidate, fctx); c = p ? nvme_subsystem_next_ctrl(s, p) : nvme_subsystem_first_ctrl(s); for (; c != NULL; c = nvme_subsystem_next_ctrl(s, c)) { @@ -1462,51 +1473,65 @@ nvme_ctrl_t __nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, return matching_c; } -__public bool nvme_ctrl_match_config(struct nvme_ctrl *c, const char *transport, - const char *traddr, const char *trsvcid, - const char *subsysnqn, const char *host_traddr, - const char *host_iface) +bool _nvme_ctrl_match_config(struct nvme_ctrl *c, struct nvmf_context *fctx) { struct candidate_args candidate = {}; ctrl_match_t ctrl_match; /* Init candidate and get the matching function to use */ - ctrl_match = _candidate_init(c->ctx, &candidate, transport, traddr, - trsvcid, subsysnqn, host_traddr, - host_iface); + ctrl_match = _candidate_init(c->ctx, &candidate, fctx); return ctrl_match(c, &candidate); } -nvme_ctrl_t nvme_ctrl_find(nvme_subsystem_t s, const char *transport, - const char *traddr, const char *trsvcid, - const char *subsysnqn, const char *host_traddr, - const char *host_iface) +__public bool nvme_ctrl_match_config(struct nvme_ctrl *c, const char *transport, + const char *traddr, const char *trsvcid, + const char *subsysnqn, const char *host_traddr, + const char *host_iface) +{ + struct nvmf_context fctx = { + .transport = transport, + .traddr = traddr, + .host_traddr = host_traddr, + .host_iface = host_iface, + .trsvcid = trsvcid, + .subsysnqn = subsysnqn, + }; + + return _nvme_ctrl_match_config(c, &fctx); +} + +nvme_ctrl_t nvme_ctrl_find(nvme_subsystem_t s, struct nvmf_context *fctx) { - return __nvme_lookup_ctrl(s, transport, traddr, host_traddr, host_iface, - trsvcid, subsysnqn, NULL/*p*/); + return __nvme_ctrl_find(s, fctx, NULL/*p*/); } -nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, - const char *traddr, const char *host_traddr, - const char *host_iface, const char *trsvcid, +nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, + struct nvmf_context *fctx, nvme_ctrl_t p) { struct nvme_global_ctx *ctx; struct nvme_ctrl *c; + const char *subsysnqn = fctx->subsysnqn; int ret; - if (!s || !transport) + if (!s || !fctx->transport) return NULL; - c = __nvme_lookup_ctrl(s, transport, traddr, host_traddr, - host_iface, trsvcid, NULL, p); - if (c) + /* Clear out subsysnqn; might be different for discovery subsystems */ + fctx->subsysnqn = NULL; + c = __nvme_ctrl_find(s, fctx, p); + if (c) { + fctx->subsysnqn = subsysnqn; return c; + } ctx = s->h ? s->h->ctx : NULL; - ret = nvme_create_ctrl(ctx, s->subsysnqn, transport, traddr, - host_traddr, host_iface, trsvcid, &c); + /* Set the NQN to the subsystem the controller should be created in */ + fctx->subsysnqn = s->subsysnqn; + ret = _nvme_create_ctrl(ctx, fctx, &c); + /* And restore NQN to avoid issues with repetitive calls */ + fctx->subsysnqn = subsysnqn; if (ret) return NULL; @@ -1866,8 +1891,14 @@ int nvme_ctrl_alloc(struct nvme_global_ctx *ctx, nvme_subsystem_t s, skip_address: p = NULL; do { - c = nvme_lookup_ctrl(s, transport, traddr, - host_traddr, host_iface, trsvcid, p); + struct nvmf_context fctx = { + .transport = transport, + .traddr = traddr, + .host_traddr = host_traddr, + .host_iface = host_iface, + .trsvcid = trsvcid, + }; + c = nvme_lookup_ctrl(s, &fctx, p); if (c) { if (!c->name) break; diff --git a/libnvme/test/tree.c b/libnvme/test/tree.c index 076c10c485..6bb23a2b7b 100644 --- a/libnvme/test/tree.c +++ b/libnvme/test/tree.c @@ -17,15 +17,8 @@ struct test_data { /* input data */ - const char *hostnqn; - const char *hostid; + struct nvmf_context f; const char *subsysname; - const char *subsysnqn; - const char *transport; - const char *traddr; - const char *host_traddr; - const char *host_iface; - const char *trsvcid; /* track controller generated by input data */ nvme_subsystem_t s; @@ -40,22 +33,27 @@ struct test_data { #define SRC_ADDR4 "192.168.56.100" #define SRC_ADDR6 "1234:5678:abcd:EF01:1234:5678:abcd:EF01" -#define DEFAULTS DEFAULT_HOSTNQN, DEFAULT_HOSTNQN, DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN +#define DEFAULTS(t, a, h, i, s) \ + .f = { .hostnqn = DEFAULT_HOSTNQN, \ + .subsysnqn = DEFAULT_SUBSYSNQN, \ + .transport = (t), .traddr = (a), .host_traddr = (h), \ + .host_iface = (i), .trsvcid = (s), }, \ + .subsysname = DEFAULT_SUBSYSNAME struct test_data test_data[] = { - { DEFAULTS, "tcp", "192.168.1.1", "192.168.1.20", NULL, "4420" }, - { DEFAULTS, "tcp", "192.168.1.1", "192.168.1.20", NULL, "4421" }, - { DEFAULTS, "tcp", "192.168.1.2", "192.168.1.20", "eth1", "4420" }, - { DEFAULTS, "tcp", "192.168.1.2", "192.168.1.20", "eth1", "4421" }, - { DEFAULTS, "rdma", "192.168.1.3", "192.168.1.20", NULL, NULL }, - { DEFAULTS, "rdma", "192.168.1.4", "192.168.1.20", NULL, NULL }, - { DEFAULTS, "fc", - "nn-0x201700a09890f5bf:pn-0x201900a09890f5bf", - "nn-0x200000109b579ef3:pn-0x100000109b579ef3" + { DEFAULTS("tcp", "192.168.1.1", "192.168.1.20", NULL, "4420") }, + { DEFAULTS("tcp", "192.168.1.1", "192.168.1.20", NULL, "4421") }, + { DEFAULTS("tcp", "192.168.1.2", "192.168.1.20", "eth1", "4420") }, + { DEFAULTS("tcp", "192.168.1.2", "192.168.1.20", "eth1", "4421") }, + { DEFAULTS("rdma", "192.168.1.3", "192.168.1.20", NULL, NULL) }, + { DEFAULTS("rdma", "192.168.1.4", "192.168.1.20", NULL, NULL) }, + { DEFAULTS("fc", + "nn-0x201700a09890f5bf:pn-0x201900a09890f5bf", + "nn-0x200000109b579ef3:pn-0x100000109b579ef3", NULL, NULL) }, - { DEFAULTS, "fc", - "nn-0x201700a09890f5bf:pn-0x201900a09890f5bf", - "nn-0x200000109b579ef6:pn-0x100000109b579ef6", + { DEFAULTS("fc", + "nn-0x201700a09890f5bf:pn-0x201900a09890f5bf", + "nn-0x200000109b579ef6:pn-0x100000109b579ef6", NULL, NULL) }, }; @@ -80,8 +78,9 @@ static void show_ctrl(nvme_ctrl_t c) else printf(" "); - printf("0x%p: %s %s %s %s %s ", + printf("0x%p: %s %s %s %s %s %s", c, + nvme_ctrl_get_subsysnqn(c), nvme_ctrl_get_transport(c), nvme_ctrl_get_traddr(c), nvme_ctrl_get_host_traddr(c), @@ -97,26 +96,26 @@ static bool match_ctrl(struct test_data *d, nvme_ctrl_t c) if (d->c != c) pass = false; - if (strcmp(d->transport, nvme_ctrl_get_transport(d->c))) + if (strcmp(d->f.transport, nvme_ctrl_get_transport(d->c))) pass = false; - if (strcmp(d->traddr, nvme_ctrl_get_traddr(d->c))) + if (strcmp(d->f.traddr, nvme_ctrl_get_traddr(d->c))) pass = false; host_traddr = nvme_ctrl_get_host_traddr(c); - if (d->host_traddr && - (!host_traddr || strcmp(d->host_traddr, host_traddr))) + if (d->f.host_traddr && + (!host_traddr || strcmp(d->f.host_traddr, host_traddr))) pass = false; host_iface = nvme_ctrl_get_host_iface(c); - if (d->host_iface && - (!host_iface || strcmp(d->host_iface, host_iface))) + if (d->f.host_iface && + (!host_iface || strcmp(d->f.host_iface, host_iface))) pass = false; trsvid = nvme_ctrl_get_trsvcid(c); - if (d->trsvcid && - (!trsvid || strcmp(d->trsvcid, trsvid))) + if (d->f.trsvcid && + (!trsvid || strcmp(d->f.trsvcid, trsvid))) pass = false; printf("[%s]", pass? "PASS" : "FAILED"); @@ -139,11 +138,9 @@ static struct nvme_global_ctx *create_tree() struct test_data *d = &test_data[i]; assert(!nvme_get_subsystem(ctx, h, d->subsysname, - d->subsysnqn, &d->s)); + d->f.subsysnqn, &d->s)); assert(d->s); - d->c = nvme_lookup_ctrl(d->s, d->transport, d->traddr, - d->host_traddr, d->host_iface, - d->trsvcid, NULL); + d->c = nvme_lookup_ctrl(d->s, &d->f, NULL); assert(d->c); d->ctrl_id = i; @@ -176,36 +173,41 @@ static bool tcp_ctrl_lookup(nvme_subsystem_t s, struct test_data *d) { nvme_ctrl_t c; bool pass = true; + struct nvmf_context f = d->f; - c = nvme_lookup_ctrl(s, d->transport, d->traddr, NULL, - NULL, d->trsvcid, NULL); - printf("%10s %12s %10s -> ", d->trsvcid, "", ""); + f.host_traddr = NULL; + f.host_iface = NULL; + c = nvme_lookup_ctrl(s, &f, NULL); + printf("%10s %12s %10s -> ", f.trsvcid, "", ""); show_ctrl(c); pass &= match_ctrl(d, c); printf("\n"); - if (d->host_traddr) { - c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr, - NULL, d->trsvcid, NULL); - printf("%10s %12s %10s -> ", d->trsvcid, d->host_traddr, ""); + if (d->f.host_traddr) { + f = d->f; + f.host_iface = NULL; + c = nvme_lookup_ctrl(s, &f, NULL); + printf("%10s %12s %10s -> ", f.trsvcid, f.host_traddr, ""); show_ctrl(c); pass &= match_ctrl(d, c); printf("\n"); } - if (d->host_iface) { - c = nvme_lookup_ctrl(s, d->transport, d->traddr, NULL, - d->host_iface, d->trsvcid, NULL); - printf("%10s %12s %10s -> ", d->trsvcid, "", d->host_iface); + if (d->f.host_iface) { + f = d->f; + f.host_traddr = NULL; + c = nvme_lookup_ctrl(s, &f, NULL); + printf("%10s %12s %10s -> ", f.trsvcid, "", f.host_iface); show_ctrl(c); pass &= match_ctrl(d, c); printf("\n"); } - if (d->host_iface && d->traddr) { - c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr, - d->host_iface, d->trsvcid, NULL); - printf("%10s %12s %10s -> ", d->trsvcid, d->host_traddr, d->host_iface); + if (d->f.host_iface && d->f.traddr) { + f = d->f; + c = nvme_lookup_ctrl(s, &f, NULL); + printf("%10s %12s %10s -> ", f.trsvcid, + f.host_traddr, f.host_iface); show_ctrl(c); pass &= match_ctrl(d, c); printf("\n"); @@ -218,9 +220,11 @@ static bool default_ctrl_lookup(nvme_subsystem_t s, struct test_data *d) { nvme_ctrl_t c; bool pass = true; + struct nvmf_context f = d->f; - c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr, - NULL, NULL, NULL); + f.host_iface = NULL; + f.trsvcid = NULL; + c = nvme_lookup_ctrl(s, &f, NULL); printf("%10s %12s %10s -> ", "", "", ""); show_ctrl(c); pass &= match_ctrl(d, c); @@ -246,7 +250,7 @@ static bool ctrl_lookups(struct nvme_global_ctx *ctx) show_ctrl(d->c); printf("\n"); - if (!strcmp("tcp", d->transport)) + if (!strcmp("tcp", d->f.transport)) pass &= tcp_ctrl_lookup(s, d); else pass &= default_ctrl_lookup(s, d); @@ -276,6 +280,13 @@ static bool test_lookup(void) static bool test_src_addr() { struct nvme_global_ctx *ctx; + struct nvmf_context fctx = { + .transport = "tcp", + .traddr = "192.168.56.1", + .host_traddr = NULL, + .host_iface = NULL, + .trsvcid = "8009", + }; bool pass = true; nvme_host_t h; nvme_ctrl_t c; @@ -294,7 +305,7 @@ static bool test_src_addr() nvme_get_subsystem(ctx, h, DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, &s); assert(s); - c = nvme_lookup_ctrl(s, "tcp", "192.168.56.1", NULL, NULL, "8009", NULL); + c = nvme_lookup_ctrl(s, &fctx, NULL); assert(c); c->address = NULL; @@ -420,13 +431,8 @@ static bool test_src_addr() } struct ctrl_args { - const char *transport; - const char *traddr; - const char *trsvcid; - const char *host_traddr; - const char *host_iface; + struct nvmf_context f; const char *address; - const char *subsysnqn; }; static void set_ctrl_args(struct ctrl_args *args, @@ -438,13 +444,13 @@ static void set_ctrl_args(struct ctrl_args *args, const char *address, const char *subsysnqn) { - args->transport = transport; - args->traddr = traddr; - args->trsvcid = trsvcid; - args->host_traddr = host_traddr; - args->host_iface = host_iface; + args->f.transport = transport; + args->f.traddr = traddr; + args->f.trsvcid = trsvcid; + args->f.host_traddr = host_traddr; + args->f.host_iface = host_iface; args->address = address; - args->subsysnqn = subsysnqn; + args->f.subsysnqn = subsysnqn; } static bool ctrl_match(const char *tag, @@ -468,14 +474,12 @@ static bool ctrl_match(const char *tag, assert(h); assert(!nvme_get_subsystem(ctx, h, DEFAULT_SUBSYSNAME, - reference->subsysnqn ? - reference->subsysnqn : DEFAULT_SUBSYSNQN, + reference->f.subsysnqn ? + reference->f.subsysnqn : DEFAULT_SUBSYSNQN, &s)); assert(s); - reference_ctrl = nvme_lookup_ctrl(s, reference->transport, reference->traddr, - reference->host_traddr, reference->host_iface, - reference->trsvcid, NULL); + reference_ctrl = nvme_lookup_ctrl(s, &reference->f, NULL); assert(reference_ctrl); reference_ctrl->name = "nvme1"; /* fake the device name */ if (reference->address) { @@ -483,49 +487,57 @@ static bool ctrl_match(const char *tag, } /* nvme_ctrl_find() MUST BE RUN BEFORE nvme_lookup_ctrl() */ - found_ctrl = nvme_ctrl_find(s, candidate->transport, candidate->traddr, - candidate->trsvcid, candidate->subsysnqn, - candidate->host_traddr, - candidate->host_iface); + found_ctrl = nvme_ctrl_find(s, &candidate->f); - candidate_ctrl = nvme_lookup_ctrl(s, candidate->transport, candidate->traddr, - candidate->host_traddr, candidate->host_iface, - candidate->trsvcid, NULL); + candidate_ctrl = nvme_lookup_ctrl(s, &candidate->f, NULL); if (should_match) { if (candidate_ctrl != reference_ctrl) { printf("%s-%d-%d: Candidate (%s, %s, %s, %s, %s, %s) failed to match (%s, %s, %s, %s, %s, %s, %s)\n", tag, reference_id, candidate_id, - candidate->transport, candidate->traddr, candidate->trsvcid, - candidate->subsysnqn, candidate->host_traddr, candidate->host_iface, - reference->transport, reference->traddr, reference->trsvcid, reference->subsysnqn, - reference->host_traddr, reference->host_iface, reference->address); + candidate->f.transport, candidate->f.traddr, + candidate->f.trsvcid, candidate->f.subsysnqn, + candidate->f.host_traddr, + candidate->f.host_iface, + reference->f.transport, reference->f.traddr, + reference->f.trsvcid, reference->f.subsysnqn, + reference->f.host_traddr, + reference->f.host_iface, reference->address); return false; } if (!found_ctrl) { printf("%s-%d-%d: Candidate (%s, %s, %s, %s, %s, %s) failed to find controller\n", tag, reference_id, candidate_id, - candidate->transport, candidate->traddr, candidate->trsvcid, - candidate->subsysnqn, candidate->host_traddr, candidate->host_iface); + candidate->f.transport, candidate->f.traddr, + candidate->f.trsvcid, candidate->f.subsysnqn, + candidate->f.host_traddr, + candidate->f.host_iface); return false; } } else { if (candidate_ctrl == reference_ctrl) { printf("%s-%d-%d: Candidate (%s, %s, %s, %s, %s, %s) should not match (%s, %s, %s, %s, %s, %s, %s)\n", tag, reference_id, candidate_id, - candidate->transport, candidate->traddr, candidate->trsvcid, - candidate->subsysnqn, candidate->host_traddr, candidate->host_iface, - reference->transport, reference->traddr, reference->trsvcid, reference->subsysnqn, - reference->host_traddr, reference->host_iface, reference->address); + candidate->f.transport, candidate->f.traddr, + candidate->f.trsvcid, candidate->f.subsysnqn, + candidate->f.host_traddr, + candidate->f.host_iface, + reference->f.transport, reference->f.traddr, + reference->f.trsvcid, reference->f.subsysnqn, + reference->f.host_traddr, + reference->f.host_iface, reference->address); return false; } if (found_ctrl) { printf("%s-%d-%d: Candidate (%s, %s, %s, %s, %s, %s) should not have found controller. found_ctrl=%p reference=%p\n", tag, reference_id, candidate_id, - candidate->transport, candidate->traddr, candidate->trsvcid, candidate->subsysnqn, - candidate->host_traddr, candidate->host_iface, found_ctrl, reference_ctrl); + candidate->f.transport, candidate->f.traddr, + candidate->f.trsvcid, candidate->f.subsysnqn, + candidate->f.host_traddr, + candidate->f.host_iface, + found_ctrl, reference_ctrl); return false; } } @@ -1084,39 +1096,38 @@ static bool ctrl_config_match(const char *tag, assert(h); assert(!nvme_get_subsystem(ctx, h, DEFAULT_SUBSYSNAME, - reference->subsysnqn ? - reference->subsysnqn : DEFAULT_SUBSYSNQN, + reference->f.subsysnqn ? + reference->f.subsysnqn : DEFAULT_SUBSYSNQN, &s)); assert(s); - reference_ctrl = nvme_lookup_ctrl(s, reference->transport, reference->traddr, - reference->host_traddr, reference->host_iface, - reference->trsvcid, NULL); + reference_ctrl = nvme_lookup_ctrl(s, &reference->f, NULL); assert(reference_ctrl); reference_ctrl->name = "nvme1"; /* fake the device name */ if (reference->address) { reference_ctrl->address = (char *)reference->address; } - match = nvme_ctrl_match_config(reference_ctrl, - candidate->transport, candidate->traddr, - candidate->trsvcid, candidate->subsysnqn, - candidate->host_traddr, candidate->host_iface); + match = _nvme_ctrl_match_config(reference_ctrl, &candidate->f); if (should_match) { if (!match) { printf("%s-%d-%d: Failed to match config for Candidate (%s, %s, %s, %s, %s, %s)\n", tag, reference_id, candidate_id, - candidate->transport, candidate->traddr, candidate->trsvcid, - candidate->subsysnqn, candidate->host_traddr, candidate->host_iface); + candidate->f.transport, candidate->f.traddr, + candidate->f.trsvcid, candidate->f.subsysnqn, + candidate->f.host_traddr, + candidate->f.host_iface); return false; } } else { if (match) { printf("%s-%d-%d: Config should not have matched for Candidate (%s, %s, %s, %s, %s, %s)\n", tag, reference_id, candidate_id, - candidate->transport, candidate->traddr, candidate->trsvcid, - candidate->subsysnqn, candidate->host_traddr, candidate->host_iface); + candidate->f.transport, candidate->f.traddr, + candidate->f.trsvcid, candidate->f.subsysnqn, + candidate->f.host_traddr, + candidate->f.host_iface); return false; } }