tcp: build image with TCP_DEBUG_ALWAYS via make
[vpp.git] / src / vnet / tcp / tcp_debug.h
1 /*
2  * Copyright (c) 2017-2019 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #ifndef SRC_VNET_TCP_TCP_DEBUG_H_
17 #define SRC_VNET_TCP_TCP_DEBUG_H_
18
19 #include <vlib/vlib.h>
20
21 /**
22  * Build debugging infra unconditionally. Debug components controlled via
23  * debug configuration. Comes with some overhead so it's not recommended for
24  * production/performance scenarios. Takes priority over TCP_DEBUG_ENABLE.
25  */
26 #ifdef VPP_TCP_DEBUG_ALWAYS
27 #define TCP_DEBUG_ALWAYS (1)
28 #else
29 #define TCP_DEBUG_ALWAYS (0)
30 #endif
31 /**
32  * Build debugging infra only if enabled. Debug components controlled via
33  * macros that follow.
34  */
35 #define TCP_DEBUG_ENABLE (0)
36
37 #define TCP_DEBUG_SM (0)
38 #define TCP_DEBUG_CC (0)
39 #define TCP_DEBUG_CS (0)
40 #define TCP_DEBUG_LC (0 || TCP_DEBUG_SM || TCP_DEBUG_CC || TCP_DEBUG_CS)
41
42 #define TCP_DEBUG (TCP_DEBUG_ALWAYS || TCP_DEBUG_ENABLE)
43 #define TCP_DEBUG_BUF_ALLOC (0)
44
45 #if TCP_DEBUG > 0
46 #define TRANSPORT_DEBUG (1)
47 #endif
48
49 #define TCP_CONCAT_HELPER(_a, _b) _a##_b
50 #define TCP_CC(_a, _b) TCP_CONCAT_HELPER(_a, _b)
51
52 #define tcp_evt_lvl(_evt) TCP_CC(_evt, _LVL)
53 #define tcp_evt_grp(_evt) TCP_CC(_evt, _GRP)
54 #define tcp_evt_handler(_evt, _args...) TCP_CC(_evt, _HANDLER) (_args)
55 #define tcp_evt_grp_dbg_lvl(_evt) tcp_dbg_main.grp_dbg_lvl[tcp_evt_grp (_evt)]
56
57 #define foreach_tcp_evt_grp                                     \
58   _(LC, "life cycle")                                           \
59   _(SM, "state machine")                                        \
60   _(CC, "congestion control")                                   \
61   _(CS, "cc stats")                                             \
62
63 typedef enum tcp_evt_grp_
64 {
65 #define _(sym, str) TCP_EVT_GRP_ ## sym,
66   foreach_tcp_evt_grp
67 #undef _
68   TCP_EVT_N_GRP
69 } tcp_evt_grp_e;
70
71 typedef struct tcp_dbg_main_
72 {
73   u8 grp_dbg_lvl[TCP_EVT_N_GRP];
74   u32 *free_track_indices;
75 } tcp_dbg_main_t;
76
77 extern tcp_dbg_main_t tcp_dbg_main;
78
79 #define foreach_tcp_dbg_evt                                     \
80   _(INIT,               LC, 1, "init")                          \
81   _(DEALLOC,            LC, 1, "dealloc")                       \
82   _(OPEN,               LC, 1, "open")                          \
83   _(CLOSE,              LC, 1, "close")                         \
84   _(BIND,               LC, 1, "bind")                          \
85   _(UNBIND,             LC, 1, "unbind")                        \
86   _(DELETE,             LC, 1, "delete")                        \
87   _(SYN_RCVD,           LC, 1, "SYN rcvd")                      \
88   _(STATE_CHANGE,       LC, 1, "state change")                  \
89   _(SYN_SENT,           SM, 1, "SYN sent")                      \
90   _(SYN_RXT,            SM, 1, "SYN retransmit")                \
91   _(SYNACK_SENT,        SM, 1, "SYNACK sent")                   \
92   _(SYNACK_RCVD,        SM, 1, "SYNACK rcvd")                   \
93   _(FIN_SENT,           SM, 1, "FIN sent")                      \
94   _(FIN_RCVD,           SM, 1, "FIN rcvd")                      \
95   _(RST_SENT,           SM, 1, "RST sent")                      \
96   _(RST_RCVD,           SM, 1, "RST rcvd")                      \
97   _(TIMER_POP,          SM, 1, "timer pop")                     \
98   _(SEG_INVALID,        SM, 2, "invalid segment")               \
99   _(PAWS_FAIL,          SM, 2, "failed paws check")             \
100   _(ACK_RCV_ERR,        SM, 2, "invalid ack")                   \
101   _(RCV_WND_SHRUNK,     SM, 2, "shrunk rcv_wnd")                \
102   _(ACK_SENT,           SM, 3, "ACK sent")                      \
103   _(ACK_RCVD,           SM, 3, "ACK rcvd")                      \
104   _(PKTIZE,             SM, 3, "packetize")                     \
105   _(INPUT,              SM, 3, "in")                            \
106   _(OUTPUT,             SM, 4, "output")                        \
107   _(SND_WND,            SM, 4, "snd_wnd update")                \
108   _(CC_EVT,             CC, 1, "cc event")                      \
109   _(CC_RTX,             CC, 2, "retransmit")                    \
110   _(CC_PACK,            CC, 2, "cc partial ack")                \
111   _(DUPACK_SENT,        CC, 2, "DUPACK sent")                   \
112   _(DUPACK_RCVD,        CC, 2, "DUPACK rcvd")                   \
113   _(CC_SCOREBOARD,      CC, 2, "scoreboard stats")              \
114   _(CC_SACKS,           CC, 2, "snd sacks stats")               \
115   _(CC_INPUT,           CC, 2, "ooo data delivered")            \
116   _(CC_STAT,            CS, 1, "cc stats")                      \
117   _(CC_RTO_STAT,        CS, 1, "cc rto stats")                  \
118
119 typedef enum tcp_evt_types_
120 {
121 #define _(sym, grp, lvl, str) TCP_EVT_##sym,
122   foreach_tcp_dbg_evt
123 #undef _
124 } tcp_evt_types_e;
125
126 typedef enum tcp_evt_lvl_
127 {
128 #define _(sym, grp, lvl, str) TCP_EVT_## sym ## _LVL = lvl,
129   foreach_tcp_dbg_evt
130 #undef _
131 } tcp_evt_lvl_e;
132
133 typedef enum tcp_evt_to_grp_
134 {
135 #define _(sym, grp, lvl, str) TCP_EVT_ ## sym ## _GRP = TCP_EVT_GRP_ ## grp,
136   foreach_tcp_dbg_evt
137 #undef _
138 } tcp_evt_to_grp_e;
139
140 #if TCP_DEBUG_ALWAYS > 0
141 #define TCP_EVT(_evt, _args...)                                         \
142   if (PREDICT_FALSE (tcp_evt_grp_dbg_lvl (_evt) >= tcp_evt_lvl (_evt))) \
143     tcp_evt_handler (_evt, _args)
144 #define TCP_DBG(_fmt, _args...) clib_warning (_fmt, ##_args)
145 #elif TCP_DEBUG_ENABLE > 0
146 #define TCP_EVT(_evt, _args...) tcp_evt_handler(_evt, _args)
147 #define TCP_DBG(_fmt, _args...) clib_warning (_fmt, ##_args)
148 #else
149 #define TCP_EVT(_evt, _args...)
150 #define TCP_DBG(_fmt, _args...)
151 #endif
152
153 void tcp_evt_track_register (elog_track_t * et);
154 void tcp_debug_init (void);
155
156 #define TCP_DECLARE_ETD(_tc, _e, _size)                                 \
157 struct                                                                  \
158 {                                                                       \
159   u32 data[_size];                                                      \
160 } * ed;                                                                 \
161 ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, _e,                  \
162                       _tc->c_elog_track)                                \
163
164 /*
165  * Event handlers definitions
166  */
167
168 #if TCP_DEBUG_LC || TCP_DEBUG_ALWAYS
169
170 /*
171  * Infra and evt track setup
172  */
173
174 #define TCP_DBG_IP_TAG_LCL(_tc)                                         \
175 {                                                                       \
176   if (_tc->c_is_ip4)                                                    \
177     {                                                                   \
178       ELOG_TYPE_DECLARE (_e) =                                          \
179       {                                                                 \
180         .format = "lcl: %d.%d.%d.%d:%d",                                \
181         .format_args = "i4i4i4i4i4",                                    \
182       };                                                                \
183       TCP_DECLARE_ETD(_tc, _e, 5);                                      \
184       ed->data[0] = _tc->c_lcl_ip.ip4.as_u8[0];                         \
185       ed->data[1] = _tc->c_lcl_ip.ip4.as_u8[1];                         \
186       ed->data[2] = _tc->c_lcl_ip.ip4.as_u8[2];                         \
187       ed->data[3] = _tc->c_lcl_ip.ip4.as_u8[3];                         \
188       ed->data[4] = clib_net_to_host_u16(_tc->c_lcl_port);              \
189     }                                                                   \
190 }
191
192 #define TCP_DBG_IP_TAG_RMT(_tc)                                         \
193 {                                                                       \
194   if (_tc->c_is_ip4)                                                    \
195     {                                                                   \
196       ELOG_TYPE_DECLARE (_e) =                                          \
197       {                                                                 \
198         .format = "rmt: %d.%d.%d.%d:%d",                                \
199         .format_args = "i4i4i4i4i4",                                    \
200       };                                                                \
201       TCP_DECLARE_ETD(_tc, _e, 5);                                      \
202       ed->data[0] = _tc->c_rmt_ip.ip4.as_u8[0];                         \
203       ed->data[1] = _tc->c_rmt_ip.ip4.as_u8[1];                         \
204       ed->data[2] = _tc->c_rmt_ip.ip4.as_u8[2];                         \
205       ed->data[3] = _tc->c_rmt_ip.ip4.as_u8[3];                         \
206       ed->data[4] = clib_net_to_host_u16(_tc->c_rmt_port);              \
207     }                                                                   \
208 }
209
210 #define TCP_EVT_INIT_HANDLER(_tc, _is_l, ...)                           \
211 {                                                                       \
212   char *_fmt = _is_l ? "l[%d].%d:%d%c" : "[%d].%d:%d->.%d:%d%c";        \
213   if (_tc->c_is_ip4)                                                    \
214     {                                                                   \
215       _tc->c_elog_track.name =                                          \
216         (char *) format (0, _fmt, _tc->c_thread_index,                  \
217                          _tc->c_lcl_ip.ip4.as_u8[3],                    \
218                          clib_net_to_host_u16(_tc->c_lcl_port),         \
219                          _tc->c_rmt_ip.ip4.as_u8[3],                    \
220                          clib_net_to_host_u16(_tc->c_rmt_port), 0);     \
221     }                                                                   \
222   else                                                                  \
223       _tc->c_elog_track.name =                                          \
224         (char *) format (0, _fmt, _tc->c_thread_index,                  \
225                          _tc->c_lcl_ip.ip6.as_u8[15],                   \
226                          clib_net_to_host_u16(_tc->c_lcl_port),         \
227                          _tc->c_rmt_ip.ip6.as_u8[15],                   \
228                          clib_net_to_host_u16(_tc->c_rmt_port), 0);     \
229   tcp_evt_track_register (&_tc->c_elog_track);                          \
230   TCP_DBG_IP_TAG_LCL(_tc);                                              \
231   TCP_DBG_IP_TAG_RMT(_tc);                                              \
232 }
233
234 #define TCP_EVT_DEALLOC_HANDLER(_tc, ...)                               \
235 {                                                                       \
236   vec_free (_tc->c_elog_track.name);                                    \
237   vec_add1 (tcp_dbg_main.free_track_indices,                            \
238             _tc->c_elog_track.track_index_plus_one - 1);                \
239 }
240
241 #define TCP_EVT_OPEN_HANDLER(_tc, ...)                                  \
242 {                                                                       \
243   TCP_EVT_INIT_HANDLER(_tc, 0);                                         \
244   ELOG_TYPE_DECLARE (_e) =                                              \
245   {                                                                     \
246     .format = "open: index %d",                                         \
247     .format_args = "i4",                                                \
248   };                                                                    \
249   TCP_DECLARE_ETD(_tc, _e, 1);                                          \
250   ed->data[0] = _tc->c_c_index;                                         \
251 }
252
253 #define TCP_EVT_CLOSE_HANDLER(_tc, ...)                                 \
254 {                                                                       \
255   ELOG_TYPE_DECLARE (_e) =                                              \
256   {                                                                     \
257     .format = "close: cidx %d",                                         \
258     .format_args = "i4",                                                \
259   };                                                                    \
260   TCP_DECLARE_ETD(_tc, _e, 1);                                          \
261   ed->data[0] = _tc->c_c_index;                                         \
262 }
263
264 #define TCP_EVT_BIND_HANDLER(_tc, ...)                                  \
265 {                                                                       \
266   TCP_EVT_INIT_HANDLER(_tc, 1);                                         \
267   ELOG_TYPE_DECLARE (_e) =                                              \
268   {                                                                     \
269     .format = "bind: listener %d",                                      \
270   };                                                                    \
271   TCP_DECLARE_ETD(_tc, _e, 1);                                          \
272   ed->data[0] = _tc->c_c_index;                                         \
273 }
274
275 #define TCP_EVT_SYN_RCVD_HANDLER(_tc,_init, ...)                        \
276 {                                                                       \
277   if (_init)                                                            \
278     TCP_EVT_INIT_HANDLER(_tc, 0);                                       \
279   ELOG_TYPE_DECLARE (_e) =                                              \
280   {                                                                     \
281     .format = "syn-rx: cidx %u sidx %u irs %u",                         \
282     .format_args = "i4i4i4",                                            \
283   };                                                                    \
284   TCP_DECLARE_ETD(_tc, _e, 3);                                          \
285   ed->data[0] = _tc->c_c_index;                                         \
286   ed->data[1] = _tc->c_s_index;                                         \
287   ed->data[2] = _tc->irs;                                               \
288   TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                    \
289 }
290
291 #define TCP_EVT_UNBIND_HANDLER(_tc, ...)                                \
292 {                                                                       \
293   TCP_EVT_DEALLOC_HANDLER(_tc);                                         \
294   ELOG_TYPE_DECLARE (_e) =                                              \
295   {                                                                     \
296     .format = "unbind: listener %d",                                    \
297   };                                                                    \
298   TCP_DECLARE_ETD(_tc, _e, 1);                                          \
299   ed->data[0] = _tc->c_c_index;                                         \
300   TCP_EVT_DEALLOC_HANDLER(_tc);                                         \
301 }
302
303 #define TCP_EVT_DELETE_HANDLER(_tc, ...)                                \
304 {                                                                       \
305   ELOG_TYPE_DECLARE (_e) =                                              \
306   {                                                                     \
307     .format = "delete: cidx %d sidx %d",                                \
308     .format_args = "i4i4",                                              \
309   };                                                                    \
310   TCP_DECLARE_ETD(_tc, _e, 2);                                          \
311   ed->data[0] = _tc->c_c_index;                                         \
312   ed->data[1] = _tc->c_s_index;                                         \
313   TCP_EVT_DEALLOC_HANDLER(_tc);                                         \
314 }
315
316 #endif
317
318 /*
319  * State machine
320  */
321 #if TCP_DEBUG_SM > 0 || TCP_DEBUG_ALWAYS
322
323 #define TCP_EVT_STATE_CHANGE_HANDLER(_tc, ...)                          \
324 {                                                                       \
325   ELOG_TYPE_DECLARE (_e) =                                              \
326   {                                                                     \
327     .format = "state: %s",                                              \
328     .format_args = "t4",                                                \
329     .n_enum_strings = 11,                                               \
330     .enum_strings = {                                                   \
331       "closed",                                                         \
332       "listen",                                                         \
333       "syn-sent",                                                       \
334       "syn-rcvd",                                                       \
335       "established",                                                    \
336       "close_wait",                                                     \
337       "fin-wait-1",                                                     \
338       "last-ack",                                                       \
339       "closing",                                                        \
340       "fin-wait-2",                                                     \
341       "time-wait",                                                      \
342     },                                                                  \
343   };                                                                    \
344   TCP_DECLARE_ETD(_tc, _e, 1);                                          \
345   ed->data[0] = _tc->state;                                             \
346 }
347
348 #define TCP_EVT_SYN_SENT_HANDLER(_tc, ...)                              \
349 {                                                                       \
350   ELOG_TYPE_DECLARE (_e) =                                              \
351   {                                                                     \
352     .format = "syn-tx: iss %u snd_una %u snd_nxt %u",                   \
353     .format_args = "i4i4i4",                                            \
354   };                                                                    \
355   TCP_DECLARE_ETD(_tc, _e, 3);                                          \
356   ed->data[0] = _tc->iss;                                               \
357   ed->data[1] = _tc->snd_una - _tc->iss;                                \
358   ed->data[2] = _tc->snd_nxt - _tc->iss;                                \
359   TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                    \
360 }
361
362 #define TCP_EVT_SYNACK_SENT_HANDLER(_tc, ...)                           \
363 {                                                                       \
364   ELOG_TYPE_DECLARE (_e) =                                              \
365   {                                                                     \
366     .format = "synack-tx: iss %u irs %u snd_una %u snd_nxt %u rcv_nxt %u",\
367     .format_args = "i4i4i4i4i4",                                        \
368   };                                                                    \
369   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
370   ed->data[0] = _tc->iss;                                               \
371   ed->data[1] = _tc->irs;                                               \
372   ed->data[2] = _tc->snd_una - _tc->iss;                                \
373   ed->data[3] = _tc->snd_nxt - _tc->iss;                                \
374   ed->data[4] = _tc->rcv_nxt - _tc->irs;                                \
375 }
376
377 #define TCP_EVT_SYNACK_RCVD_HANDLER(_tc, ...)                           \
378 {                                                                       \
379   ELOG_TYPE_DECLARE (_e) =                                              \
380   {                                                                     \
381     .format = "synack-rx: iss %u irs %u snd_una %u snd_nxt %u rcv_nxt %u",\
382     .format_args = "i4i4i4i4i4",                                        \
383   };                                                                    \
384   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
385   ed->data[0] = _tc->iss;                                               \
386   ed->data[1] = _tc->irs;                                               \
387   ed->data[2] = _tc->snd_una - _tc->iss;                                \
388   ed->data[3] = _tc->snd_nxt - _tc->iss;                                \
389   ed->data[4] = _tc->rcv_nxt - _tc->irs;                                \
390   TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                    \
391 }
392
393 #define TCP_EVT_FIN_SENT_HANDLER(_tc, ...)                              \
394 {                                                                       \
395   ELOG_TYPE_DECLARE (_e) =                                              \
396   {                                                                     \
397     .format = "fin-tx: snd_nxt %d rcv_nxt %d",                          \
398     .format_args = "i4i4",                                              \
399   };                                                                    \
400   TCP_DECLARE_ETD(_tc, _e, 2);                                          \
401   ed->data[0] = _tc->snd_nxt - _tc->iss;                                \
402   ed->data[1] = _tc->rcv_nxt - _tc->irs;                                \
403 }
404
405 #define TCP_EVT_RST_SENT_HANDLER(_tc, ...)                              \
406 {                                                                       \
407 if (_tc)                                                                \
408   {                                                                     \
409     ELOG_TYPE_DECLARE (_e) =                                            \
410     {                                                                   \
411       .format = "rst-tx: snd_nxt %d rcv_nxt %d",                        \
412       .format_args = "i4i4",                                            \
413     };                                                                  \
414     TCP_DECLARE_ETD(_tc, _e, 2);                                        \
415     ed->data[0] = _tc->snd_nxt - _tc->iss;                              \
416     ed->data[1] = _tc->rcv_nxt - _tc->irs;                              \
417     TCP_EVT_STATE_CHANGE_HANDLER(_tc);                                  \
418   }                                                                     \
419 }
420
421 #define TCP_EVT_FIN_RCVD_HANDLER(_tc, ...)                              \
422 {                                                                       \
423   ELOG_TYPE_DECLARE (_e) =                                              \
424   {                                                                     \
425     .format = "fin-rx: snd_nxt %d rcv_nxt %d",                          \
426     .format_args = "i4i4",                                              \
427   };                                                                    \
428   TCP_DECLARE_ETD(_tc, _e, 2);                                          \
429   ed->data[0] = _tc->snd_nxt - _tc->iss;                                \
430   ed->data[1] = _tc->rcv_nxt - _tc->irs;                                \
431 }
432
433 #define TCP_EVT_RST_RCVD_HANDLER(_tc, ...)                              \
434 {                                                                       \
435   ELOG_TYPE_DECLARE (_e) =                                              \
436   {                                                                     \
437     .format = "rst-rx: snd_nxt %d rcv_nxt %d",                          \
438     .format_args = "i4i4",                                              \
439   };                                                                    \
440   TCP_DECLARE_ETD(_tc, _e, 2);                                          \
441   ed->data[0] = _tc->snd_nxt - _tc->iss;                                \
442   ed->data[1] = _tc->rcv_nxt - _tc->irs;                                \
443 }
444
445 #define TCP_EVT_SYN_RXT_HANDLER(_tc, _type, ...)                        \
446 {                                                                       \
447   ELOG_TYPE_DECLARE (_e) =                                              \
448   {                                                                     \
449     .format = "%s-rxt: iss %u irs %u snd_nxt %u rcv_nxt %u",            \
450     .format_args = "t4i4i4i4i4",                                        \
451     .n_enum_strings = 2,                                                \
452     .enum_strings = {                                                   \
453         "syn",                                                          \
454         "synack",                                                       \
455     },                                                                  \
456   };                                                                    \
457   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
458   ed->data[0] = _type;                                                  \
459   ed->data[1] = _tc->iss;                                               \
460   ed->data[2] = _tc->irs;                                               \
461   ed->data[3] = _tc->snd_nxt - _tc->iss;                                \
462   ed->data[4] = _tc->rcv_nxt - _tc->irs;                                \
463 }
464
465 #define TCP_EVT_TIMER_POP_HANDLER(_tc_index, _timer_id, ...)            \
466 {                                                                       \
467   tcp_connection_t *_tc;                                                \
468   if (_timer_id == TCP_TIMER_RETRANSMIT_SYN)                            \
469     {                                                                   \
470       _tc = tcp_half_open_connection_get (_tc_index);                   \
471     }                                                                   \
472   else                                                                  \
473     {                                                                   \
474       u32 _thread_index = vlib_get_thread_index ();                     \
475       _tc = tcp_connection_get (_tc_index, _thread_index);              \
476     }                                                                   \
477   ELOG_TYPE_DECLARE (_e) =                                              \
478   {                                                                     \
479     .format = "timer-pop: %s cidx %u sidx %u",                          \
480     .format_args = "t4i4i4",                                            \
481     .n_enum_strings = 8,                                                \
482     .enum_strings = {                                                   \
483       "retransmit",                                                     \
484       "delack",                                                         \
485       "persist",                                                        \
486       "keep",                                                           \
487       "waitclose",                                                      \
488       "retransmit syn",                                                 \
489       "establish",                                                      \
490       "establish-ao",                                                   \
491     },                                                                  \
492   };                                                                    \
493   if (_tc)                                                              \
494     {                                                                   \
495       TCP_DECLARE_ETD(_tc, _e, 3);                                      \
496       ed->data[0] = _timer_id;                                          \
497       ed->data[1] = _tc->c_c_index;                                     \
498       ed->data[2] = _tc->c_s_index;                                     \
499     }                                                                   \
500   else                                                                  \
501     {                                                                   \
502       clib_warning ("pop %d for unexisting connection %d", _timer_id,   \
503                     _tc_index);                                         \
504     }                                                                   \
505 }
506
507 #else
508 #define TCP_EVT_SYN_SENT_HANDLER(_tc, ...)
509 #define TCP_EVT_SYNACK_SENT_HANDLER(_tc, ...)
510 #define TCP_EVT_SYNACK_RCVD_HANDLER(_tc, ...)
511 #define TCP_EVT_SYN_RXT_HANDLER(_tc, ...)
512 #define TCP_EVT_FIN_SENT_HANDLER(_tc, ...)
513 #define TCP_EVT_RST_SENT_HANDLER(_tc, ...)
514 #define TCP_EVT_FIN_RCVD_HANDLER(_tc, ...)
515 #define TCP_EVT_RST_RCVD_HANDLER(_tc, ...)
516 #define TCP_EVT_STATE_CHANGE_HANDLER(_tc, ...)
517 #define TCP_EVT_TIMER_POP_HANDLER(_tc_index, _timer_id, ...)
518 #endif
519
520 #if TCP_DEBUG_SM > 1 || TCP_DEBUG_ALWAYS
521 #define TCP_EVT_SEG_INVALID_HANDLER(_tc, _btcp, ...)                    \
522 {                                                                       \
523   ELOG_TYPE_DECLARE (_e) =                                              \
524   {                                                                     \
525     .format = "seg-inv: seq %u end %u rcv_las %u rcv_nxt %u rcv_wnd %u",\
526     .format_args = "i4i4i4i4i4",                                        \
527   };                                                                    \
528   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
529   ed->data[0] = _btcp.seq_number - _tc->irs;                            \
530   ed->data[1] = _btcp.seq_end - _tc->irs;                               \
531   ed->data[2] = _tc->rcv_las - _tc->irs;                                \
532   ed->data[3] = _tc->rcv_nxt - _tc->irs;                                \
533   ed->data[4] = _tc->rcv_wnd;                                           \
534 }
535
536 #define TCP_EVT_PAWS_FAIL_HANDLER(_tc, _seq, _end, ...)                 \
537 {                                                                       \
538   ELOG_TYPE_DECLARE (_e) =                                              \
539   {                                                                     \
540     .format = "paws-err: seq %u end %u tsval %u tsval_recent %u",       \
541     .format_args = "i4i4i4i4",                                          \
542   };                                                                    \
543   TCP_DECLARE_ETD(_tc, _e, 4);                                          \
544   ed->data[0] = _seq - _tc->irs;                                        \
545   ed->data[1] = _end - _tc->irs;                                        \
546   ed->data[2] = _tc->rcv_opts.tsval;                                    \
547   ed->data[3] = _tc->tsval_recent;                                      \
548 }
549
550 #define TCP_EVT_ACK_RCV_ERR_HANDLER(_tc, _type, _ack, ...)              \
551 {                                                                       \
552   ELOG_TYPE_DECLARE (_e) =                                              \
553   {                                                                     \
554     .format = "ack-err: %s ack %u snd_una %u snd_nxt %u",               \
555     .format_args = "t4i4i4i4",                                          \
556     .n_enum_strings = 3,                                                \
557     .enum_strings = {                                                   \
558       "invalid",                                                        \
559       "old",                                                            \
560       "future",                                                         \
561     },                                                                  \
562   };                                                                    \
563   TCP_DECLARE_ETD(_tc, _e, 4);                                          \
564   ed->data[0] = _type;                                                  \
565   ed->data[1] = _ack - _tc->iss;                                        \
566   ed->data[2] = _tc->snd_una - _tc->iss;                                \
567   ed->data[3] = _tc->snd_nxt - _tc->iss;                                \
568 }
569
570 #define TCP_EVT_RCV_WND_SHRUNK_HANDLER(_tc, _obs, _av, ...)             \
571 {                                                                       \
572 if (_av > 0)                                                            \
573 {                                                                       \
574   ELOG_TYPE_DECLARE (_e) =                                              \
575   {                                                                     \
576     .format = "huh?: rcv_wnd %u obsd %u av %u rcv_nxt %u rcv_las %u",   \
577     .format_args = "i4i4i4i4i4",                                        \
578   };                                                                    \
579   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
580   ed->data[0] = _tc->rcv_wnd;                                           \
581   ed->data[1] = _obs;                                                   \
582   ed->data[2] = _av;                                                    \
583   ed->data[3] = _tc->rcv_nxt - _tc->irs;                                \
584   ed->data[4] = _tc->rcv_las - _tc->irs;                                \
585 }                                                                       \
586 }
587 #else
588 #define TCP_EVT_SEG_INVALID_HANDLER(_tc, _btcp, ...)
589 #define TCP_EVT_PAWS_FAIL_HANDLER(_tc, _seq, _end, ...)
590 #define TCP_EVT_ACK_RCV_ERR_HANDLER(_tc, _type, _ack, ...)
591 #define TCP_EVT_RCV_WND_SHRUNK_HANDLER(_tc, _obs, _av, ...)
592 #endif
593
594 #if TCP_DEBUG_SM > 2 || TCP_DEBUG_ALWAYS
595
596 #define TCP_EVT_ACK_SENT_HANDLER(_tc, ...)                              \
597 {                                                                       \
598   ELOG_TYPE_DECLARE (_e) =                                              \
599   {                                                                     \
600     .format = "ack-tx: acked %u rcv_nxt %u rcv_wnd %u snd_nxt %u snd_wnd %u",\
601     .format_args = "i4i4i4i4i4",                                        \
602   };                                                                    \
603   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
604   ed->data[0] = _tc->rcv_nxt - _tc->rcv_las;                            \
605   ed->data[1] = _tc->rcv_nxt - _tc->irs;                                \
606   ed->data[2] = _tc->rcv_wnd;                                           \
607   ed->data[3] = _tc->snd_nxt - _tc->iss;                                \
608   ed->data[4] = _tc->snd_wnd;                                           \
609 }
610
611 #define TCP_EVT_ACK_RCVD_HANDLER(_tc, ...)                              \
612 {                                                                       \
613   ELOG_TYPE_DECLARE (_e) =                                              \
614   {                                                                     \
615     .format = "ack-rx: %u snd_una %u snd_wnd %u cwnd %u inflight %u",   \
616     .format_args = "i4i4i4i4i4",                                        \
617   };                                                                    \
618   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
619   ed->data[0] = _tc->bytes_acked;                                       \
620   ed->data[1] = _tc->snd_una - _tc->iss;                                \
621   ed->data[2] = _tc->snd_wnd;                                           \
622   ed->data[3] = _tc->cwnd;                                              \
623   ed->data[4] = tcp_flight_size(_tc);                                   \
624 }
625
626 #define TCP_EVT_PKTIZE_HANDLER(_tc, ...)                                \
627 {                                                                       \
628   ELOG_TYPE_DECLARE (_e) =                                              \
629   {                                                                     \
630     .format = "tx: una %u snd_nxt %u space %u flight %u rcv_wnd %u",\
631     .format_args = "i4i4i4i4i4",                                        \
632   };                                                                    \
633   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
634   ed->data[0] = _tc->snd_una - _tc->iss;                                \
635   ed->data[1] = _tc->snd_nxt - _tc->iss;                                \
636   ed->data[2] = tcp_available_output_snd_space (_tc);                   \
637   ed->data[3] = tcp_flight_size (_tc);                                  \
638   ed->data[4] = _tc->rcv_wnd;                                           \
639 }
640
641 #define TCP_EVT_INPUT_HANDLER(_tc, _type, _len, _written, ...)          \
642 {                                                                       \
643   ELOG_TYPE_DECLARE (_e) =                                              \
644   {                                                                     \
645     .format = "in: %s len %u written %d rcv_nxt %u rcv_wnd(o) %d",      \
646     .format_args = "t4i4i4i4i4",                                        \
647     .n_enum_strings = 2,                                                \
648     .enum_strings = {                                                   \
649       "order",                                                          \
650       "ooo",                                                            \
651     },                                                                  \
652   };                                                                    \
653   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
654   ed->data[0] = _type;                                                  \
655   ed->data[1] = _len;                                                   \
656   ed->data[2] = _written;                                               \
657   ed->data[3] = (_tc->rcv_nxt - _tc->irs) + _written;                   \
658   ed->data[4] = _tc->rcv_wnd - (_tc->rcv_nxt - _tc->rcv_las);           \
659 }
660
661 #else
662 #define TCP_EVT_ACK_SENT_HANDLER(_tc, ...)
663 #define TCP_EVT_ACK_RCVD_HANDLER(_tc, ...)
664 #define TCP_EVT_PKTIZE_HANDLER(_tc, ...)
665 #define TCP_EVT_INPUT_HANDLER(_tc, _type, _len, _written, ...)
666 #endif
667
668 /*
669  * State machine verbose
670  */
671 #if TCP_DEBUG_SM > 3 || TCP_DEBUG_ALWAYS
672 #define TCP_EVT_SND_WND_HANDLER(_tc, ...)                               \
673 {                                                                       \
674   ELOG_TYPE_DECLARE (_e) =                                              \
675   {                                                                     \
676     .format = "snd-wnd update: %u ",                                    \
677     .format_args = "i4",                                                \
678   };                                                                    \
679   TCP_DECLARE_ETD(_tc, _e, 1);                                          \
680   ed->data[0] = _tc->snd_wnd;                                           \
681 }
682
683 #define TCP_EVT_OUTPUT_HANDLER(_tc, flags, n_bytes,...)                 \
684 {                                                                       \
685   ELOG_TYPE_DECLARE (_e) =                                              \
686   {                                                                     \
687     .format = "out: flags %x, bytes %u",                                \
688     .format_args = "i4i4",                                              \
689   };                                                                    \
690   TCP_DECLARE_ETD(_tc, _e, 2);                                          \
691   ed->data[0] = flags;                                                  \
692   ed->data[1] = n_bytes;                                                \
693 }
694 #else
695 #define TCP_EVT_SND_WND_HANDLER(_tc, ...)
696 #define TCP_EVT_OUTPUT_HANDLER(_tc, flags, n_bytes,...)
697 #endif
698
699 /*
700  * Congestion Control
701  */
702
703 #if TCP_DEBUG_CC || TCP_DEBUG_ALWAYS
704
705 #define TCP_EVT_CC_EVT_PRINT(_tc, _sub_evt)                             \
706 {                                                                       \
707   ELOG_TYPE_DECLARE (_e) =                                              \
708   {                                                                     \
709     .format = "cc: %s snd_space %u snd_una %u out %u flight %u",        \
710     .format_args = "t4i4i4i4i4",                                        \
711     .n_enum_strings = 7,                                                \
712     .enum_strings = {                                                   \
713       "fast-rxt",                                                       \
714       "first-rxt",                                                      \
715       "rxt-timeout",                                                    \
716       "recovered",                                                      \
717       "congestion",                                                     \
718       "undo",                                                           \
719       "recovery",                                                       \
720     },                                                                  \
721   };                                                                    \
722   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
723   ed->data[0] = _sub_evt;                                               \
724   ed->data[1] = tcp_available_cc_snd_space (_tc);                       \
725   ed->data[2] = _tc->snd_una - _tc->iss;                                \
726   ed->data[3] = tcp_bytes_out(_tc);                                     \
727   ed->data[4] = tcp_flight_size (_tc);                                  \
728 }
729
730 #define TCP_EVT_CC_EVT_HANDLER(_tc, _sub_evt, ...)                      \
731 {                                                                       \
732   if (_tc->snd_una != _tc->iss)                                         \
733     TCP_EVT_CC_STAT_PRINT (_tc);                                        \
734   if ((_sub_evt <= 1 && TCP_DEBUG_CC > 1)                               \
735       || (_sub_evt > 1 && TCP_DEBUG_CC > 0))                            \
736       TCP_EVT_CC_EVT_PRINT (_tc, _sub_evt);                             \
737 }
738 #else
739 #define TCP_EVT_CC_EVT_HANDLER(_tc, _sub_evt, ...)                      \
740
741 #endif
742
743 #if TCP_DEBUG_CC > 1 || TCP_DEBUG_ALWAYS
744 #define TCP_EVT_CC_RTX_HANDLER(_tc, offset, n_bytes, ...)               \
745 {                                                                       \
746   ELOG_TYPE_DECLARE (_e) =                                              \
747   {                                                                     \
748     .format = "rxt: snd_nxt %u offset %u snd %u rxt %u",                \
749     .format_args = "i4i4i4i4",                                          \
750   };                                                                    \
751   TCP_DECLARE_ETD(_tc, _e, 4);                                          \
752   ed->data[0] = _tc->snd_nxt - _tc->iss;                                \
753   ed->data[1] = offset;                                                 \
754   ed->data[2] = n_bytes;                                                \
755   ed->data[3] = _tc->snd_rxt_bytes;                                     \
756 }
757
758 #define TCP_EVT_DUPACK_SENT_HANDLER(_tc, _btcp, ...)                    \
759 {                                                                       \
760   ELOG_TYPE_DECLARE (_e) =                                              \
761   {                                                                     \
762     .format = "dack-tx: rcv_nxt %u seq %u rcv_wnd %u snd_nxt %u av_wnd %u",\
763     .format_args = "i4i4i4i4i4",                                        \
764   };                                                                    \
765   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
766   ed->data[0] = _tc->rcv_nxt - _tc->irs;                                \
767   ed->data[1] = _btcp.seq_number - _tc->irs;                            \
768   ed->data[2] = _tc->rcv_wnd;                                           \
769   ed->data[3] = _tc->snd_nxt - _tc->iss;                                \
770   ed->data[4] = tcp_available_snd_wnd(_tc);                             \
771 }
772
773 #define TCP_EVT_DUPACK_RCVD_HANDLER(_tc, ...)                           \
774 {                                                                       \
775   ELOG_TYPE_DECLARE (_e) =                                              \
776   {                                                                     \
777     .format = "dack-rx: snd_una %u cwnd %u snd_wnd %u flight %u rcv_wnd %u",\
778     .format_args = "i4i4i4i4i4",                                        \
779   };                                                                    \
780   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
781   ed->data[0] = _tc->snd_una - _tc->iss;                                \
782   ed->data[1] = _tc->cwnd;                                              \
783   ed->data[2] = _tc->snd_wnd;                                           \
784   ed->data[3] = tcp_flight_size(_tc);                                   \
785   ed->data[4] = _tc->rcv_wnd;                                           \
786 }
787
788 #define TCP_EVT_CC_PACK_HANDLER(_tc, ...)                               \
789 {                                                                       \
790   ELOG_TYPE_DECLARE (_e) =                                              \
791   {                                                                     \
792     .format = "pack: snd_una %u snd_nxt %u",                            \
793     .format_args = "i4i4",                                              \
794   };                                                                    \
795   TCP_DECLARE_ETD(_tc, _e, 2);                                          \
796   ed->data[0] = _tc->snd_una - _tc->iss;                                \
797   ed->data[1] = _tc->snd_nxt - _tc->iss;                                \
798 }
799 #define TCP_EVT_CC_SCOREBOARD_HANDLER(_tc, ...)                         \
800 {                                                                       \
801 if (TCP_DEBUG_CC > 1 && _tc->sack_sb.last_sacked_bytes)                 \
802   {                                                                     \
803     ELOG_TYPE_DECLARE (_e) =                                            \
804     {                                                                   \
805       .format = "sb1: holes %u lost %u sacked %u high %u highrxt %u",   \
806       .format_args = "i4i4i4i4i4",                                      \
807     };                                                                  \
808     TCP_DECLARE_ETD(_tc, _e, 5);                                        \
809     ed->data[0] = pool_elts(_tc->sack_sb.holes);                        \
810     ed->data[1] = _tc->sack_sb.lost_bytes;                              \
811     ed->data[2] = _tc->sack_sb.sacked_bytes;                            \
812     ed->data[3] = _tc->sack_sb.high_sacked - _tc->iss;                  \
813     ed->data[4] = _tc->sack_sb.high_rxt - _tc->iss;                     \
814   }                                                                     \
815 if (TCP_DEBUG_CC > 1 && _tc->sack_sb.last_sacked_bytes)                 \
816   {                                                                     \
817     sack_scoreboard_hole_t *hole;                                       \
818     hole = scoreboard_first_hole (&_tc->sack_sb);                       \
819     ELOG_TYPE_DECLARE (_e) =                                            \
820     {                                                                   \
821       .format = "sb2: first start: %u end %u last start %u end %u",     \
822       .format_args = "i4i4i4i4",                                        \
823     };                                                                  \
824     TCP_DECLARE_ETD(_tc, _e, 4);                                        \
825     ed->data[0] = hole ? hole->start - _tc->iss : 0;                    \
826     ed->data[1] = hole ? hole->end - _tc->iss : 0;                      \
827     hole = scoreboard_last_hole (&_tc->sack_sb);                        \
828     ed->data[2] = hole ? hole->start - _tc->iss : 0;                    \
829     ed->data[3] = hole ? hole->end - _tc->iss : 0;                      \
830   }                                                                     \
831 }
832 #define TCP_EVT_CC_SACKS_HANDLER(_tc, ...)                              \
833 {                                                                       \
834 if (TCP_DEBUG_CC > 1)                                                   \
835   {                                                                     \
836     ELOG_TYPE_DECLARE (_e) =                                            \
837     {                                                                   \
838       .format = "sacks: blocks %u bytes %u",                            \
839       .format_args = "i4i4",                                            \
840     };                                                                  \
841     TCP_DECLARE_ETD(_tc, _e, 2);                                        \
842     ed->data[0] = vec_len (_tc->snd_sacks);                             \
843     ed->data[1] = tcp_sack_list_bytes (_tc);                            \
844   }                                                                     \
845 }
846 #define TCP_EVT_CC_INPUT_HANDLER(_tc, _len, _written, ...)              \
847 {                                                                       \
848   ELOG_TYPE_DECLARE (_e) =                                              \
849   {                                                                     \
850     .format = "cc input: len %u written %d rcv_nxt %u rcv_wnd(o) %d",   \
851     .format_args = "i4i4i4i4",                                          \
852   };                                                                    \
853   TCP_DECLARE_ETD(_tc, _e, 4);                                          \
854   ed->data[0] = _len;                                                   \
855   ed->data[1] = _written;                                               \
856   ed->data[2] = _tc->rcv_nxt - _tc->irs;                                \
857   ed->data[3] = _tc->rcv_wnd - (_tc->rcv_nxt - _tc->rcv_las);           \
858 }
859 #else
860 #define TCP_EVT_CC_RTX_HANDLER(_tc, offset, n_bytes, ...)
861 #define TCP_EVT_DUPACK_SENT_HANDLER(_tc, _btcp, ...)
862 #define TCP_EVT_DUPACK_RCVD_HANDLER(_tc, ...)
863 #define TCP_EVT_CC_PACK_HANDLER(_tc, ...)
864 #define TCP_EVT_CC_SCOREBOARD_HANDLER(_tc, ...)
865 #define TCP_EVT_CC_SACKS_HANDLER(_tc, ...)
866 #define TCP_EVT_CC_INPUT_HANDLER(_tc, _len, _written, ...)
867 #endif
868
869 /*
870  * Congestion control stats
871  */
872 #if TCP_DEBUG_CS || TCP_DEBUG_ALWAYS
873
874 #define STATS_INTERVAL 0.001
875
876 #define tcp_cc_time_to_print_stats(_tc)                                       \
877   _tc->c_cc_stat_tstamp + STATS_INTERVAL <                                    \
878       tcp_time_now_us (_tc->c_thread_index) ||                                \
879     tcp_in_fastrecovery (_tc)
880
881 #define TCP_EVT_CC_RTO_STAT_PRINT(_tc)                                  \
882 {                                                                       \
883   ELOG_TYPE_DECLARE (_e) =                                              \
884   {                                                                     \
885     .format = "rcv_stat: rto %u srtt %u mrtt-us %u rttvar %u",          \
886     .format_args = "i4i4i4i4",                                          \
887   };                                                                    \
888   TCP_DECLARE_ETD(_tc, _e, 4);                                          \
889   ed->data[0] = _tc->rto;                                               \
890   ed->data[1] = _tc->srtt;                                              \
891   ed->data[2] = (u32) (_tc->mrtt_us * 1e6);                             \
892   ed->data[3] = _tc->rttvar;                                            \
893 }
894
895 #define TCP_EVT_CC_RTO_STAT_HANDLER(_tc, ...)                                 \
896   {                                                                           \
897     if (tcp_cc_time_to_print_stats (_tc))                                     \
898       {                                                                       \
899         TCP_EVT_CC_RTO_STAT_PRINT (_tc);                                      \
900         _tc->c_cc_stat_tstamp = tcp_time_now_us (_tc->c_thread_index);        \
901       }                                                                       \
902   }
903
904 #define TCP_EVT_CC_SND_STAT_PRINT(_tc)                                  \
905 {                                                                       \
906   ELOG_TYPE_DECLARE (_e) =                                              \
907   {                                                                     \
908     .format = "snd_stat: cc_space %u sacked %u lost %u out %u rxt %u",  \
909     .format_args = "i4i4i4i4i4",                                        \
910   };                                                                    \
911   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
912   ed->data[0] = tcp_available_cc_snd_space (_tc);                       \
913   ed->data[1] = _tc->sack_sb.sacked_bytes;                              \
914   ed->data[2] = _tc->sack_sb.lost_bytes;                                \
915   ed->data[3] = tcp_bytes_out (_tc);                                    \
916   ed->data[3] = _tc->snd_rxt_bytes;                                     \
917 }
918
919 #define TCP_EVT_CC_SND_STAT_HANDLER(_tc, ...)                                 \
920   {                                                                           \
921     if (tcp_cc_time_to_print_stats (_tc))                                     \
922       {                                                                       \
923         TCP_EVT_CC_SND_STAT_PRINT (_tc);                                      \
924         _tc->c_cc_stat_tstamp = tcp_time_now_us (_tc->c_thread_index);        \
925       }                                                                       \
926   }
927
928 #define TCP_EVT_CC_STAT_PRINT(_tc)                                      \
929 {                                                                       \
930   ELOG_TYPE_DECLARE (_e) =                                              \
931   {                                                                     \
932     .format = "cc_stat: cwnd %u flight %u space %u ssthresh %u snd_wnd %u",\
933     .format_args = "i4i4i4i4i4",                                        \
934   };                                                                    \
935   TCP_DECLARE_ETD(_tc, _e, 5);                                          \
936   ed->data[0] = _tc->cwnd;                                              \
937   ed->data[1] = tcp_flight_size (_tc);                                  \
938   ed->data[2] = tcp_snd_space (_tc);                                    \
939   ed->data[3] = _tc->ssthresh;                                          \
940   ed->data[4] = _tc->snd_wnd;                                           \
941   TCP_EVT_CC_RTO_STAT_PRINT (_tc);                                      \
942   TCP_EVT_CC_SND_STAT_PRINT (_tc);                                      \
943 }
944
945 #define TCP_EVT_CC_STAT_HANDLER(_tc, ...)                                     \
946   {                                                                           \
947     if (tcp_cc_time_to_print_stats (_tc))                                     \
948       {                                                                       \
949         TCP_EVT_CC_STAT_PRINT (_tc);                                          \
950         _tc->c_cc_stat_tstamp = tcp_time_now_us (_tc->c_thread_index);        \
951       }                                                                       \
952   }
953 #else
954 #define TCP_EVT_CC_STAT_HANDLER(_tc, ...)
955 #define TCP_EVT_CC_STAT_PRINT(_tc)
956 #endif
957
958 /*
959  * Buffer allocation
960  */
961 #if TCP_DEBUG_BUF_ALLOC
962
963 #define TCP_DBG_BUFFER_ALLOC_MAYBE_FAIL(thread_index)                   \
964 {                                                                       \
965   static u32 *buffer_fail_counters;                                     \
966   if (PREDICT_FALSE (buffer_fail_counters == 0))                        \
967     {                                                                   \
968       u32 num_threads;                                                  \
969       vlib_thread_main_t *vtm = vlib_get_thread_main ();                \
970       num_threads = 1 /* main thread */  + vtm->n_threads;              \
971       vec_validate (buffer_fail_counters, num_threads - 1);             \
972     }                                                                   \
973   if (PREDICT_FALSE (tcp_cfg.buffer_fail_fraction != 0.0))              \
974     {                                                                   \
975       if (PREDICT_TRUE (buffer_fail_counters[thread_index] > 0))        \
976         {                                                               \
977           if ((1.0 / (f32) (buffer_fail_counters[thread_index]))        \
978               < tcp_cfg.buffer_fail_fraction)                           \
979             {                                                           \
980               buffer_fail_counters[thread_index] = 0.0000001;           \
981               return -1;                                                \
982             }                                                           \
983         }                                                               \
984       buffer_fail_counters[thread_index] ++;                            \
985     }                                                                   \
986 }
987 #else
988 #define TCP_DBG_BUFFER_ALLOC_MAYBE_FAIL(thread_index)
989 #endif
990
991 #endif /* SRC_VNET_TCP_TCP_DEBUG_H_ */
992 /*
993  * fd.io coding-style-patch-verification: ON
994  *
995  * Local Variables:
996  * eval: (c-set-style "gnu")
997  * End:
998  */