Skip to content

Commit

Permalink
zebra: fix route deletion during zebra shutdown
Browse files Browse the repository at this point in the history
Split zebra's vrf_terminate() into disable() and delete() stages.
The former enqueues all events for the dplane thread.
Memory freeing is performed in the second stage.

Signed-off-by: Alexander Skorichenko <askorichenko@netgate.com>
  • Loading branch information
askorichenko committed Mar 1, 2024
1 parent c357942 commit 3d88771
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
28 changes: 28 additions & 0 deletions lib/vrf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions lib/vrf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions zebra/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 3d88771

Please sign in to comment.