From 5035bf04130a35b76f6b49f450e27d02bafb9dab Mon Sep 17 00:00:00 2001 From: Filip Tehlar Date: Mon, 20 Feb 2023 13:46:32 +0100 Subject: [PATCH] tcp: fix error counters Type: fix Signed-off-by: Filip Tehlar Change-Id: I9f4944f77ecf94f16f809392f28466e33f7f779d --- src/vnet/tcp/tcp.h | 2 ++ src/vnet/tcp/tcp_inlines.h | 29 +++++++++++++++++++++++++++++ src/vnet/tcp/tcp_input.c | 46 +++++----------------------------------------- src/vnet/tcp/tcp_output.c | 10 +++++++--- 4 files changed, 43 insertions(+), 44 deletions(-) diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h index c5dd3172302..a1491b944dd 100644 --- a/src/vnet/tcp/tcp.h +++ b/src/vnet/tcp/tcp.h @@ -268,6 +268,8 @@ extern vlib_node_registration_t tcp4_rcv_process_node; extern vlib_node_registration_t tcp6_rcv_process_node; extern vlib_node_registration_t tcp4_listen_node; extern vlib_node_registration_t tcp6_listen_node; +extern vlib_node_registration_t tcp4_input_nolookup_node; +extern vlib_node_registration_t tcp6_input_nolookup_node; #define tcp_cfg tcp_main.cfg #define tcp_node_index(node_id, is_ip4) \ diff --git a/src/vnet/tcp/tcp_inlines.h b/src/vnet/tcp/tcp_inlines.h index 91c57577067..ccd0e3fe3ee 100644 --- a/src/vnet/tcp/tcp_inlines.h +++ b/src/vnet/tcp/tcp_inlines.h @@ -18,6 +18,35 @@ #include +always_inline void +tcp_node_inc_counter_i (vlib_main_t *vm, u32 tcp4_node, u32 tcp6_node, + u8 is_ip4, u32 evt, u32 val) +{ + if (is_ip4) + vlib_node_increment_counter (vm, tcp4_node, evt, val); + else + vlib_node_increment_counter (vm, tcp6_node, evt, val); +} + +#define tcp_inc_counter(node_id, err, count) \ + tcp_node_inc_counter_i (vm, tcp4_##node_id##_node.index, \ + tcp6_##node_id##_node.index, is_ip4, err, count) +#define tcp_maybe_inc_err_counter(cnts, err) \ + { \ + cnts[err] += (next0 != tcp_next_drop (is_ip4)); \ + } +#define tcp_inc_err_counter(cnts, err, val) \ + { \ + cnts[err] += val; \ + } +#define tcp_store_err_counters(node_id, cnts) \ + { \ + int i; \ + for (i = 0; i < TCP_N_ERROR; i++) \ + if (cnts[i]) \ + tcp_inc_counter (node_id, i, cnts[i]); \ + } + always_inline tcp_header_t * tcp_buffer_hdr (vlib_buffer_t * b) { diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index a6d135812e1..fa2961eea19 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -1428,44 +1428,6 @@ tcp_established_trace_frame (vlib_main_t * vm, vlib_node_runtime_t * node, } } -always_inline void -tcp_node_inc_counter_i (vlib_main_t * vm, u32 tcp4_node, u32 tcp6_node, - u8 is_ip4, u32 evt, u32 val) -{ - if (is_ip4) - vlib_node_increment_counter (vm, tcp4_node, evt, val); - else - vlib_node_increment_counter (vm, tcp6_node, evt, val); -} - -#define tcp_maybe_inc_counter(node_id, err, count) \ -{ \ - if (next0 != tcp_next_drop (is_ip4)) \ - tcp_node_inc_counter_i (vm, tcp4_##node_id##_node.index, \ - tcp6_##node_id##_node.index, is_ip4, err, \ - 1); \ -} -#define tcp_inc_counter(node_id, err, count) \ - tcp_node_inc_counter_i (vm, tcp4_##node_id##_node.index, \ - tcp6_##node_id##_node.index, is_ip4, \ - err, count) -#define tcp_maybe_inc_err_counter(cnts, err) \ -{ \ - cnts[err] += (next0 != tcp_next_drop (is_ip4)); \ -} -#define tcp_inc_err_counter(cnts, err, val) \ -{ \ - cnts[err] += val; \ -} -#define tcp_store_err_counters(node_id, cnts) \ -{ \ - int i; \ - for (i = 0; i < TCP_N_ERROR; i++) \ - if (cnts[i]) \ - tcp_inc_counter(node_id, i, cnts[i]); \ -} - - always_inline uword tcp46_established_inline (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame, int is_ip4) @@ -2932,6 +2894,7 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, tcp_main_t *tm = vnet_get_tcp_main (); vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b; u16 nexts[VLIB_FRAME_SIZE], *next; + u16 err_counters[TCP_N_ERROR] = { 0 }; tcp_update_time_now (tcp_get_worker (thread_index)); @@ -2984,7 +2947,7 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, else { tcp_input_set_error_next (tm, &next[0], &error0, is_ip4); - b[0]->error = node->errors[error0]; + tcp_inc_err_counter (err_counters, error0, 1); } if (PREDICT_TRUE (tc1 != 0)) @@ -2996,7 +2959,7 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, else { tcp_input_set_error_next (tm, &next[1], &error1, is_ip4); - b[1]->error = node->errors[error1]; + tcp_inc_err_counter (err_counters, error1, 1); } } @@ -3027,7 +2990,7 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, else { tcp_input_set_error_next (tm, &next[0], &error0, is_ip4); - b[0]->error = node->errors[error0]; + tcp_inc_err_counter (err_counters, error0, 1); } b += 1; @@ -3038,6 +3001,7 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, if (PREDICT_FALSE (node->flags & VLIB_NODE_FLAG_TRACE)) tcp_input_trace_frame (vm, node, bufs, frame->n_vectors, is_ip4); + tcp_store_err_counters (input, err_counters); vlib_buffer_enqueue_to_next (vm, node, from, nexts, frame->n_vectors); return frame->n_vectors; } diff --git a/src/vnet/tcp/tcp_output.c b/src/vnet/tcp/tcp_output.c index 95480af0f2d..5172fcad4f4 100644 --- a/src/vnet/tcp/tcp_output.c +++ b/src/vnet/tcp/tcp_output.c @@ -2191,6 +2191,7 @@ tcp46_output_inline (vlib_main_t * vm, vlib_node_runtime_t * node, u32 n_left_from, *from, thread_index = vm->thread_index; vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b; u16 nexts[VLIB_FRAME_SIZE], *next; + u16 err_counters[TCP_N_ERROR] = { 0 }; from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; @@ -2241,7 +2242,8 @@ tcp46_output_inline (vlib_main_t * vm, vlib_node_runtime_t * node, } else { - b[0]->error = node->errors[TCP_ERROR_INVALID_CONNECTION]; + tcp_inc_err_counter (err_counters, TCP_ERROR_INVALID_CONNECTION, + 1); next[0] = TCP_OUTPUT_NEXT_DROP; } if (tc1 != 0) @@ -2252,7 +2254,8 @@ tcp46_output_inline (vlib_main_t * vm, vlib_node_runtime_t * node, } else { - b[1]->error = node->errors[TCP_ERROR_INVALID_CONNECTION]; + tcp_inc_err_counter (err_counters, TCP_ERROR_INVALID_CONNECTION, + 1); next[1] = TCP_OUTPUT_NEXT_DROP; } } @@ -2282,7 +2285,7 @@ tcp46_output_inline (vlib_main_t * vm, vlib_node_runtime_t * node, } else { - b[0]->error = node->errors[TCP_ERROR_INVALID_CONNECTION]; + tcp_inc_err_counter (err_counters, TCP_ERROR_INVALID_CONNECTION, 1); next[0] = TCP_OUTPUT_NEXT_DROP; } @@ -2291,6 +2294,7 @@ tcp46_output_inline (vlib_main_t * vm, vlib_node_runtime_t * node, n_left_from -= 1; } + tcp_store_err_counters (output, err_counters); vlib_buffer_enqueue_to_next (vm, node, from, nexts, frame->n_vectors); vlib_node_increment_counter (vm, tcp_node_index (output, is_ip4), TCP_ERROR_PKTS_SENT, frame->n_vectors); -- 2.16.6