diff --git a/lib/mgmt_be_client.c b/lib/mgmt_be_client.c index d86f3d336a..1e98c6123d 100644 --- a/lib/mgmt_be_client.c +++ b/lib/mgmt_be_client.c @@ -146,10 +146,8 @@ static bool mgmt_debug_be_client; static struct mgmt_be_client_ctx mgmt_be_client_ctx = {0}; const char *mgmt_be_client_names[MGMTD_BE_CLIENT_ID_MAX + 1] = { -#if 0 #ifdef HAVE_STATICD [MGMTD_BE_CLIENT_ID_STATICD] = "staticd", -#endif #endif [MGMTD_BE_CLIENT_ID_MAX] = "Unknown/Invalid", }; diff --git a/lib/mgmt_be_client.h b/lib/mgmt_be_client.h index 75b4ddf017..bf875f5a45 100644 --- a/lib/mgmt_be_client.h +++ b/lib/mgmt_be_client.h @@ -25,10 +25,8 @@ extern "C" { enum mgmt_be_client_id { MGMTD_BE_CLIENT_ID_MIN = 0, MGMTD_BE_CLIENT_ID_INIT = -1, -#if 0 /* example */ #ifdef HAVE_STATICD MGMTD_BE_CLIENT_ID_STATICD, -#endif #endif MGMTD_BE_CLIENT_ID_MAX }; diff --git a/mgmtd/mgmt_be_adapter.c b/mgmtd/mgmt_be_adapter.c index b47ed3afe1..8ad4064298 100644 --- a/mgmtd/mgmt_be_adapter.c +++ b/mgmtd/mgmt_be_adapter.c @@ -78,19 +78,15 @@ static const struct mgmt_be_xpath_map_reg xpath_static_map_reg[] = { {.xpath_regexp = "/frr-vrf:lib/*", .be_clients = (enum mgmt_be_client_id[]){ -#if 0 #if HAVE_STATICD MGMTD_BE_CLIENT_ID_STATICD, -#endif #endif MGMTD_BE_CLIENT_ID_MAX}}, {.xpath_regexp = "/frr-interface:lib/*", .be_clients = (enum mgmt_be_client_id[]){ -#if 0 #if HAVE_STATICD MGMTD_BE_CLIENT_ID_STATICD, -#endif #endif MGMTD_BE_CLIENT_ID_MAX}}, {.xpath_regexp = @@ -98,10 +94,8 @@ static const struct mgmt_be_xpath_map_reg xpath_static_map_reg[] = { .be_clients = (enum mgmt_be_client_id[]){ -#if 0 #if HAVE_STATICD MGMTD_BE_CLIENT_ID_STATICD, -#endif #endif MGMTD_BE_CLIENT_ID_MAX}}, }; diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c index 017263ca88..7d176059f5 100644 --- a/mgmtd/mgmt_main.c +++ b/mgmtd/mgmt_main.c @@ -201,12 +201,10 @@ static const struct frr_yang_module_info *const mgmt_yang_modules[] = { * NOTE: Always set .ignore_cbs true for to avoid validating * backend northbound callbacks during loading. */ -#if 0 #ifdef HAVE_STATICD &(struct frr_yang_module_info){.name = "frr-staticd", .ignore_cbs = true}, #endif -#endif }; FRR_DAEMON_INFO(mgmtd, MGMTD, .vty_port = MGMTD_VTY_PORT, diff --git a/mgmtd/mgmt_vty.c b/mgmtd/mgmt_vty.c index 0ac4ebc9e6..79fa54a791 100644 --- a/mgmtd/mgmt_vty.c +++ b/mgmtd/mgmt_vty.c @@ -447,11 +447,9 @@ void mgmt_vty_init(void) * backend components that are moved to new MGMTD infra * here one by one. */ -#if 0 #if HAVE_STATICD extern void static_vty_init(void); static_vty_init(); -#endif #endif install_node(&debug_node); diff --git a/mgmtd/subdir.am b/mgmtd/subdir.am index d56fd93450..a93f8f9441 100644 --- a/mgmtd/subdir.am +++ b/mgmtd/subdir.am @@ -60,3 +60,9 @@ mgmtd_mgmtd_SOURCES = \ mgmtd_mgmtd_CFLAGS = $(AM_CFLAGS) -I ./ mgmtd_mgmtd_LDADD = mgmtd/libmgmtd.a lib/libfrr.la $(LIBCAP) $(LIBM) $(LIBYANG_LIBS) $(UST_LIBS) mgmtd_mgmtd_LDADD += mgmtd/libmgmt_be_nb.la + +if STATICD +$(mgmtd_mgmtd_OBJECTS): yang/frr-staticd.yang.c +CLEANFILES += yang/frr-staticd.yang.c +nodist_mgmtd_libmgmt_be_nb_la_SOURCES += staticd/static_vty.c +endif diff --git a/staticd/static_main.c b/staticd/static_main.c index 0d0de7e8d3..d429162196 100644 --- a/staticd/static_main.c +++ b/staticd/static_main.c @@ -27,6 +27,8 @@ #include "static_debug.h" #include "static_nb.h" +#include "mgmt_be_client.h" + char backup_config_file[256]; bool mpls_enabled; @@ -51,6 +53,8 @@ struct option longopts[] = { { 0 } }; /* Master of threads. */ struct thread_master *master; +uintptr_t mgmt_lib_hndl; + static struct frr_daemon_info staticd_di; /* SIGHUP handler. */ static void sighup(void) @@ -67,6 +71,8 @@ static void sigint(void) /* Disable BFD events to avoid wasting processing. */ bfd_protocol_integration_set_shutdown(true); + mgmt_be_client_lib_destroy(mgmt_lib_hndl); + static_vrf_terminate(); static_zebra_stop(); @@ -100,6 +106,51 @@ struct frr_signal_t static_signals[] = { }, }; +static void static_mgmt_be_client_connect(uintptr_t lib_hndl, + uintptr_t usr_data, bool connected) +{ + (void)usr_data; + + assert(lib_hndl == mgmt_lib_hndl); + + zlog_debug("Got %s %s MGMTD Backend Client Server", + connected ? "connected" : "disconnected", + connected ? "to" : "from"); + + if (connected) + (void)mgmt_be_subscribe_yang_data(mgmt_lib_hndl, NULL, 0); +} + +#if 0 +static void +static_mgmt_txn_notify(uintptr_t lib_hndl, uintptr_t usr_data, + struct mgmt_be_client_txn_ctx *txn_ctx, + bool destroyed) +{ + zlog_debug("Got Txn %s Notify from MGMTD server", + destroyed ? "DESTROY" : "CREATE"); + + if (!destroyed) { + /* + * TODO: Allocate and install a private scratchpad for this + * transaction if required + */ + } else { + /* + * TODO: Uninstall and deallocate the private scratchpad for + * this transaction if installed earlier. + */ + } +} +#endif + +static struct mgmt_be_client_params mgmt_params = { + .name = "staticd", + .conn_retry_intvl_sec = 3, + .client_connect_notify = static_mgmt_be_client_connect, + .txn_notify = NULL, /* static_mgmt_txn_notify */ +}; + static const struct frr_yang_module_info *const staticd_yang_modules[] = { &frr_filter_info, &frr_interface_info, @@ -150,6 +201,10 @@ int main(int argc, char **argv, char **envp) static_zebra_init(); static_vty_init(); + /* Initialize MGMT backend functionalities */ + mgmt_lib_hndl = mgmt_be_client_lib_init(&mgmt_params, master); + assert(mgmt_lib_hndl); + hook_register(routing_conf_event, routing_control_plane_protocols_name_validate); diff --git a/staticd/static_routes.c b/staticd/static_routes.c index 3399686a90..1fbbf7e99d 100644 --- a/staticd/static_routes.c +++ b/staticd/static_routes.c @@ -757,30 +757,6 @@ void static_ifindex_update(struct interface *ifp, bool up) static_ifindex_update_af(ifp, up, AFI_IP6, SAFI_MULTICAST); } -void static_get_nh_type(enum static_nh_type stype, char *type, size_t size) -{ - switch (stype) { - case STATIC_IFNAME: - strlcpy(type, "ifindex", size); - break; - case STATIC_IPV4_GATEWAY: - strlcpy(type, "ip4", size); - break; - case STATIC_IPV4_GATEWAY_IFNAME: - strlcpy(type, "ip4-ifindex", size); - break; - case STATIC_BLACKHOLE: - strlcpy(type, "blackhole", size); - break; - case STATIC_IPV6_GATEWAY: - strlcpy(type, "ip6", size); - break; - case STATIC_IPV6_GATEWAY_IFNAME: - strlcpy(type, "ip6-ifindex", size); - break; - }; -} - struct stable_info *static_get_stable_info(struct route_node *rn) { struct route_table *table; diff --git a/staticd/static_routes.h b/staticd/static_routes.h index eb7953db2c..4fd7a1342f 100644 --- a/staticd/static_routes.h +++ b/staticd/static_routes.h @@ -159,6 +159,31 @@ static_route_info_from_rnode(struct route_node *rn) return (struct static_route_info *)(rn->info); } +static inline void static_get_nh_type(enum static_nh_type stype, char *type, + size_t size) +{ + switch (stype) { + case STATIC_IFNAME: + strlcpy(type, "ifindex", size); + break; + case STATIC_IPV4_GATEWAY: + strlcpy(type, "ip4", size); + break; + case STATIC_IPV4_GATEWAY_IFNAME: + strlcpy(type, "ip4-ifindex", size); + break; + case STATIC_BLACKHOLE: + strlcpy(type, "blackhole", size); + break; + case STATIC_IPV6_GATEWAY: + strlcpy(type, "ip6", size); + break; + case STATIC_IPV6_GATEWAY_IFNAME: + strlcpy(type, "ip6-ifindex", size); + break; + }; +} + extern bool mpls_enabled; extern uint32_t zebra_ecmp_count; @@ -192,8 +217,6 @@ extern struct static_path *static_add_path(struct route_node *rn, uint32_t table_id, uint8_t distance); extern void static_del_path(struct static_path *pn); -extern void static_get_nh_type(enum static_nh_type stype, char *type, - size_t size); extern bool static_add_nexthop_validate(const char *nh_vrf_name, enum static_nh_type type, struct ipaddr *ipaddr); diff --git a/staticd/static_vty.c b/staticd/static_vty.c index d87ca16c61..bfffbe6a60 100644 --- a/staticd/static_vty.c +++ b/staticd/static_vty.c @@ -1452,15 +1452,18 @@ DEFPY_YANG(debug_staticd, debug_staticd_cmd, "Debug route\n" "Debug bfd\n") { +#ifndef INCLUDE_MGMTD_CMDDEFS_ONLY /* If no specific category, change all */ if (strmatch(argv[argc - 1]->text, "static")) static_debug_set(vty->node, !no, true, true, true); else static_debug_set(vty->node, !no, !!events, !!route, !!bfd); +#endif /* ifndef INCLUDE_MGMTD_CMDDEFS_ONLY */ return CMD_SUCCESS; } +#ifndef INCLUDE_MGMTD_CMDDEFS_ONLY DEFPY(staticd_show_bfd_routes, staticd_show_bfd_routes_cmd, "show bfd static route [json]$isjson", SHOW_STR @@ -1496,9 +1499,15 @@ static struct cmd_node debug_node = { .config_write = static_config_write_debug, }; +#endif /* ifndef INCLUDE_MGMTD_CMDDEFS_ONLY */ + void static_vty_init(void) { +#ifndef INCLUDE_MGMTD_CMDDEFS_ONLY install_node(&debug_node); + install_element(ENABLE_NODE, &show_debugging_static_cmd); + install_element(ENABLE_NODE, &staticd_show_bfd_routes_cmd); +#endif /* ifndef INCLUDE_MGMTD_CMDDEFS_ONLY */ install_element(CONFIG_NODE, &ip_mroute_dist_cmd); @@ -1516,9 +1525,6 @@ void static_vty_init(void) install_element(CONFIG_NODE, &ipv6_route_cmd); install_element(VRF_NODE, &ipv6_route_vrf_cmd); - install_element(ENABLE_NODE, &show_debugging_static_cmd); install_element(ENABLE_NODE, &debug_staticd_cmd); install_element(CONFIG_NODE, &debug_staticd_cmd); - - install_element(ENABLE_NODE, &staticd_show_bfd_routes_cmd); }