X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmfib%2Fmfib_entry.h;h=7087fe87a4d6bfce0a46459ab7fb4e9ce5db11b8;hb=9db6ada779794779158163f6293b479ae7f6ad5e;hp=dc8f49aad1a36910de117fdd62b9355b53b93e74;hpb=5a8123bda0261158457e38bfb4922aa5961389ff;p=vpp.git diff --git a/src/vnet/mfib/mfib_entry.h b/src/vnet/mfib/mfib_entry.h index dc8f49aad1a..7087fe87a4d 100644 --- a/src/vnet/mfib/mfib_entry.h +++ b/src/vnet/mfib/mfib_entry.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -34,30 +35,31 @@ typedef struct mfib_entry_t_ { * Base class. The entry's node representation in the graph. */ fib_node_t mfe_node; + /** * The prefix of the route */ mfib_prefix_t mfe_prefix; + /** * The index of the FIB table this entry is in */ u32 mfe_fib_index; + /** - * the path-list for which this entry is a child. This is also the path-list - * that is contributing forwarding for this entry. + * A vector of sources contributing forwarding */ - fib_node_index_t mfe_parent; + struct mfib_entry_src_t_ *mfe_srcs; + /** - * index of this entry in the parent's child list. - * This is set when this entry is added as a child, but can also - * be changed by the parent as it manages its list. + * The path-list of which this entry is a child */ - u32 mfe_sibling; + fib_node_index_t mfe_pl; /** - * A vector of sources contributing forwarding + * The sibling index on the path-list */ - struct mfib_entry_src_t_ *mfe_srcs; + u32 mfe_sibling; /** * 2nd cache line has the members used in the data plane @@ -65,7 +67,7 @@ typedef struct mfib_entry_t_ { CLIB_CACHE_LINE_ALIGN_MARK(cacheline1); /** - * The Replicate DPO used for forwarding. + * The DPO used for forwarding; replicate, drop, etc.. */ dpo_id_t mfe_rep; @@ -74,12 +76,37 @@ typedef struct mfib_entry_t_ { */ mfib_entry_flags_t mfe_flags; + /** + * RPF-ID used when the packets ingress not from an interface + */ + fib_rpf_id_t mfe_rpf_id; + /** * A hash table of interfaces */ mfib_itf_t *mfe_itfs; + + /** + * A vector of delegates. + */ + mfib_entry_delegate_t *fe_delegates; } mfib_entry_t; +/** + * Debug macro + */ +extern vlib_log_class_t mfib_entry_logger; + +#define MFIB_ENTRY_DBG(_e, _fmt, _args...) \ +{ \ + vlib_log_debug(mfib_entry_logger, \ + "e:[%d:%U]: " _fmt, \ + mfib_entry_get_index(_e), \ + format_mfib_prefix, \ + &_e->mfe_prefix, \ + ##_args); \ +} + #define MFIB_ENTRY_FORMAT_BRIEF (0x0) #define MFIB_ENTRY_FORMAT_DETAIL (0x1) #define MFIB_ENTRY_FORMAT_DETAIL2 (0x2) @@ -90,17 +117,25 @@ extern u8 *format_mfib_entry(u8 * s, va_list * args); extern fib_node_index_t mfib_entry_create(u32 fib_index, mfib_source_t source, const mfib_prefix_t *prefix, - mfib_entry_flags_t entry_flags); + fib_rpf_id_t rpf_id, + mfib_entry_flags_t entry_flags, + index_t repi); extern int mfib_entry_update(fib_node_index_t fib_entry_index, mfib_source_t source, mfib_entry_flags_t entry_flags, + fib_rpf_id_t rpf_id, index_t rep_dpo); +extern int mfib_entry_special_add(fib_node_index_t fib_entry_index, + mfib_source_t source, + mfib_entry_flags_t entry_flags, + fib_rpf_id_t rpf_id, + index_t rep_dpo); + extern void mfib_entry_path_update(fib_node_index_t fib_entry_index, mfib_source_t source, - const fib_route_path_t *rpath, - mfib_itf_flags_t itf_flags); + const fib_route_path_t *rpath); extern int mfib_entry_path_remove(fib_node_index_t fib_entry_index, @@ -121,17 +156,40 @@ extern void mfib_entry_child_remove(fib_node_index_t mfib_entry_index, extern void mfib_entry_lock(fib_node_index_t fib_entry_index); extern void mfib_entry_unlock(fib_node_index_t fib_entry_index); -extern void mfib_entry_get_prefix(fib_node_index_t fib_entry_index, - mfib_prefix_t *pfx); +extern const mfib_prefix_t *mfib_entry_get_prefix(fib_node_index_t fib_entry_index); extern u32 mfib_entry_get_fib_index(fib_node_index_t fib_entry_index); +extern int mfib_entry_is_sourced(fib_node_index_t fib_entry_index, + mfib_source_t source); +extern int mfib_entry_is_host(fib_node_index_t fib_entry_index); +extern int mfib_entry_is_marked(fib_node_index_t fib_entry_index, mfib_source_t source); +extern void mfib_entry_mark(fib_node_index_t fib_entry_index, mfib_source_t source); +extern u32 mfib_entry_get_stats_index(fib_node_index_t fib_entry_index); +extern void mfib_entry_cover_changed(fib_node_index_t fib_entry_index); +extern void mfib_entry_cover_updated(fib_node_index_t fib_entry_index); + +extern const dpo_id_t*mfib_entry_contribute_ip_forwarding( + fib_node_index_t mfib_entry_index); + +/** + * Flags to control what is present in the replicate DPO returned when + * the entry contributes forwarding + */ +typedef enum mfib_entry_fwd_flags_t_ +{ + MFIB_ENTRY_FWD_FLAG_NONE, + /** + * Do not reutrn any local replications in the set + */ + MFIB_ENTRY_FWD_FLAG_NO_LOCAL, +} mfib_entry_fwd_flags_t; extern void mfib_entry_contribute_forwarding( fib_node_index_t mfib_entry_index, fib_forward_chain_type_t type, + mfib_entry_fwd_flags_t flags, dpo_id_t *dpo); -extern void mfib_entry_encode(fib_node_index_t fib_entry_index, - fib_route_path_encode_t **api_rpaths); +extern fib_route_path_t* mfib_entry_encode(fib_node_index_t fib_entry_index); extern void mfib_entry_module_init(void);