summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_main.c11
-rw-r--r--bgpd/bgp_zebra.c18
-rw-r--r--bgpd/bgpd.h1
3 files changed, 30 insertions, 0 deletions
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 */