#include <vnet/dpo/drop_dpo.h>
#include <vnet/dpo/replicate_dpo.h>
+/**
+ * the logger
+ */
+vlib_log_class_t mfib_entry_logger;
+
/**
* Debug macro
*/
-#ifdef MFIB_DEBUG
-#DEFIne MFIB_ENTRY_DBG(_e, _fmt, _args...) \
+#define MFIB_ENTRY_DBG(_e, _fmt, _args...) \
{ \
- u8*__tmp = NULL; \
- __tmp = format(__tmp, "e:[%d:%U", \
- mfib_entry_get_index(_e), \
- format_ip46_address, \
- &_e->mfe_prefix.fp_grp_addr, \
- IP46_TYPE_ANY); \
- __tmp = format(__tmp, "/%d,", \
- _e->mfe_prefix.fp_len); \
- __tmp = format(__tmp, "%U]", \
+ vlib_log_debug(mfib_entry_logger, \
+ "e:[%d:%U]: " _fmt, \
mfib_entry_get_index(_e), \
- format_ip46_address, \
- &_e->mfe_prefix.fp_src_addr, \
- IP46_TYPE_ANY); \
- __tmp = format(__tmp, _fmt, ##_args); \
- clib_warning("%s", __tmp); \
- vec_free(__tmp); \
+ format_mfib_prefix, \
+ &_e->mfe_prefix, \
+ ##_args); \
}
-#else
-#define MFIB_ENTRY_DBG(_e, _fmt, _args...)
-#endif
/**
* MFIB extensions to each path
({
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);
/*
* Some of the members require non-default initialisation
- * so we also init those that don't and thus save on the call to memset.
+ * so we also init those that don't and thus save on the call to clib_memset.
*/
mfib_entry->mfe_flags = 0;
mfib_entry->mfe_fib_index = fib_index;
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;
}
* entry
*/
fib_node_index_t old_pl_index;
- fib_protocol_t fp;
+ dpo_proto_t dp;
dpo_id_t dpo = DPO_INVALID;
- fp = mfib_entry_get_proto(mfib_entry);
+ dp = fib_proto_to_dpo(mfib_entry_get_proto(mfib_entry));
old_pl_index = msrc->mfes_pl;
- dpo_set(&dpo, DPO_REPLICATE,
- fib_proto_to_dpo(fp),
- repi);
+ dpo_set(&dpo, DPO_REPLICATE, dp, repi);
msrc->mfes_pl =
- fib_path_list_create_special(fp,
+ fib_path_list_create_special(dp,
FIB_PATH_LIST_FLAG_EXCLUSIVE,
&dpo);
{
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);
+ }
}
}
pool_put(mfib_entry_pool, mfib_entry);
}
+u32
+mfib_entry_get_stats_index (fib_node_index_t fib_entry_index)
+{
+ mfib_entry_t *mfib_entry;
+
+ mfib_entry = mfib_entry_get(fib_entry_index);
+
+ return (mfib_entry->mfe_rep.dpoi_index);
+}
+
/*
* mfib_entry_back_walk_notify
*
{
fib_node_register_type (FIB_NODE_TYPE_MFIB_ENTRY, &mfib_entry_vft);
dpo_register(DPO_MFIB_ENTRY, &mfib_entry_dpo_vft, mfib_entry_nodes);
+ mfib_entry_logger = vlib_log_register_class("mfib", "entry");
}
void
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,