]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Use BGP instance to derive the VRF for route uninstall
authorvivek <vivek@cumulusnetworks.com>
Wed, 1 Nov 2017 20:36:46 +0000 (13:36 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 21 Mar 2018 20:37:24 +0000 (16:37 -0400)
When uninstalling routes from zebra, ensure that the BGP instance for
which processing is being done is used to derive the VRF. It is incorrect
to derive the VRF from the peer when dealing with scenarios like VRF route
leaking, EVPN symmetric/external routing etc., where the peer which sourced
the route could belong to a different VRF.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
Reviewed-by: Mitesh Kanjariya <mitesh@cumulusnetworks.com>
Ticket: CM-18413
Reviewed By: CCR-6778
Testing Done: Manual testing of BGP route withdraw/delete, bgp-min

bgpd/bgp_route.c
bgpd/bgp_zebra.c
bgpd/bgp_zebra.h

index 5e122efe8f9885569ea2853bfe513669a5eba89a..41dff0a7e2ce45b40a4a2ce0093a5af8c6553add 100644 (file)
@@ -2313,7 +2313,7 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_node *rn,
                                || old_select->sub_type == BGP_ROUTE_AGGREGATE
                                || old_select->sub_type == BGP_ROUTE_IMPORTED))
 
-                               bgp_zebra_withdraw(p, old_select, safi);
+                               bgp_zebra_withdraw(p, old_select, bgp, safi);
                }
        }
 
@@ -3984,7 +3984,8 @@ void bgp_clear_stale_route(struct peer *peer, afi_t afi, safi_t safi)
        }
 }
 
-static void bgp_cleanup_table(struct bgp_table *table, safi_t safi)
+static void bgp_cleanup_table(struct bgp *bgp, struct bgp_table *table,
+                             safi_t safi)
 {
        struct bgp_node *rn;
        struct bgp_info *ri;
@@ -4000,7 +4001,8 @@ static void bgp_cleanup_table(struct bgp_table *table, safi_t safi)
                                || ri->sub_type == BGP_ROUTE_IMPORTED)) {
 
                                if (bgp_fibupd_safi(safi))
-                                       bgp_zebra_withdraw(&rn->p, ri, safi);
+                                       bgp_zebra_withdraw(&rn->p, ri,
+                                                          bgp, safi);
                                bgp_info_reap(rn, ri);
                        }
                }
@@ -4015,7 +4017,8 @@ void bgp_cleanup_routes(struct bgp *bgp)
        for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
                if (afi == AFI_L2VPN)
                        continue;
-               bgp_cleanup_table(bgp->rib[afi][SAFI_UNICAST], SAFI_UNICAST);
+               bgp_cleanup_table(bgp, bgp->rib[afi][SAFI_UNICAST],
+                                 SAFI_UNICAST);
                /*
                 * VPN and ENCAP and EVPN tables are two-level (RD is top level)
                 */
@@ -4025,7 +4028,7 @@ void bgp_cleanup_routes(struct bgp *bgp)
                        for (rn = bgp_table_top(bgp->rib[afi][safi]); rn;
                             rn = bgp_route_next(rn)) {
                                if (rn->info) {
-                                       bgp_cleanup_table(
+                                       bgp_cleanup_table(bgp,
                                                (struct bgp_table *)(rn->info),
                                                safi);
                                        bgp_table_finish((struct bgp_table **)&(
@@ -4038,7 +4041,7 @@ void bgp_cleanup_routes(struct bgp *bgp)
                        for (rn = bgp_table_top(bgp->rib[afi][safi]); rn;
                             rn = bgp_route_next(rn)) {
                                if (rn->info) {
-                                       bgp_cleanup_table(
+                                       bgp_cleanup_table(bgp,
                                                (struct bgp_table *)(rn->info),
                                                safi);
                                        bgp_table_finish((struct bgp_table **)&(
@@ -4052,7 +4055,8 @@ void bgp_cleanup_routes(struct bgp *bgp)
        for (rn = bgp_table_top(bgp->rib[AFI_L2VPN][SAFI_EVPN]); rn;
             rn = bgp_route_next(rn)) {
                if (rn->info) {
-                       bgp_cleanup_table((struct bgp_table *)(rn->info),
+                       bgp_cleanup_table(bgp,
+                                         (struct bgp_table *)(rn->info),
                                          SAFI_EVPN);
                        bgp_table_finish((struct bgp_table **)&(rn->info));
                        rn->info = NULL;
index 486ea3937a9c7b4c29d05e71cd03c9235d3ab69f..bc6ee73da8d5d7e4539b7b6eb7bb41b2bfd72a83 100644 (file)
@@ -1303,7 +1303,8 @@ void bgp_zebra_announce_table(struct bgp *bgp, afi_t afi, safi_t safi)
                                                   safi);
 }
 
-void bgp_zebra_withdraw(struct prefix *p, struct bgp_info *info, safi_t safi)
+void bgp_zebra_withdraw(struct prefix *p, struct bgp_info *info,
+                       struct bgp *bgp, safi_t safi)
 {
        struct zapi_route api;
        struct peer *peer;
@@ -1329,12 +1330,12 @@ void bgp_zebra_withdraw(struct prefix *p, struct bgp_info *info, safi_t safi)
        /* Don't try to install if we're not connected to Zebra or Zebra doesn't
         * know of this instance.
         */
-       if (!bgp_install_info_to_zebra(peer->bgp))
+       if (!bgp_install_info_to_zebra(bgp))
                return;
 
        memset(&api, 0, sizeof(api));
        memcpy(&api.rmac, &(info->attr->rmac), sizeof(struct ethaddr));
-       api.vrf_id = peer->bgp->vrf_id;
+       api.vrf_id = bgp->vrf_id;
        api.type = ZEBRA_ROUTE_BGP;
        api.safi = safi;
        api.prefix = *p;
@@ -1353,14 +1354,14 @@ void bgp_zebra_withdraw(struct prefix *p, struct bgp_info *info, safi_t safi)
 
        if ((peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
            || CHECK_FLAG(peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)
-           || bgp_flag_check(peer->bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
+           || bgp_flag_check(bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
                SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION);
 
        if (bgp_debug_zebra(p)) {
                char buf[PREFIX_STRLEN];
 
                prefix2str(&api.prefix, buf, sizeof(buf));
-               zlog_debug("Tx route delete VRF %u %s", peer->bgp->vrf_id, buf);
+               zlog_debug("Tx route delete VRF %u %s", bgp->vrf_id, buf);
        }
 
        zclient_route_send(ZEBRA_ROUTE_DELETE, zclient, &api);
index da5160bc16d6c0ce96e8950eb58dff71ebe5a257..c30f63039b902d05d184ea15d52ac2425f131d1b 100644 (file)
@@ -33,7 +33,8 @@ extern void bgp_config_write_redistribute(struct vty *, struct bgp *, afi_t,
 extern void bgp_zebra_announce(struct bgp_node *, struct prefix *,
                               struct bgp_info *, struct bgp *, afi_t, safi_t);
 extern void bgp_zebra_announce_table(struct bgp *, afi_t, safi_t);
-extern void bgp_zebra_withdraw(struct prefix *, struct bgp_info *, safi_t);
+extern void bgp_zebra_withdraw(struct prefix *, struct bgp_info *,
+                              struct bgp *, safi_t);
 
 extern void bgp_zebra_initiate_radv(struct bgp *bgp, struct peer *peer);
 extern void bgp_zebra_terminate_radv(struct bgp *bgp, struct peer *peer);