summaryrefslogtreecommitdiff
path: root/zebra/zebra_srv6.c
diff options
context:
space:
mode:
authorCarmine Scarpitta <cscarpit@cisco.com>2024-03-23 15:50:24 +0100
committerCarmine Scarpitta <cscarpit@cisco.com>2024-06-13 14:54:16 +0200
commitf8da4a29e58ec301c72a17f238686a59b62edef0 (patch)
tree55371610c5dcf4f4945ae125b49e454760eb6241 /zebra/zebra_srv6.c
parent164117f2ec3d85c7ed63bb81413fb0d28651bc84 (diff)
zebra: Repond to `GET_LOCATOR` ZAPI request
The previous commits introduced a new operation, `ZEBRA_SRV6_MANAGER_GET_LOCATOR`, allowing a daemon to request information about a specific SRv6 locator from the SRv6 SID Manager. This commit extends the SID Manager to respond to a `ZEBRA_SRV6_MANAGER_GET_LOCATOR` request and provide the requested locator information. Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com>
Diffstat (limited to 'zebra/zebra_srv6.c')
-rw-r--r--zebra/zebra_srv6.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/zebra/zebra_srv6.c b/zebra/zebra_srv6.c
index 6e72440274..0217be8c7f 100644
--- a/zebra/zebra_srv6.c
+++ b/zebra/zebra_srv6.c
@@ -61,6 +61,11 @@ DEFINE_HOOK(srv6_manager_release_chunk,
vrf_id_t vrf_id),
(client, locator_name, vrf_id));
+DEFINE_HOOK(srv6_manager_get_locator,
+ (struct srv6_locator **locator, struct zserv *client,
+ const char *locator_name),
+ (locator, client, locator_name));
+
/* define wrappers to be called in zapi_msg.c (as hooks must be called in
* source file where they were defined)
*/
@@ -91,6 +96,13 @@ int srv6_manager_client_disconnect_cb(struct zserv *client)
return 0;
}
+void srv6_manager_get_locator_call(struct srv6_locator **locator,
+ struct zserv *client,
+ const char *locator_name)
+{
+ hook_call(srv6_manager_get_locator, locator, client, locator_name);
+}
+
static int zebra_srv6_cleanup(struct zserv *client)
{
return 0;
@@ -921,6 +933,28 @@ void zebra_srv6_encap_src_addr_unset(void)
memset(&srv6->encap_src_addr, 0, sizeof(struct in6_addr));
}
+/**
+ * Handle a get SRv6 Locator request received from a client.
+ *
+ * It looks up the requested locator and send it to the client.
+ *
+ * @param locator SRv6 locator returned by this function
+ * @param client The client that sent the Get SRv6 Locator request
+ * @param locator_name Name of the locator to look up
+ *
+ * @return 0 on success
+ */
+static int srv6_manager_get_srv6_locator_internal(struct srv6_locator **locator,
+ struct zserv *client,
+ const char *locator_name)
+{
+ *locator = zebra_srv6_locator_lookup(locator_name);
+ if (!*locator)
+ return -1;
+
+ return zsend_zebra_srv6_locator_add(client, *locator);
+}
+
void zebra_srv6_terminate(void)
{
struct srv6_locator *locator;
@@ -983,6 +1017,9 @@ void zebra_srv6_init(void)
zebra_srv6_manager_get_locator_chunk);
hook_register(srv6_manager_release_chunk,
zebra_srv6_manager_release_locator_chunk);
+
+ hook_register(srv6_manager_get_locator,
+ srv6_manager_get_srv6_locator_internal);
}
bool zebra_srv6_is_enable(void)