@@ -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 ;
0 commit comments