diff options
| author | vivek <vivek@cumulusnetworks.com> | 2016-03-02 01:08:43 +0000 |
|---|---|---|
| committer | vivek <vivek@cumulusnetworks.com> | 2016-03-02 01:08:43 +0000 |
| commit | 4b33b75a01b38108f99ef633e85d9bf964a33d3f (patch) | |
| tree | 033ea88af5b350c30512841a68e37cf09e6df2dc | |
| parent | d1570739d97f5dbf74272f67b1104a28fa389747 (diff) | |
Zebra: Cleanup registered nexthops upon client exit
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
| -rw-r--r-- | zebra/zserv.c | 25 |
1 files changed, 21 insertions, 4 deletions
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) |
