Adjacency walks protected by 'walk in progress' flag 25/14525/1
authorNeale Ranns <[email protected]>
Mon, 27 Aug 2018 14:29:15 +0000 (07:29 -0700)
committerNeale Ranns <[email protected]>
Tue, 28 Aug 2018 09:30:59 +0000 (09:30 +0000)
Change-Id: I3281f65f7dec792d56de48afb39efcc2fed8578b
Signed-off-by: Neale Ranns <[email protected]>
(cherry picked from commit 30d53645ded750db3cc84f6fb4a97df038b143a1)

src/vnet/adj/adj_nbr.c
src/vnet/fib/fib_node.h

index 3f66acb..5165db5 100644 (file)
@@ -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);
 }
index ec3b542..5578498 100644 (file)
@@ -159,6 +159,7 @@ STATIC_ASSERT(sizeof(fib_node_bw_reason_flag_t) < 2,
  */
 typedef enum fib_node_bw_flags_t_
 {
+    FIB_NODE_BW_FLAG_NONE = 0,
     /**
      * Force the walk to be synchronous
      */