Skip to content

Commit 5a10caf

Browse files
committed
bgpd: change function length to 32 bits when wide_func is used
When allocating a SID in the wide range of the locator, the storage of the SID in BGP update is not displaying the extra-wide part. The below command shows that the transposed sid value does not reflect what SID manager allocated: > r3# show segment-routing srv6 sid > SID Behavior Context Daemon/Instance Locator AllocationType > ---------------------------------- ------------- ----------------- --------- ---------------- > 2001:db8:3:fff7:fe4b:: uDT46 VRF 'Vrf10' bgp(0) MAIN explicit > > r3# show bgp ipv4 vpn 192.168.3.0/24 json > [..] > "remoteLabel":1048432, > "remoteLabels":[ > 1048432 > ], > "remoteTransposedSid":"2001:db8:3:fff7::", > "remoteSid":"2001:db8:3::", > "remoteSidStructure":{ > "locatorBlockLen":32, > "locatorNodeLen":16, > "functionLen":16, > "argumentLen":0, > "transpositionLen":16, > "transpositionOffset":48 > }, > In BGP, detect that wide range is used, and change to the real SID value in the BGP update accordingly. Also, update the Zebra route seg6local context by changing the functionLen to 32 bits too. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
1 parent 895eaf3 commit 5a10caf

File tree

3 files changed

+52
-18
lines changed

3 files changed

+52
-18
lines changed

bgpd/bgp_mplsvpn.c

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -371,9 +371,11 @@ void vpn_leak_zebra_vrf_sid_update_per_af(struct bgp *bgp, afi_t afi)
371371
bgp->vpn_policy[afi].tovpn_sid_locator->block_bits_length;
372372
ctx.node_len =
373373
bgp->vpn_policy[afi].tovpn_sid_locator->node_bits_length;
374-
ctx.function_len =
375-
bgp->vpn_policy[afi]
376-
.tovpn_sid_locator->function_bits_length;
374+
if (CHECK_FLAG(bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE))
375+
ctx.function_len = BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_BGP;
376+
else
377+
ctx.function_len =
378+
bgp->vpn_policy[afi].tovpn_sid_locator->function_bits_length;
377379
ctx.argument_len =
378380
bgp->vpn_policy[afi]
379381
.tovpn_sid_locator->argument_bits_length;
@@ -440,7 +442,10 @@ void vpn_leak_zebra_vrf_sid_update_per_vrf(struct bgp *bgp)
440442
if (bgp->tovpn_sid_locator) {
441443
ctx.block_len = bgp->tovpn_sid_locator->block_bits_length;
442444
ctx.node_len = bgp->tovpn_sid_locator->node_bits_length;
443-
ctx.function_len = bgp->tovpn_sid_locator->function_bits_length;
445+
if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_FUNC_WIDE))
446+
ctx.function_len = BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_BGP;
447+
else
448+
ctx.function_len = bgp->tovpn_sid_locator->function_bits_length;
444449
ctx.argument_len = bgp->tovpn_sid_locator->argument_bits_length;
445450
if (CHECK_FLAG(bgp->tovpn_sid_locator->flags, SRV6_LOCATOR_USID))
446451
SET_SRV6_FLV_OP(ctx.flv.flv_ops, ZEBRA_SEG6_LOCAL_FLV_OP_NEXT_CSID);
@@ -508,9 +513,11 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_af(struct bgp *bgp, afi_t afi)
508513
bgp->vpn_policy[afi].tovpn_sid_locator->block_bits_length;
509514
seg6localctx.node_len =
510515
bgp->vpn_policy[afi].tovpn_sid_locator->node_bits_length;
511-
seg6localctx.function_len =
512-
bgp->vpn_policy[afi]
513-
.tovpn_sid_locator->function_bits_length;
516+
if (CHECK_FLAG(bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE))
517+
seg6localctx.function_len = BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_BGP;
518+
else
519+
seg6localctx.function_len =
520+
bgp->vpn_policy[afi].tovpn_sid_locator->function_bits_length;
514521
seg6localctx.argument_len =
515522
bgp->vpn_policy[afi]
516523
.tovpn_sid_locator->argument_bits_length;
@@ -526,6 +533,7 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_af(struct bgp *bgp, afi_t afi)
526533
ctx.behavior = afi == AFI_IP ? ZEBRA_SEG6_LOCAL_ACTION_END_DT4
527534
: ZEBRA_SEG6_LOCAL_ACTION_END_DT6;
528535
bgp_zebra_release_srv6_sid(&ctx, bgp->vpn_policy[afi].tovpn_sid_locator->name);
536+
UNSET_FLAG(bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE);
529537
}
530538

