]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Check the route and the nexthop appropriately when validating NH 15532/head
authorDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 12 Mar 2024 17:48:26 +0000 (19:48 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 13 Mar 2024 07:39:22 +0000 (09:39 +0200)
A route and its nexthop might belong to different VRFs. Therefore, we need
both the bgp and bgp_nexthop pointers.

Fixes: 8d51fafdcbef3dcf06df796e4f9b83d2bbd5edc2 ("bgpd: Drop bgp_static_update_safi() function")
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_route.c

index 520185e60f224103b412e56a4637f0575cd3bfa3..5d79a10591c8061f3905894ceb8380681372b144 100644 (file)
@@ -6286,13 +6286,14 @@ static void bgp_nexthop_reachability_check(afi_t afi, safi_t safi,
                                           struct bgp_path_info *bpi,
                                           const struct prefix *p,
                                           struct bgp_dest *dest,
-                                          struct bgp *bgp)
+                                          struct bgp *bgp,
+                                          struct bgp *bgp_nexthop)
 {
        /* Nexthop reachability check. */
        if (safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST) {
                if (CHECK_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK)) {
-                       if (bgp_find_or_add_nexthop(bgp, bgp, afi, safi, bpi,
-                                                   NULL, 0, p))
+                       if (bgp_find_or_add_nexthop(bgp, bgp_nexthop, afi, safi,
+                                                   bpi, NULL, 0, p))
                                bgp_path_info_set_flag(dest, bpi,
                                                       BGP_PATH_VALID);
                        else {
@@ -6350,6 +6351,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
        mpls_label_t label = 0;
 #endif
        uint32_t num_labels = 0;
+       struct bgp *bgp_nexthop = bgp;
 
        assert(bgp_static);
 
@@ -6504,9 +6506,11 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
                                                &pi->extra->label[0]);
                        }
 #endif
+                       if (pi->extra && pi->extra->vrfleak->bgp_orig)
+                               bgp_nexthop = pi->extra->vrfleak->bgp_orig;
 
                        bgp_nexthop_reachability_check(afi, safi, pi, p, dest,
-                                                      bgp);
+                                                      bgp, bgp_nexthop);
 
                        /* Process change. */
                        bgp_aggregate_increment(bgp, p, pi, afi, safi);
@@ -6556,7 +6560,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
 #endif
        }
 
-       bgp_nexthop_reachability_check(afi, safi, new, p, dest, bgp);
+       bgp_nexthop_reachability_check(afi, safi, new, p, dest, bgp, bgp);
 
        /* Aggregate address increment. */
        bgp_aggregate_increment(bgp, p, new, afi, safi);