+ return (~0);
+}
+
+static adj_index_t
+adj_glean_db_lookup (fib_protocol_t proto,
+ u32 sw_if_index,
+ const ip46_address_t *nh_addr)
+{
+ uword *p;
+
+ if (vec_len(adj_gleans[proto]) <= sw_if_index)
+ return (ADJ_INDEX_INVALID);
+
+ p = hash_get_mem (adj_gleans[proto][sw_if_index], nh_addr);
+
+ if (p)
+ return (p[0]);
+
+ return (ADJ_INDEX_INVALID);
+}
+
+static void
+adj_glean_db_insert (fib_protocol_t proto,
+ u32 sw_if_index,
+ const ip46_address_t *nh_addr,
+ adj_index_t ai)
+{
+ vlib_main_t *vm = vlib_get_main();
+
+ vlib_worker_thread_barrier_sync(vm);
+
+ vec_validate(adj_gleans[proto], sw_if_index);
+
+ if (NULL == adj_gleans[proto][sw_if_index])
+ {
+ adj_gleans[proto][sw_if_index] =
+ hash_create_mem (0, sizeof(ip46_address_t), sizeof(adj_index_t));
+ }
+
+ hash_set_mem_alloc (&adj_gleans[proto][sw_if_index],
+ nh_addr, ai);
+
+ vlib_worker_thread_barrier_release(vm);
+}
+
+static void
+adj_glean_db_remove (fib_protocol_t proto,
+ u32 sw_if_index,
+ const ip46_address_t *nh_addr)
+{
+ vlib_main_t *vm = vlib_get_main();
+
+ vlib_worker_thread_barrier_sync(vm);
+
+ ASSERT(ADJ_INDEX_INVALID != adj_glean_db_lookup(proto, sw_if_index, nh_addr));
+ hash_unset_mem_free (&adj_gleans[proto][sw_if_index],
+ nh_addr);
+
+ if (0 == hash_elts(adj_gleans[proto][sw_if_index]))
+ {
+ hash_free(adj_gleans[proto][sw_if_index]);
+ adj_gleans[proto][sw_if_index] = NULL;
+ }
+ vlib_worker_thread_barrier_release(vm);