/* * 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); }
u32 fib_entry_cover_track (fib_entry_t* cover, fib_node_index_t covered) { fib_entry_delegate_t *fed; FIB_ENTRY_DBG(cover, "cover-track %d", covered); ASSERT(fib_entry_get_index(cover) != covered); fed = fib_entry_delegate_get(cover, FIB_ENTRY_DELEGATE_COVERED); if (NULL == fed) { fed = fib_entry_delegate_find_or_add(cover, FIB_ENTRY_DELEGATE_COVERED); fed->fd_list = fib_node_list_create(); } return (fib_node_list_push_front(fed->fd_list, 0, FIB_NODE_TYPE_ENTRY, covered)); }