531539
/*
@@ -559,8 +567,10 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_vrf(struct bgp *bgp)
559567
seg6localctx.block_len =
560568
bgp->tovpn_sid_locator->block_bits_length;
561569
seg6localctx.node_len = bgp->tovpn_sid_locator->node_bits_length;
562-
seg6localctx.function_len =
563-
bgp->tovpn_sid_locator->function_bits_length;
570+
if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_FUNC_WIDE))
571+
seg6localctx.function_len = BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_BGP;
572+
else
573+
seg6localctx.function_len = bgp->tovpn_sid_locator->function_bits_length;
564574
seg6localctx.argument_len =
565575
bgp->tovpn_sid_locator->argument_bits_length;
566576
}
@@ -573,6 +583,7 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_vrf(struct bgp *bgp)
573583
ctx.vrf_id = bgp->vrf_id;
574584
ctx.behavior = ZEBRA_SEG6_LOCAL_ACTION_END_DT46;
575585
bgp_zebra_release_srv6_sid(&ctx, bgp->tovpn_sid_locator->name);
586+
UNSET_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_FUNC_WIDE);
576587
}
577588

578589
/*
@@ -1014,6 +1025,7 @@ void delete_vrf_tovpn_sid_per_af(struct bgp *bgp_vpn, struct bgp *bgp_vrf,
10141025
ctx.behavior = afi == AFI_IP ? ZEBRA_SEG6_LOCAL_ACTION_END_DT4
10151026
: ZEBRA_SEG6_LOCAL_ACTION_END_DT6;
10161027
bgp_zebra_release_srv6_sid(&ctx, bgp_vrf->vpn_policy[afi].tovpn_sid_locator->name);
1028+
UNSET_FLAG(bgp_vrf->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE);
10171029

10181030
sid_unregister(bgp_vpn, bgp_vrf->vpn_policy[afi].tovpn_sid);
10191031
XFREE(MTYPE_BGP_SRV6_SID, bgp_vrf->vpn_policy[afi].tovpn_sid);
@@ -1060,6 +1072,7 @@ void delete_vrf_tovpn_sid_per_vrf(struct bgp *bgp_vpn, struct bgp *bgp_vrf)
10601072
ctx.vrf_id = bgp_vrf->vrf_id;
10611073
ctx.behavior = ZEBRA_SEG6_LOCAL_ACTION_END_DT46;
10621074
bgp_zebra_release_srv6_sid(&ctx, bgp_vrf->tovpn_sid_locator->name);
1075+
UNSET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_TOVPN_SID_FUNC_WIDE);
10631076

10641077
sid_unregister(bgp_vpn, bgp_vrf->tovpn_sid);
10651078
XFREE(MTYPE_BGP_SRV6_SID, bgp_vrf->tovpn_sid);
@@ -1753,11 +1766,15 @@ static bool vpn_leak_from_vrf_fill_srv6(struct attr *attr, struct bgp *from_bgp,
17531766
from_bgp->vpn_policy[afi].tovpn_sid_locator->block_bits_length;
17541767
attr->srv6_l3service->loc_node_len =
17551768
from_bgp->vpn_policy[afi].tovpn_sid_locator->node_bits_length;
1756-
attr->srv6_l3service->func_len =
1757-
from_bgp->vpn_policy[afi].tovpn_sid_locator->function_bits_length;
1769+
if (CHECK_FLAG(from_bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE))
1770+
attr->srv6_l3service->func_len =
1771+
BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_BGP;
1772+
else
1773+
attr->srv6_l3service->func_len =
1774+
from_bgp->vpn_policy[afi].tovpn_sid_locator->function_bits_length;
17581775
attr->srv6_l3service->arg_len =
17591776
from_bgp->vpn_policy[afi].tovpn_sid_locator->argument_bits_length;
1760-
if (from_bgp->vpn_policy[afi].tovpn_sid_locator->function_bits_length >
1777+
if (attr->srv6_l3service->func_len >
17611778
BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_LABEL) {
17621779
attr->srv6_l3service->transposition_len = 0;
17631780
attr->srv6_l3service->transposition_offset = 0;
@@ -1788,9 +1805,14 @@ static bool vpn_leak_from_vrf_fill_srv6(struct attr *attr, struct bgp *from_bgp,
17881805
attr->srv6_l3service->loc_block_len =
17891806
from_bgp->tovpn_sid_locator->block_bits_length;
17901807
attr->srv6_l3service->loc_node_len = from_bgp->tovpn_sid_locator->node_bits_length;
1791-
attr->srv6_l3service->func_len = from_bgp->tovpn_sid_locator->function_bits_length;
1808+
if (CHECK_FLAG(from_bgp->vrf_flags, BGP_VRF_TOVPN_SID_FUNC_WIDE))
1809+
attr->srv6_l3service->func_len =
1810+
BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_BGP;
1811+
else
1812+
attr->srv6_l3service->func_len =
1813+
from_bgp->tovpn_sid_locator->function_bits_length;
17921814
attr->srv6_l3service->arg_len = from_bgp->tovpn_sid_locator->argument_bits_length;
1793-
if (from_bgp->tovpn_sid_locator->function_bits_length >
1815+
if (attr->srv6_l3service->func_len >
17941816
BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_LABEL) {
17951817
attr->srv6_l3service->transposition_len = 0;
17961818
attr->srv6_l3service->transposition_offset = 0;

bgpd/bgp_zebra.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3663,7 +3663,7 @@ static int bgp_zebra_srv6_sid_notify(ZAPI_CALLBACK_ARGS)
36633663
char buf[256];
36643664
struct in6_addr *tovpn_sid;
36653665
struct prefix_ipv6 tmp_prefix;
3666-
uint32_t sid_func;
3666+
uint32_t sid_func, sid_wide_func = 0;
36673667
bool found = false;
36683668
char *loc_name;
36693669

@@ -3685,8 +3685,8 @@ static int bgp_zebra_srv6_sid_notify(ZAPI_CALLBACK_ARGS)
36853685
}
36863686

36873687
/* Decode the received notification message */
3688-
if (!zapi_srv6_sid_notify_decode(zclient->ibuf, &ctx, &sid_addr, &sid_func, NULL, &note,
3689-
&loc_name)) {
3688+
if (!zapi_srv6_sid_notify_decode(zclient->ibuf, &ctx, &sid_addr, &sid_func, &sid_wide_func,
3689+
&note, &loc_name)) {
36903690
zlog_err("%s : error in msg decode", __func__);
36913691
return -1;
36923692
}
@@ -3762,7 +3762,17 @@ static int bgp_zebra_srv6_sid_notify(ZAPI_CALLBACK_ARGS)
37623762
uint8_t func_len = locator_bgp->function_bits_length;
37633763
mpls_label_t label = MPLS_LABEL_IMPLICIT_NULL;
37643764

3765-
if (func_len <= BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_LABEL)
3765+
if (sid_wide_func && (CHECK_FLAG(locator_bgp->flags, SRV6_LOCATOR_F3216) ||
3766+
CHECK_FLAG(locator_bgp->flags, SRV6_LOCATOR_F4816))) {
3767+
if (ctx.behavior == ZEBRA_SEG6_LOCAL_ACTION_END_DT6)
3768+
SET_FLAG(bgp_vrf->vpn_policy[AFI_IP6].flags,
3769+
BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE);
3770+
else if (ctx.behavior == ZEBRA_SEG6_LOCAL_ACTION_END_DT4)
3771+
SET_FLAG(bgp_vrf->vpn_policy[AFI_IP].flags,
3772+
BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE);
3773+
else if (ctx.behavior == ZEBRA_SEG6_LOCAL_ACTION_END_DT46)
3774+
SET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_TOVPN_SID_FUNC_WIDE);
3775+
} else if (func_len <= BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_LABEL)
37663776
label = sid_func
37673777
<< (BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH_FOR_LABEL - func_len);
37683778

bgpd/bgpd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ struct vpn_policy {
294294
#define BGP_VPN_POLICY_TOVPN_SID_EXPLICIT (1 << 6)
295295
/* Is this value set by the cli? */
296296
#define BGP_VPN_POLICY_TOVPN_RD_CLI_SET (1 << 7)
297+
#define BGP_VPN_POLICY_TOVPN_SID_FUNC_WIDE (1 << 8)
297298

298299
/*
299300
* If we are importing another vrf into us keep a list of
@@ -982,6 +983,7 @@ struct bgp {
982983
/* per-VRF toVPN SID */
983984
#define BGP_VRF_TOVPN_SID_AUTO (1 << 7)
984985
#define BGP_VRF_TOVPN_SID_EXPLICIT (1 << 8)
986+
#define BGP_VRF_TOVPN_SID_FUNC_WIDE (1 << 9)
985987

986988
/* unique ID for auto derivation of RD for this vrf */
987989
uint16_t vrf_rd_id;

0 commit comments

Comments
 (0)