]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Repond to `GET_LOCATOR` ZAPI request
authorCarmine Scarpitta <cscarpit@cisco.com>
Sat, 23 Mar 2024 14:50:24 +0000 (15:50 +0100)
committerCarmine Scarpitta <cscarpit@cisco.com>
Thu, 13 Jun 2024 12:54:16 +0000 (14:54 +0200)
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>
zebra/zapi_msg.c
zebra/zapi_msg.h
zebra/zebra_srv6.c
zebra/zebra_srv6.h

index 2d580e2972ed8665bd16230e101698d6bcea47f4..21c18a1445941f8c153ddfe3e2fcd26fb8df8f85 100644 (file)
@@ -3006,6 +3006,31 @@ stream_failure:
        return;
 }
 
+/**
+ * Handle SRv6 locator get request received from a client daemon protocol.
+ *
+ * @param client The client zapi session
+ * @param msg The request message
+ */
+static void zread_srv6_manager_get_locator(struct zserv *client,
+                                          struct stream *msg)
+{
+       struct stream *s = msg;
+       uint16_t len;
+       char locator_name[SRV6_LOCNAME_SIZE] = { 0 };
+       struct srv6_locator *locator = NULL;
+
+       /* Get data */
+       STREAM_GETW(s, len);
+       STREAM_GET(locator_name, s, len);
+
+       /* Call hook to get the locator info using wrapper */
+       srv6_manager_get_locator_call(&locator, client, locator_name);
+
+stream_failure:
+       return;
+}
+
 static void zread_srv6_manager_request(ZAPI_HANDLER_ARGS)
 {
        switch (hdr->command) {
@@ -3017,6 +3042,9 @@ 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_LOCATOR:
+               zread_srv6_manager_get_locator(client, msg);
+               break;
        default:
                zlog_err("%s: unknown SRv6 Manager command", __func__);
                break;
@@ -3965,6 +3993,7 @@ 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_LOCATOR] = zread_srv6_manager_request,
        [ZEBRA_CLIENT_CAPABILITIES] = zread_client_capabilities,
        [ZEBRA_NEIGH_DISCOVER] = zread_neigh_discover,
        [ZEBRA_NHG_ADD] = zread_nhg_add,
index 43f734d26e6d9c7a5d60b2b0b75c67c83623741e..c7123e2593f2a78204852b2b8ef39e6b97ef9717 100644 (file)
@@ -110,6 +110,9 @@ extern int zsend_zebra_srv6_locator_delete(struct zserv *client,
 extern int zsend_srv6_manager_get_locator_chunk_response(struct zserv *client,
                vrf_id_t vrf_id, struct srv6_locator *loc);
 
+extern int zsend_srv6_manager_get_locator_response(struct zserv *client,
+                                                  struct srv6_locator *locator);
+
 #ifdef __cplusplus
 }
 #endif
index 6e72440274865cca45c7501b1b4c39011c547d05..0217be8c7f55f03451f5610354d166ca3230150c 100644 (file)
@@ -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)
index ad100925755feaf642cbdc1861071af675dc712c..681789e4aca91bfcf890b56eaa48d4700d4e2691 100644 (file)
@@ -231,6 +231,10 @@ DECLARE_HOOK(srv6_manager_release_chunk,
              vrf_id_t vrf_id),
             (client, locator_name, vrf_id));
 
+DECLARE_HOOK(srv6_manager_get_locator,
+            (struct srv6_locator **locator, struct zserv *client,
+             const char *locator_name),
+            (locator, client, locator_name));
 
 extern void zebra_srv6_locator_add(struct srv6_locator *locator);
 extern void zebra_srv6_locator_delete(struct srv6_locator *locator);
@@ -286,6 +290,10 @@ zebra_srv6_sid_alloc(struct zebra_srv6_sid_ctx *ctx, struct in6_addr *sid_value,
 extern void zebra_srv6_sid_free(struct zebra_srv6_sid *sid);
 extern void delete_zebra_srv6_sid(void *val);
 
+extern void srv6_manager_get_locator_call(struct srv6_locator **locator,
+                                         struct zserv *client,
+                                         const char *locator_name);
+
 extern struct zebra_srv6_sid_ctx *zebra_srv6_sid_ctx_alloc(void);
 extern void zebra_srv6_sid_ctx_free(struct zebra_srv6_sid_ctx *ctx);
 extern void delete_zebra_srv6_sid_ctx(void *val);