Skip to content

Commit fce9116

Browse files
cscarpittamergify[bot]
authored andcommitted
staticd: Fix SRv6 SID installation and deletion
The SRv6 support in staticd (PR #16894) does not set the correct SID parameters (block length, node length, function length). This commit fixes the issue and computes the correct parameters. Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com> (cherry picked from commit e1654ba)
1 parent dcebe85 commit fce9116

File tree

1 file changed

+54
-8
lines changed

1 file changed

+54
-8
lines changed

staticd/static_zebra.c

+54-8
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,9 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid)
615615
struct seg6local_context ctx = {};
616616
struct interface *ifp = NULL;
617617
struct vrf *vrf;
618+
struct prefix_ipv6 sid_block = {};
619+
struct prefix_ipv6 locator_block = {};
620+
struct prefix_ipv6 sid_locator = {};
618621

619622
if (!sid)
620623
return;
@@ -696,10 +699,30 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid)
696699
break;
697700
}
698701

699-
ctx.block_len = sid->locator->block_bits_length;
700-
ctx.node_len = sid->locator->node_bits_length;
701-
ctx.function_len = sid->locator->function_bits_length;
702-
ctx.argument_len = sid->locator->argument_bits_length;
702+
sid_block = sid->addr;
703+
sid_block.prefixlen = sid->locator->block_bits_length;
704+
apply_mask(&sid_block);
705+
706+
locator_block = sid->locator->prefix;
707+
locator_block.prefixlen = sid->locator->block_bits_length;
708+
apply_mask(&locator_block);
709+
710+
if (prefix_same(&sid_block, &locator_block))
711+
ctx.block_len = sid->locator->block_bits_length;
712+
else {
713+
zlog_warn("SID block %pFX does not match locator block %pFX", &sid_block,
714+
&locator_block);
715+
return;
716+
}
717+
718+
sid_locator = sid->addr;
719+
sid_locator.prefixlen = sid->locator->block_bits_length + sid->locator->node_bits_length;
720+
apply_mask(&sid_locator);
721+
722+
if (prefix_same(&sid_locator, &sid->locator->prefix))
723+
ctx.node_len = sid->locator->node_bits_length;
724+
725+
ctx.function_len = sid->addr.prefixlen - (ctx.block_len + ctx.node_len);
703726

704727
/* Attach the SID to the SRv6 interface */
705728
if (!ifp) {
@@ -724,6 +747,9 @@ void static_zebra_srv6_sid_uninstall(struct static_srv6_sid *sid)
724747
struct interface *ifp = NULL;
725748
struct seg6local_context ctx = {};
726749
struct vrf *vrf;
750+
struct prefix_ipv6 sid_block = {};
751+
struct prefix_ipv6 locator_block = {};
752+
struct prefix_ipv6 sid_locator = {};
727753

728754
if (!sid)
729755
return;
@@ -803,10 +829,30 @@ void static_zebra_srv6_sid_uninstall(struct static_srv6_sid *sid)
803829
}
804830
}
805831

806-
ctx.block_len = sid->locator->block_bits_length;
807-
ctx.node_len = sid->locator->node_bits_length;
808-
ctx.function_len = sid->locator->function_bits_length;
809-
ctx.argument_len = sid->locator->argument_bits_length;
832+
sid_block = sid->addr;
833+
sid_block.prefixlen = sid->locator->block_bits_length;
834+
apply_mask(&sid_block);
835+
836+
locator_block = sid->locator->prefix;
837+
locator_block.prefixlen = sid->locator->block_bits_length;
838+
apply_mask(&locator_block);
839+
840+
if (prefix_same(&sid_block, &locator_block))
841+
ctx.block_len = sid->locator->block_bits_length;
842+
else {
843+
zlog_warn("SID block %pFX does not match locator block %pFX", &sid_block,
844+
&locator_block);
845+
return;
846+
}
847+
848+
sid_locator = sid->addr;
849+
sid_locator.prefixlen = sid->locator->block_bits_length + sid->locator->node_bits_length;
850+
apply_mask(&sid_locator);
851+
852+
if (prefix_same(&sid_locator, &sid->locator->prefix))
853+
ctx.node_len = sid->locator->node_bits_length;
854+
855+
ctx.function_len = sid->addr.prefixlen - (ctx.block_len + ctx.node_len);
810856

811857
static_zebra_send_localsid(ZEBRA_ROUTE_DELETE, &sid->addr.prefix, sid->addr.prefixlen,
812858
ifp->ifindex, action, &ctx);

0 commit comments

Comments
 (0)