]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: do allocate vrf label only when necessary 15717/head
authorPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 9 Apr 2024 15:09:39 +0000 (17:09 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 18 Apr 2024 12:55:25 +0000 (14:55 +0200)
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: 577be36a41be ("bgpd: add support for l3vpn per-nexthop label")
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_mplsvpn.c
bgpd/bgp_mplsvpn.h
bgpd/bgp_vty.c

index 2404ceffb18fe8e712e8708d53f1d7fe9a0c2007..d17fdc7169508a9a6826f1f9f0cdd738a0edf75b 100644 (file)
@@ -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.
index cd25899965f34b5413ce7fb132366ad8d7b246f4..92a9fba887ae431b9fab83de8bbc42f6edea2037 100644 (file)
@@ -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) &&
index 9faba65a5886d665dc99dcabbc017a6534966528..da7e42153be89234ab65e4ec3e00bd49aad1d904 100644 (file)
@@ -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,