X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmap%2Fmap.c;h=99305afaf418e3a0c1859f8feb5c7e35d9ab4bfa;hb=refs%2Fchanges%2F62%2F5762%2F5;hp=6823a46e24aede6cccfc932bed2adbcb53acc2d6;hpb=8082380922c65702251d5242058f7b5f35011574;p=vpp.git diff --git a/src/vnet/map/map.c b/src/vnet/map/map.c index 6823a46e24a..99305afaf41 100644 --- a/src/vnet/map/map.c +++ b/src/vnet/map/map.c @@ -556,23 +556,51 @@ map_fib_resolve (map_main_pre_resolved_t * pr, } static void -map_pre_resolve (ip4_address_t * ip4, ip6_address_t * ip6) +map_fib_unresolve (map_main_pre_resolved_t * pr, + fib_protocol_t proto, u8 len, const ip46_address_t * addr) +{ + fib_prefix_t pfx = { + .fp_proto = proto, + .fp_len = len, + .fp_addr = *addr, + }; + + fib_entry_child_remove (pr->fei, pr->sibling); + + fib_table_entry_special_remove (0, // default fib + &pfx, FIB_SOURCE_RR); + dpo_reset (&pr->dpo); + + pr->fei = FIB_NODE_INDEX_INVALID; + pr->sibling = FIB_NODE_INDEX_INVALID; +} + +static void +map_pre_resolve (ip4_address_t * ip4, ip6_address_t * ip6, int is_del) { if (ip6 && (ip6->as_u64[0] != 0 || ip6->as_u64[1] != 0)) { ip46_address_t addr = { .ip6 = *ip6, }; - map_fib_resolve (&pre_resolved[FIB_PROTOCOL_IP6], - FIB_PROTOCOL_IP6, 128, &addr); + if (is_del) + map_fib_unresolve (&pre_resolved[FIB_PROTOCOL_IP6], + FIB_PROTOCOL_IP6, 128, &addr); + else + map_fib_resolve (&pre_resolved[FIB_PROTOCOL_IP6], + FIB_PROTOCOL_IP6, 128, &addr); } if (ip4 && (ip4->as_u32 != 0)) { ip46_address_t addr = { .ip4 = *ip4, }; - map_fib_resolve (&pre_resolved[FIB_PROTOCOL_IP4], - FIB_PROTOCOL_IP4, 32, &addr); + if (is_del) + map_fib_unresolve (&pre_resolved[FIB_PROTOCOL_IP4], + FIB_PROTOCOL_IP4, 32, &addr); + else + map_fib_resolve (&pre_resolved[FIB_PROTOCOL_IP4], + FIB_PROTOCOL_IP4, 32, &addr); } } #endif @@ -817,6 +845,7 @@ map_pre_resolve_command_fn (vlib_main_t * vm, ip4_address_t ip4nh, *p_v4 = NULL; ip6_address_t ip6nh, *p_v6 = NULL; clib_error_t *error = NULL; + int is_del = 0; memset (&ip4nh, 0, sizeof (ip4nh)); memset (&ip6nh, 0, sizeof (ip6nh)); @@ -832,6 +861,8 @@ map_pre_resolve_command_fn (vlib_main_t * vm, else if (unformat (line_input, "ip6-nh %U", unformat_ip6_address, &ip6nh)) p_v6 = &ip6nh; + else if (unformat (line_input, "del")) + is_del = 1; else { error = clib_error_return (0, "unknown input `%U'", @@ -840,7 +871,7 @@ map_pre_resolve_command_fn (vlib_main_t * vm, } } - map_pre_resolve (p_v4, p_v6); + map_pre_resolve (p_v4, p_v6, is_del); done: unformat_free (line_input); @@ -1273,7 +1304,7 @@ show_map_stats_command_fn (vlib_main_t * vm, unformat_input_t * input, { which = cm - mm->domain_counters; - for (i = 0; i < vec_len (cm->maxi); i++) + for (i = 0; i < vlib_combined_counter_n_counters (cm); i++) { vlib_get_combined_counter (cm, i, &v); total_pkts[which] += v.packets;