]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: fix route recursion on leaked routes 15352/head
authorLouis Scalbert <louis.scalbert@6wind.com>
Tue, 26 Apr 2022 14:45:42 +0000 (16:45 +0200)
committerLouis Scalbert <louis.scalbert@6wind.com>
Fri, 9 Feb 2024 17:25:01 +0000 (18:25 +0100)
Leaked recursive routes are not resolved.

> VRF r1-cust1:
> B>  5.1.0.0/24 [200/98] via 99.0.0.1 (recursive), weight 1, 00:00:08
>  *                       via 192.168.1.2, r1-eth4, weight 1, 00:00:08
> B>* 99.0.0.1/32 [200/0] via 192.168.1.2, r1-eth4, weight 1, 00:00:08

> VRF r1-cust4:
> B   5.1.0.0/24 [20/98] via 99.0.0.1 (vrf r1-cust1) inactive, weight 1, 00:00:08
> B>* 99.0.0.1/32 [20/0] via 192.168.1.2, r1-eth4 (vrf r1-cust1), weight 1, 00:00:08

When announcing the routes to zebra, use the peer of the ultimate bgp
path info instead of the one of the first parent path info to determine
whether the route is recursive.

The result is:
> VRF r1-cust4:
> B>  5.1.0.0/24 [20/98] via 99.0.0.1 (vrf r1-cust1) (recursive), weight 1, 00:00:02
>   *                      via 192.168.1.2, r1-eth4 (vrf r1-cust1), weight 1, 00:00:02
> B>* 99.0.0.1/32 [20/0] via 192.168.1.2, r1-eth4 (vrf r1-cust1), weight 1, 00:00:02

Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
bgpd/bgp_zebra.c

index dcbb87e96913b91e27847e9ba2e425f7c0d32cdb..1172514e52615dcf3a0846a408b8ae990d93e9de 100644 (file)
@@ -1511,6 +1511,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
                        struct bgp_path_info *info, struct bgp *bgp, afi_t afi,
                        safi_t safi)
 {
+       struct bgp_path_info *bpi_ultimate;
        struct zapi_route api = { 0 };
        unsigned int valid_nh_count = 0;
        bool allow_recursion = false;
@@ -1554,15 +1555,9 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
 
        peer = info->peer;
 
-       if (info->type == ZEBRA_ROUTE_BGP
-           && info->sub_type == BGP_ROUTE_IMPORTED) {
-
-               /* Obtain peer from parent */
-               if (info->extra && info->extra->vrfleak &&
-                   info->extra->vrfleak->parent)
-                       peer = ((struct bgp_path_info *)(info->extra->vrfleak
-                                                                ->parent))
-                                      ->peer;
+       if (info->type == ZEBRA_ROUTE_BGP) {
+               bpi_ultimate = bgp_get_imported_bpi_ultimate(info);
+               peer = bpi_ultimate->peer;
        }
 
        tag = info->attr->tag;