From 401d56cc5238173ba24bf8460821710bd745ca9e Mon Sep 17 00:00:00 2001 From: Don Slice Date: Thu, 14 Mar 2019 15:17:47 +0000 Subject: [PATCH] bgpd: fix redistribution into vrf when networking is restarted 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 --- bgpd/bgp_main.c | 8 ++++---- bgpd/bgp_zebra.c | 11 ++++------- bgpd/bgpd.h | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c index 47e7c1686f..ac579b1bf0 100644 --- a/bgpd/bgp_main.c +++ b/bgpd/bgp_main.c @@ -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); } diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index ca25a1d4c6..d9749863ec 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -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; } diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 9ca09101e9..66fe6a6f4e 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -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); -- 2.39.5