From eb117f29e1c18cd4ddf32d7b01fa10a7bc3d0fab Mon Sep 17 00:00:00 2001 From: Sid Khot Date: Fri, 5 Aug 2016 16:49:39 -0700 Subject: [PATCH] bgpd: Fix for CM-11982 bgp failed to redistribute connected in vrf table Made fix to update the redistribute vrf bitmap when vrf goes down and comes up. Ticket: CM-11982 Reviewed By: CCR-5032 Testing Done: bgp-min passed, manual --- bgpd/bgp_main.c | 11 +++++++++++ bgpd/bgp_zebra.c | 18 ++++++++++++++++++ bgpd/bgpd.h | 1 + 3 files changed, 30 insertions(+) diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c index 1f2f7f86ce..a5f066bff0 100644 --- a/bgpd/bgp_main.c +++ b/bgpd/bgp_main.c @@ -317,6 +317,7 @@ bgp_vrf_enable (vrf_id_t vrf_id, const char *name, void **info) { struct vrf *vrf; struct bgp *bgp; + vrf_id_t old_vrf_id; vrf = vrf_lookup (vrf_id); if (!vrf) // unexpected @@ -328,8 +329,13 @@ bgp_vrf_enable (vrf_id_t vrf_id, const char *name, void **info) bgp = bgp_lookup_by_name(name); if (bgp) { + old_vrf_id = bgp->vrf_id; /* We have instance configured, link to VRF and make it "up". */ bgp_vrf_link (bgp, vrf); + + /* Update 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_instance_up (bgp); } @@ -341,6 +347,7 @@ bgp_vrf_disable (vrf_id_t vrf_id, const char *name, void **info) { struct vrf *vrf; struct bgp *bgp; + vrf_id_t old_vrf_id; if (vrf_id == VRF_DEFAULT) return 0; @@ -355,8 +362,12 @@ bgp_vrf_disable (vrf_id_t vrf_id, const char *name, void **info) bgp = bgp_lookup_by_name(name); if (bgp) { + old_vrf_id = bgp->vrf_id; /* 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 */ + if (old_vrf_id != bgp->vrf_id) + bgp_update_redist_vrf_bitmaps(bgp, old_vrf_id); bgp_instance_down (bgp); } diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 3df63d5ba7..b4bac840e3 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -1965,6 +1965,24 @@ bgp_redistribute_unset (struct bgp *bgp, afi_t afi, int type, u_short instance) return CMD_SUCCESS; } +/* 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) +{ + int i; + afi_t afi; + + 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)) + { + vrf_bitmap_unset (zclient->redist[afi][i], old_vrf_id); + vrf_bitmap_set (zclient->redist[afi][i], bgp->vrf_id); + } + return; +} + void bgp_zclient_reset (void) { diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 1603ed2614..991afdf7cc 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1504,4 +1504,5 @@ 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); #endif /* _QUAGGA_BGPD_H */ -- 2.39.5