aboutsummaryrefslogtreecommitdiffstats
path: root/vnet/vnet/adj
diff options
context:
space:
mode:
Diffstat (limited to 'vnet/vnet/adj')
-rw-r--r--vnet/vnet/adj/adj.c10
-rw-r--r--vnet/vnet/adj/adj_internal.h3
-rw-r--r--vnet/vnet/adj/adj_nbr.c4
3 files changed, 14 insertions, 3 deletions
diff --git a/vnet/vnet/adj/adj.c b/vnet/vnet/adj/adj.c
index 24f7662d..2741c885 100644
--- a/vnet/vnet/adj/adj.c
+++ b/vnet/vnet/adj/adj.c
@@ -61,6 +61,7 @@ adj_alloc (fib_protocol_t proto)
adj->mcast_group_index = ~0;
adj->saved_lookup_next_index = 0;
adj->n_adj = 1;
+ adj->lookup_next_index = 0;
fib_node_init(&adj->ia_node,
FIB_NODE_TYPE_ADJ);
@@ -163,7 +164,8 @@ adj_last_lock_gone (ip_adjacency_t *adj)
/*
* complete and incomplete nbr adjs
*/
- adj_nbr_remove(adj->ia_nh_proto,
+ adj_nbr_remove(adj_get_index(adj),
+ adj->ia_nh_proto,
adj->ia_link,
&adj->sub_type.nbr.next_hop,
adj->rewrite_header.sw_if_index);
@@ -376,6 +378,12 @@ adj_show (vlib_main_t * vm,
if (ADJ_INDEX_INVALID != ai)
{
+ if (pool_is_free_index(adj_pool, ai))
+ {
+ vlib_cli_output (vm, "adjacency %d invalid", ai);
+ return 0;
+ }
+
vlib_cli_output (vm, "[@%d] %U",
ai,
format_ip_adjacency, ai,
diff --git a/vnet/vnet/adj/adj_internal.h b/vnet/vnet/adj/adj_internal.h
index e3e0e04c..833bc7c9 100644
--- a/vnet/vnet/adj/adj_internal.h
+++ b/vnet/vnet/adj/adj_internal.h
@@ -93,7 +93,8 @@ extern void adj_nbr_update_rewrite_internal (ip_adjacency_t *adj,
extern ip_adjacency_t * adj_alloc(fib_protocol_t proto);
-extern void adj_nbr_remove(fib_protocol_t nh_proto,
+extern void adj_nbr_remove(adj_index_t ai,
+ fib_protocol_t nh_proto,
vnet_link_t link_type,
const ip46_address_t *nh_addr,
u32 sw_if_index);
diff --git a/vnet/vnet/adj/adj_nbr.c b/vnet/vnet/adj/adj_nbr.c
index 1a78ecbc..003e18e8 100644
--- a/vnet/vnet/adj/adj_nbr.c
+++ b/vnet/vnet/adj/adj_nbr.c
@@ -76,7 +76,8 @@ adj_nbr_insert (fib_protocol_t nh_proto,
}
void
-adj_nbr_remove (fib_protocol_t nh_proto,
+adj_nbr_remove (adj_index_t ai,
+ fib_protocol_t nh_proto,
vnet_link_t link_type,
const ip46_address_t *nh_addr,
u32 sw_if_index)
@@ -87,6 +88,7 @@ adj_nbr_remove (fib_protocol_t nh_proto,
return;
ADJ_NBR_SET_KEY(kv, link_type, nh_addr);
+ kv.value = ai;
BV(clib_bihash_add_del) (adj_nbr_tables[nh_proto][sw_if_index], &kv, 0);
}