]> git.puffer.fish Git - matthieu/frr.git/commitdiff
Zebra: Cleanup registered nexthops upon client exit
authorvivek <vivek@cumulusnetworks.com>
Wed, 2 Mar 2016 01:08:43 +0000 (01:08 +0000)
committervivek <vivek@cumulusnetworks.com>
Wed, 2 Mar 2016 01:08:43 +0000 (01:08 +0000)
Ensure registered nexthops are cleaned up when bgpd exits.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
Ticket: CM-9488
Reviewed By: CCR-4220
Testing Done: Manual testing

zebra/zserv.c

index 6603437f091dc353239ac96ba9f925280ff30739..9eb53dff0fe2bd6f16bad52f81a559d787da73a0 100644 (file)
@@ -1791,14 +1791,31 @@ zread_vrf_unregister (struct zserv *client, u_short length, vrf_id_t vrf_id)
   return 0;
 }
 
+/* Cleanup registered nexthops (across VRFs) upon client disconnect. */
+static void
+zebra_client_close_cleanup_rnh (struct zserv *client)
+{
+  vrf_iter_t iter;
+  struct zebra_vrf *zvrf;
+
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    {
+      if ((zvrf = vrf_iter2info (iter)) != NULL)
+        {
+          zebra_cleanup_rnh_client(zvrf->vrf_id, AF_INET, client, RNH_NEXTHOP_TYPE);
+          zebra_cleanup_rnh_client(zvrf->vrf_id, AF_INET6, client, RNH_NEXTHOP_TYPE);
+          zebra_cleanup_rnh_client(zvrf->vrf_id, AF_INET, client, RNH_IMPORT_CHECK_TYPE);
+          zebra_cleanup_rnh_client(zvrf->vrf_id, AF_INET6, client, RNH_IMPORT_CHECK_TYPE);
+        }
+    }
+}
+
 /* Close zebra client. */
 static void
 zebra_client_close (struct zserv *client)
 {
-  zebra_cleanup_rnh_client(0, AF_INET, client, RNH_NEXTHOP_TYPE);
-  zebra_cleanup_rnh_client(0, AF_INET6, client, RNH_NEXTHOP_TYPE);
-  zebra_cleanup_rnh_client(0, AF_INET, client, RNH_IMPORT_CHECK_TYPE);
-  zebra_cleanup_rnh_client(0, AF_INET6, client, RNH_IMPORT_CHECK_TYPE);
+  /* Cleanup any registered nexthops - across all VRFs. */
+  zebra_client_close_cleanup_rnh (client);
 
   /* Close file descriptor. */
   if (client->sock)