diff --git a/zebra/main.c b/zebra/main.c index 687da70cabce..dd6249eff5f1 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -238,7 +238,7 @@ void zebra_finalize(struct event *dummy) zebra_ns_notify_close(); /* Final shutdown of ns resources */ - ns_walk_func(zebra_ns_final_shutdown, NULL, NULL); + ns_walk_func(zebra_ns_kernel_shutdown, NULL, NULL); zebra_rib_terminate(); zebra_router_terminate(); @@ -251,6 +251,8 @@ void zebra_finalize(struct event *dummy) label_manager_terminate(); + ns_walk_func(zebra_ns_final_shutdown, NULL, NULL); + ns_terminate(); frr_fini(); exit(0); diff --git a/zebra/zebra_ns.c b/zebra/zebra_ns.c index 803d8f0034c0..ffd749fcf17e 100644 --- a/zebra/zebra_ns.c +++ b/zebra/zebra_ns.c @@ -175,6 +175,22 @@ int zebra_ns_early_shutdown(struct ns *ns, return NS_WALK_CONTINUE; } +/* During zebra shutdown, do kernel cleanup + * netlink sockets, .. + */ +int zebra_ns_kernel_shutdown(struct ns *ns, void *param_in __attribute__((unused)), + void **param_out __attribute__((unused))) +{ + struct zebra_ns *zns = ns->info; + + if (zns == NULL) + return NS_WALK_CONTINUE; + + kernel_terminate(zns, true); + + return NS_WALK_CONTINUE; +} + /* During zebra shutdown, do final cleanup * after all dataplane work is complete. */ @@ -185,9 +201,7 @@ int zebra_ns_final_shutdown(struct ns *ns, struct zebra_ns *zns = ns->info; if (zns == NULL) - return 0; - - kernel_terminate(zns, true); + return NS_WALK_CONTINUE; zebra_ns_delete(ns); diff --git a/zebra/zebra_ns.h b/zebra/zebra_ns.h index 8d988c3f82d0..d5fd5869bca4 100644 --- a/zebra/zebra_ns.h +++ b/zebra/zebra_ns.h @@ -70,6 +70,8 @@ int zebra_ns_early_shutdown(struct ns *ns, int zebra_ns_final_shutdown(struct ns *ns, void *param_in __attribute__((unused)), void **param_out __attribute__((unused))); +int zebra_ns_kernel_shutdown(struct ns *ns, void *param_in __attribute__((unused)), + void **param_out __attribute__((unused))); void zebra_ns_startup_continue(struct zebra_dplane_ctx *ctx);