Commit a274a0c866 for frr
commit a274a0c86600892620224cbfc8139da71924ce48
Author: Carmine Scarpitta <cscarpit@cisco.com>
Date: Tue Nov 10 16:26:02 2026 +0100
zebra: Key SRv6 SID blocks by format and prefix
A SID block is identified by its format and prefix. Include both in
the block lookup key. Matching only the prefix can return a block
initialized for a different format.
Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com>
diff --git a/zebra/zebra_srv6.c b/zebra/zebra_srv6.c
index 4dfbb481f7..df9aecb28d 100644
--- a/zebra/zebra_srv6.c
+++ b/zebra/zebra_srv6.c
@@ -621,15 +621,15 @@ void delete_zebra_srv6_sid_block(void *val)
zebra_srv6_sid_block_free((struct zebra_srv6_sid_block *)val);
}
-struct zebra_srv6_sid_block *
-zebra_srv6_sid_block_lookup(struct prefix_ipv6 *prefix)
+struct zebra_srv6_sid_block *zebra_srv6_sid_block_lookup(struct srv6_sid_format *format,
+ struct prefix_ipv6 *prefix)
{
struct zebra_srv6 *srv6 = zebra_srv6_get_default();
struct zebra_srv6_sid_block *block;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO(srv6->sid_blocks, node, block))
- if (prefix_match(prefix, &block->prefix))
+ if (block->sid_format == format && prefix_match(prefix, &block->prefix))
return block;
return NULL;
@@ -679,7 +679,7 @@ void zebra_srv6_sid_locator_block_alloc(struct srv6_locator *locator)
apply_mask(&block_pfx_new);
/* Allocate the new parent block */
- block_new = zebra_srv6_sid_block_lookup(&block_pfx_new);
+ block_new = zebra_srv6_sid_block_lookup(format, &block_pfx_new);
if (!block_new) {
block_new = zebra_srv6_sid_block_alloc(format, &block_pfx_new);
listnode_add(srv6->sid_blocks, block_new);
diff --git a/zebra/zebra_srv6.h b/zebra/zebra_srv6.h
index 4a7d108fa8..9a57e2cf89 100644
--- a/zebra/zebra_srv6.h
+++ b/zebra/zebra_srv6.h
@@ -324,8 +324,8 @@ zebra_srv6_sid_block_alloc(struct srv6_sid_format *format,
struct prefix_ipv6 *prefix);
extern void zebra_srv6_sid_block_free(struct zebra_srv6_sid_block *block);
extern void delete_zebra_srv6_sid_block(void *val);
-extern struct zebra_srv6_sid_block *
-zebra_srv6_sid_block_lookup(struct prefix_ipv6 *prefix);
+extern struct zebra_srv6_sid_block *zebra_srv6_sid_block_lookup(struct srv6_sid_format *format,
+ struct prefix_ipv6 *prefix);
void zebra_srv6_sid_locator_block_alloc(struct srv6_locator *locator);
void zebra_srv6_sid_locator_block_release(struct srv6_locator *locator);