File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -16,6 +16,9 @@ LIBNVME_MI_1_1 {
1616 nvme_mi_admin_security_send;
1717 nvme_mi_admin_security_recv;
1818 nvme_mi_endpoint_desc;
19+ nvme_mi_root_close;
20+ nvme_mi_first_endpoint;
21+ nvme_mi_next_endpoint;
1922 nvme_mi_open_mctp;
2023 local:
2124 *;
Original file line number Diff line number Diff line change @@ -32,6 +32,8 @@ nvme_root_t nvme_mi_create_root(FILE *fp, int log_level)
3232 r -> fp = stderr ;
3333 if (fp )
3434 r -> fp = fp ;
35+ list_head_init (& r -> hosts );
36+ list_head_init (& r -> endpoints );
3537 return r ;
3638}
3739
@@ -44,7 +46,8 @@ struct nvme_mi_ep *nvme_mi_init_ep(nvme_root_t root)
4446{
4547 struct nvme_mi_ep * ep ;
4648
47- ep = malloc (sizeof (* ep ));
49+ ep = calloc (1 , sizeof (* ep ));
50+ list_node_init (& ep -> root_entry );
4851 ep -> root = root ;
4952
5053 return ep ;
@@ -610,6 +613,7 @@ void nvme_mi_close(nvme_mi_ep_t ep)
610613{
611614 if (ep -> transport -> close )
612615 ep -> transport -> close (ep );
616+ list_del (& ep -> root_entry );
613617 free (ep );
614618}
615619
@@ -647,3 +651,13 @@ char *nvme_mi_endpoint_desc(nvme_mi_ep_t ep)
647651
648652 return s ;
649653}
654+
655+ nvme_mi_ep_t nvme_mi_first_endpoint (nvme_root_t m )
656+ {
657+ return list_top (& m -> endpoints , struct nvme_mi_ep , root_entry );
658+ }
659+
660+ nvme_mi_ep_t nvme_mi_next_endpoint (nvme_root_t m , nvme_mi_ep_t ep )
661+ {
662+ return ep ? list_next (& m -> endpoints , ep , root_entry ) : NULL ;
663+ }
Original file line number Diff line number Diff line change @@ -285,6 +285,38 @@ struct nvme_mi_ep;
285285 */
286286typedef struct nvme_mi_ep * nvme_mi_ep_t ;
287287
288+ /**
289+ * nvme_mi_first_endpoint - Start endpoint iterator
290+ * @m: &nvme_root_t object
291+ *
292+ * Return: first MI endpoint object under this root, or NULL if no endpoints
293+ * are present.
294+ *
295+ * See: &nvme_mi_next_endpoint, &nvme_mi_for_each_endpoint
296+ */
297+ nvme_mi_ep_t nvme_mi_first_endpoint (nvme_root_t m );
298+
299+ /**
300+ * nvme_mi_next_endpoint - Continue endpoint iterator
301+ * @m: &nvme_root_t object
302+ * @e: &nvme_mi_ep_t current position of iterator
303+ *
304+ * Return: next endpoint MI endpoint object after @e under this root, or NULL
305+ * if no further endpoints are present.
306+ *
307+ * See: &nvme_mi_first_endpoint, &nvme_mi_for_each_endpoint
308+ */
309+ nvme_mi_ep_t nvme_mi_next_endpoint (nvme_root_t m , nvme_mi_ep_t e );
310+
311+ /**
312+ * nvme_mi_for_each_endpoint - Iterator for NVMe-MI endpoints.
313+ * @m: &nvme_root_t containing endpoints
314+ * @e: &nvme_mi_ep_t object, set on each iteration
315+ */
316+ #define nvme_mi_for_each_endpoint (m , e ) \
317+ for (e = nvme_mi_first_endpoint(m); e != NULL; \
318+ e = nvme_mi_next_endpoint(m, e))
319+
288320struct nvme_mi_ctrl ;
289321
290322/**
Original file line number Diff line number Diff line change @@ -118,6 +118,7 @@ struct nvme_host {
118118struct nvme_root {
119119 char * config_file ;
120120 struct list_head hosts ;
121+ struct list_head endpoints ; /* MI endpoints */
121122 FILE * fp ;
122123 int log_level ;
123124 bool log_pid ;
@@ -187,6 +188,7 @@ struct nvme_mi_ep {
187188 struct nvme_root * root ;
188189 const struct nvme_mi_transport * transport ;
189190 void * transport_data ;
191+ struct list_node root_entry ;
190192};
191193
192194struct nvme_mi_ctrl {
Original file line number Diff line number Diff line change @@ -141,6 +141,7 @@ nvme_root_t nvme_create_root(FILE *fp, int log_level)
141141 if (fp )
142142 r -> fp = fp ;
143143 list_head_init (& r -> hosts );
144+ list_head_init (& r -> endpoints );
144145 return r ;
145146}
146147
You can’t perform that action at this time.
0 commit comments