X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Fmpls_fib.c;h=6f59eb3ee44088a83cc9c968b0dae7409dcd0d22;hb=097fa66b986f06281f603767d321ab13ab6c88c3;hp=6a9b1ac29892cf54b7c469ca51babda2234db14c;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/fib/mpls_fib.c b/src/vnet/fib/mpls_fib.c index 6a9b1ac2989..6f59eb3ee44 100644 --- a/src/vnet/fib/mpls_fib.c +++ b/src/vnet/fib/mpls_fib.c @@ -44,10 +44,11 @@ * Switching between schemes based on observed/measured action similarity is not * considered on the grounds of complexity and flip-flopping. * - * VPP mantra - favour performance over memory. We choose a 21 bit key. + * VPP mantra - favour performance over memory. We choose a 21 bit key. */ #include +#include #include #include #include @@ -60,11 +61,6 @@ */ static index_t mpls_fib_drop_dpo_index = INDEX_INVALID; -/** - * FIXME - */ -#define MPLS_FLOW_HASH_DEFAULT 0 - static inline u32 mpls_fib_entry_mk_key (mpls_label_t label, mpls_eos_bit_t eos) @@ -87,7 +83,8 @@ mpls_fib_index_from_table_id (u32 table_id) } static u32 -mpls_fib_create_with_table_id (u32 table_id) +mpls_fib_create_with_table_id (u32 table_id, + fib_source_t src) { dpo_id_t dpo = DPO_INVALID; fib_table_t *fib_table; @@ -95,23 +92,23 @@ mpls_fib_create_with_table_id (u32 table_id) mpls_fib_t *mf; int i; - pool_get_aligned(mpls_main.fibs, fib_table, CLIB_CACHE_LINE_BYTES); - memset(fib_table, 0, sizeof(*fib_table)); + pool_get(mpls_main.fibs, fib_table); + pool_get_aligned(mpls_main.mpls_fibs, mf, CLIB_CACHE_LINE_BYTES); + + ASSERT((fib_table - mpls_main.fibs) == + (mf - mpls_main.mpls_fibs)); + + clib_memset(fib_table, 0, sizeof(*fib_table)); fib_table->ft_proto = FIB_PROTOCOL_MPLS; - fib_table->ft_index = - (fib_table - mpls_main.fibs); + fib_table->ft_index = (fib_table - mpls_main.fibs); hash_set (mpls_main.fib_index_by_table_id, table_id, fib_table->ft_index); - fib_table->ft_table_id = - table_id; - fib_table->ft_flow_hash_config = - MPLS_FLOW_HASH_DEFAULT; - fib_table->v4.fwd_classify_table_index = ~0; - fib_table->v4.rev_classify_table_index = ~0; + fib_table->ft_table_id = table_id; + fib_table->ft_flow_hash_config = MPLS_FLOW_HASH_DEFAULT; - fib_table_lock(fib_table->ft_index, FIB_PROTOCOL_MPLS); + fib_table_lock(fib_table->ft_index, FIB_PROTOCOL_MPLS, src); if (INDEX_INVALID == mpls_fib_drop_dpo_index) { @@ -121,7 +118,6 @@ mpls_fib_create_with_table_id (u32 table_id) drop_dpo_get(DPO_PROTO_MPLS)); } - mf = &fib_table->mpls; mf->mf_entries = hash_create(0, sizeof(fib_node_index_t)); for (i = 0; i < MPLS_FIB_DB_SIZE; i++) { @@ -163,6 +159,7 @@ mpls_fib_create_with_table_id (u32 table_id) lookup_dpo_add_or_lock_w_fib_index(0, // unused DPO_PROTO_IP4, + LOOKUP_UNICAST, LOOKUP_INPUT_DST_ADDR, LOOKUP_TABLE_FROM_INPUT_INTERFACE, &dpo); @@ -177,6 +174,7 @@ mpls_fib_create_with_table_id (u32 table_id) lookup_dpo_add_or_lock_w_fib_index(0, //unsued DPO_PROTO_MPLS, + LOOKUP_UNICAST, LOOKUP_INPUT_DST_ADDR, LOOKUP_TABLE_FROM_INPUT_INTERFACE, &dpo); @@ -195,6 +193,7 @@ mpls_fib_create_with_table_id (u32 table_id) lookup_dpo_add_or_lock_w_fib_index(0, //unused DPO_PROTO_IP6, + LOOKUP_UNICAST, LOOKUP_INPUT_DST_ADDR, LOOKUP_TABLE_FROM_INPUT_INTERFACE, &dpo); @@ -208,6 +207,7 @@ mpls_fib_create_with_table_id (u32 table_id) prefix.fp_eos = MPLS_NON_EOS; lookup_dpo_add_or_lock_w_fib_index(0, // unsued DPO_PROTO_MPLS, + LOOKUP_UNICAST, LOOKUP_INPUT_DST_ADDR, LOOKUP_TABLE_FROM_INPUT_INTERFACE, &dpo); @@ -221,28 +221,30 @@ mpls_fib_create_with_table_id (u32 table_id) } u32 -mpls_fib_table_find_or_create_and_lock (u32 table_id) +mpls_fib_table_find_or_create_and_lock (u32 table_id, + fib_source_t src) { u32 index; index = mpls_fib_index_from_table_id(table_id); if (~0 == index) - return mpls_fib_create_with_table_id(table_id); + return mpls_fib_create_with_table_id(table_id, src); - fib_table_lock(index, FIB_PROTOCOL_MPLS); + fib_table_lock(index, FIB_PROTOCOL_MPLS, src); return (index); } u32 -mpls_fib_table_create_and_lock (void) +mpls_fib_table_create_and_lock (fib_source_t src) { - return (mpls_fib_create_with_table_id(~0)); + return (mpls_fib_create_with_table_id(~0, src)); } void -mpls_fib_table_destroy (mpls_fib_t *mf) +mpls_fib_table_destroy (u32 fib_index) { - fib_table_t *fib_table = (fib_table_t*)mf; + fib_table_t *fib_table = pool_elt_at_index(mpls_main.fibs, fib_index); + mpls_fib_t *mf = pool_elt_at_index(mpls_main.mpls_fibs, fib_index); fib_prefix_t prefix = { .fp_proto = FIB_PROTOCOL_MPLS, }; @@ -271,8 +273,9 @@ mpls_fib_table_destroy (mpls_fib_t *mf) hash_unset(mpls_main.fib_index_by_table_id, fib_table->ft_table_id); } - hash_delete(mf->mf_entries); + hash_free(mf->mf_entries); + pool_put(mpls_main.mpls_fibs, mf); pool_put(mpls_main.fibs, fib_table); } @@ -316,8 +319,15 @@ mpls_fib_forwarding_table_update (mpls_fib_t *mf, { mpls_label_t key; - ASSERT(DPO_LOAD_BALANCE == dpo->dpoi_type); - + ASSERT((DPO_LOAD_BALANCE == dpo->dpoi_type) || + (DPO_REPLICATE == dpo->dpoi_type)); + if (CLIB_DEBUG > 0) + { + if (DPO_REPLICATE == dpo->dpoi_type) + ASSERT(dpo->dpoi_index & MPLS_IS_REPLICATE); + if (DPO_LOAD_BALANCE == dpo->dpoi_type) + ASSERT(!(dpo->dpoi_index & MPLS_IS_REPLICATE)); + } key = mpls_fib_entry_mk_key(label, eos); mf->mf_lbs[key] = dpo->dpoi_index; @@ -335,11 +345,30 @@ mpls_fib_forwarding_table_reset (mpls_fib_t *mf, mf->mf_lbs[key] = mpls_fib_drop_dpo_index; } -flow_hash_config_t -mpls_fib_table_get_flow_hash_config (u32 fib_index) +void +mpls_fib_table_walk (mpls_fib_t *mpls_fib, + fib_table_walk_fn_t fn, + void *ctx) { - // FIXME. - return (0); + fib_node_index_t lfei; + mpls_label_t key; + + hash_foreach(key, lfei, mpls_fib->mf_entries, + ({ + fn(lfei, ctx); + })); +} + +u8 * +format_mpls_fib_table_memory (u8 * s, va_list * args) +{ + u64 n_tables, mem; + + n_tables = pool_elts(mpls_main.fibs); + mem = n_tables * sizeof(mpls_fib_t); + s = format(s, "%=30s %=6ld %=12ld\n", "MPLS", n_tables, mem); + + return (s); } static void @@ -413,19 +442,32 @@ mpls_fib_show (vlib_main_t * vm, pool_foreach (fib_table, mpls_main.fibs, ({ + fib_source_t source; + u8 *s = NULL; + if (table_id >= 0 && table_id != fib_table->ft_table_id) continue; - vlib_cli_output (vm, "%v, fib_index %d", - fib_table->ft_desc, mpls_main.fibs - fib_table); + s = format (s, "%v, fib_index:%d locks:[", + fib_table->ft_desc, mpls_main.fibs - fib_table); + FOR_EACH_FIB_SOURCE(source) + { + if (0 != fib_table->ft_locks[source]) + { + s = format(s, "%U:%d, ", + format_fib_source, source, + fib_table->ft_locks[source]); + } + } + vlib_cli_output (vm, "%v]", s); if (MPLS_LABEL_INVALID == label) { - mpls_fib_table_show_all(&(fib_table->mpls), vm); + mpls_fib_table_show_all(mpls_fib_get(fib_table->ft_index), vm); } else { - mpls_fib_table_show_one(&(fib_table->mpls), label, vm); + mpls_fib_table_show_one(mpls_fib_get(fib_table->ft_index), label, vm); } }));