tcp: fix input error counters
Type: fix Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I87940d02813b66616f1944e41b16c8cc16f5dac0
This commit is contained in:

committed by
Florin Coras

parent
43818c1e02
commit
deb6f784ed
@ -3579,25 +3579,27 @@ tcp_input_lookup_buffer (vlib_buffer_t * b, u8 thread_index, u32 * error,
|
|||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
tcp_input_dispatch_buffer (tcp_main_t * tm, tcp_connection_t * tc,
|
tcp_input_dispatch_buffer (tcp_main_t * tm, tcp_connection_t * tc,
|
||||||
vlib_buffer_t * b, u16 * next, u32 * error)
|
vlib_buffer_t * b, u16 * next,
|
||||||
|
vlib_node_runtime_t * error_node)
|
||||||
{
|
{
|
||||||
tcp_header_t *tcp;
|
tcp_header_t *tcp;
|
||||||
|
u32 error;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
|
|
||||||
tcp = tcp_buffer_hdr (b);
|
tcp = tcp_buffer_hdr (b);
|
||||||
flags = tcp->flags & filter_flags;
|
flags = tcp->flags & filter_flags;
|
||||||
*next = tm->dispatch_table[tc->state][flags].next;
|
*next = tm->dispatch_table[tc->state][flags].next;
|
||||||
*error = tm->dispatch_table[tc->state][flags].error;
|
error = tm->dispatch_table[tc->state][flags].error;
|
||||||
tc->segs_in += 1;
|
tc->segs_in += 1;
|
||||||
|
|
||||||
if (PREDICT_FALSE (*error == TCP_ERROR_DISPATCH
|
if (PREDICT_FALSE (error != TCP_ERROR_NONE))
|
||||||
|| *next == TCP_INPUT_NEXT_RESET))
|
|
||||||
{
|
{
|
||||||
/* Overload tcp flags to store state */
|
/* Overload tcp flags to store state */
|
||||||
tcp_state_t state = tc->state;
|
tcp_state_t state = tc->state;
|
||||||
vnet_buffer (b)->tcp.flags = tc->state;
|
vnet_buffer (b)->tcp.flags = tc->state;
|
||||||
|
|
||||||
if (*error == TCP_ERROR_DISPATCH)
|
b->error = error_node->errors[error];
|
||||||
|
if (error == TCP_ERROR_DISPATCH)
|
||||||
clib_warning ("tcp conn %u disp error state %U flags %U",
|
clib_warning ("tcp conn %u disp error state %U flags %U",
|
||||||
tc->c_c_index, format_tcp_state, state,
|
tc->c_c_index, format_tcp_state, state,
|
||||||
format_tcp_flags, (int) flags);
|
format_tcp_flags, (int) flags);
|
||||||
@ -3612,9 +3614,11 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
|||||||
tcp_main_t *tm = vnet_get_tcp_main ();
|
tcp_main_t *tm = vnet_get_tcp_main ();
|
||||||
vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b;
|
vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b;
|
||||||
u16 nexts[VLIB_FRAME_SIZE], *next;
|
u16 nexts[VLIB_FRAME_SIZE], *next;
|
||||||
|
vlib_node_runtime_t *error_node;
|
||||||
|
|
||||||
tcp_set_time_now (tcp_get_worker (thread_index));
|
tcp_set_time_now (tcp_get_worker (thread_index));
|
||||||
|
|
||||||
|
error_node = vlib_node_get_runtime (vm, tcp_node_index (input, is_ip4));
|
||||||
from = vlib_frame_vector_args (frame);
|
from = vlib_frame_vector_args (frame);
|
||||||
n_left_from = frame->n_vectors;
|
n_left_from = frame->n_vectors;
|
||||||
vlib_get_buffers (vm, from, bufs, n_left_from);
|
vlib_get_buffers (vm, from, bufs, n_left_from);
|
||||||
@ -3650,8 +3654,8 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
|||||||
vnet_buffer (b[0])->tcp.connection_index = tc0->c_c_index;
|
vnet_buffer (b[0])->tcp.connection_index = tc0->c_c_index;
|
||||||
vnet_buffer (b[1])->tcp.connection_index = tc1->c_c_index;
|
vnet_buffer (b[1])->tcp.connection_index = tc1->c_c_index;
|
||||||
|
|
||||||
tcp_input_dispatch_buffer (tm, tc0, b[0], &next[0], &error0);
|
tcp_input_dispatch_buffer (tm, tc0, b[0], &next[0], error_node);
|
||||||
tcp_input_dispatch_buffer (tm, tc1, b[1], &next[1], &error1);
|
tcp_input_dispatch_buffer (tm, tc1, b[1], &next[1], error_node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -3659,19 +3663,25 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
|||||||
{
|
{
|
||||||
ASSERT (tcp_lookup_is_valid (tc0, b[0], tcp_buffer_hdr (b[0])));
|
ASSERT (tcp_lookup_is_valid (tc0, b[0], tcp_buffer_hdr (b[0])));
|
||||||
vnet_buffer (b[0])->tcp.connection_index = tc0->c_c_index;
|
vnet_buffer (b[0])->tcp.connection_index = tc0->c_c_index;
|
||||||
tcp_input_dispatch_buffer (tm, tc0, b[0], &next[0], &error0);
|
tcp_input_dispatch_buffer (tm, tc0, b[0], &next[0], error_node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tcp_input_set_error_next (tm, &next[0], &error0, is_ip4);
|
{
|
||||||
|
tcp_input_set_error_next (tm, &next[0], &error0, is_ip4);
|
||||||
|
b[0]->error = error_node->errors[error0];
|
||||||
|
}
|
||||||
|
|
||||||
if (PREDICT_TRUE (tc1 != 0))
|
if (PREDICT_TRUE (tc1 != 0))
|
||||||
{
|
{
|
||||||
ASSERT (tcp_lookup_is_valid (tc1, b[1], tcp_buffer_hdr (b[1])));
|
ASSERT (tcp_lookup_is_valid (tc1, b[1], tcp_buffer_hdr (b[1])));
|
||||||
vnet_buffer (b[1])->tcp.connection_index = tc1->c_c_index;
|
vnet_buffer (b[1])->tcp.connection_index = tc1->c_c_index;
|
||||||
tcp_input_dispatch_buffer (tm, tc1, b[1], &next[1], &error1);
|
tcp_input_dispatch_buffer (tm, tc1, b[1], &next[1], error_node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tcp_input_set_error_next (tm, &next[1], &error1, is_ip4);
|
{
|
||||||
|
tcp_input_set_error_next (tm, &next[1], &error1, is_ip4);
|
||||||
|
b[1]->error = error_node->errors[error1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b += 2;
|
b += 2;
|
||||||
@ -3696,10 +3706,13 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
|||||||
{
|
{
|
||||||
ASSERT (tcp_lookup_is_valid (tc0, b[0], tcp_buffer_hdr (b[0])));
|
ASSERT (tcp_lookup_is_valid (tc0, b[0], tcp_buffer_hdr (b[0])));
|
||||||
vnet_buffer (b[0])->tcp.connection_index = tc0->c_c_index;
|
vnet_buffer (b[0])->tcp.connection_index = tc0->c_c_index;
|
||||||
tcp_input_dispatch_buffer (tm, tc0, b[0], &next[0], &error0);
|
tcp_input_dispatch_buffer (tm, tc0, b[0], &next[0], error_node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tcp_input_set_error_next (tm, &next[0], &error0, is_ip4);
|
{
|
||||||
|
tcp_input_set_error_next (tm, &next[0], &error0, is_ip4);
|
||||||
|
b[0]->error = error_node->errors[error0];
|
||||||
|
}
|
||||||
|
|
||||||
b += 1;
|
b += 1;
|
||||||
next += 1;
|
next += 1;
|
||||||
@ -3860,7 +3873,7 @@ do { \
|
|||||||
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_RST, TCP_INPUT_NEXT_DROP,
|
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_RST, TCP_INPUT_NEXT_DROP,
|
||||||
TCP_ERROR_SEGMENT_INVALID);
|
TCP_ERROR_SEGMENT_INVALID);
|
||||||
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_RST | TCP_FLAG_ACK, TCP_INPUT_NEXT_DROP,
|
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_RST | TCP_FLAG_ACK, TCP_INPUT_NEXT_DROP,
|
||||||
TCP_ERROR_NONE);
|
TCP_ERROR_SEGMENT_INVALID);
|
||||||
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_SYN, TCP_INPUT_NEXT_DROP,
|
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_SYN, TCP_INPUT_NEXT_DROP,
|
||||||
TCP_ERROR_SEGMENT_INVALID);
|
TCP_ERROR_SEGMENT_INVALID);
|
||||||
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_SYN | TCP_FLAG_ACK, TCP_INPUT_NEXT_DROP,
|
_(LISTEN, TCP_FLAG_FIN | TCP_FLAG_SYN | TCP_FLAG_ACK, TCP_INPUT_NEXT_DROP,
|
||||||
@ -4047,10 +4060,10 @@ do { \
|
|||||||
_(CLOSED, TCP_FLAG_RST, TCP_INPUT_NEXT_DROP, TCP_ERROR_CONNECTION_CLOSED);
|
_(CLOSED, TCP_FLAG_RST, TCP_INPUT_NEXT_DROP, TCP_ERROR_CONNECTION_CLOSED);
|
||||||
_(CLOSED, TCP_FLAG_RST | TCP_FLAG_ACK, TCP_INPUT_NEXT_DROP,
|
_(CLOSED, TCP_FLAG_RST | TCP_FLAG_ACK, TCP_INPUT_NEXT_DROP,
|
||||||
TCP_ERROR_CONNECTION_CLOSED);
|
TCP_ERROR_CONNECTION_CLOSED);
|
||||||
_(CLOSED, TCP_FLAG_ACK, TCP_INPUT_NEXT_RESET, TCP_ERROR_NONE);
|
_(CLOSED, TCP_FLAG_ACK, TCP_INPUT_NEXT_RESET, TCP_ERROR_CONNECTION_CLOSED);
|
||||||
_(CLOSED, TCP_FLAG_SYN, TCP_INPUT_NEXT_RESET, TCP_ERROR_NONE);
|
_(CLOSED, TCP_FLAG_SYN, TCP_INPUT_NEXT_RESET, TCP_ERROR_CONNECTION_CLOSED);
|
||||||
_(CLOSED, TCP_FLAG_FIN | TCP_FLAG_ACK, TCP_INPUT_NEXT_RESET,
|
_(CLOSED, TCP_FLAG_FIN | TCP_FLAG_ACK, TCP_INPUT_NEXT_RESET,
|
||||||
TCP_ERROR_NONE);
|
TCP_ERROR_CONNECTION_CLOSED);
|
||||||
#undef _
|
#undef _
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user