From 6cd4b6a5e6ec0c5e28f9dd974ec852b2874693d5 Mon Sep 17 00:00:00 2001 From: Carmine Scarpitta Date: Fri, 17 Jan 2025 14:06:41 -0600 Subject: [PATCH] Verifying static SRv6 SIDs parameters Signed-off-by: Carmine Scarpitta --- .../dplane_fpm_sonic/dplane_fpm_sonic.c | 44 +++++----- .../0079-staticd-add-support-for-srv6.patch | 82 ++++++++++++++++--- 2 files changed, 92 insertions(+), 34 deletions(-) diff --git a/src/sonic-frr/dplane_fpm_sonic/dplane_fpm_sonic.c b/src/sonic-frr/dplane_fpm_sonic/dplane_fpm_sonic.c index 343cc1f3262..31f31cd1fa0 100644 --- a/src/sonic-frr/dplane_fpm_sonic/dplane_fpm_sonic.c +++ b/src/sonic-frr/dplane_fpm_sonic/dplane_fpm_sonic.c @@ -1035,33 +1035,29 @@ static ssize_t netlink_srv6_localsid_msg_encode(int cmd, nl_attr_nest(&req->n, datalen, FPM_SRV6_LOCALSID_FORMAT); - if (nexthop->nh_srv6->seg6local_ctx.block_len) - if (!nl_attr_put8( - &req->n, datalen, - FPM_SRV6_LOCALSID_FORMAT_BLOCK_LEN, - nexthop->nh_srv6->seg6local_ctx.block_len)) - return -1; + if (!nl_attr_put8( + &req->n, datalen, + FPM_SRV6_LOCALSID_FORMAT_BLOCK_LEN, + nexthop->nh_srv6->seg6local_ctx.block_len)) + return -1; - if (nexthop->nh_srv6->seg6local_ctx.node_len) - if (!nl_attr_put8( - &req->n, datalen, - FPM_SRV6_LOCALSID_FORMAT_NODE_LEN, - nexthop->nh_srv6->seg6local_ctx.node_len)) - return -1; + if (!nl_attr_put8( + &req->n, datalen, + FPM_SRV6_LOCALSID_FORMAT_NODE_LEN, + nexthop->nh_srv6->seg6local_ctx.node_len)) + return -1; - if (nexthop->nh_srv6->seg6local_ctx.function_len) - if (!nl_attr_put8( - &req->n, datalen, - FPM_SRV6_LOCALSID_FORMAT_FUNC_LEN, - nexthop->nh_srv6->seg6local_ctx.function_len)) - return -1; + if (!nl_attr_put8( + &req->n, datalen, + FPM_SRV6_LOCALSID_FORMAT_FUNC_LEN, + nexthop->nh_srv6->seg6local_ctx.function_len)) + return -1; - if (nexthop->nh_srv6->seg6local_ctx.argument_len) - if (!nl_attr_put8( - &req->n, datalen, - FPM_SRV6_LOCALSID_FORMAT_ARG_LEN, - nexthop->nh_srv6->seg6local_ctx.argument_len)) - return -1; + if (!nl_attr_put8( + &req->n, datalen, + FPM_SRV6_LOCALSID_FORMAT_ARG_LEN, + nexthop->nh_srv6->seg6local_ctx.argument_len)) + return -1; nl_attr_nest_end(&req->n, nest); diff --git a/src/sonic-frr/patch/0079-staticd-add-support-for-srv6.patch b/src/sonic-frr/patch/0079-staticd-add-support-for-srv6.patch index 9c1803f13a2..bba0fdf20a8 100644 --- a/src/sonic-frr/patch/0079-staticd-add-support-for-srv6.patch +++ b/src/sonic-frr/patch/0079-staticd-add-support-for-srv6.patch @@ -14,7 +14,7 @@ Signed-off-by: Carmine Scarpitta staticd/static_srv6.h | 125 ++++ staticd/static_vrf.c | 2 + staticd/static_vty.c | 320 +++++++++ - staticd/static_zebra.c | 636 ++++++++++++++++++ + staticd/static_zebra.c | 698 ++++++++++++++++++ staticd/static_zebra.h | 12 +- staticd/subdir.am | 2 + tests/topotests/static_srv6_sids/__init__.py | 0 @@ -1136,7 +1136,7 @@ index d76befc131..f86fd3b48a 100644 return 0; } -@@ -530,10 +537,639 @@ extern void static_zebra_route_add(struct static_path *pn, bool install) +@@ -529,10 +536,701 @@ extern void static_zebra_route_add(struct static_path *pn, bool install) zclient, &api); } @@ -1218,6 +1218,9 @@ index d76befc131..f86fd3b48a 100644 + struct seg6local_context ctx = {}; + struct interface *ifp = NULL; + struct vrf *vrf; ++ struct prefix_ipv6 sid_block = {}; ++ struct prefix_ipv6 locator_block = {}; ++ struct prefix_ipv6 sid_locator = {}; + + if (!sid) + return; @@ -1291,10 +1294,38 @@ index d76befc131..f86fd3b48a 100644 + break; + } + -+ ctx.block_len = sid->locator->block_bits_length; -+ ctx.node_len = sid->locator->node_bits_length; -+ ctx.function_len = sid->locator->function_bits_length; -+ ctx.argument_len = sid->locator->argument_bits_length; ++ ctx.block_len = 0; ++ ctx.node_len = 0; ++ ctx.function_len = 0; ++ ctx.argument_len = 0; ++ ++ sid_block = sid->addr; ++ sid_block.prefixlen = sid->locator->block_bits_length; ++ apply_mask(&sid_block); ++ ++ locator_block = sid->locator->prefix; ++ locator_block.prefixlen = sid->locator->block_bits_length; ++ apply_mask(&locator_block); ++ ++ if (prefix_same(&sid_block, &locator_block)) ++ ctx.block_len = sid->locator->block_bits_length; ++ else { ++ zlog_warn("SID block %pFX does not match locator block %pFX", &sid_block, &locator_block); ++ return; ++ } ++ ++ sid_locator = sid->addr; ++ sid_locator.prefixlen = sid->locator->block_bits_length + sid->locator->node_bits_length; ++ apply_mask(&sid_locator); ++ ++ if (prefix_same(&sid_locator, &sid->locator->prefix)) ++ ctx.node_len = sid->locator->node_bits_length; ++ else { ++ zlog_warn("SID locator %pFX does not match the specified locator %pFX", &sid_locator, &sid->locator->prefix); ++ return; ++ } ++ ++ ctx.function_len = sid->addr.prefixlen - (ctx.block_len + ctx.node_len); + + /* Attach the SID to the SRv6 interface */ + if (!ifp) { @@ -1318,6 +1349,9 @@ index d76befc131..f86fd3b48a 100644 + struct interface *ifp = NULL; + struct seg6local_context ctx = {}; + struct vrf *vrf; ++ struct prefix_ipv6 sid_block = {}; ++ struct prefix_ipv6 locator_block = {}; ++ struct prefix_ipv6 sid_locator = {}; + + if (!sid) + return; @@ -1387,10 +1421,38 @@ index d76befc131..f86fd3b48a 100644 + } + } + -+ ctx.block_len = sid->locator->block_bits_length; -+ ctx.node_len = sid->locator->node_bits_length; -+ ctx.function_len = sid->locator->function_bits_length; -+ ctx.argument_len = sid->locator->argument_bits_length; ++ ctx.block_len = 0; ++ ctx.node_len = 0; ++ ctx.function_len = 0; ++ ctx.argument_len = 0; ++ ++ sid_block = sid->addr; ++ sid_block.prefixlen = sid->locator->block_bits_length; ++ apply_mask(&sid_block); ++ ++ locator_block = sid->locator->prefix; ++ locator_block.prefixlen = sid->locator->block_bits_length; ++ apply_mask(&locator_block); ++ ++ if (prefix_same(&sid_block, &locator_block)) ++ ctx.block_len = sid->locator->block_bits_length; ++ else { ++ zlog_warn("SID block %pFX does not match locator block %pFX", &sid_block, &locator_block); ++ return; ++ } ++ ++ sid_locator = sid->addr; ++ sid_locator.prefixlen = sid->locator->block_bits_length + sid->locator->node_bits_length; ++ apply_mask(&sid_locator); ++ ++ if (prefix_same(&sid_locator, &sid->locator->prefix)) ++ ctx.node_len = sid->locator->node_bits_length; ++ else { ++ zlog_warn("SID locator %pFX does not match the specified locator %pFX", &sid_locator, &sid->locator->prefix); ++ return; ++ } ++ ++ ctx.function_len = sid->addr.prefixlen - (ctx.block_len + ctx.node_len); + + zlog_info("delete SID %pFX", + &sid->addr);