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) {
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;
[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,
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
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)
*/
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;
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;
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)
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);
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);