From: vivek Date: Wed, 2 Mar 2016 01:08:43 +0000 (+0000) Subject: Zebra: Cleanup registered nexthops upon client exit X-Git-Tag: frr-2.0-rc1~1084 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=4b33b75a01b38108f99ef633e85d9bf964a33d3f;p=matthieu%2Ffrr.git Zebra: Cleanup registered nexthops upon client exit Ensure registered nexthops are cleaned up when bgpd exits. Signed-off-by: Vivek Venkatraman Reviewed-by: Donald Sharp Ticket: CM-9488 Reviewed By: CCR-4220 Testing Done: Manual testing --- diff --git a/zebra/zserv.c b/zebra/zserv.c index 6603437f09..9eb53dff0f 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -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)