]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: fix redistribution into vrf when networking is restarted
authorDon Slice <dslice@cumulusnetworks.com>
Thu, 14 Mar 2019 15:17:47 +0000 (15:17 +0000)
committerDon Slice <dslice@cumulusnetworks.com>
Thu, 14 Mar 2019 15:17:47 +0000 (15:17 +0000)
Found that previous fix for this issue caused collatoral damage and
reverted that fix.  This fix clears the vrf_bitmaps when the vrf is
disabled/deleted and then re-applies the redist config when the vrf
is re-enabled.

Ticket: CM-24231
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
bgpd/bgp_main.c
bgpd/bgp_zebra.c
bgpd/bgpd.h

index 47e7c1686fab5e97a7c4fd378de0799224d9b825..ac579b1bf011105af10e2fe829d8157438055c27 100644 (file)
@@ -281,9 +281,9 @@ static int bgp_vrf_enable(struct vrf *vrf)
                bgp_vrf_link(bgp, vrf);
 
                bgp_handle_socket(bgp, vrf, old_vrf_id, true);
-               /* Update any redistribute vrf bitmaps if the vrf_id changed */
+               /* Update any redistribution if vrf_id changed */
                if (old_vrf_id != bgp->vrf_id)
-                       bgp_update_redist_vrf_bitmaps(bgp, old_vrf_id);
+                       bgp_redistribute_redo(bgp);
                bgp_instance_up(bgp);
                vpn_leak_zebra_vrf_label_update(bgp, AFI_IP);
                vpn_leak_zebra_vrf_label_update(bgp, AFI_IP6);
@@ -330,9 +330,9 @@ static int bgp_vrf_disable(struct vrf *vrf)
                /* We have instance configured, unlink from VRF and make it
                 * "down". */
                bgp_vrf_unlink(bgp, vrf);
-               /* Update any redistribute vrf bitmaps if the vrf_id changed */
+               /* Delete any redistribute vrf bitmaps if the vrf_id changed */
                if (old_vrf_id != bgp->vrf_id)
-                       bgp_update_redist_vrf_bitmaps(bgp, old_vrf_id);
+                       bgp_unset_redist_vrf_bitmaps(bgp, old_vrf_id);
                bgp_instance_down(bgp);
        }
 
index ca25a1d4c60e81da845df54c1d236660e53a2a22..d9749863ecedf22cf182b3f7594c14fc3c6542c9 100644 (file)
@@ -1843,9 +1843,9 @@ void bgp_redistribute_redo(struct bgp *bgp)
        }
 }
 
-/* Update redistribute vrf bitmap during triggers like
-   restart networking or delete/add VRFs */
-void bgp_update_redist_vrf_bitmaps(struct bgp *bgp, vrf_id_t old_vrf_id)
+/* Unset redistribute vrf bitmap during triggers like
+   restart networking or delete VRFs */
+void bgp_unset_redist_vrf_bitmaps(struct bgp *bgp, vrf_id_t old_vrf_id)
 {
        int i;
        afi_t afi;
@@ -1853,12 +1853,9 @@ void bgp_update_redist_vrf_bitmaps(struct bgp *bgp, vrf_id_t old_vrf_id)
        for (afi = AFI_IP; afi < AFI_MAX; afi++)
                for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
                        if (vrf_bitmap_check(zclient->redist[afi][i],
-                                            old_vrf_id)) {
+                                            old_vrf_id))
                                vrf_bitmap_unset(zclient->redist[afi][i],
                                                 old_vrf_id);
-                               vrf_bitmap_set(zclient->redist[afi][i],
-                                              bgp->vrf_id);
-                       }
        return;
 }
 
index 9ca09101e9652af55eabe33ec618372446d2722b..66fe6a6f4e6293bffe71237b0831a48e89c3605a 100644 (file)
@@ -1904,7 +1904,7 @@ static inline void bgp_vrf_unlink(struct bgp *bgp, struct vrf *vrf)
        bgp->vrf_id = VRF_UNKNOWN;
 }
 
-extern void bgp_update_redist_vrf_bitmaps(struct bgp *, vrf_id_t);
+extern void bgp_unset_redist_vrf_bitmaps(struct bgp *, vrf_id_t);
 
 /* For benefit of rfapi */
 extern struct peer *peer_new(struct bgp *bgp);