From: Hannes Reinecke Date: Wed, 16 Jun 2021 08:06:42 +0000 (+0200) Subject: tree,fabrics: add 'host_iface' controller option X-Git-Tag: v1.0-rc0~127^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=f4ad497dae82c8be8f130b31c892635f5428d97c;p=users%2Fsagi%2Flibnvme.git tree,fabrics: add 'host_iface' controller option Add a 'host_iface' controller option. Ported from nvme-cli. Signed-off-by: Hannes Reinecke --- diff --git a/examples/discover-loop.c b/examples/discover-loop.c index 37637e24..e31e5405 100644 --- a/examples/discover-loop.c +++ b/examples/discover-loop.c @@ -62,7 +62,8 @@ int main() fprintf(stderr, "Failed to allocated memory\n"); return ENOMEM; } - c = nvme_create_ctrl(NVME_DISC_SUBSYS_NAME, "loop", NULL, NULL, NULL); + c = nvme_create_ctrl(NVME_DISC_SUBSYS_NAME, "loop", + NULL, NULL, NULL, NULL); if (!c) { fprintf(stderr, "Failed to allocate memory\n"); return ENOMEM; diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c index 64845644..9a95f328 100644 --- a/src/nvme/fabrics.c +++ b/src/nvme/fabrics.c @@ -251,6 +251,8 @@ static int build_options(nvme_ctrl_t c, char **argstr) nvme_ctrl_get_traddr(c)) || add_argument(argstr, "host_traddr", nvme_ctrl_get_host_traddr(c)) || + add_argument(argstr, "host_iface", + nvme_ctrl_get_host_iface(c)) || add_argument(argstr, "trsvcid", nvme_ctrl_get_trsvcid(c)) || (hostnqn && add_argument(argstr, "hostnqn", hostnqn)) || @@ -452,7 +454,7 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h, nvme_msg(LOG_DEBUG, "lookup ctrl " "(transport: %s, traddr: %s, trsvcid %s)\n", transport, traddr, trsvcid); - c = nvme_create_ctrl(e->subnqn, transport, traddr, NULL, trsvcid); + c = nvme_create_ctrl(e->subnqn, transport, traddr, NULL, NULL, trsvcid); if (!c) { nvme_msg(LOG_DEBUG, "skipping discovery entry, " "failed to allocate %s controller with traddr %s\n", diff --git a/src/nvme/json.c b/src/nvme/json.c index 307dc7fd..d4f2644c 100644 --- a/src/nvme/json.c +++ b/src/nvme/json.c @@ -73,7 +73,7 @@ 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, *trsvcid = NULL; + const char *host_traddr = NULL, *host_iface = NULL, *trsvcid = NULL; attr_obj = json_object_object_get(port_obj, "transport"); if (!attr_obj) @@ -85,11 +85,14 @@ static void json_parse_port(nvme_subsystem_t s, struct json_object *port_obj) attr_obj = json_object_object_get(port_obj, "host_traddr"); if (attr_obj) 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); 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, trsvcid); + c = nvme_lookup_ctrl(s, transport, traddr, host_traddr, + host_iface, trsvcid); if (c) { json_update_attributes(c, port_obj); } @@ -182,6 +185,9 @@ static void json_update_port(struct json_object *ctrl_array, nvme_ctrl_t c) value = nvme_ctrl_get_host_traddr(c); if (value) json_object_add_value_string(port_obj, "host_traddr", value); + value = nvme_ctrl_get_host_iface(c); + if (value) + json_object_add_value_string(port_obj, "host_iface", value); value = nvme_ctrl_get_trsvcid(c); if (value) json_object_add_value_string(port_obj, "trsvcid", value); diff --git a/src/nvme/tree.c b/src/nvme/tree.c index e3ce92b6..887c6444 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -107,6 +107,7 @@ struct nvme_ctrl { char *traddr; char *trsvcid; char *host_traddr; + char *host_iface; bool discovered; bool persistent; struct nvme_fabrics_config cfg; @@ -693,6 +694,11 @@ const char *nvme_ctrl_get_host_traddr(nvme_ctrl_t c) return c->host_traddr; } +const char *nvme_ctrl_get_host_iface(nvme_ctrl_t c) +{ + return c->host_iface; +} + const char *nvme_ctrl_get_hostnqn(nvme_ctrl_t c) { if (!c->s) @@ -828,6 +834,8 @@ void nvme_free_ctrl(nvme_ctrl_t c) free(c->trsvcid); if (c->host_traddr) free(c->host_traddr); + if (c->host_iface) + free(c->host_iface); free(c->firmware); free(c->model); free(c->state); @@ -911,9 +919,9 @@ free_addrinfo: freeaddrinfo(host_info); } -struct nvme_ctrl *nvme_create_ctrl(const char *subsysnqn, - const char *transport, const char *traddr, - const char *host_traddr, const char *trsvcid) +struct nvme_ctrl *nvme_create_ctrl(const char *subsysnqn, const char *transport, + const char *traddr, const char *host_traddr, + const char *host_iface, const char *trsvcid) { struct nvme_ctrl *c; bool discovery = false; @@ -947,6 +955,8 @@ struct nvme_ctrl *nvme_create_ctrl(const char *subsysnqn, else c->host_traddr = strdup(host_traddr); } + if (host_iface) + c->host_iface = strdup(host_iface); if (trsvcid) c->trsvcid = strdup(trsvcid); else if (discovery) @@ -962,9 +972,9 @@ struct nvme_ctrl *nvme_create_ctrl(const char *subsysnqn, return c; } -struct nvme_ctrl *nvme_lookup_ctrl(struct nvme_subsystem *s, - const char *transport, const char *traddr, - const char *host_traddr, const char *trsvcid) +struct nvme_ctrl *nvme_lookup_ctrl(struct nvme_subsystem *s, const char *transport, + const char *traddr, const char *host_traddr, + const char *host_iface, const char *trsvcid) { struct nvme_ctrl *c; @@ -979,13 +989,16 @@ struct nvme_ctrl *nvme_lookup_ctrl(struct nvme_subsystem *s, if (host_traddr && c->host_traddr && strcmp(c->host_traddr, host_traddr)) continue; + if (host_iface && c->host_iface && + strcmp(c->host_iface, host_iface)) + continue; if (trsvcid && c->trsvcid && strcmp(c->trsvcid, trsvcid)) continue; return c; } - c = nvme_create_ctrl(s->subsysnqn, transport, - traddr, host_traddr, trsvcid); + c = nvme_create_ctrl(s->subsysnqn, transport, traddr, + host_traddr, host_iface, trsvcid); if (c) { c->s = s; list_add(&s->ctrls, &c->entry); @@ -1122,7 +1135,8 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_subsystem_t s, const char *path, { nvme_ctrl_t c; char *addr, *address, *a, *e; - char *transport, *traddr = NULL, *trsvcid = NULL, *host_traddr = NULL; + char *transport, *traddr = NULL, *trsvcid = NULL; + char *host_traddr = NULL, *host_iface = NULL; int ret; transport = nvme_get_attr(path, "transport"); @@ -1141,10 +1155,13 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_subsystem_t s, const char *path, trsvcid = a + 8; else if (!strncmp(a, "host_traddr=", 12)) host_traddr = a + 12; + else if (!strncmp(a, "host_iface=", 11)) + host_iface = a + 12; a = strtok_r(NULL, ",", &e); } - c = nvme_lookup_ctrl(s, transport, traddr, host_traddr, trsvcid); + c = nvme_lookup_ctrl(s, transport, traddr, + host_traddr, host_iface, trsvcid); free(addr); if (!c) { errno = ENOMEM; diff --git a/src/nvme/tree.h b/src/nvme/tree.h index 4983bbae..e65b1f50 100644 --- a/src/nvme/tree.h +++ b/src/nvme/tree.h @@ -211,13 +211,14 @@ nvme_ctrl_t nvme_subsystem_next_ctrl(nvme_subsystem_t s, nvme_ctrl_t c); * @transport: * @traddr: * @host_traddr: + * @host_iface: * @trsvcid: * * Return: */ nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, const char *traddr, const char *host_traddr, - const char *trsvcid); + const char *host_iface, const char *trsvcid); /** @@ -226,13 +227,14 @@ nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, * @transport: * @traddr: * @host_traddr: + * @host_iface: * @trsvcid: * * Return: */ nvme_ctrl_t nvme_create_ctrl(const char *subsysnqn, const char *transport, const char *traddr, const char *host_traddr, - const char *trsvcid); + const char *host_iface, const char *trsvcid); /** @@ -783,6 +785,14 @@ const char *nvme_ctrl_get_trsvcid(nvme_ctrl_t c); */ const char *nvme_ctrl_get_host_traddr(nvme_ctrl_t c); +/** + * nvme_ctrl_get_host_iface() - + * @c: + * + * Return: + */ +const char *nvme_ctrl_get_host_iface(nvme_ctrl_t c); + /** * nvme_ctrl_get_config() - * @c: