FD.io VPP  v21.01.1
Vector Packet Processing
tcp_debug.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 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 #include <vnet/tcp/tcp_debug.h>
16 
18 
19 void
21 {
23  u32 fl_len, track_index;
24 
25  fl_len = vec_len (tdm->free_track_indices);
26  if (fl_len)
27  {
28  track_index = tdm->free_track_indices[fl_len - 1];
29  _vec_len (tdm->free_track_indices) -= 1;
30  et->track_index_plus_one = track_index + 1;
31  }
32  else
34 }
35 
36 static const char *tcp_evt_grp_str[] = {
37 #define _(sym, str) str,
39 #undef _
40 };
41 
42 static void
44 {
47  int i = 0;
48 
49  vlib_cli_output (vm, "%-10s%-30s%-10s", "Index", "Group", "Level");
50 
51  for (i = 0; i < TCP_EVT_N_GRP; i++)
52  vlib_cli_output (vm, "%-10d%-30s%-10d", i, tcp_evt_grp_str[i],
53  tdm->grp_dbg_lvl[i]);
54 }
55 
56 static void
58 {
60  int i, have_enabled = 0;
61 
62  if (tdm->grp_dbg_lvl[TCP_EVT_GRP_LC])
63  return;
64 
65  for (i = 0; i < TCP_EVT_N_GRP; i++)
66  {
67  if (tdm->grp_dbg_lvl[i])
68  {
69  have_enabled = 1;
70  break;
71  }
72  }
73 
74  /* Make sure LC is enabled for track initialization */
75  if (have_enabled)
76  tdm->grp_dbg_lvl[TCP_EVT_GRP_LC] = 1;
77 }
78 
79 static clib_error_t *
81  vlib_cli_command_t * cmd)
82 {
83  unformat_input_t _line_input, *line_input = &_line_input;
85  u32 group = ~0, level = ~0;
86  clib_error_t *error = 0;
87  u8 is_show = 0;
88 
89  if (!TCP_DEBUG_ALWAYS)
90  return clib_error_return (0, "must compile with TCP_DEBUG_ALWAYS set");
91 
92  if (!unformat_user (input, unformat_line_input, line_input))
93  return clib_error_return (0, "expected enable | disable");
94 
95  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
96  {
97  if (unformat (line_input, "show"))
98  is_show = 1;
99  else if (unformat (line_input, "group %d", &group))
100  ;
101  else if (unformat (line_input, "level %d", &level))
102  ;
103  else
104  {
105  error = clib_error_return (0, "unknown input `%U'",
106  format_unformat_error, line_input);
107  goto done;
108  }
109  }
110 
111  if (is_show)
112  {
114  goto done;
115  }
116  if (group >= TCP_EVT_N_GRP)
117  {
118  error = clib_error_return (0, "group out of bounds");
119  goto done;
120  }
121  if (group == ~0 || level == ~0)
122  {
123  error = clib_error_return (0, "group and level must be set");
124  goto done;
125  }
126 
127  tdm->grp_dbg_lvl[group] = level;
128 
130 
131 done:
132 
133  unformat_free (line_input);
134  return error;
135 }
136 
137 /* *INDENT-OFF* */
138 VLIB_CLI_COMMAND (tcp_debug_command, static) =
139 {
140  .path = "tcp debug",
141  .short_help = "tcp [show] [debug group <N> level <N>]",
142  .function = tcp_debug_fn,
143 };
144 /* *INDENT-ON* */
145 
146 /*
147  * fd.io coding-style-patch-verification: ON
148  *
149  * Local Variables:
150  * eval: (c-set-style "gnu")
151  * End:
152  */
vlib_main_t vlib_global_main
Definition: main.c:2041
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:989
vlib_main_t * vm
Definition: in2out_ed.c:1580
static clib_error_t * tcp_debug_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: tcp_debug.c:80
u32 * free_track_indices
Definition: tcp_debug.h:70
unsigned char u8
Definition: types.h:56
#define foreach_tcp_evt_grp
Definition: tcp_debug.h:53
#define clib_error_return(e, args...)
Definition: error.h:99
unsigned int u32
Definition: types.h:88
u8 grp_dbg_lvl[TCP_EVT_N_GRP]
Definition: tcp_debug.h:69
unformat_function_t unformat_line_input
Definition: format.h:282
Definition: cJSON.c:84
struct _unformat_input_t unformat_input_t
static void tcp_debug_check_lc(void)
Definition: tcp_debug.c:57
#define UNFORMAT_END_OF_INPUT
Definition: format.h:144
sll srl srl sll sra u16x4 i
Definition: vector_sse42.h:317
static void tcp_debug_show_groups(void)
Definition: tcp_debug.c:43
elog_main_t elog_main
Definition: main.h:224
u32 track_index_plus_one
Set to one when track has been added to main structure.
Definition: elog.h:120
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:158
void tcp_evt_track_register(elog_track_t *et)
Definition: tcp_debug.c:20
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:696
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
#define TCP_DEBUG_ALWAYS
Build debugging infra unconditionally.
Definition: tcp_debug.h:26
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static void unformat_free(unformat_input_t *i)
Definition: format.h:162
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
tcp_dbg_main_t tcp_dbg_main
Definition: tcp_debug.c:17
static const char * tcp_evt_grp_str[]
Definition: tcp_debug.c:36
__clib_export word elog_track_register(elog_main_t *em, elog_track_t *t)
register an event track
Definition: elog.c:198
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:170