summaryrefslogtreecommitdiffstats
path: root/zebra/zapi_msg.c
diff options
context:
space:
mode:
authorCarmine Scarpitta <cscarpit@cisco.com>2024-03-22 19:31:01 +0100
committerCarmine Scarpitta <cscarpit@cisco.com>2024-06-13 14:54:16 +0200
commit779d4c2702ac446cc4b96a1a9d2d62d1b0bbe232 (patch)
tree1a5447630cf2c4869cd40d44529bab15b7cc4120 /zebra/zapi_msg.c
parentlib: Add function to copy an SRv6 locator (diff)
downloadfrr-779d4c2702ac446cc4b96a1a9d2d62d1b0bbe232.tar.xz
frr-779d4c2702ac446cc4b96a1a9d2d62d1b0bbe232.zip
zebra: CLI to specify format of an SRv6 locator
Add the CLI to choose the SID format of a locator. When the SID format of a locator is changed, the SIDs allocated from that locator might no longer be valid (for example, because the new format might involve a different SID allocation schema). In such a case, it is necessary to notify all the zclients so that they can withdraw/uninstall the old SIDs that use the previous format and allocate/install/advertise the new SIDs based on the new format. Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com>
Diffstat (limited to 'zebra/zapi_msg.c')
-rw-r--r--zebra/zapi_msg.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index d585ef996..2d580e297 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -1136,9 +1136,25 @@ static int zsend_table_manager_connect_response(struct zserv *client,
int zsend_zebra_srv6_locator_add(struct zserv *client, struct srv6_locator *loc)
{
struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ);
+ struct srv6_locator locator = {};
+ struct srv6_sid_format *format = loc->sid_format;
+
+ /*
+ * Copy the locator and fill locator block/node/func/arg length from the format
+ * before sending the locator to the zclient
+ */
+ srv6_locator_copy(&locator, loc);
+ if (format) {
+ locator.block_bits_length = format->block_len;
+ locator.node_bits_length = format->node_len;
+ locator.function_bits_length = format->function_len;
+ locator.argument_bits_length = format->argument_len;
+ if (format->type == ZEBRA_SRV6_SID_FORMAT_TYPE_USID)
+ SET_FLAG(locator.flags, SRV6_LOCATOR_USID);
+ }
zclient_create_header(s, ZEBRA_SRV6_LOCATOR_ADD, VRF_DEFAULT);
- zapi_srv6_locator_encode(s, loc);
+ zapi_srv6_locator_encode(s, &locator);
stream_putw_at(s, 0, stream_get_endp(s));
return zserv_send_message(client, s);