diff options
author | Donald Sharp <sharpd@nvidia.com> | 2023-11-15 20:41:18 +0100 |
---|---|---|
committer | Donald Sharp <sharpd@nvidia.com> | 2023-11-21 18:41:18 +0100 |
commit | 318a8c98b4f8cf29a91da45ad3708a4aaf97c55c (patch) | |
tree | d3c386dc96f7911ffad610d3472762c91549358f /zebra | |
parent | *: Cleanup keychain on shutdown (diff) | |
download | frr-318a8c98b4f8cf29a91da45ad3708a4aaf97c55c.tar.xz frr-318a8c98b4f8cf29a91da45ad3708a4aaf97c55c.zip |
zebra: Cleanup dplane provider owned ctx's on shutdown
On shutdown go through and ensure that any contexts the
dplane provider holds are freed.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'zebra')
-rw-r--r-- | zebra/zebra_dplane.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c index 406395123..e1d1e8417 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c @@ -6859,6 +6859,31 @@ static int kernel_dplane_process_func(struct zebra_dplane_provider *prov) return 0; } +static int kernel_dplane_shutdown_func(struct zebra_dplane_provider *prov, + bool early) +{ + struct zebra_dplane_ctx *ctx; + + if (early) + return 1; + + ctx = dplane_provider_dequeue_in_ctx(prov); + while (ctx) { + dplane_ctx_free(&ctx); + + ctx = dplane_provider_dequeue_in_ctx(prov); + } + + ctx = dplane_provider_dequeue_out_ctx(prov); + while (ctx) { + dplane_ctx_free(&ctx); + + ctx = dplane_provider_dequeue_out_ctx(prov); + } + + return 1; +} + #ifdef DPLANE_TEST_PROVIDER /* @@ -6931,12 +6956,10 @@ static void dplane_provider_init(void) { int ret; - ret = dplane_provider_register("Kernel", - DPLANE_PRIO_KERNEL, + ret = dplane_provider_register("Kernel", DPLANE_PRIO_KERNEL, DPLANE_PROV_FLAGS_DEFAULT, NULL, kernel_dplane_process_func, - NULL, - NULL, NULL); + kernel_dplane_shutdown_func, NULL, NULL); if (ret != AOK) zlog_err("Unable to register kernel dplane provider: %d", |