session: add support for memfd segments
[vpp.git] / src / vnet / tcp / tcp_debug.h
index e3da56f..e0db7f4 100755 (executable)
 #include <vlib/vlib.h>
 
 #define TCP_DEBUG (1)
-#define TCP_DEBUG_SM (2)
+#define TCP_DEBUG_SM (1)
 #define TCP_DEBUG_CC (0)
-#define TCP_DEBUG_CC_STAT (0)
+#define TCP_DEBUG_CC_STAT (1)
+#define TCP_DEBUG_BUFFER_ALLOCATION (0)
 
 #define foreach_tcp_dbg_evt            \
   _(INIT, "")                          \
@@ -82,13 +83,7 @@ typedef enum _tcp_dbg_evt
  * Infra and evt track setup
  */
 
-#define TCP_DBG(_tc, _evt, _args...)                                   \
-{                                                                      \
-    u8 *_tmp = 0;                                                      \
-    _tmp = format(_tmp, "%U", format_tcp_connection_verbose, _tc);     \
-    clib_warning("%s", _tmp);                                          \
-    vec_free(_tmp);                                                    \
-}
+#define TCP_DBG(_fmt, _args...) clib_warning (_fmt, ##_args)
 
 #define DECLARE_ETD(_tc, _e, _size)                                    \
   struct                                                               \
@@ -197,6 +192,20 @@ typedef enum _tcp_dbg_evt
   ed->data[0] = _tc->c_c_index;                                                \
 }
 
