adj_nbr_tables[nh_proto][sw_if_index] =
clib_mem_alloc_aligned(sizeof(BVT(clib_bihash)),
CLIB_CACHE_LINE_BYTES);
- memset(adj_nbr_tables[nh_proto][sw_if_index],
+ clib_memset(adj_nbr_tables[nh_proto][sw_if_index],
0,
sizeof(BVT(clib_bihash)));
BV(clib_bihash_add_del) (adj_nbr_tables[nh_proto][sw_if_index], &kv, 0);
}
-static adj_index_t
+adj_index_t
adj_nbr_find (fib_protocol_t nh_proto,
vnet_link_t link_type,
const ip46_address_t *nh_addr,
adj_index = adj_get_index(adj);
adj_lock(adj_index);
- vnet_rewrite_init(vnm, sw_if_index,
+ if (ip46_address_is_equal(&ADJ_BCAST_ADDR, nh_addr))
+ {
+ adj->lookup_next_index = IP_LOOKUP_NEXT_BCAST;
+ }
+
+ vnet_rewrite_init(vnm, sw_if_index, link_type,
adj_get_nd_node(nh_proto),
vnet_tx_node_index_for_sw_interface(vnm, sw_if_index),
&adj->rewrite_header);
* 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 :
*/
.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);
}
* @brief Invoked on each SW interface of a HW interface when the
* HW interface state changes
*/
-static void
+static walk_rc_t
adj_nbr_hw_sw_interface_state_change (vnet_main_t * vnm,
u32 sw_if_index,
void *arg)
adj_nbr_interface_state_change_one,
ctx);
}
+ return (WALK_CONTINUE);
}
/**
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);
}