diff options
| author | Donatas Abraitis <donatas@opensourcerouting.org> | 2025-02-02 13:32:36 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-02 13:32:36 +0200 | 
| commit | 91ebab35f2e88c3eb5664a7266b152ed7bcc283b (patch) | |
| tree | 305b640deaaa35ed9a8e0936f8e0853649b96cab | |
| parent | 43a04450e08049c97b0ab398ca183f4ec032b23e (diff) | |
| parent | 339c49bcff61aacdd63e8f2c4f18a3232fb4ca9d (diff) | |
Merge pull request #17964 from cscarpitta/fix/fix-srv6-sid-manager
Fix SRv6 SID Manager
| -rw-r--r-- | tests/topotests/static_srv6_sids/expected_srv6_sids.json | 35 | ||||
| -rw-r--r-- | tests/topotests/static_srv6_sids/r1/frr.conf | 1 | ||||
| -rw-r--r-- | zebra/zebra_srv6.c | 23 | 
3 files changed, 56 insertions, 3 deletions
diff --git a/tests/topotests/static_srv6_sids/expected_srv6_sids.json b/tests/topotests/static_srv6_sids/expected_srv6_sids.json index e1a2a16afe..5799d97988 100644 --- a/tests/topotests/static_srv6_sids/expected_srv6_sids.json +++ b/tests/topotests/static_srv6_sids/expected_srv6_sids.json @@ -1,4 +1,39 @@  { +	"fcbb:bbbb:1::/48": [ +		{ +			"prefix": "fcbb:bbbb:1::/48", +			"prefixLen": 48, +			"protocol": "static", +			"vrfId": 0, +			"vrfName": "default", +			"selected": true, +			"destSelected": true, +			"distance": 1, +			"metric": 0, +			"installed": true, +			"table": 254, +			"internalStatus": 16, +			"internalFlags": 9, +			"internalNextHopNum": 1, +			"internalNextHopActiveNum": 1, +			"nexthops": [ +				{ +					"flags": 3, +					"fib": true, +					"directlyConnected": true, +					"interfaceName": "sr0", +					"active": true, +					"weight": 1, +					"seg6local": { +						"action": "End" +					}, +					"seg6localContext": { + +					} +				} +			] +		} +	],  	"fcbb:bbbb:1:fe10::/64": [  		{  			"prefix": "fcbb:bbbb:1:fe10::/64", diff --git a/tests/topotests/static_srv6_sids/r1/frr.conf b/tests/topotests/static_srv6_sids/r1/frr.conf index 999e35c35b..b4904d9ac2 100644 --- a/tests/topotests/static_srv6_sids/r1/frr.conf +++ b/tests/topotests/static_srv6_sids/r1/frr.conf @@ -8,6 +8,7 @@ segment-routing     !    !    static-sids +   sid fcbb:bbbb:1::/48 locator MAIN behavior uN     sid fcbb:bbbb:1:fe10::/64 locator MAIN behavior uDT4 vrf Vrf10     sid fcbb:bbbb:1:fe20::/64 locator MAIN behavior uDT6 vrf Vrf20     sid fcbb:bbbb:1:fe30::/64 locator MAIN behavior uDT46 vrf Vrf30 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 */  | 
