({
s = format(s, "\n %U", format_mfib_itf, mfi);
}));
- s = format(s, "\n RPF-ID:%d", mfib_entry->mfe_rpf_id);
+ if (MFIB_RPF_ID_NONE != mfib_entry->mfe_rpf_id)
+ {
+ s = format(s, "\n RPF-ID:%d", mfib_entry->mfe_rpf_id);
+ }
s = format(s, "\n %U-chain\n %U",
format_fib_forw_chain_type,
mfib_entry_get_default_chain_type(mfib_entry),
static mfib_entry_t*
mfib_entry_from_fib_node (fib_node_t *node)
{
-#if CLIB_DEBUG > 0
ASSERT(FIB_NODE_TYPE_MFIB_ENTRY == node->fn_type);
-#endif
return ((mfib_entry_t*)node);
}
static mfib_entry_src_t *
mfib_entry_src_find_or_create (mfib_entry_t *mfib_entry,
- mfib_source_t source)
+ mfib_source_t source)
{
mfib_entry_src_t *esrc;
return (bsrc);
}
+int
+mfib_entry_is_sourced (fib_node_index_t mfib_entry_index,
+ mfib_source_t source)
+{
+ mfib_entry_t *mfib_entry;
+
+ mfib_entry = mfib_entry_get(mfib_entry_index);
+
+ return (NULL != mfib_entry_src_find(mfib_entry, source, NULL));
+}
+
static void
mfib_entry_src_flush (mfib_entry_src_t *msrc)
{
{
mfib_entry_t *mfib_entry;
- pool_get(mfib_entry_pool, mfib_entry);
+ pool_get_aligned(mfib_entry_pool, mfib_entry, CLIB_CACHE_LINE_BYTES);
fib_node_init(&mfib_entry->mfe_node,
FIB_NODE_TYPE_MFIB_ENTRY);
case FIB_FORW_CHAIN_TYPE_MPLS_EOS:
case FIB_FORW_CHAIN_TYPE_ETHERNET:
case FIB_FORW_CHAIN_TYPE_NSH:
+ case FIB_FORW_CHAIN_TYPE_BIER:
ASSERT(0);
break;
}
{
fib_node_index_t path_index;
mfib_path_ext_t *path_ext;
- mfib_itf_flags_t old, new;
mfib_entry_t *mfib_entry;
mfib_entry_src_t *msrc;
+ mfib_itf_flags_t old;
mfib_entry = mfib_entry_get(mfib_entry_index);
ASSERT(NULL != mfib_entry);
{
mfib_itf_t *mfib_itf;
- new = itf_flags;
-
- if (old != new)
+ if (old != itf_flags)
{
- if (MFIB_ITF_FLAG_NONE == new)
- {
- /*
- * no more interface flags on this path, remove
- * from the data-plane set
- */
- mfib_entry_itf_remove(msrc, rpath[0].frp_sw_if_index);
- }
- else if (MFIB_ITF_FLAG_NONE == old)
+ /*
+ * change of flag contributions
+ */
+ mfib_itf = mfib_entry_itf_find(msrc->mfes_itfs,
+ rpath[0].frp_sw_if_index);
+
+ if (NULL == mfib_itf)
{
- /*
- * This interface is now contributing
- */
mfib_entry_itf_add(msrc,
rpath[0].frp_sw_if_index,
- mfib_itf_create(rpath[0].frp_sw_if_index,
- itf_flags));
+ mfib_itf_create(path_index, itf_flags));
}
else
{
- /*
- * change of flag contributions
- */
- mfib_itf = mfib_entry_itf_find(msrc->mfes_itfs,
- rpath[0].frp_sw_if_index);
- /* Seen by packets inflight */
- mfib_itf->mfi_flags = new;
+ if (mfib_itf_update(mfib_itf,
+ path_index,
+ itf_flags))
+ {
+ /*
+ * no more interface flags on this path, remove
+ * from the data-plane set
+ */
+ mfib_entry_itf_remove(msrc, rpath[0].frp_sw_if_index);
+ }
}
}
}
mfib_path_ext_remove(msrc, path_index);
if (~0 != rpath[0].frp_sw_if_index)
{
- mfib_entry_itf_remove(msrc, rpath[0].frp_sw_if_index);
+ mfib_itf_t *mfib_itf;
+
+ mfib_itf = mfib_entry_itf_find(msrc->mfes_itfs,
+ rpath[0].frp_sw_if_index);
+
+ if (mfib_itf_update(mfib_itf,
+ path_index,
+ MFIB_ITF_FLAG_NONE))
+ {
+ /*
+ * no more interface flags on this path, remove
+ * from the data-plane set
+ */
+ mfib_entry_itf_remove(msrc, rpath[0].frp_sw_if_index);
+ }
}
}
return (mfib_entry->mfe_fib_index);
}
+const dpo_id_t*
+mfib_entry_contribute_ip_forwarding (fib_node_index_t mfib_entry_index)
+{
+ mfib_entry_t *mfib_entry;
+
+ mfib_entry = mfib_entry_get(mfib_entry_index);
+
+ return (&mfib_entry->mfe_rep);
+}
+
void
mfib_entry_contribute_forwarding (fib_node_index_t mfib_entry_index,
fib_forward_chain_type_t type,