{
struct vrf *vrf;
struct bgp *bgp;
+ vrf_id_t old_vrf_id;
vrf = vrf_lookup (vrf_id);
if (!vrf) // unexpected
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);
}
{
struct vrf *vrf;
struct bgp *bgp;
+ vrf_id_t old_vrf_id;
if (vrf_id == VRF_DEFAULT)
return 0;
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);
}
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)
{
bgp->vrf_id = VRF_UNKNOWN;
}
+extern void bgp_update_redist_vrf_bitmaps (struct bgp*, vrf_id_t);
#endif /* _QUAGGA_BGPD_H */