tcp: fix tcp packet trace

Type: fix

Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Change-Id: Id4ca9a749a343c55b24f6eb4b5eb0909a57e0c23
This commit is contained in:
Filip Tehlar
2023-04-17 12:22:12 +02:00
committed by Florin Coras
parent 1f7042506c
commit bc4dc16a5c

View File

@@ -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);