diff --git a/lib/vrf.c b/lib/vrf.c index 9f4c5cdddc4b..cd0439c407d5 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -326,6 +326,34 @@ void vrf_disable(struct vrf *vrf) (*vrf_master.vrf_disable_hook)(vrf); } +/* Disable VRF module. */ +void vrf_disable_all(void) +{ + struct vrf *vrf, *tmp; + + if (debug_vrf) + zlog_debug("%s: vrf subsystem", __func__); + + RB_FOREACH_SAFE (vrf, vrf_id_head, &vrfs_by_id, tmp) { + if (vrf->vrf_id == VRF_DEFAULT) + continue; + + vrf_disable(vrf); + } + + RB_FOREACH_SAFE (vrf, vrf_name_head, &vrfs_by_name, tmp) { + if (vrf->vrf_id == VRF_DEFAULT) + continue; + + vrf_disable(vrf); + } + + /* Finally disable default VRF */ + vrf = vrf_lookup_by_id(VRF_DEFAULT); + if (vrf) + vrf_disable(vrf); +} + const char *vrf_id_to_name(vrf_id_t vrf_id) { struct vrf *vrf; diff --git a/lib/vrf.h b/lib/vrf.h index 4277a51bb1b8..00e10690a6b5 100644 --- a/lib/vrf.h +++ b/lib/vrf.h @@ -203,8 +203,11 @@ extern void vrf_init(int (*create)(struct vrf *vrf), /* * Call vrf_terminate when the protocol is being shutdown + * it implements disable() and destroy() hooks + * vrf_disable_all does disable() only */ extern void vrf_terminate(void); +extern void vrf_disable_all(void); /* * Utilities to create networks objects, diff --git a/zebra/main.c b/zebra/main.c index 606ecc727964..154756b37195 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -204,6 +204,8 @@ static void sigint(void) list_delete(&zrouter.client_list); + vrf_disable_all(); + /* Indicate that all new dplane work has been enqueued. When that * work is complete, the dataplane will enqueue an event * with the 'finalize' function.