fib_entry_src_adj_remove (fib_entry_src_t *src)
{
src->fes_pl = FIB_NODE_INDEX_INVALID;
+
+ if (FIB_NODE_INDEX_INVALID != src->u.adj.fesa_cover)
+ {
+ fib_entry_cover_untrack(fib_entry_get(src->u.adj.fesa_cover),
+ src->u.adj.fesa_sibling);
+ }
}
/*
fib_attached_export_covered_removed(cover, fib_entry_get_index(fib_entry));
src->u.adj.fesa_cover = FIB_NODE_INDEX_INVALID;
+ src->u.adj.fesa_sibling = FIB_NODE_INDEX_INVALID;
}
static u8*
const fib_entry_t *fib_entry)
{
fib_entry_src_cover_res_t res = {
- .install = !0,
+ .install = 0,
.bw_reason = FIB_NODE_BW_REASON_FLAG_NONE,
};
+ /*
+ * not interested in a change to the cover if the cover
+ * is not being tracked, i.e. the source is not active
+ */
+ if (FIB_NODE_INDEX_INVALID == src->u.adj.fesa_cover)
+ return res;
+
fib_entry_src_adj_deactivate(src, fib_entry);
res.install = fib_entry_src_adj_activate(src, fib_entry);
* prefix is updated during the covers walk.
*/
fib_entry_src_cover_res_t res = {
- .install = !0,
+ .install = 0,
.bw_reason = FIB_NODE_BW_REASON_FLAG_NONE,
};
fib_entry_t *cover;
- ASSERT(FIB_NODE_INDEX_INVALID != src->u.adj.fesa_cover);
-
- cover = fib_entry_get(src->u.adj.fesa_cover);
-
- res.install = (FIB_ENTRY_FLAG_ATTACHED & fib_entry_get_flags_i(cover));
+ /*
+ * If there is no cover, then the source is not active and we can ignore
+ * this update
+ */
+ if (FIB_NODE_INDEX_INVALID != src->u.adj.fesa_cover)
+ {
+ cover = fib_entry_get(src->u.adj.fesa_cover);
- FIB_ENTRY_DBG(fib_entry, "adj-src-cover-updated");
+ res.install = (FIB_ENTRY_FLAG_ATTACHED & fib_entry_get_flags_i(cover));
+ FIB_ENTRY_DBG(fib_entry, "adj-src-cover-updated");
+ }
return (res);
}
void
fib_entry_src_adj_register (void)
{
- fib_entry_src_register(FIB_SOURCE_ADJ, &adj_src_vft);
+ fib_entry_src_behaviour_register(FIB_SOURCE_BH_ADJ, &adj_src_vft);
}