]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
tree,fabrics: add 'host_iface' controller option
authorHannes Reinecke <hare@suse.de>
Wed, 16 Jun 2021 08:06:42 +0000 (10:06 +0200)
committerHannes Reinecke <hare@suse.de>
Wed, 16 Jun 2021 08:06:42 +0000 (10:06 +0200)
Add a 'host_iface' controller option.

Ported from nvme-cli.

Signed-off-by: Hannes Reinecke <hare@suse.de>
examples/discover-loop.c
src/nvme/fabrics.c
src/nvme/json.c
src/nvme/tree.c
src/nvme/tree.h

index 37637e24ce0874b57e77589e9553a9650b196584..e31e54054ab6210571ebf44fc1508a860a485a59 100644 (file)
@@ -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;
index 6484564443371f5ebc41d1d940bba88d13e47425..9a95f32811b2c40d7f5694793a7d02fe8aa0c906 100644 (file)
@@ -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",
index 307dc7fdb1a978ba7b4e7ec28978d8c1d0d925d3..d4f2644c63299ea3b59d89361ec86727a775396b 100644 (file)
@@ -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);
index e3ce92b6f660e37bdbed015cdfa5157d2f66d25e..887c6444b6c7b53c27a1dbeb42e0bbcc1151c5ef 100644 (file)
@@ -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;
index 4983bbaec19955c6ab9943102392495111789a10..e65b1f5095680313f3c783a8cb261a91c3ea81bc 100644 (file)
@@ -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: