summaryrefslogtreecommitdiff
path: root/zebra/zapi_msg.c
diff options
context:
space:
mode:
authorCarmine Scarpitta <cscarpit@cisco.com>2024-03-23 17:25:39 +0100
committerCarmine Scarpitta <cscarpit@cisco.com>2024-06-13 14:54:16 +0200
commit84dd482cb929d522cf12c91c2e7ec1faead848ea (patch)
treec3b8127bc3892c545a366c8435e64cb2ef547589 /zebra/zapi_msg.c
parentc570d2bcaec477167d613d1b2bf57021200d1f89 (diff)
zebra: Alloc/Release SIDs to daemons upon request
Previous commits introduced two new ZAPI operations, `ZEBRA_SRV6_MANAGER_GET_SRV6_SID` and `ZEBRA_SRV6_MANAGER_RELEASE_SRV6_SID`. These operations allow a daemon to interact with the SRv6 SID Manager to get and release an SRv6 SID, respectively. This commit extends the SID Manager by adding logic to process the requests `ZEBRA_SRV6_MANAGER_GET_SRV6_SID` and `ZEBRA_SRV6_MANAGER_RELEASE_SRV6_SID`, and allocate/release SIDs to requesting daemons. Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com>
Diffstat (limited to 'zebra/zapi_msg.c')
-rw-r--r--zebra/zapi_msg.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 52ee087689..bab4c4fa3d 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -3007,6 +3007,71 @@ stream_failure:
}
/**
+ * Handle SRv6 SID request received from a client daemon protocol.
+ *
+ * @param client The client zapi session
+ * @param msg The request message
+ */
+static void zread_srv6_manager_get_srv6_sid(struct zserv *client,
+ struct stream *msg)
+{
+ struct stream *s;
+ struct srv6_sid_ctx ctx = {};
+ struct in6_addr sid_value = {};
+ struct in6_addr *sid_value_ptr = NULL;
+ char locator[SRV6_LOCNAME_SIZE] = { 0 };
+ uint16_t len;
+ struct zebra_srv6_sid *sid = NULL;
+ uint8_t flags;
+
+ /* Get input stream */
+ s = msg;
+
+ /* Get data */
+ STREAM_GET(&ctx, s, sizeof(struct srv6_sid_ctx));
+ STREAM_GETC(s, flags);
+ if (CHECK_FLAG(flags, ZAPI_SRV6_MANAGER_SID_FLAG_HAS_SID_VALUE)) {
+ STREAM_GET(&sid_value, s, sizeof(struct in6_addr));
+ sid_value_ptr = &sid_value;
+ }
+ if (CHECK_FLAG(flags, ZAPI_SRV6_MANAGER_SID_FLAG_HAS_LOCATOR)) {
+ STREAM_GETW(s, len);
+ STREAM_GET(locator, s, len);
+ }
+
+ /* Call hook to get a SID using wrapper */
+ srv6_manager_get_sid_call(&sid, client, &ctx, sid_value_ptr, locator);
+
+stream_failure:
+ return;
+}
+
+/**
+ * Handle SRv6 SID release request received from a client daemon protocol.
+ *
+ * @param client The client zapi session
+ * @param msg The request message
+ */
+static void zread_srv6_manager_release_srv6_sid(struct zserv *client,
+ struct stream *msg)
+{
+ struct stream *s;
+ struct srv6_sid_ctx ctx = {};
+
+ /* Get input stream */
+ s = msg;
+
+ /* Get data */
+ STREAM_GET(&ctx, s, sizeof(struct srv6_sid_ctx));
+
+ /* Call hook to release a SID using wrapper */
+ srv6_manager_release_sid_call(client, &ctx);
+
+stream_failure:
+ return;
+}
+
+/**
* Handle SRv6 locator get request received from a client daemon protocol.
*
* @param client The client zapi session
@@ -3042,6 +3107,12 @@ static void zread_srv6_manager_request(ZAPI_HANDLER_ARGS)
zread_srv6_manager_release_locator_chunk(client, msg,
zvrf_id(zvrf));
break;
+ case ZEBRA_SRV6_MANAGER_GET_SRV6_SID:
+ zread_srv6_manager_get_srv6_sid(client, msg);
+ break;
+ case ZEBRA_SRV6_MANAGER_RELEASE_SRV6_SID:
+ zread_srv6_manager_release_srv6_sid(client, msg);
+ break;
case ZEBRA_SRV6_MANAGER_GET_LOCATOR:
zread_srv6_manager_get_locator(client, msg);
break;
@@ -3993,6 +4064,8 @@ void (*const zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
[ZEBRA_MLAG_FORWARD_MSG] = zebra_mlag_forward_client_msg,
[ZEBRA_SRV6_MANAGER_GET_LOCATOR_CHUNK] = zread_srv6_manager_request,
[ZEBRA_SRV6_MANAGER_RELEASE_LOCATOR_CHUNK] = zread_srv6_manager_request,
+ [ZEBRA_SRV6_MANAGER_GET_SRV6_SID] = zread_srv6_manager_request,
+ [ZEBRA_SRV6_MANAGER_RELEASE_SRV6_SID] = zread_srv6_manager_request,
[ZEBRA_SRV6_MANAGER_GET_LOCATOR] = zread_srv6_manager_request,
[ZEBRA_CLIENT_CAPABILITIES] = zread_client_capabilities,
[ZEBRA_NEIGH_DISCOVER] = zread_neigh_discover,