summaryrefslogtreecommitdiffstats
path: root/mgmtd/mgmt_be_adapter.c
diff options
context:
space:
mode:
Diffstat (limited to 'mgmtd/mgmt_be_adapter.c')
-rw-r--r--mgmtd/mgmt_be_adapter.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/mgmtd/mgmt_be_adapter.c b/mgmtd/mgmt_be_adapter.c
index 45e154d83..1c32f936b 100644
--- a/mgmtd/mgmt_be_adapter.c
+++ b/mgmtd/mgmt_be_adapter.c
@@ -77,6 +77,7 @@ static const char *const zebra_config_xpaths[] = {
};
static const char *const zebra_oper_xpaths[] = {
+ "/frr-backend:clients",
"/frr-interface:lib/interface",
"/frr-vrf:lib/vrf/frr-zebra:zebra",
"/frr-zebra:zebra",
@@ -94,6 +95,7 @@ static const char *const ripd_config_xpaths[] = {
NULL,
};
static const char *const ripd_oper_xpaths[] = {
+ "/frr-backend:clients",
"/frr-ripd:ripd",
"/ietf-key-chain:key-chains",
NULL,
@@ -114,6 +116,7 @@ static const char *const ripngd_config_xpaths[] = {
NULL,
};
static const char *const ripngd_oper_xpaths[] = {
+ "/frr-backend:clients",
"/frr-ripngd:ripngd",
NULL,
};
@@ -130,6 +133,11 @@ static const char *const staticd_config_xpaths[] = {
"/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-staticd:staticd",
NULL,
};
+
+static const char *const staticd_oper_xpaths[] = {
+ "/frr-backend:clients",
+ NULL,
+};
#endif
static const char *const *be_client_config_xpaths[MGMTD_BE_CLIENT_ID_MAX] = {
@@ -152,6 +160,9 @@ static const char *const *be_client_oper_xpaths[MGMTD_BE_CLIENT_ID_MAX] = {
#ifdef HAVE_RIPNGD
[MGMTD_BE_CLIENT_ID_RIPNGD] = ripngd_oper_xpaths,
#endif
+#ifdef HAVE_STATICD
+ [MGMTD_BE_CLIENT_ID_STATICD] = staticd_oper_xpaths,
+#endif
[MGMTD_BE_CLIENT_ID_ZEBRA] = zebra_oper_xpaths,
};
@@ -320,7 +331,7 @@ static void mgmt_be_xpath_map_init(void)
__dbg("Total Cfg XPath Maps: %u", darr_len(be_cfg_xpath_map));
__dbg("Total Oper XPath Maps: %u", darr_len(be_oper_xpath_map));
- __dbg("Total Noitf XPath Maps: %u", darr_len(be_notif_xpath_map));
+ __dbg("Total Notif XPath Maps: %u", darr_len(be_notif_xpath_map));
__dbg("Total RPC XPath Maps: %u", darr_len(be_rpc_xpath_map));
}
@@ -651,13 +662,17 @@ int mgmt_be_send_native(enum mgmt_be_client_id id, void *msg)
return mgmt_msg_native_send_msg(adapter->conn, msg, false);
}
+/*
+ * Send notification to back-ends that subscribed for them.
+ */
static void mgmt_be_adapter_send_notify(struct mgmt_msg_notify_data *msg,
size_t msglen)
{
struct mgmt_be_client_adapter *adapter;
struct mgmt_be_xpath_map *map;
- struct nb_node *nb_node;
+ struct nb_node *nb_node = NULL;
const char *notif;
+ bool is_root;
uint id, len;
if (!darr_len(be_notif_xpath_map))
@@ -669,28 +684,34 @@ static void mgmt_be_adapter_send_notify(struct mgmt_msg_notify_data *msg,
return;
}
- nb_node = nb_node_find(notif);
- if (!nb_node) {
- __log_err("No schema found for notification: %s", notif);
- return;
+ is_root = !strcmp(notif, "/");
+ if (!is_root) {
+ nb_node = nb_node_find(notif);
+ if (!nb_node) {
+ __log_err("No schema found for notification: %s", notif);
+ return;
+ }
}
darr_foreach_p (be_notif_xpath_map, map) {
- len = strlen(map->xpath_prefix);
- if (strncmp(map->xpath_prefix, nb_node->xpath, len) &&
- strncmp(map->xpath_prefix, notif, len))
- continue;
-
+ if (!is_root) {
+ len = strlen(map->xpath_prefix);
+ if (strncmp(map->xpath_prefix, nb_node->xpath, len) &&
+ strncmp(map->xpath_prefix, notif, len))
+ continue;
+ }
FOREACH_BE_CLIENT_BITS (id, map->clients) {
adapter = mgmt_be_get_adapter_by_id(id);
if (!adapter)
continue;
+
msg_conn_send_msg(adapter->conn, MGMT_MSG_VERSION_NATIVE,
msg, msglen, NULL, false);
}
}
}
+
/*
* Handle a native encoded message
*/
@@ -735,6 +756,9 @@ static void be_adapter_handle_native_msg(struct mgmt_be_client_adapter *adapter,
mgmt_txn_notify_rpc_reply(adapter, rpc_msg, msg_len);
break;
case MGMT_MSG_CODE_NOTIFY:
+ /*
+ * Handle notify message from a back-end client
+ */
notify_msg = (typeof(notify_msg))msg;
__dbg("Got NOTIFY from '%s'", adapter->name);
mgmt_be_adapter_send_notify(notify_msg, msg_len);