tcp: fix tcp packet trace
Type: fix Signed-off-by: Filip Tehlar <ftehlar@cisco.com> Change-Id: Id4ca9a749a343c55b24f6eb4b5eb0909a57e0c23
This commit is contained in:

committed by
Florin Coras

parent
1f7042506c
commit
bc4dc16a5c
@@ -75,6 +75,18 @@ typedef enum _tcp_state_next
|
||||
TCP_STATE_N_NEXT,
|
||||
} tcp_state_next_t;
|
||||
|
||||
typedef enum _tcp_input_next
|
||||
{
|
||||
TCP_INPUT_NEXT_DROP,
|
||||
TCP_INPUT_NEXT_LISTEN,
|
||||
TCP_INPUT_NEXT_RCV_PROCESS,
|
||||
TCP_INPUT_NEXT_SYN_SENT,
|
||||
TCP_INPUT_NEXT_ESTABLISHED,
|
||||
TCP_INPUT_NEXT_RESET,
|
||||
TCP_INPUT_NEXT_PUNT,
|
||||
TCP_INPUT_N_NEXT
|
||||
} tcp_input_next_t;
|
||||
|
||||
#define tcp_next_output(is_ip4) (is_ip4 ? TCP_NEXT_TCP4_OUTPUT \
|
||||
: TCP_NEXT_TCP6_OUTPUT)
|
||||
|
||||
@@ -1356,9 +1368,13 @@ format_tcp_rx_trace (u8 * s, va_list * args)
|
||||
tcp_connection_t *tc = &t->tcp_connection;
|
||||
u32 indent = format_get_indent (s);
|
||||
|
||||
s = format (s, "%U state %U\n%U%U", format_tcp_connection_id, tc,
|
||||
format_tcp_state, tc->state, format_white_space, indent,
|
||||
format_tcp_header, &t->tcp_header, 128);
|
||||
if (!tc->c_lcl_port)
|
||||
s = format (s, "no tcp connection\n%U%U", format_white_space, indent,
|
||||
format_tcp_header, &t->tcp_header, 128);
|
||||
else
|
||||
s = format (s, "%U state %U\n%U%U", format_tcp_connection_id, tc,
|
||||
format_tcp_state, tc->state, format_white_space, indent,
|
||||
format_tcp_header, &t->tcp_header, 128);
|
||||
|
||||
return s;
|
||||
}
|
||||
@@ -1757,6 +1773,45 @@ tcp_check_tx_offload (tcp_connection_t * tc, int is_ipv4)
|
||||
tc->cfg_flags |= TCP_CFG_F_TSO;
|
||||
}
|
||||
|
||||
static void
|
||||
tcp_input_trace_frame (vlib_main_t *vm, vlib_node_runtime_t *node,
|
||||
vlib_buffer_t **bs, u16 *nexts, u32 n_bufs, u8 is_ip4)
|
||||
{
|
||||
tcp_connection_t *tc;
|
||||
tcp_header_t *tcp;
|
||||
tcp_rx_trace_t *t;
|
||||
u8 flags;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_bufs; i++)
|
||||
{
|
||||
if (!(bs[i]->flags & VLIB_BUFFER_IS_TRACED))
|
||||
continue;
|
||||
|
||||
t = vlib_add_trace (vm, node, bs[i], sizeof (*t));
|
||||
if (nexts[i] == TCP_INPUT_NEXT_DROP || nexts[i] == TCP_INPUT_NEXT_PUNT ||
|
||||
nexts[i] == TCP_INPUT_NEXT_RESET)
|
||||
{
|
||||
tc = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
flags = vnet_buffer (bs[i])->tcp.flags;
|
||||
|
||||
if (flags == TCP_STATE_LISTEN)
|
||||
tc = tcp_listener_get (vnet_buffer (bs[i])->tcp.connection_index);
|
||||
else if (flags == TCP_STATE_SYN_SENT)
|
||||
tc = tcp_half_open_connection_get (
|
||||
vnet_buffer (bs[i])->tcp.connection_index);
|
||||
else
|
||||
tc = tcp_connection_get (vnet_buffer (bs[i])->tcp.connection_index,
|
||||
vm->thread_index);
|
||||
}
|
||||
tcp = tcp_buffer_hdr (bs[i]);
|
||||
tcp_set_rx_trace_data (t, tc, tcp, bs[i], is_ip4);
|
||||
}
|
||||
}
|
||||
|
||||
always_inline uword
|
||||
tcp46_syn_sent_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
|
||||
vlib_frame_t *frame, int is_ip4)
|
||||
@@ -2781,18 +2836,6 @@ VLIB_REGISTER_NODE (tcp6_listen_node) =
|
||||
};
|
||||
/* *INDENT-ON* */
|
||||
|
||||
typedef enum _tcp_input_next
|
||||
{
|
||||
TCP_INPUT_NEXT_DROP,
|
||||
TCP_INPUT_NEXT_LISTEN,
|
||||
TCP_INPUT_NEXT_RCV_PROCESS,
|
||||
TCP_INPUT_NEXT_SYN_SENT,
|
||||
TCP_INPUT_NEXT_ESTABLISHED,
|
||||
TCP_INPUT_NEXT_RESET,
|
||||
TCP_INPUT_NEXT_PUNT,
|
||||
TCP_INPUT_N_NEXT
|
||||
} tcp_input_next_t;
|
||||
|
||||
#define foreach_tcp4_input_next \
|
||||
_ (DROP, "ip4-drop") \
|
||||
_ (LISTEN, "tcp4-listen") \
|
||||
@@ -2813,28 +2856,6 @@ typedef enum _tcp_input_next
|
||||
|
||||
#define filter_flags (TCP_FLAG_SYN|TCP_FLAG_ACK|TCP_FLAG_RST|TCP_FLAG_FIN)
|
||||
|
||||
static void
|
||||
tcp_input_trace_frame (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
vlib_buffer_t ** bs, u32 n_bufs, u8 is_ip4)
|
||||
{
|
||||
tcp_connection_t *tc;
|
||||
tcp_header_t *tcp;
|
||||
tcp_rx_trace_t *t;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_bufs; i++)
|
||||
{
|
||||
if (bs[i]->flags & VLIB_BUFFER_IS_TRACED)
|
||||
{
|
||||
t = vlib_add_trace (vm, node, bs[i], sizeof (*t));
|
||||
tc = tcp_connection_get (vnet_buffer (bs[i])->tcp.connection_index,
|
||||
vm->thread_index);
|
||||
tcp = vlib_buffer_get_current (bs[i]);
|
||||
tcp_set_rx_trace_data (t, tc, tcp, bs[i], is_ip4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
tcp_input_set_error_next (tcp_main_t * tm, u16 * next, u32 * error, u8 is_ip4)
|
||||
{
|
||||
@@ -3001,7 +3022,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_input_trace_frame (vm, node, bufs, nexts, frame->n_vectors, is_ip4);
|
||||
|
||||
tcp_store_err_counters (input, err_counters);
|
||||
vlib_buffer_enqueue_to_next (vm, node, from, nexts, frame->n_vectors);
|
||||
|
Reference in New Issue
Block a user