From 7c02567b4aa921c0a09ce326f1c49620e0894372 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Sun, 4 Feb 2024 02:46:48 +0200 Subject: [PATCH 1/2] mgmtd: fix missing -n flag and help Only --vrfwnetns works right now, because -n was missing from short ops. Also add the missing help. Signed-off-by: Igor Ryzhov --- mgmtd/mgmt_main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c index 5be849b63c41..0f80377d28db 100644 --- a/mgmtd/mgmt_main.c +++ b/mgmtd/mgmt_main.c @@ -230,8 +230,9 @@ int main(int argc, char **argv) frr_preinit(&mgmtd_di, argc, argv); frr_opt_add( - "s:" DEPRECATED_OPTIONS, longopts, - " -s, --socket_size Set MGMTD peer socket send buffer size\n"); + "s:n" DEPRECATED_OPTIONS, longopts, + " -s, --socket_size Set MGMTD peer socket send buffer size\n" + " -n, --vrfwnetns Use NetNS as VRF backend\n"); /* Command line argument treatment. */ while (1) { From ea6a7d3fa3ec7ee515dade6414636e43d8677f1c Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Sun, 4 Feb 2024 21:52:47 +0200 Subject: [PATCH 2/2] lib, mgmtd: don't register NB config callbacks in mgmtd mgmtd is supposed to only register CLI callbacks. If configuration callbacks are registered, they are getting called on startup when mgmtd reads config files, and they can use infrastructure that is not initialized on mgmtd, or allocate some memory that is never freed. Signed-off-by: Igor Ryzhov --- lib/if.c | 25 +++++++++++++++++++++++++ lib/if.h | 1 + lib/routing_nb.c | 10 ++++++++++ lib/routing_nb.h | 1 + lib/vrf.c | 18 ++++++++++++++++++ lib/vrf.h | 1 + mgmtd/mgmt_main.c | 6 +++--- 7 files changed, 59 insertions(+), 3 deletions(-) diff --git a/lib/if.c b/lib/if.c index 1328e21874a1..a344c2b8657e 100644 --- a/lib/if.c +++ b/lib/if.c @@ -1748,6 +1748,8 @@ lib_interface_state_phy_address_get_elem(struct nb_cb_get_elem_args *args) } /* clang-format off */ + +/* cli_show callbacks are kept here for daemons not yet converted to mgmtd */ const struct frr_yang_module_info frr_interface_info = { .name = "frr-interface", .nodes = { @@ -1830,3 +1832,26 @@ const struct frr_yang_module_info frr_interface_info = { }, } }; + +const struct frr_yang_module_info frr_interface_cli_info = { + .name = "frr-interface", + .ignore_cfg_cbs = true, + .nodes = { + { + .xpath = "/frr-interface:lib/interface", + .cbs = { + .cli_show = cli_show_interface, + .cli_show_end = cli_show_interface_end, + }, + }, + { + .xpath = "/frr-interface:lib/interface/description", + .cbs = { + .cli_show = cli_show_interface_desc, + }, + }, + { + .xpath = NULL, + }, + } +}; diff --git a/lib/if.h b/lib/if.h index 548a91b9480d..0dc56bd21098 100644 --- a/lib/if.h +++ b/lib/if.h @@ -636,6 +636,7 @@ extern void if_down_via_zapi(struct interface *ifp); extern void if_destroy_via_zapi(struct interface *ifp); extern const struct frr_yang_module_info frr_interface_info; +extern const struct frr_yang_module_info frr_interface_cli_info; #ifdef __cplusplus } diff --git a/lib/routing_nb.c b/lib/routing_nb.c index 3d837bcc1149..33372d113a99 100644 --- a/lib/routing_nb.c +++ b/lib/routing_nb.c @@ -27,3 +27,13 @@ const struct frr_yang_module_info frr_routing_info = { }, } }; + +const struct frr_yang_module_info frr_routing_cli_info = { + .name = "frr-routing", + .ignore_cfg_cbs = true, + .nodes = { + { + .xpath = NULL, + }, + } +}; diff --git a/lib/routing_nb.h b/lib/routing_nb.h index cc83d8469d2d..e805e1cd0fe5 100644 --- a/lib/routing_nb.h +++ b/lib/routing_nb.h @@ -6,6 +6,7 @@ extern "C" { #endif extern const struct frr_yang_module_info frr_routing_info; +extern const struct frr_yang_module_info frr_routing_cli_info; /* Mandatory callbacks. */ int routing_control_plane_protocols_control_plane_protocol_create( diff --git a/lib/vrf.c b/lib/vrf.c index f8fa70bfe84e..9f4c5cdddc4b 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -1034,6 +1034,8 @@ lib_vrf_state_active_get_elem(struct nb_cb_get_elem_args *args) } /* clang-format off */ + +/* cli_show callbacks are kept here for daemons not yet converted to mgmtd */ const struct frr_yang_module_info frr_vrf_info = { .name = "frr-vrf", .nodes = { @@ -1069,3 +1071,19 @@ const struct frr_yang_module_info frr_vrf_info = { } }; +const struct frr_yang_module_info frr_vrf_cli_info = { + .name = "frr-vrf", + .ignore_cfg_cbs = true, + .nodes = { + { + .xpath = "/frr-vrf:lib/vrf", + .cbs = { + .cli_show = lib_vrf_cli_write, + .cli_show_end = lib_vrf_cli_write_end, + }, + }, + { + .xpath = NULL, + }, + } +}; diff --git a/lib/vrf.h b/lib/vrf.h index f66a9e6b325e..4277a51bb1b8 100644 --- a/lib/vrf.h +++ b/lib/vrf.h @@ -294,6 +294,7 @@ extern int vrf_enable(struct vrf *vrf); extern void vrf_delete(struct vrf *vrf); extern const struct frr_yang_module_info frr_vrf_info; +extern const struct frr_yang_module_info frr_vrf_cli_info; #ifdef __cplusplus } diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c index 0f80377d28db..c0d90231254b 100644 --- a/mgmtd/mgmt_main.c +++ b/mgmtd/mgmt_main.c @@ -171,10 +171,10 @@ const struct frr_yang_module_info zebra_route_map_info = { */ static const struct frr_yang_module_info *const mgmt_yang_modules[] = { &frr_filter_cli_info, - &frr_interface_info, + &frr_interface_cli_info, &frr_route_map_cli_info, - &frr_routing_info, - &frr_vrf_info, + &frr_routing_cli_info, + &frr_vrf_cli_info, &frr_affinity_map_cli_info, /* mgmtd-only modules */