From bb70b874dac13a15c37ce1dd1de866d6a5dd428d Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Tue, 30 Nov 2021 12:44:15 +0800 Subject: [PATCH] mi: Add MI endpoints to root_t, and add iterators 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 , using global nvme_root_t as base context. Signed-off-by: Matt Johnston Signed-off-by: Jeremy Kerr --- src/libnvme-mi.map | 3 +++ src/nvme/mi.c | 16 +++++++++++++++- src/nvme/mi.h | 32 ++++++++++++++++++++++++++++++++ src/nvme/private.h | 2 ++ src/nvme/tree.c | 1 + 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/libnvme-mi.map b/src/libnvme-mi.map index 27dd458a..b03957d3 100644 --- a/src/libnvme-mi.map +++ b/src/libnvme-mi.map @@ -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: *; diff --git a/src/nvme/mi.c b/src/nvme/mi.c index f07b3276..b59cacad 100644 --- a/src/nvme/mi.c +++ b/src/nvme/mi.c @@ -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; +} diff --git a/src/nvme/mi.h b/src/nvme/mi.h index ba1a46d1..57087157 100644 --- a/src/nvme/mi.h +++ b/src/nvme/mi.h @@ -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; /** diff --git a/src/nvme/private.h b/src/nvme/private.h index dc408de3..4caf15ad 100644 --- a/src/nvme/private.h +++ b/src/nvme/private.h @@ -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 { diff --git a/src/nvme/tree.c b/src/nvme/tree.c index ce5a6a6f..d87b2596 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -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; } -- 2.50.1