X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Fip4_fib.c;h=29d121c96a78f88d3c59dd7afce1542ebba707e0;hb=2c8e0023f91882e53f06eb99c901b97fe013f981;hp=ef3324645c3eb023252ee872329d347c3072a6c7;hpb=89541992000433b743cbbe8cb396faab42bcf6ae;p=vpp.git diff --git a/src/vnet/fib/ip4_fib.c b/src/vnet/fib/ip4_fib.c index ef3324645c3..29d121c96a7 100644 --- a/src/vnet/fib/ip4_fib.c +++ b/src/vnet/fib/ip4_fib.c @@ -18,7 +18,7 @@ #include /* - * A table of pefixes to be added to tables and the sources for them + * A table of prefixes to be added to tables and the sources for them */ typedef struct ip4_fib_table_special_prefix_t_ { fib_prefix_t ift_prefix; @@ -108,8 +108,8 @@ ip4_create_fib_with_table_id (u32 table_id, ip4_fib_t *v4_fib; void *old_heap; - pool_get_aligned(ip4_main.fibs, fib_table, CLIB_CACHE_LINE_BYTES); - memset(fib_table, 0, sizeof(*fib_table)); + pool_get(ip4_main.fibs, fib_table); + clib_memset(fib_table, 0, sizeof(*fib_table)); old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); pool_get_aligned(ip4_main.v4_fibs, v4_fib, CLIB_CACHE_LINE_BYTES); @@ -129,9 +129,7 @@ ip4_create_fib_with_table_id (u32 table_id, v4_fib->table_id = table_id; fib_table->ft_flow_hash_config = IP_FLOW_HASH_DEFAULT; - v4_fib->fwd_classify_table_index = ~0; - v4_fib->rev_classify_table_index = ~0; - + fib_table_lock(fib_table->ft_index, FIB_PROTOCOL_IP4, src); ip4_mtrie_init(&v4_fib->mtrie); @@ -162,6 +160,7 @@ ip4_fib_table_destroy (u32 fib_index) { fib_table_t *fib_table = pool_elt_at_index(ip4_main.fibs, fib_index); ip4_fib_t *v4_fib = pool_elt_at_index(ip4_main.v4_fibs, fib_index); + u32 *n_locks; int ii; /* @@ -183,10 +182,14 @@ ip4_fib_table_destroy (u32 fib_index) /* * validate no more routes. */ - ASSERT(0 == fib_table->ft_total_route_counts); - FOR_EACH_FIB_SOURCE(ii) +#ifdef CLIB_DEBUG + if (0 != fib_table->ft_total_route_counts) + fib_table_assert_empty(fib_table); +#endif + + vec_foreach(n_locks, fib_table->ft_src_route_counts) { - ASSERT(0 == fib_table->ft_src_route_counts[ii]); + ASSERT(0 == *n_locks); } if (~0 != fib_table->ft_table_id) @@ -194,6 +197,7 @@ ip4_fib_table_destroy (u32 fib_index) hash_unset (ip4_main.fib_index_by_table_id, fib_table->ft_table_id); } + vec_free(fib_table->ft_src_route_counts); ip4_mtrie_free(&v4_fib->mtrie); pool_put(ip4_main.v4_fibs, v4_fib); @@ -362,10 +366,10 @@ ip4_fib_table_entry_remove (ip4_fib_t *fib, if (NULL == result) { /* - * removing a non-existant entry. i'll allow it. + * removing a non-existent entry. i'll allow it. */ } - else + else { uword *old_heap; @@ -393,9 +397,7 @@ ip4_fib_table_fwding_dpo_remove (ip4_fib_t *fib, const dpo_id_t *dpo, u32 cover_index) { - fib_prefix_t cover_prefix = { - .fp_len = 0, - }; + const fib_prefix_t *cover_prefix; const dpo_id_t *cover_dpo; /* @@ -403,12 +405,12 @@ ip4_fib_table_fwding_dpo_remove (ip4_fib_t *fib, * covering prefix, so it can fill the plys with the correct replacement * for the entry being removed */ - fib_entry_get_prefix(cover_index, &cover_prefix); + cover_prefix = fib_entry_get_prefix(cover_index); cover_dpo = fib_entry_contribute_ip_forwarding(cover_index); ip4_fib_mtrie_route_del(&fib->mtrie, addr, len, dpo->dpoi_index, - cover_prefix.fp_len, + cover_prefix->fp_len, cover_dpo->dpoi_index); } @@ -439,7 +441,7 @@ ip4_fib_table_sub_tree_walk (ip4_fib_t *fib, int i; /* - * There is no efficent way to walk this array of hash tables. + * There is no efficient way to walk this array of hash tables. * so we walk each table with a mask length greater than and equal to * the required root and check it is covered by the root. */ @@ -557,7 +559,7 @@ ip4_fib_table_show_one (ip4_fib_t *fib, ip4_address_t *address, u32 mask_len, int detail) -{ +{ vlib_cli_output(vm, "%U", format_fib_entry, ip4_fib_table_lookup(fib, address, mask_len), @@ -569,11 +571,10 @@ ip4_fib_table_show_one (ip4_fib_t *fib, u8 * format_ip4_fib_table_memory (u8 * s, va_list * args) { - s = format(s, "%=30s %=6d %=8ld\n", + s = format(s, "%=30s %=6d %=12ld\n", "IPv4 unicast", pool_elts(ip4_main.fibs), - mheap_bytes(ip4_main.mtrie_mheap)); - + mspace_footprint(ip4_main.mtrie_mheap)); return (s); } @@ -639,11 +640,13 @@ ip4_show_fib (vlib_main_t * vm, if (memory) { - uword mtrie_size, hash_size; + uword mtrie_size, hash_size, *old_heap; + mtrie_size = ip4_fib_mtrie_memory_usage(&fib->mtrie); hash_size = 0; + old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); for (i = 0; i < ARRAY_LEN (fib->fib_entry_by_dst_address); i++) { uword * hash = fib->fib_entry_by_dst_address[i]; @@ -652,6 +655,8 @@ ip4_show_fib (vlib_main_t * vm, hash_size += hash_bytes(hash); } } + clib_mem_set_heap (old_heap); + if (verbose) vlib_cli_output (vm, "%U mtrie:%d hash:%d", format_fib_table_name, fib->index, @@ -663,13 +668,15 @@ ip4_show_fib (vlib_main_t * vm, continue; } - s = format(s, "%U, fib_index:%d, flow hash:[%U] locks:[", + s = format(s, "%U, fib_index:%d, flow hash:[%U] epoch:%d flags:%U locks:[", format_fib_table_name, fib->index, FIB_PROTOCOL_IP4, fib->index, format_ip_flow_hash_config, - fib_table->ft_flow_hash_config); - FOR_EACH_FIB_SOURCE(source) + fib_table->ft_flow_hash_config, + fib_table->ft_epoch, + format_fib_table_flags, fib_table->ft_flags); + vec_foreach_index(source, fib_table->ft_locks) { if (0 != fib_table->ft_locks[source]) { @@ -713,11 +720,14 @@ ip4_show_fib (vlib_main_t * vm, })); if (memory) + { vlib_cli_output (vm, "totals: mtrie:%ld hash:%ld all:%ld", total_mtrie_memory, total_hash_memory, total_mtrie_memory + total_hash_memory); - + vlib_cli_output (vm, "\nMtrie Mheap Usage: %U\n", + format_mheap, ip4_main.mtrie_mheap, 1); + } return 0; }