]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Fix for CM-11982 bgp failed to redistribute connected in vrf table
authorSid Khot <sidkhot@cumulusnetworks.com>
Fri, 5 Aug 2016 23:49:39 +0000 (16:49 -0700)
committerSid Khot <sidkhot@cumulusnetworks.com>
Fri, 5 Aug 2016 23:49:39 +0000 (16:49 -0700)
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
bgpd/bgp_zebra.c
bgpd/bgpd.h

index 1f2f7f86ce960a15f4d0ed063c9b48100f19be23..a5f066bff059ab3bce0bda8122ec2fd52f2665c1 100644 (file)
@@ -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);
     }
 
index 3df63d5ba7af0335e81dfc8037c4a2e2021b1ba2..b4bac840e3755d5ed1d4b61484465edf129a18e7 100644 (file)
@@ -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)
 {
index 1603ed261443cc34be3ac93bd99032e2ec423a44..991afdf7ccc91fa3c04934aa5500da15014c5dea 100644 (file)
@@ -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 */