X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fping.c;h=2c5c44f5f26ee51195969209d47127b75244ae03;hb=b4d2c967f86b4cc0d8d772abafdb6dbf3f11de04;hp=c664772f6b4ef5ef78f7d8a53a713f0ab895762f;hpb=6e19b37757df334d58dbd6b7fa39f0e6e42f7d30;p=vpp.git diff --git a/src/vnet/ip/ping.c b/src/vnet/ip/ping.c index c664772f6b4..2c5c44f5f26 100755 --- a/src/vnet/ip/ping.c +++ b/src/vnet/ip/ping.c @@ -18,6 +18,9 @@ #include #include #include +#include + +ping_main_t ping_main; /** * @file @@ -43,6 +46,21 @@ format_icmp_echo_trace (u8 * s, va_list * va) return s; } +static u8 * +format_ip46_ping_result (u8 * s, va_list * args) +{ + send_ip46_ping_result_t res = va_arg (*args, send_ip46_ping_result_t); + + switch (res) + { +#define _(v, n) case SEND_PING_##v: s = format(s, "%s", n); + foreach_ip46_ping_result +#undef _ + } + + return (s); +} + /* * If we can find the ping run by an ICMP ID, then we send the signal * to the CLI process referenced by that ping run, alongside with @@ -53,8 +71,7 @@ format_icmp_echo_trace (u8 * s, va_list * va) */ static int -signal_ip46_icmp_reply_event (vlib_main_t * vm, - u8 event_type, vlib_buffer_t * b0) +signal_ip46_icmp_reply_event (u8 event_type, vlib_buffer_t * b0) { ping_main_t *pm = &ping_main; u16 net_icmp_id = 0; @@ -84,14 +101,20 @@ signal_ip46_icmp_reply_event (vlib_main_t * vm, return 0; ping_run_t *pr = vec_elt_at_index (pm->ping_runs, p[0]); + vlib_main_t *vm = vlib_mains[pr->cli_thread_index]; if (vlib_buffer_alloc (vm, &bi0_copy, 1) == 1) { - void *dst = vlib_buffer_get_current (vlib_get_buffer (vm, bi0_copy)); + void *dst = vlib_buffer_get_current (vlib_get_buffer (vm, + bi0_copy)); clib_memcpy (dst, vlib_buffer_get_current (b0), b0->current_length); } /* If buffer_alloc failed, bi0_copy == 0 - just signaling an event. */ - - vlib_process_signal_event (vm, pr->cli_process_id, event_type, bi0_copy); + f64 nowts = vlib_time_now (vm); + /* Pass the timestamp to the cli_process thanks to the vnet_buffer unused metadata field */ + clib_memcpy (vnet_buffer + (vlib_get_buffer + (vm, bi0_copy))->unused, &nowts, sizeof (nowts)); + vlib_process_signal_event_mt (vm, pr->cli_process_id, event_type, bi0_copy); return 1; } @@ -116,7 +139,7 @@ ip6_icmp_echo_reply_node_fn (vlib_main_t * vm, bi0 = from[0]; b0 = vlib_get_buffer (vm, bi0); - next0 = signal_ip46_icmp_reply_event (vm, PING_RESPONSE_IP6, b0) ? + next0 = signal_ip46_icmp_reply_event (PING_RESPONSE_IP6, b0) ? ICMP6_ECHO_REPLY_NEXT_DROP : ICMP6_ECHO_REPLY_NEXT_PUNT; if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED)) @@ -147,8 +170,8 @@ VLIB_REGISTER_NODE (ip6_icmp_echo_reply_node, static) = .format_trace = format_icmp_echo_trace, .n_next_nodes = ICMP6_ECHO_REPLY_N_NEXT, .next_nodes = { - [ICMP6_ECHO_REPLY_NEXT_DROP] = "error-drop", - [ICMP6_ECHO_REPLY_NEXT_PUNT] = "error-punt", + [ICMP6_ECHO_REPLY_NEXT_DROP] = "ip6-drop", + [ICMP6_ECHO_REPLY_NEXT_PUNT] = "ip6-punt", }, }; /* *INDENT-ON* */ @@ -174,7 +197,7 @@ ip4_icmp_echo_reply_node_fn (vlib_main_t * vm, bi0 = from[0]; b0 = vlib_get_buffer (vm, bi0); - next0 = signal_ip46_icmp_reply_event (vm, PING_RESPONSE_IP4, b0) ? + next0 = signal_ip46_icmp_reply_event (PING_RESPONSE_IP4, b0) ? ICMP4_ECHO_REPLY_NEXT_DROP : ICMP4_ECHO_REPLY_NEXT_PUNT; if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED)) @@ -205,15 +228,12 @@ VLIB_REGISTER_NODE (ip4_icmp_echo_reply_node, static) = .format_trace = format_icmp_echo_trace, .n_next_nodes = ICMP4_ECHO_REPLY_N_NEXT, .next_nodes = { - [ICMP4_ECHO_REPLY_NEXT_DROP] = "error-drop", - [ICMP4_ECHO_REPLY_NEXT_PUNT] = "error-punt", + [ICMP4_ECHO_REPLY_NEXT_DROP] = "ip4-drop", + [ICMP4_ECHO_REPLY_NEXT_PUNT] = "ip4-punt", }, }; /* *INDENT-ON* */ -char *ip6_lookup_next_nodes[] = IP6_LOOKUP_NEXT_NODES; -char *ip4_lookup_next_nodes[] = IP4_LOOKUP_NEXT_NODES; - /* Fill in the ICMP ECHO structure, return the safety-checked and possibly shrunk data_len */ static u16 init_icmp46_echo_request (icmp46_echo_request_t * icmp46_echo, @@ -306,13 +326,14 @@ send_ip6_ping (vlib_main_t * vm, ip6_main_t * im, h0->ip6.src_address = *pa6; /* Fill in the correct source now */ - ip6_address_t *a = ip6_interface_first_address (im, sw_if_index); - if (!a) + if (!ip6_src_address_for_packet (&im->lookup_main, + sw_if_index, + &h0->ip6.dst_address, + &h0->ip6.src_address)) { vlib_buffer_free (vm, &bi0, 1); return SEND_PING_NO_SRC_ADDRESS; } - h0->ip6.src_address = a[0]; /* Fill in icmp fields */ h0->icmp.type = ICMP6_echo_request; @@ -497,8 +518,9 @@ print_ip6_icmp_reply (vlib_main_t * vm, u32 bi0) { vlib_buffer_t *b0 = vlib_get_buffer (vm, bi0); icmp6_echo_request_header_t *h0 = vlib_buffer_get_current (b0); - f64 rtt = vlib_time_now (vm) - h0->icmp_echo.time_sent; - + f64 rtt = 0; + clib_memcpy (&rtt, vnet_buffer (b0)->unused, sizeof (rtt)); + rtt -= h0->icmp_echo.time_sent; vlib_cli_output (vm, "%d bytes from %U: icmp_seq=%d ttl=%d time=%.4f ms", clib_host_to_net_u16 (h0->ip6.payload_length), @@ -513,7 +535,9 @@ print_ip4_icmp_reply (vlib_main_t * vm, u32 bi0) { vlib_buffer_t *b0 = vlib_get_buffer (vm, bi0); icmp4_echo_request_header_t *h0 = vlib_buffer_get_current (b0); - f64 rtt = vlib_time_now (vm) - h0->icmp_echo.time_sent; + f64 rtt = 0; + clib_memcpy (&rtt, vnet_buffer (b0)->unused, sizeof (rtt)); + rtt -= h0->icmp_echo.time_sent; u32 rcvd_icmp_len = clib_host_to_net_u16 (h0->ip4.length) - (4 * (0xF & h0->ip4.ip_version_and_header_length)); @@ -565,29 +589,35 @@ run_ping_ip46_address (vlib_main_t * vm, u32 table_id, ip4_address_t * pa4, pool_get (pm->ping_runs, pr); ping_run_index = pr - pm->ping_runs; pr->cli_process_id = curr_proc; + pr->cli_thread_index = vm->thread_index; pr->icmp_id = icmp_id; hash_set (pm->ping_run_by_icmp_id, icmp_id, ping_run_index); for (i = 1; i <= ping_repeat; i++) { + send_ip46_ping_result_t res = SEND_PING_OK; f64 sleep_interval; f64 time_ping_sent = vlib_time_now (vm); /* Reset pr: running ping in other process could have changed pm->ping_runs */ pr = vec_elt_at_index (pm->ping_runs, ping_run_index); pr->curr_seq = i; - if (pa6 && - (SEND_PING_OK == - send_ip6_ping (vm, ping_main.ip6_main, table_id, pa6, sw_if_index, - i, icmp_id, data_len, ping_burst, verbose))) + if (pa6) { - n_requests += ping_burst; + res = send_ip6_ping (vm, ping_main.ip6_main, table_id, + pa6, sw_if_index, i, icmp_id, + data_len, ping_burst, verbose); } - if (pa4 && - (SEND_PING_OK == - send_ip4_ping (vm, ping_main.ip4_main, table_id, pa4, sw_if_index, - i, icmp_id, data_len, ping_burst, verbose))) + if (pa4) + { + res = send_ip4_ping (vm, ping_main.ip4_main, table_id, pa4, + sw_if_index, i, icmp_id, data_len, + ping_burst, verbose); + } + if (SEND_PING_OK == res) { n_requests += ping_burst; } + else + vlib_cli_output (vm, "Failed: %U", format_ip46_ping_result, res); while ((i <= ping_repeat) && ((sleep_interval = @@ -636,6 +666,7 @@ run_ping_ip46_address (vlib_main_t * vm, u32 table_id, ip4_address_t * pa4, i = 1 + ping_repeat; break; } + vec_free (event_data); } } vlib_cli_output (vm, "\n");