summaryrefslogtreecommitdiff
path: root/staticd/static_zebra.c
diff options
context:
space:
mode:
authorCarmine Scarpitta <cscarpit@cisco.com>2025-04-08 15:17:42 +0200
committerCarmine Scarpitta <cscarpit@cisco.com>2025-04-08 15:17:42 +0200
commit5a75a0685c6bc9af890d5bd61f69bde7870db913 (patch)
treeaac4da08cf68ccac1540b7adc017d7a740dec8bf /staticd/static_zebra.c
parent8bd485a286fba0d2e9c4e7351e5fb0a5913d7edd (diff)
staticd: Avoid requesting SRv6 sid from zebra when loc and sid block dont match
Currently, when the locator block and sid block differs, staticd would still go ahead and request zebra to allocate the SID which it does if there is atleast one match (from any locators). Only when staticd tries to install the route, it sees that the locator block and sid block are different and avoids installing the route. Fix: Check if the locator block and sid block match before even requesting Zebra to allocate one. Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com> (cherry picked from commit dbd9fed0b30dd1d3475686f71f87d326eeafd26c)
Diffstat (limited to 'staticd/static_zebra.c')
-rw-r--r--staticd/static_zebra.c45
1 files changed, 26 insertions, 19 deletions
diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c
index 9a794d4d02..21a5eda6b4 100644
--- a/staticd/static_zebra.c
+++ b/staticd/static_zebra.c
@@ -615,8 +615,6 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid)
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)
@@ -699,22 +697,7 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid)
break;
}
- 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;
- }
-
+ ctx.block_len = sid->locator->block_bits_length;
sid_locator = sid->addr;
sid_locator.prefixlen = sid->locator->block_bits_length + sid->locator->node_bits_length;
apply_mask(&sid_locator);
@@ -860,13 +843,37 @@ void static_zebra_srv6_sid_uninstall(struct static_srv6_sid *sid)
UNSET_FLAG(sid->flags, STATIC_FLAG_SRV6_SID_SENT_TO_ZEBRA);
}
+/* Validate if the sid block and locator block are the same */
+static bool static_zebra_sid_locator_block_check(struct static_srv6_sid *sid)
+{
+ struct prefix_ipv6 sid_block = {};
+ struct prefix_ipv6 locator_block = {};
+
+ 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)) {
+ zlog_warn("SID block %pFX does not match locator block %pFX", &sid_block,
+ &locator_block);
+
+ return false;
+ }
+
+ return true;
+}
+
extern void static_zebra_request_srv6_sid(struct static_srv6_sid *sid)
{
struct srv6_sid_ctx ctx = {};
int ret = 0;
struct vrf *vrf;
- if (!sid)
+ if (!sid || !static_zebra_sid_locator_block_check(sid))
return;
/* convert `srv6_endpoint_behavior_codepoint` to `seg6local_action_t` */