X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Fmpls_fib.h;h=8d18b008b0e0bf1e066bf1af6564be77dd7d0672;hb=eb987d3a09f669787014b1553f032219522149e1;hp=93ae462301646b42f671e9323cb1a5bd32264cab;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/fib/mpls_fib.h b/src/vnet/fib/mpls_fib.h index 93ae4623016..8d18b008b0e 100644 --- a/src/vnet/fib/mpls_fib.h +++ b/src/vnet/fib/mpls_fib.h @@ -25,16 +25,48 @@ #include #include +#define MPLS_FIB_DEFAULT_TABLE_ID 0 + +/** + * Type exposure is to allow the DP fast/inlined access + */ +#define MPLS_FIB_KEY_SIZE 21 +#define MPLS_FIB_DB_SIZE (1 << (MPLS_FIB_KEY_SIZE-1)) + +/** + * There are no options for controlling the MPLS flow hash + */ +#define MPLS_FLOW_HASH_DEFAULT 0 + +typedef struct mpls_fib_t_ +{ + /** + * Required for pool_get_aligned + */ + CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); + + /** + * A hash table of entries. 21 bit key + * Hash table for reduced memory footprint + */ + uword * mf_entries; + + /** + * The load-balance indices keyed by 21 bit label+eos bit. + * A flat array for maximum lookup performace. + */ + index_t mf_lbs[MPLS_FIB_DB_SIZE]; +} mpls_fib_t; + static inline mpls_fib_t* mpls_fib_get (fib_node_index_t index) { - if (!pool_is_free_index(mpls_main.fibs, index)) - return (&(pool_elt_at_index(mpls_main.fibs, index)->mpls)); - return (NULL); + return (pool_elt_at_index(mpls_main.mpls_fibs, index)); } -extern u32 mpls_fib_table_find_or_create_and_lock(u32 table_id); -extern u32 mpls_fib_table_create_and_lock(void); +extern u32 mpls_fib_table_find_or_create_and_lock(u32 table_id, + fib_source_t src); +extern u32 mpls_fib_table_create_and_lock(fib_source_t src); // extern mpls_fib_t * mpls_fib_find(u32 table_id); extern u32 mpls_fib_index_from_table_id(u32 table_id); @@ -58,8 +90,7 @@ extern void mpls_fib_table_entry_insert(mpls_fib_t *mf, mpls_label_t label, mpls_eos_bit_t eos, fib_node_index_t fei); -extern void mpls_fib_table_destroy(mpls_fib_t *mf); - +extern void mpls_fib_table_destroy(u32 fib_index); extern void mpls_fib_forwarding_table_update(mpls_fib_t *mf, @@ -70,6 +101,17 @@ extern void mpls_fib_forwarding_table_reset(mpls_fib_t *mf, mpls_label_t label, mpls_eos_bit_t eos); +/** + * @brief Walk all entries in a FIB table + * N.B: This is NOT safe to deletes. If you need to delete walk the whole + * table and store elements in a vector, then delete the elements + */ +extern void mpls_fib_table_walk(mpls_fib_t *fib, + fib_table_walk_fn_t fn, + void *ctx); + +extern u8 *format_mpls_fib_table_memory(u8 * s, va_list * args); + /** * @brief * Lookup a label and EOS bit in the MPLS_FIB table to retrieve the @@ -101,6 +143,4 @@ mpls_fib_table_get_index_for_sw_if_index (u32 sw_if_index) return (mm->fib_index_by_sw_if_index[sw_if_index]); } -extern flow_hash_config_t mpls_fib_table_get_flow_hash_config(u32 fib_index); - #endif