]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Respect allowas-in value from the source VRF's peer
authorDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 8 Jan 2025 17:03:55 +0000 (19:03 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 8 Jan 2025 17:16:04 +0000 (19:16 +0200)
If the peer which has allowas-in enabled and then reimports the routes to another
local VRF, respect that value.

This was working with < 10.2 releases.

Fixes: d4426b62d221f4e15810dbe578de05df8991c991 ("bgpd: copy source vrf ASN to leaked route and block loops")
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_mplsvpn.c
bgpd/bgp_mplsvpn.h
bgpd/bgp_route.c

index b96c287f8600e76d0261cb0375386c18859005ad..1d10831ca134a9e1b6d9ea7072c8205acdac4962 100644 (file)
@@ -1951,7 +1951,7 @@ void vpn_leak_from_vrf_update(struct bgp *to_bgp,      /* to */
         * because of loop checking.
         */
        if (new_info)
-               vpn_leak_to_vrf_update(from_bgp, new_info, NULL);
+               vpn_leak_to_vrf_update(from_bgp, new_info, NULL, path_vrf->peer);
        else
                bgp_dest_unlock_node(bn);
 }
@@ -2143,10 +2143,10 @@ static struct bgp *bgp_lookup_by_rd(struct bgp_path_info *bpi,
        return NULL;
 }
 
-static void vpn_leak_to_vrf_update_onevrf(struct bgp *to_bgp,   /* to */
+static void vpn_leak_to_vrf_update_onevrf(struct bgp *to_bgp,  /* to */
                                          struct bgp *from_bgp, /* from */
-                                         struct bgp_path_info *path_vpn,
-                                         struct prefix_rd *prd)
+                                         struct bgp_path_info *path_vpn, struct prefix_rd *prd,
+                                         struct peer *from)
 {
        const struct prefix *p = bgp_dest_get_prefix(path_vpn->net);
        afi_t afi = family2afi(p->family);
@@ -2231,6 +2231,12 @@ static void vpn_leak_to_vrf_update_onevrf(struct bgp *to_bgp,   /* to */
        /* Check if leaked route has our asn. If so, don't import it. */
        if (CHECK_FLAG(peer->af_flags[afi][SAFI_MPLS_VPN], PEER_FLAG_ALLOWAS_IN))
                aspath_loop_count = peer->allowas_in[afi][SAFI_MPLS_VPN];
+       else if (peer == peer->bgp->peer_self && from)
+               /* If this is an import from one VRF to another and the source
+                * VRF's peer has allowas-in applied, respect it.
+                */
+               aspath_loop_count = from->allowas_in[afi][SAFI_UNICAST];
+
        if (aspath_loop_check(path_vpn->attr->aspath, to_bgp->as) > aspath_loop_count) {
                for (bpi = bgp_dest_get_bgp_path_info(bn); bpi;
                     bpi = bpi->next) {
@@ -2511,9 +2517,8 @@ bool vpn_leak_to_vrf_no_retain_filter_check(struct bgp *from_bgp,
        return true;
 }
 
-void vpn_leak_to_vrf_update(struct bgp *from_bgp,
-                           struct bgp_path_info *path_vpn,
-                           struct prefix_rd *prd)
+void vpn_leak_to_vrf_update(struct bgp *from_bgp, struct bgp_path_info *path_vpn,
+                           struct prefix_rd *prd, struct peer *peer)
 {
        struct listnode *mnode, *mnnode;
        struct bgp *bgp;
@@ -2528,8 +2533,7 @@ void vpn_leak_to_vrf_update(struct bgp *from_bgp,
        for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {
                if (!path_vpn->extra || !path_vpn->extra->vrfleak ||
                    path_vpn->extra->vrfleak->bgp_orig != bgp) { /* no loop */
-                       vpn_leak_to_vrf_update_onevrf(bgp, from_bgp, path_vpn,
-                                                     prd);
+                       vpn_leak_to_vrf_update_onevrf(bgp, from_bgp, path_vpn, prd, peer);
                }
        }
 }
@@ -2728,8 +2732,8 @@ void vpn_leak_to_vrf_update_all(struct bgp *to_bgp, struct bgp *vpn_from,
                                    bpi->extra->vrfleak->bgp_orig == to_bgp)
                                        continue;
 
-                               vpn_leak_to_vrf_update_onevrf(to_bgp, vpn_from,
-                                                             bpi, NULL);
+                               vpn_leak_to_vrf_update_onevrf(to_bgp, vpn_from, bpi, NULL,
+                                                             bpi->peer);
                        }
                }
        }
index 18639fc69b23df0b0a841289372a294177b6f1d4..56dd33f9b1641cf26bcf8378cf63fbe13975fc6b 100644 (file)
@@ -67,9 +67,8 @@ extern bool vpn_leak_to_vrf_no_retain_filter_check(struct bgp *from_bgp,
                                                   struct attr *attr,
                                                   afi_t afi);
 
-extern void vpn_leak_to_vrf_update(struct bgp *from_bgp,
-                                  struct bgp_path_info *path_vpn,
-                                  struct prefix_rd *prd);
+extern void vpn_leak_to_vrf_update(struct bgp *from_bgp, struct bgp_path_info *path_vpn,
+                                  struct prefix_rd *prd, struct peer *peer);
 
 extern void vpn_leak_to_vrf_withdraw(struct bgp_path_info *path_vpn);
 
index f519534192f4f434585e2a2da3d9a02a70486856..8935c67498319d7cfff2d984c67623fa4fc9a5bf 100644 (file)
@@ -5539,7 +5539,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                }
                if ((SAFI_MPLS_VPN == safi)
                    && (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) {
-                       vpn_leak_to_vrf_update(bgp, pi, prd);
+                       vpn_leak_to_vrf_update(bgp, pi, prd, peer);
                }
 
 #ifdef ENABLE_BGP_VNC
@@ -5633,7 +5633,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
        }
        if ((SAFI_MPLS_VPN == safi)
            && (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) {
-               vpn_leak_to_vrf_update(bgp, new, prd);
+               vpn_leak_to_vrf_update(bgp, new, prd, peer);
        }
 #ifdef ENABLE_BGP_VNC
        if (SAFI_MPLS_VPN == safi) {
@@ -7142,8 +7142,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
 
                        if (SAFI_MPLS_VPN == safi &&
                            bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
-                               vpn_leak_to_vrf_update(bgp, pi,
-                                                      &bgp_static->prd);
+                               vpn_leak_to_vrf_update(bgp, pi, &bgp_static->prd, NULL);
                        }
 #ifdef ENABLE_BGP_VNC
                        if (safi == SAFI_MPLS_VPN || safi == SAFI_ENCAP ||
@@ -7207,7 +7206,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
 
        if (SAFI_MPLS_VPN == safi &&
            bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
-               vpn_leak_to_vrf_update(bgp, new, &bgp_static->prd);
+               vpn_leak_to_vrf_update(bgp, new, &bgp_static->prd, NULL);
        }
 #ifdef ENABLE_BGP_VNC
        if (safi == SAFI_MPLS_VPN || safi == SAFI_ENCAP || safi == SAFI_EVPN)