/* * Source activate. * Called when the source is teh new longer best source on the entry */ static int fib_entry_src_interface_activate (fib_entry_src_t *src, const fib_entry_t *fib_entry) { fib_entry_t *cover; if (FIB_ENTRY_FLAG_LOCAL & src->fes_entry_flags) { /* * Track the covering attached/connected cover. This is so that * during an attached export of the cover, this local prefix is * also exported */ src->u.interface.fesi_cover = fib_table_get_less_specific(fib_entry->fe_fib_index, &fib_entry->fe_prefix); ASSERT(FIB_NODE_INDEX_INVALID != src->u.interface.fesi_cover); cover = fib_entry_get(src->u.interface.fesi_cover); src->u.interface.fesi_sibling = fib_entry_cover_track(cover, fib_entry_get_index(fib_entry)); } return (!0); }
void fib_entry_cover_change_notify (fib_node_index_t cover_index, fib_node_index_t covered) { fib_entry_t *cover; cover = fib_entry_get(cover_index); fib_entry_cover_walk(cover, fib_entry_cover_change_one, uword_to_pointer(covered, void*)); }
/* * Source Deactivate. * Called when the source is no longer best source on the entry */ static void fib_entry_src_interface_deactivate (fib_entry_src_t *src, const fib_entry_t *fib_entry) { fib_entry_t *cover; /* * remove the depednecy on the covering entry */ if (FIB_NODE_INDEX_INVALID != src->u.interface.fesi_cover) { cover = fib_entry_get(src->u.interface.fesi_cover); fib_entry_cover_untrack(cover, src->u.interface.fesi_sibling); src->u.interface.fesi_cover = FIB_NODE_INDEX_INVALID; } }