+#define TCP_EVT_SYN_RCVD_HANDLER(_tc,_init, ...)                               \
+{                                                                      \
+  if (_init)                                                           \
+    TCP_EVT_INIT_HANDLER(_tc, 0);                                      \
+  ELOG_TYPE_DECLARE (_e) =                                             \
+  {                                                                    \
+    .format = "syn-rx: irs %u",                                                \
+    .format_args = "i4",                                               \
+  };                                                                   \
+  DECLARE_ETD(_tc, _e, 1);                                             \
+  ed->data[0] = _tc->irs;                                              \
+  TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                   \
+}
+
 #define TCP_EVT_UNBIND_HANDLER(_tc, ...)                               \
 {                                                                      \
   TCP_EVT_DEALLOC_HANDLER(_tc);                                                \
@@ -226,6 +235,7 @@ typedef enum _tcp_dbg_evt
 #define TCP_EVT_DBG(_evt, _args...) CC(_evt, _HANDLER)(_args)
 #else
 #define TCP_EVT_DBG(_evt, _args...)
+#define TCP_DBG(_fmt, _args...)
 #endif
 
 /*
@@ -258,28 +268,18 @@ typedef enum _tcp_dbg_evt
   ed->data[0] = _tc->state;                                            \
 }
 
-#define TCP_EVT_SYN_RCVD_HANDLER(_tc, ...)                             \
-{                                                                      \
-  TCP_EVT_INIT_HANDLER(_tc, 0);                                                \
-  ELOG_TYPE_DECLARE (_e) =                                             \
-  {                                                                    \
-    .format = "syn-rx: irs %u",                                                \
-    .format_args = "i4",                                               \
-  };                                                                   \
-  DECLARE_ETD(_tc, _e, 1);                                             \
-  ed->data[0] = _tc->irs;                                              \
-  TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                   \
-}
-
 #define TCP_EVT_SYN_SENT_HANDLER(_tc, ...)                             \
 {                                                                      \
   ELOG_TYPE_DECLARE (_e) =                                             \
   {                                                                    \
-    .format = "syn-tx: iss %u",                                                \
-    .format_args = "i4",                                               \
+    .format = "syn-tx: iss %u snd_una %u snd_una_max %u snd_nxt %u",   \
+    .format_args = "i4i4i4i4",                                         \
   };                                                                   \
-  DECLARE_ETD(_tc, _e, 1);                                             \
+  DECLARE_ETD(_tc, _e, 4);                                             \
   ed->data[0] = _tc->iss;                                              \
+  ed->data[1] = _tc->snd_una - _tc->iss;                                       \
+  ed->data[2] = _tc->snd_una_max - _tc->iss;                           \
+  ed->data[3] = _tc->snd_nxt - _tc->iss;                                       \
   TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                   \
 }
 
@@ -287,24 +287,30 @@ typedef enum _tcp_dbg_evt
 {                                                                      \
   ELOG_TYPE_DECLARE (_e) =                                             \
   {                                                                    \
-    .format = "synack-tx: iss %u irs %u",                              \
-    .format_args = "i4i4",                                             \
+    .format = "synack-tx: iss %u irs %u snd_una %u snd_nxt %u rcv_nxt %u",\
+    .format_args = "i4i4i4i4i4",                                               \
   };                                                                   \
-  DECLARE_ETD(_tc, _e, 2);                                             \
+  DECLARE_ETD(_tc, _e, 5);                                             \
   ed->data[0] = _tc->iss;                                              \
   ed->data[1] = _tc->irs;                                              \
+  ed->data[2] = _tc->snd_una - _tc->iss;                                       \
+  ed->data[3] = _tc->snd_nxt - _tc->iss;                                       \
+  ed->data[4] = _tc->rcv_nxt - _tc->irs;                                       \
 }
 
 #define TCP_EVT_SYNACK_RCVD_HANDLER(_tc, ...)                          \
 {                                                                      \
   ELOG_TYPE_DECLARE (_e) =                                             \
   {                                                                    \
-    .format = "synack-rx: iss %u irs %u",                              \
-    .format_args = "i4i4",                                             \
+    .format = "synack-rx: iss %u irs %u snd_una %u snd_nxt %u rcv_nxt %u",\
+    .format_args = "i4i4i4i4i4",                                               \
   };                                                                   \
-  DECLARE_ETD(_tc, _e, 2);                                             \
+  DECLARE_ETD(_tc, _e, 5);                                             \
   ed->data[0] = _tc->iss;                                              \
   ed->data[1] = _tc->irs;                                              \
+  ed->data[2] = _tc->snd_una - _tc->iss;                                       \
+  ed->data[3] = _tc->snd_nxt - _tc->iss;                                       \
+  ed->data[4] = _tc->rcv_nxt - _tc->irs;                                       \
   TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                   \
 }
 
@@ -361,17 +367,20 @@ typedef enum _tcp_dbg_evt
 {                                                                      \
   ELOG_TYPE_DECLARE (_e) =                                             \
   {                                                                    \
-    .format = "%s-rxt: iss %u",                                                \
-    .format_args = "t4i4",                                             \
+    .format = "%s-rxt: iss %u irs %u snd_nxt %u rcv_nxt %u",           \
+    .format_args = "t4i4i4i4i4",                                               \
     .n_enum_strings = 2,                                               \
     .enum_strings = {                                                  \
        "syn",                                                          \
         "syn-ack",                                                     \
     },                                                                 \
   };                                                                   \
-  DECLARE_ETD(_tc, _e, 2);                                             \
+  DECLARE_ETD(_tc, _e, 5);                                             \
   ed->data[0] = _type;                                                 \
   ed->data[1] = _tc->iss;                                              \
+  ed->data[2] = _tc->irs;                                              \
+  ed->data[3] = _tc->snd_nxt - _tc->iss;                                       \
+  ed->data[4] = _tc->rcv_nxt - _tc->irs;                                       \
 }
 
 #else
@@ -403,26 +412,11 @@ typedef enum _tcp_dbg_evt
   ed->data[4] = _tc->snd_wnd;                                          \
 }
 
-#define TCP_EVT_DUPACK_SENT_HANDLER(_tc, ...)                          \
-{                                                                      \
-  ELOG_TYPE_DECLARE (_e) =                                             \
-  {                                                                    \
-    .format = "dack-tx: rcv_nxt %u rcv_wnd %u snd_nxt %u av_wnd %u snd_wnd %u",\
-    .format_args = "i4i4i4i4i4",                                       \
-  };                                                                   \
-  DECLARE_ETD(_tc, _e, 5);                                             \
-  ed->data[0] = _tc->rcv_nxt - _tc->irs;                               \
-  ed->data[1] = _tc->rcv_wnd;                                          \
-  ed->data[2] = _tc->snd_nxt - _tc->iss;                               \
-  ed->data[3] = tcp_available_wnd(_tc);                                        \
-  ed->data[4] = _tc->snd_wnd;                                          \
-}
-
 #define TCP_EVT_ACK_RCVD_HANDLER(_tc, ...)                             \
 {                                                                      \
   ELOG_TYPE_DECLARE (_e) =                                             \
   {                                                                    \
-    .format = "acked: %u snd_una %u snd_wnd %u cwnd %u inflight %u",   \
+    .format = "ack-rx: %u snd_una %u snd_wnd %u cwnd %u inflight %u",  \
     .format_args = "i4i4i4i4i4",                                       \
   };                                                                   \
   DECLARE_ETD(_tc, _e, 5);                                             \
@@ -433,32 +427,17 @@ typedef enum _tcp_dbg_evt
   ed->data[4] = tcp_flight_size(_tc);                                  \
 }
 
-#define TCP_EVT_DUPACK_RCVD_HANDLER(_tc, ...)                          \
-{                                                                      \
-  ELOG_TYPE_DECLARE (_e) =                                             \
-  {                                                                    \
-    .format = "dack-rx: snd_una %u cwnd %u snd_wnd %u flight %u rcv_wnd %u",\
-    .format_args = "i4i4i4i4i4",                                       \
-  };                                                                   \
-  DECLARE_ETD(_tc, _e, 5);                                             \
-  ed->data[0] = _tc->snd_una - _tc->iss;                               \
-  ed->data[1] = _tc->cwnd;                                             \
-  ed->data[2] = _tc->snd_wnd;                                          \
-  ed->data[3] = tcp_flight_size(_tc);                                  \
-  ed->data[4] = _tc->rcv_wnd;                                          \
-}
-
 #define TCP_EVT_PKTIZE_HANDLER(_tc, ...)                               \
 {                                                                      \
   ELOG_TYPE_DECLARE (_e) =                                             \
   {                                                                    \
-    .format = "pktize: una %u snd_nxt %u space %u flight %u rcv_wnd %u",\
+    .format = "tx: una %u snd_nxt %u space %u flight %u rcv_wnd %u",\
     .format_args = "i4i4i4i4i4",                                       \
   };                                                                   \
   DECLARE_ETD(_tc, _e, 5);                                             \
   ed->data[0] = _tc->snd_una - _tc->iss;                               \
   ed->data[1] = _tc->snd_nxt - _tc->iss;                               \
-  ed->data[2] = tcp_available_snd_space (_tc);                         \
+  ed->data[2] = tcp_available_output_snd_space (_tc);                  \
   ed->data[3] = tcp_flight_size (_tc);                                 \
   ed->data[4] = _tc->rcv_wnd;                                          \
 }
@@ -593,9 +572,7 @@ if (_av > 0)                                                                \
 }
 #else
 #define TCP_EVT_ACK_SENT_HANDLER(_tc, ...)
-#define TCP_EVT_DUPACK_SENT_HANDLER(_tc, ...)
 #define TCP_EVT_ACK_RCVD_HANDLER(_tc, ...)
-#define TCP_EVT_DUPACK_RCVD_HANDLER(_tc, ...)
 #define TCP_EVT_PKTIZE_HANDLER(_tc, ...)
 #define TCP_EVT_INPUT_HANDLER(_tc, _type, _len, _written, ...)
 #define TCP_EVT_TIMER_POP_HANDLER(_tc_index, _timer_id, ...)
@@ -641,19 +618,6 @@ if (_av > 0)                                                               \
  */
 
 #if TCP_DEBUG_CC
-#define TCP_EVT_CC_RTX_HANDLER(_tc, offset, n_bytes, ...)              \
-{                                                                      \
-  ELOG_TYPE_DECLARE (_e) =                                             \
-  {                                                                    \
-    .format = "rxt: snd_nxt %u offset %u snd %u rxt %u",               \
-    .format_args = "i4i4i4i4",                                         \
-  };                                                                   \
-  DECLARE_ETD(_tc, _e, 4);                                             \
-  ed->data[0] = _tc->snd_nxt - _tc->iss;                               \
-  ed->data[1] = offset;                                                        \
-  ed->data[2] = n_bytes;                                               \
-  ed->data[3] = _tc->snd_rxt_bytes;                                    \
-}
 
 #define TCP_EVT_CC_EVT_HANDLER(_tc, _sub_evt, ...)                     \
 {                                                                      \
@@ -661,13 +625,14 @@ if (_av > 0)                                                              \
   {                                                                    \
     .format = "cc: %s wnd %u snd_cong %u rxt_bytes %u",                        \
     .format_args = "t4i4i4i4",                                         \
-    .n_enum_strings = 5,                                               \
+    .n_enum_strings = 6,                                               \
     .enum_strings = {                                                  \
       "fast-rxt",                                                      \
       "rxt-timeout",                                                   \
       "first-rxt",                                                     \
       "recovered",                                                     \
       "congestion",                                                    \
+      "undo",                                                          \
     },                                                                 \
   };                                                                   \
   DECLARE_ETD(_tc, _e, 4);                                             \
@@ -677,6 +642,50 @@ if (_av > 0)                                                               \
   ed->data[3] = _tc->snd_rxt_bytes;                                    \
 }
 
+#define TCP_EVT_CC_RTX_HANDLER(_tc, offset, n_bytes, ...)              \
+{                                                                      \
+  ELOG_TYPE_DECLARE (_e) =                                             \
+  {                                                                    \
+    .format = "rxt: snd_nxt %u offset %u snd %u rxt %u",               \
+    .format_args = "i4i4i4i4",                                         \
+  };                                                                   \
+  DECLARE_ETD(_tc, _e, 4);                                             \
+  ed->data[0] = _tc->snd_nxt - _tc->iss;                               \
+  ed->data[1] = offset;                                                        \
+  ed->data[2] = n_bytes;                                               \
+  ed->data[3] = _tc->snd_rxt_bytes;                                    \
+}
+
+#define TCP_EVT_DUPACK_SENT_HANDLER(_tc, ...)                          \
+{                                                                      \
+  ELOG_TYPE_DECLARE (_e) =                                             \
+  {                                                                    \
+    .format = "dack-tx: rcv_nxt %u rcv_wnd %u snd_nxt %u av_wnd %u snd_wnd %u",\
+    .format_args = "i4i4i4i4i4",                                       \
+  };                                                                   \
+  DECLARE_ETD(_tc, _e, 5);                                             \
+  ed->data[0] = _tc->rcv_nxt - _tc->irs;                               \
+  ed->data[1] = _tc->rcv_wnd;                                          \
+  ed->data[2] = _tc->snd_nxt - _tc->iss;                               \
+  ed->data[3] = tcp_available_snd_wnd(_tc);                            \
+  ed->data[4] = _tc->snd_wnd;                                          \
+}
+
+#define TCP_EVT_DUPACK_RCVD_HANDLER(_tc, ...)                          \
+{                                                                      \
+  ELOG_TYPE_DECLARE (_e) =                                             \
+  {                                                                    \
+    .format = "dack-rx: snd_una %u cwnd %u snd_wnd %u flight %u rcv_wnd %u",\
+    .format_args = "i4i4i4i4i4",                                       \
+  };                                                                   \
+  DECLARE_ETD(_tc, _e, 5);                                             \
+  ed->data[0] = _tc->snd_una - _tc->iss;                               \
+  ed->data[1] = _tc->cwnd;                                             \
+  ed->data[2] = _tc->snd_wnd;                                          \
+  ed->data[3] = tcp_flight_size(_tc);                                  \
+  ed->data[4] = _tc->rcv_wnd;                                          \
+}
+
 #define TCP_EVT_CC_PACK_HANDLER(_tc, ...)                              \
 {                                                                      \
   ELOG_TYPE_DECLARE (_e) =                                             \
@@ -688,6 +697,13 @@ if (_av > 0)                                                               \
   ed->data[0] = _tc->snd_una - _tc->iss;                               \
   ed->data[1] = _tc->snd_una_max - _tc->iss;                           \
 }
+#else
+#define TCP_EVT_CC_RTX_HANDLER(_tc, offset, n_bytes, ...)
+#define TCP_EVT_DUPACK_SENT_HANDLER(_tc, ...)
+#define TCP_EVT_DUPACK_RCVD_HANDLER(_tc, ...)
+#define TCP_EVT_CC_PACK_HANDLER(_tc, ...)
+#define TCP_EVT_CC_EVT_HANDLER(_tc, _sub_evt, ...)
+#endif
 
 /*
  * Congestion control stats
@@ -732,14 +748,40 @@ if (_tc->c_cc_stat_tstamp + STATS_INTERVAL < tcp_time_now())              \
 }                                                                      \
 }
 
+/*
+ * Buffer allocation
+ */
+#if TCP_DEBUG_BUFFER_ALLOCATION
+
+#define TCP_DBG_BUFFER_ALLOC_MAYBE_FAIL(thread_index)                  \
+{                                                                      \
+  static u32 *buffer_fail_counters;                                    \
+  if (PREDICT_FALSE (buffer_fail_counters == 0))                               \
+    {                                                                  \
+      u32 num_threads;                                                 \
+      vlib_thread_main_t *vtm = vlib_get_thread_main ();                       \
+      num_threads = 1 /* main thread */  + vtm->n_threads;             \
+      vec_validate (buffer_fail_counters, num_threads - 1);            \
+    }                                                                  \
+  if (PREDICT_FALSE (tcp_main.buffer_fail_fraction != 0.0))            \
+    {                                                                  \
+      if (PREDICT_TRUE (buffer_fail_counters[thread_index] > 0))               \
+        {                                                              \
+          if ((1.0 / (f32) (buffer_fail_counters[thread_index]))               \
+              < tcp_main.buffer_fail_fraction)                         \
+            {                                                          \
+              buffer_fail_counters[thread_index] = 0.0000001;          \
+              return -1;                                                       \
+            }                                                          \
+        }                                                              \
+      buffer_fail_counters[thread_index] ++;                           \
+    }                                                                  \
+}
 #else
-#define TCP_EVT_CC_STAT_HANDLER(_tc, ...)
+#define TCP_DBG_BUFFER_ALLOC_MAYBE_FAIL(thread_index)
 #endif
 
 #else
-#define TCP_EVT_CC_RTX_HANDLER(_tc, offset, n_bytes, ...)
-#define TCP_EVT_CC_EVT_HANDLER(_tc, _sub_evt, ...)
-#define TCP_EVT_CC_PACK_HANDLER(_tc, ...)
 #define TCP_EVT_CC_STAT_HANDLER(_tc, ...)
 #endif