From 6da5d8d237c52d999fe077dd278eaa9bc020f01b Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Mon, 27 Aug 2018 07:29:15 -0700 Subject: Adjacency walks protected by 'walk in progress' flag Change-Id: I3281f65f7dec792d56de48afb39efcc2fed8578b Signed-off-by: Neale Ranns (cherry picked from commit 30d53645ded750db3cc84f6fb4a97df038b143a1) --- src/vnet/adj/adj_nbr.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src/vnet/adj/adj_nbr.c') diff --git a/src/vnet/adj/adj_nbr.c b/src/vnet/adj/adj_nbr.c index 3f66acbb5c5..5165db5a2df 100644 --- a/src/vnet/adj/adj_nbr.c +++ b/src/vnet/adj/adj_nbr.c @@ -694,7 +694,6 @@ adj_nbr_interface_state_change_one (adj_index_t ai, * since this is the walk that provides convergence */ adj_nbr_interface_state_change_ctx_t *ctx = arg; - fib_node_back_walk_ctx_t bw_ctx = { .fnbw_reason = ((ctx->flags & ADJ_NBR_INTERFACE_UP) ? FIB_NODE_BW_REASON_FLAG_INTERFACE_UP : @@ -706,10 +705,15 @@ adj_nbr_interface_state_change_one (adj_index_t ai, */ .fnbw_flags = (!(ctx->flags & ADJ_NBR_INTERFACE_UP) ? FIB_NODE_BW_FLAG_FORCE_SYNC : - 0), + FIB_NODE_BW_FLAG_NONE), }; + ip_adjacency_t *adj; + + adj = adj_get(ai); + adj->ia_flags |= ADJ_FLAG_SYNC_WALK_ACTIVE; fib_walk_sync(FIB_NODE_TYPE_ADJ, ai, &bw_ctx); + adj->ia_flags &= ~ADJ_FLAG_SYNC_WALK_ACTIVE; return (ADJ_WALK_RC_CONTINUE); } @@ -810,8 +814,13 @@ adj_nbr_interface_delete_one (adj_index_t ai, fib_node_back_walk_ctx_t bw_ctx = { .fnbw_reason = FIB_NODE_BW_REASON_FLAG_INTERFACE_DELETE, }; + ip_adjacency_t *adj; + + adj = adj_get(ai); + adj->ia_flags |= ADJ_FLAG_SYNC_WALK_ACTIVE; fib_walk_sync(FIB_NODE_TYPE_ADJ, ai, &bw_ctx); + adj->ia_flags &= ~ADJ_FLAG_SYNC_WALK_ACTIVE; return (ADJ_WALK_RC_CONTINUE); } -- cgit 1.2.3-korg