]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: BGP-LU use implicit-null in some cases
authorMark Stapp <mstapp@nvidia.com>
Tue, 5 Oct 2021 15:49:20 +0000 (11:49 -0400)
committerMark Stapp <mstapp@nvidia.com>
Fri, 8 Oct 2021 13:11:51 +0000 (09:11 -0400)
In some cases where bgp is at the mpls edge, where it has a BGP-LU
peer downstream but an IP peer upstream, it can advertise the
IMPLICIT_NULL label instead of a per-prefix label.

Signed-off-by: Mark Stapp <mstapp@nvidia.com>
bgpd/bgp_label.c
bgpd/bgp_route.c

index 3c8f2f36684a55abf7ac9864b7083597339f9929..fa2a445165e4f695344b1e9e62f391ae5b982348 100644 (file)
@@ -244,6 +244,10 @@ void bgp_reg_dereg_for_label(struct bgp_dest *dest, struct bgp_path_info *pi,
 
        p = bgp_dest_get_prefix(dest);
 
+       if (BGP_DEBUG(labelpool, LABELPOOL))
+               zlog_debug("%s: %pFX: %s ", __func__, p,
+                          (reg ? "reg" : "dereg"));
+
        if (reg) {
                assert(pi);
                /*
index fc971784500696c5bf97163f58190bc79bed46d9..f278cef77cb5f8ade6a6a36207602d644c23deeb 100644 (file)
@@ -2711,6 +2711,28 @@ static void bgp_process_evpn_route_injection(struct bgp *bgp, afi_t afi,
                bgp_evpn_withdraw_type5_route(bgp, p, afi, safi);
 }
 
+/*
+ * Utility to determine whether a particular path_info should use
+ * the IMPLICIT_NULL label. This is pretty specialized: it's only called
+ * in a path where we basically _know_ this is a BGP-LU route.
+ */
+static bool bgp_lu_need_imp_null(const struct bgp_path_info *new_select)
+{
+       /* Certain types get imp null; so do paths where the nexthop is
+        * not labeled.
+        */
+       if (new_select->sub_type == BGP_ROUTE_STATIC
+           || new_select->sub_type == BGP_ROUTE_AGGREGATE
+           || new_select->sub_type == BGP_ROUTE_REDISTRIBUTE)
+               return true;
+       else if (new_select->extra == NULL ||
+                !bgp_is_valid_label(&new_select->extra->label[0]))
+               /* TODO -- should be configurable? */
+               return true;
+       else
+               return false;
+}
+
 /*
  * old_select = The old best path
  * new_select = the new best path
@@ -2802,11 +2824,7 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest,
                                 * implicit-null for local routes, aggregate
                                 * and redistributed routes
                                 */
-                               if (new_select->sub_type == BGP_ROUTE_STATIC
-                                   || new_select->sub_type
-                                               == BGP_ROUTE_AGGREGATE
-                                   || new_select->sub_type
-                                               == BGP_ROUTE_REDISTRIBUTE) {
+                               if (bgp_lu_need_imp_null(new_select)) {
                                        if (CHECK_FLAG(
                                                    dest->flags,
                                                    BGP_NODE_REGISTERED_FOR_LABEL)