mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 11:01:48 +00:00
bgpd: do allocate vrf label only when necessary
Today, with the following bgp instance configured, the
local VRF label is allocated even if it is not used.
> router bgp 65500 vrf vrf1
> address-family ipv4 unicast
> label vpn export allocation-mode per-nexthop
> label vpn export auto
> rd vpn export 444:1
> rt vpn both 52:100
> export vpn
> import vpn
The 'show mpls table' indicates that the 16 label value
is allocated, but never used in the exported prefixes.
> r1# show mpls table
> Inbound Label Type Nexthop Outbound Label
> -----------------------------------------------------
> 16 BGP vrf1 -
> 17 BGP 192.168.255.13 -
> 18 BGP 192.0.2.12 -
> 19 BGP 192.0.2.11 -
Fix this by only allocating new label values when really
used. Consequently, only 3 labels will be allocated instead
of previously 4.
> r1# show mpls table
> Inbound Label Type Nexthop Outbound Label
> -----------------------------------------------------
> 16 BGP 192.168.255.13 -
> 17 BGP 192.0.2.11 -
> 18 BGP 192.0.2.12 -
Fixes: 577be36a41
("bgpd: add support for l3vpn per-nexthop label")
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
parent
8e7fb950c1
commit
8b27521cfa
@ -1441,6 +1441,16 @@ _vpn_leak_from_vrf_get_per_nexthop_label(struct bgp_path_info *pi,
|
||||
return blnc->label;
|
||||
}
|
||||
|
||||
static mpls_label_t bgp_mplsvpn_get_vpn_label(struct vpn_policy *bgp_policy)
|
||||
{
|
||||
if (bgp_policy->tovpn_label == MPLS_LABEL_NONE &&
|
||||
CHECK_FLAG(bgp_policy->flags, BGP_VPN_POLICY_TOVPN_LABEL_AUTO)) {
|
||||
bgp_lp_get(LP_TYPE_VRF, bgp_policy, vpn_leak_label_callback);
|
||||
return MPLS_INVALID_LABEL;
|
||||
}
|
||||
return bgp_policy->tovpn_label;
|
||||
}
|
||||
|
||||
/* Filter out all the cases where a per nexthop label is not possible:
|
||||
* - return an invalid label when the nexthop is invalid
|
||||
* - return the per VRF label when the per nexthop label is not supported
|
||||
@ -1469,7 +1479,7 @@ vpn_leak_from_vrf_get_per_nexthop_label(afi_t afi, struct bgp_path_info *pi,
|
||||
* Fallback to the per VRF label.
|
||||
*/
|
||||
bgp_mplsvpn_path_nh_label_unlink(pi);
|
||||
return from_bgp->vpn_policy[afi].tovpn_label;
|
||||
return bgp_mplsvpn_get_vpn_label(&from_bgp->vpn_policy[afi]);
|
||||
}
|
||||
|
||||
if (is_bgp_static_route == false && afi == AFI_IP &&
|
||||
@ -1481,7 +1491,7 @@ vpn_leak_from_vrf_get_per_nexthop_label(afi_t afi, struct bgp_path_info *pi,
|
||||
* Fallback to the per VRF label.
|
||||
*/
|
||||
bgp_mplsvpn_path_nh_label_unlink(pi);
|
||||
return from_bgp->vpn_policy[afi].tovpn_label;
|
||||
return bgp_mplsvpn_get_vpn_label(&from_bgp->vpn_policy[afi]);
|
||||
}
|
||||
|
||||
if (is_bgp_static_route == false && afi == AFI_IP6 &&
|
||||
@ -1495,7 +1505,7 @@ vpn_leak_from_vrf_get_per_nexthop_label(afi_t afi, struct bgp_path_info *pi,
|
||||
* Fallback to the per VRF label.
|
||||
*/
|
||||
bgp_mplsvpn_path_nh_label_unlink(pi);
|
||||
return from_bgp->vpn_policy[afi].tovpn_label;
|
||||
return bgp_mplsvpn_get_vpn_label(&from_bgp->vpn_policy[afi]);
|
||||
}
|
||||
|
||||
/* Check the next-hop reachability.
|
||||
@ -1517,7 +1527,7 @@ vpn_leak_from_vrf_get_per_nexthop_label(afi_t afi, struct bgp_path_info *pi,
|
||||
* table. Fallback to the per-vrf label
|
||||
*/
|
||||
bgp_mplsvpn_path_nh_label_unlink(pi);
|
||||
return from_bgp->vpn_policy[afi].tovpn_label;
|
||||
return bgp_mplsvpn_get_vpn_label(&from_bgp->vpn_policy[afi]);
|
||||
}
|
||||
|
||||
if (!nh_valid || !pi->nexthop || pi->nexthop->nexthop_num == 0 ||
|
||||
@ -1540,7 +1550,7 @@ vpn_leak_from_vrf_get_per_nexthop_label(afi_t afi, struct bgp_path_info *pi,
|
||||
* Fallback to per-vrf label.
|
||||
*/
|
||||
bgp_mplsvpn_path_nh_label_unlink(pi);
|
||||
return from_bgp->vpn_policy[afi].tovpn_label;
|
||||
return bgp_mplsvpn_get_vpn_label(&from_bgp->vpn_policy[afi]);
|
||||
}
|
||||
|
||||
return _vpn_leak_from_vrf_get_per_nexthop_label(pi, to_bgp, from_bgp,
|
||||
@ -1755,12 +1765,10 @@ void vpn_leak_from_vrf_update(struct bgp *to_bgp, /* to */
|
||||
label_val = vpn_leak_from_vrf_get_per_nexthop_label(
|
||||
afi, path_vrf, from_bgp, to_bgp);
|
||||
else
|
||||
/* per VRF label mode */
|
||||
label_val = from_bgp->vpn_policy[afi].tovpn_label;
|
||||
label_val =
|
||||
bgp_mplsvpn_get_vpn_label(&from_bgp->vpn_policy[afi]);
|
||||
|
||||
if (label_val == MPLS_INVALID_LABEL &&
|
||||
CHECK_FLAG(from_bgp->vpn_policy[afi].flags,
|
||||
BGP_VPN_POLICY_TOVPN_LABEL_PER_NEXTHOP)) {
|
||||
if (label_val == MPLS_INVALID_LABEL) {
|
||||
/* no valid label for the moment
|
||||
* when the 'bgp_mplsvpn_get_label_per_nexthop_cb' callback gets
|
||||
* a valid label value, it will call the current function again.
|
||||
|
@ -170,16 +170,6 @@ static inline int vpn_leak_to_vpn_active(struct bgp *bgp_vrf, afi_t afi,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Is there an "auto" export label that isn't allocated yet? */
|
||||
if (CHECK_FLAG(bgp_vrf->vpn_policy[afi].flags,
|
||||
BGP_VPN_POLICY_TOVPN_LABEL_AUTO) &&
|
||||
(bgp_vrf->vpn_policy[afi].tovpn_label == MPLS_LABEL_NONE)) {
|
||||
|
||||
if (pmsg)
|
||||
*pmsg = "auto label not allocated";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Is there a "manual" export label that isn't allocated yet? */
|
||||
if (!CHECK_FLAG(bgp_vrf->vpn_policy[afi].flags,
|
||||
BGP_VPN_POLICY_TOVPN_LABEL_AUTO) &&
|
||||
|
@ -9711,8 +9711,6 @@ DEFPY (af_label_vpn_export,
|
||||
BGP_VPN_POLICY_TOVPN_LABEL_AUTO);
|
||||
/* fetch a label */
|
||||
bgp->vpn_policy[afi].tovpn_label = MPLS_LABEL_NONE;
|
||||
bgp_lp_get(LP_TYPE_VRF, &bgp->vpn_policy[afi],
|
||||
vpn_leak_label_callback);
|
||||
} else {
|
||||
bgp->vpn_policy[afi].tovpn_label = label;
|
||||
UNSET_FLAG(bgp->vpn_policy[afi].flags,
|
||||
|
Loading…
Reference in New Issue
Block a user