X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Fmpls_fib.c;h=6f59eb3ee44088a83cc9c968b0dae7409dcd0d22;hb=097fa66b986f06281f603767d321ab13ab6c88c3;hp=ca6271fe3d7278f11d0a758115c2ee1e4ea26434;hpb=227038a444b98f922b4a4f44b85ae60f9ee86e1c;p=vpp.git diff --git a/src/vnet/fib/mpls_fib.c b/src/vnet/fib/mpls_fib.c index ca6271fe3d7..6f59eb3ee44 100644 --- a/src/vnet/fib/mpls_fib.c +++ b/src/vnet/fib/mpls_fib.c @@ -83,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; @@ -91,13 +92,13 @@ 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); + 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)); - memset(fib_table, 0, sizeof(*fib_table)); + clib_memset(fib_table, 0, sizeof(*fib_table)); fib_table->ft_proto = FIB_PROTOCOL_MPLS; fib_table->ft_index = (fib_table - mpls_main.fibs); @@ -107,7 +108,7 @@ mpls_fib_create_with_table_id (u32 table_id) 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) { @@ -220,22 +221,23 @@ 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 @@ -357,6 +359,18 @@ mpls_fib_table_walk (mpls_fib_t *mpls_fib, })); } +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 mpls_fib_table_show_all (const mpls_fib_t *mpls_fib, vlib_main_t * vm) @@ -428,11 +442,24 @@ 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) {