tcp: fix tcp packet trace 87/38687/5
authorFilip Tehlar <ftehlar@cisco.com>
Mon, 17 Apr 2023 10:22:12 +0000 (12:22 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 20 Apr 2023 17:43:23 +0000 (17:43 +0000)
Type: fix

Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Change-Id: Id4ca9a749a343c55b24f6eb4b5eb0909a57e0c23

src/vnet/tcp/tcp_input.c

index 32de187..1bcdd4c 100644 (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);