From 73f511b5fb23331f90a3dbdbb3e7bc1a76de662a Mon Sep 17 00:00:00 2001 From: Pushpasis Sarkar Date: Mon, 11 Sep 2023 23:18:31 -0700 Subject: [PATCH] lib,mgmtd,zebra: Add Zebra as a MGMT Bckend client Add Zebra as a MGMT Backend client. This commit does not divert show commands to MGMTd yet. Co-authored-by: Yash Ranjan Signed-off-by: Pushpasis Sarkar --- lib/mgmt_be_client.c | 1 + lib/mgmt_be_client.h | 1 + mgmtd/mgmt_be_adapter.c | 14 ++++++++++++++ mgmtd/mgmt_main.c | 2 ++ zebra/main.c | 10 ++++++++++ zebra/zebra_nb_state.c | 4 ++++ zebra/zebra_vty.c | 3 +++ 7 files changed, 35 insertions(+) diff --git a/lib/mgmt_be_client.c b/lib/mgmt_be_client.c index 521f7a41fea3..9d0831d107ff 100644 --- a/lib/mgmt_be_client.c +++ b/lib/mgmt_be_client.c @@ -167,6 +167,7 @@ const char *mgmt_be_client_names[MGMTD_BE_CLIENT_ID_MAX + 1] = { #ifdef HAVE_STATICD [MGMTD_BE_CLIENT_ID_STATICD] = "staticd", #endif + [MGMTD_BE_CLIENT_ID_ZEBRA] = "zebra", [MGMTD_BE_CLIENT_ID_MAX] = "Unknown/Invalid", }; diff --git a/lib/mgmt_be_client.h b/lib/mgmt_be_client.h index 4ad5ca5957cd..645bac3b55bf 100644 --- a/lib/mgmt_be_client.h +++ b/lib/mgmt_be_client.h @@ -30,6 +30,7 @@ enum mgmt_be_client_id { #ifdef HAVE_STATICD MGMTD_BE_CLIENT_ID_STATICD, #endif + MGMTD_BE_CLIENT_ID_ZEBRA, MGMTD_BE_CLIENT_ID_MAX }; diff --git a/mgmtd/mgmt_be_adapter.c b/mgmtd/mgmt_be_adapter.c index 6bc39ace3e78..8cfae4180ced 100644 --- a/mgmtd/mgmt_be_adapter.c +++ b/mgmtd/mgmt_be_adapter.c @@ -79,6 +79,18 @@ static struct mgmt_be_client_xpath staticd_xpaths[] = { }, }; #endif +static struct mgmt_be_client_xpath zebra_xpaths[] = { + { + .xpath = "/frr-zebra:zebra/*", + .subscribed = MGMT_SUBSCR_VALIDATE_CFG | MGMT_SUBSCR_NOTIFY_CFG + | MGMT_SUBSCR_OPER_OWN, + }, + { + .xpath = "/frr-vrf:lib/vrf[name='*']/frr-zebra:zebra/*", + .subscribed = MGMT_SUBSCR_VALIDATE_CFG | MGMT_SUBSCR_NOTIFY_CFG + | MGMT_SUBSCR_OPER_OWN, + }, +}; static struct mgmt_be_client_xpath_map mgmt_client_xpaths[MGMTD_BE_CLIENT_ID_MAX] = { @@ -86,6 +98,8 @@ static struct mgmt_be_client_xpath_map [MGMTD_BE_CLIENT_ID_STATICD] = {staticd_xpaths, array_size(staticd_xpaths)}, #endif + [MGMTD_BE_CLIENT_ID_ZEBRA] = {zebra_xpaths, + array_size(zebra_xpaths)}, }; /* diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c index 39362fa74a83..d63a456ed7c1 100644 --- a/mgmtd/mgmt_main.c +++ b/mgmtd/mgmt_main.c @@ -207,6 +207,8 @@ static const struct frr_yang_module_info *const mgmt_yang_modules[] = { &(struct frr_yang_module_info){.name = "frr-staticd", .ignore_cbs = true}, #endif + &(struct frr_yang_module_info){.name = "frr-zebra", + .ignore_cbs = true}, }; FRR_DAEMON_INFO(mgmtd, MGMTD, .vty_port = MGMTD_VTY_PORT, diff --git a/zebra/main.c b/zebra/main.c index 1e833ce7f182..94e830b5d677 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -21,6 +21,7 @@ #include "affinitymap.h" #include "routemap.h" #include "routing_nb.h" +#include "mgmt_be_client.h" #include "zebra/zebra_router.h" #include "zebra/zebra_errors.h" @@ -115,6 +116,8 @@ struct zebra_privs_t zserv_privs = { .cap_num_p = array_size(_caps_p), .cap_num_i = 0}; +struct mgmt_be_client *mgmt_be_client; + /* SIGHUP handler. */ static void sighup(void) { @@ -140,6 +143,8 @@ static void sigint(void) zlog_notice("Terminating on signal"); + mgmt_be_client_destroy(mgmt_be_client); + atomic_store_explicit(&zrouter.in_shutdown, true, memory_order_relaxed); @@ -418,6 +423,11 @@ int main(int argc, char **argv) zebra_ns_init(); router_id_cmd_init(); zebra_vty_init(); + + /* Initialize MGMT backend functionalities */ + mgmt_be_client = mgmt_be_client_create("zebra", NULL, 0, + zrouter.master); + access_list_init(); prefix_list_init(); rtadv_cmd_init(); diff --git a/zebra/zebra_nb_state.c b/zebra/zebra_nb_state.c index ba537475cbcc..4fa6587b0a93 100644 --- a/zebra/zebra_nb_state.c +++ b/zebra/zebra_nb_state.c @@ -156,6 +156,8 @@ const void *lib_vrf_zebra_ribs_rib_get_next(struct nb_cb_get_next_args *args) safi_t safi; zvrf = zebra_vrf_lookup_by_id(vrf->vrf_id); + if (!zvrf) + return NULL; if (args->list_entry == NULL) { afi = AFI_IP; @@ -198,6 +200,8 @@ lib_vrf_zebra_ribs_rib_lookup_entry(struct nb_cb_lookup_entry_args *args) uint32_t table_id = 0; zvrf = zebra_vrf_lookup_by_id(vrf->vrf_id); + if (!zvrf) + return NULL; yang_afi_safi_identity2value(args->keys->key[0], &afi, &safi); table_id = yang_str2uint32(args->keys->key[1]); diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index d36c2f81c789..80d34b884a57 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -20,6 +20,7 @@ #include "vxlan.h" #include "termtable.h" #include "affinitymap.h" +#include "mgmt_be_client.h" #include "zebra/zebra_router.h" #include "zebra/zserv.h" @@ -4702,4 +4703,6 @@ void zebra_vty_init(void) #endif /* HAVE_SCRIPTING */ install_element(VIEW_NODE, &zebra_show_routing_tables_summary_cmd); + + mgmt_be_client_lib_vty_init(); }