summaryrefslogtreecommitdiff
path: root/zebra
diff options
context:
space:
mode:
Diffstat (limited to 'zebra')
-rw-r--r--zebra/zebra_srv6.c23
-rw-r--r--zebra/zebra_vxlan.c2
2 files changed, 21 insertions, 4 deletions
diff --git a/zebra/zebra_srv6.c b/zebra/zebra_srv6.c
index 624f60e815..6d228c5e24 100644
--- a/zebra/zebra_srv6.c
+++ b/zebra/zebra_srv6.c
@@ -1547,9 +1547,26 @@ static int get_srv6_sid_explicit(struct zebra_srv6_sid **sid,
}
if (ctx->behavior == ZEBRA_SEG6_LOCAL_ACTION_END) {
- zlog_err("%s: invalid SM request arguments: explicit SID allocation not allowed for End/uN behavior",
- __func__);
- return -1;
+ zctx = zebra_srv6_sid_ctx_alloc();
+ zctx->ctx = *ctx;
+
+ *sid = zebra_srv6_sid_alloc(zctx, sid_value, locator, block, sid_func,
+ SRV6_SID_ALLOC_MODE_EXPLICIT);
+ if (!(*sid)) {
+ flog_err(EC_ZEBRA_SM_CANNOT_ASSIGN_SID,
+ "%s: failed to create SRv6 SID %s (%pI6)", __func__,
+ srv6_sid_ctx2str(buf, sizeof(buf), ctx), sid_value);
+ return -1;
+ }
+ (*sid)->ctx = zctx;
+ zctx->sid = *sid;
+ listnode_add(srv6->sids, zctx);
+
+ if (IS_ZEBRA_DEBUG_SRV6)
+ zlog_debug("%s: allocated explicit SRv6 SID %pI6 for context %s", __func__,
+ &(*sid)->value, srv6_sid_ctx2str(buf, sizeof(buf), ctx));
+
+ return 1;
}
/* Allocate an explicit SID function for the SID */
diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c
index c60eeab946..04585f6312 100644
--- a/zebra/zebra_vxlan.c
+++ b/zebra/zebra_vxlan.c
@@ -1584,7 +1584,7 @@ static void svd_nh_del_terminate(void *ptr)
struct zebra_neigh *n = ptr;
n->refcnt = 0;
- svd_nh_del(n);
+ XFREE(MTYPE_L3NEIGH, n);
}