]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
mi: Add MI endpoints to root_t, and add iterators
authorMatt Johnston <matt@codeconstruct.com.au>
Tue, 30 Nov 2021 04:44:15 +0000 (12:44 +0800)
committerJeremy Kerr <jk@codeconstruct.com.au>
Fri, 24 Jun 2022 07:42:50 +0000 (15:42 +0800)
These can be used to iterate through a set of endpoints. This
will be used for transports such as MCTP's dbus scan functionality

Updated for v1.x by Jeremy Kerr <jk@codeconstruct.com.au>, using global
nvme_root_t as base context.

Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
src/libnvme-mi.map
src/nvme/mi.c
src/nvme/mi.h
src/nvme/private.h
src/nvme/tree.c

index 27dd458a95c48d68d68a1d7fe3961995cd47d584..b03957d38e91f172f450cc62118fca0524ab63e4 100644 (file)
@@ -16,6 +16,9 @@ LIBNVME_MI_1_1 {
                nvme_mi_admin_security_send;
                nvme_mi_admin_security_recv;
                nvme_mi_endpoint_desc;
+               nvme_mi_root_close;
+               nvme_mi_first_endpoint;
+               nvme_mi_next_endpoint;
                nvme_mi_open_mctp;
        local:
                *;
index f07b32765e0317ce1fdd48605dc0b975bd54019e..b59cacada4704fbc7de2a0800c0fae88f1e7d51c 100644 (file)
@@ -32,6 +32,8 @@ nvme_root_t nvme_mi_create_root(FILE *fp, int log_level)
        r->fp = stderr;
        if (fp)
                r->fp = fp;
+       list_head_init(&r->hosts);
+       list_head_init(&r->endpoints);
        return r;
 }
 
@@ -44,7 +46,8 @@ struct nvme_mi_ep *nvme_mi_init_ep(nvme_root_t root)
 {
        struct nvme_mi_ep *ep;
 
-       ep = malloc(sizeof(*ep));
+       ep = calloc(1, sizeof(*ep));
+       list_node_init(&ep->root_entry);
        ep->root = root;
 
        return ep;
@@ -610,6 +613,7 @@ void nvme_mi_close(nvme_mi_ep_t ep)
 {
        if (ep->transport->close)
                ep->transport->close(ep);
+       list_del(&ep->root_entry);
        free(ep);
 }
 
@@ -647,3 +651,13 @@ char *nvme_mi_endpoint_desc(nvme_mi_ep_t ep)
 
        return s;
 }
+
+nvme_mi_ep_t nvme_mi_first_endpoint(nvme_root_t m)
+{
+       return list_top(&m->endpoints, struct nvme_mi_ep, root_entry);
+}
+
+nvme_mi_ep_t nvme_mi_next_endpoint(nvme_root_t m, nvme_mi_ep_t ep)
+{
+       return ep ? list_next(&m->endpoints, ep, root_entry) : NULL;
+}
index ba1a46d15edc0bec92213716d80de13753187206..57087157bab257b34535d8f8008cd06d7302fe61 100644 (file)
@@ -285,6 +285,38 @@ struct nvme_mi_ep;
  */
 typedef struct nvme_mi_ep * nvme_mi_ep_t;
 
+/**
+ * nvme_mi_first_endpoint - Start endpoint iterator
+ * @m: &nvme_root_t object
+ *
+ * Return: first MI endpoint object under this root, or NULL if no endpoints
+ *         are present.
+ *
+ * See: &nvme_mi_next_endpoint, &nvme_mi_for_each_endpoint
+ */
+nvme_mi_ep_t nvme_mi_first_endpoint(nvme_root_t m);
+
+/**
+ * nvme_mi_next_endpoint - Continue endpoint iterator
+ * @m: &nvme_root_t object
+ * @e: &nvme_mi_ep_t current position of iterator
+ *
+ * Return: next endpoint MI endpoint object after @e under this root, or NULL
+ *         if no further endpoints are present.
+ *
+ * See: &nvme_mi_first_endpoint, &nvme_mi_for_each_endpoint
+ */
+nvme_mi_ep_t nvme_mi_next_endpoint(nvme_root_t m, nvme_mi_ep_t e);
+
+/**
+ * nvme_mi_for_each_endpoint - Iterator for NVMe-MI endpoints.
+ * @m: &nvme_root_t containing endpoints
+ * @e: &nvme_mi_ep_t object, set on each iteration
+ */
+#define nvme_mi_for_each_endpoint(m, e)                        \
+       for (e = nvme_mi_first_endpoint(m); e != NULL;  \
+            e = nvme_mi_next_endpoint(m, e))
+
 struct nvme_mi_ctrl;
 
 /**
index dc408de3a161a7c65b1e1879801d64fa2efa59f6..4caf15adceb384cbfab8fba4d5257abcd0b4cc0a 100644 (file)
@@ -118,6 +118,7 @@ struct nvme_host {
 struct nvme_root {
        char *config_file;
        struct list_head hosts;
+       struct list_head endpoints; /* MI endpoints */
        FILE *fp;
        int log_level;
        bool log_pid;
@@ -187,6 +188,7 @@ struct nvme_mi_ep {
        struct nvme_root *root;
        const struct nvme_mi_transport *transport;
        void *transport_data;
+       struct list_node root_entry;
 };
 
 struct nvme_mi_ctrl {
index ce5a6a6fbb1e52cd3311f37e9427e6b0154c934e..d87b25961237fae56fbbe1bfdbf32177b07e9579 100644 (file)
@@ -141,6 +141,7 @@ nvme_root_t nvme_create_root(FILE *fp, int log_level)
        if (fp)
                r->fp = fp;
        list_head_init(&r->hosts);
+       list_head_init(&r->endpoints);
        return r;
 }