X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmfib%2Fmfib_itf.h;h=295be1b20e59ef171130a080425494fb0084cac2;hb=eb987d3a09f669787014b1553f032219522149e1;hp=5f26a4765251f0a558412a6fdf56c44a8d7bba70;hpb=32e1c010b0c34fd0984f7fc45fae648a182025c5;p=vpp.git diff --git a/src/vnet/mfib/mfib_itf.h b/src/vnet/mfib/mfib_itf.h index 5f26a476525..295be1b20e5 100644 --- a/src/vnet/mfib/mfib_itf.h +++ b/src/vnet/mfib/mfib_itf.h @@ -25,7 +25,12 @@ typedef struct mfib_itf_t_ { /** - * @brief Falags on the entry + * Required for pool_get_aligned + */ + CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); + + /** + * @brief Forwarding Flags on the entry - checked in the data-path */ mfib_itf_flags_t mfi_flags; @@ -38,22 +43,43 @@ typedef struct mfib_itf_t_ * The index of the signal in the pending list */ u32 mfi_si; + + /** + * A hash table of path-inidices that are contributing flags to this interface. + * Since paths with next-hops can be on the same interface and each of those + * paths can contribute different flags, we need to maintain the flag + * contribution from each path, and use a combination for forwarding. + */ + uword *mfi_hash; } mfib_itf_t; +/** + * update an interface from a path. + * returns 1 if the entry is removed, i.e. has no flags left, as a result + * of the update. + */ +extern int mfib_itf_update(mfib_itf_t *itf, + fib_node_index_t path_index, + mfib_itf_flags_t mfi_flags); -extern index_t mfib_itf_create(u32 sw_if_index, +extern index_t mfib_itf_create(fib_node_index_t path_index, mfib_itf_flags_t mfi_flags); -extern void mfib_itf_delete(mfib_itf_t *mfi); + +extern void mfib_itf_delete(mfib_itf_t *itf); extern u8 *format_mfib_itf(u8 * s, va_list * args); extern mfib_itf_t *mfib_itf_pool; +/** + * Get the MFIB interface representation + */ static inline mfib_itf_t * mfib_itf_get (index_t mi) { return (pool_elt_at_index(mfib_itf_pool, mi)); } + static inline index_t mfib_itf_get_index (const mfib_itf_t *mfi) {