misc: remove GNU Indent directives
[vpp.git] / src / plugins / lacp / cli.c
1 /*
2  * Copyright (c) 2017 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 #define _GNU_SOURCE
17 #include <vnet/bonding/node.h>
18 #include <lacp/node.h>
19
20 int
21 lacp_dump_ifs (lacp_interface_details_t ** out_lacpifs)
22 {
23   vnet_main_t *vnm = vnet_get_main ();
24   bond_main_t *bm = &bond_main;
25   member_if_t *mif;
26   bond_if_t *bif;
27   vnet_hw_interface_t *hi;
28   lacp_interface_details_t *r_lacpifs = NULL;
29   lacp_interface_details_t *lacpif = NULL;
30
31   pool_foreach (mif, bm->neighbors) {
32     if (mif->lacp_enabled == 0)
33       continue;
34     vec_add2(r_lacpifs, lacpif, 1);
35     clib_memset (lacpif, 0, sizeof (*lacpif));
36     lacpif->sw_if_index = mif->sw_if_index;
37     hi = vnet_get_hw_interface (vnm, mif->hw_if_index);
38     clib_memcpy(lacpif->interface_name, hi->name,
39                 MIN (ARRAY_LEN (lacpif->interface_name) - 1,
40                      vec_len (hi->name)));
41     bif = bond_get_bond_if_by_dev_instance (mif->bif_dev_instance);
42     hi = vnet_get_hw_interface (vnm, bif->hw_if_index);
43     clib_memcpy(lacpif->bond_interface_name, hi->name,
44                 MIN (ARRAY_LEN (lacpif->bond_interface_name) - 1,
45                      vec_len (hi->name)));
46     clib_memcpy (lacpif->actor_system, mif->actor.system, 6);
47     lacpif->actor_system_priority = mif->actor.system_priority;
48     lacpif->actor_key = mif->actor.key;
49     lacpif->actor_port_priority = mif->actor.port_priority;
50     lacpif->actor_port_number = mif->actor.port_number;
51     lacpif->actor_state = mif->actor.state;
52     clib_memcpy (lacpif->partner_system, mif->partner.system, 6);
53     lacpif->partner_system_priority = mif->partner.system_priority;
54     lacpif->partner_key = mif->partner.key;
55     lacpif->partner_port_priority = mif->partner.port_priority;
56     lacpif->partner_port_number = mif->partner.port_number;
57     lacpif->partner_state = mif->partner.state;
58     lacpif->rx_state = mif->rx_state;
59     lacpif->tx_state = mif->tx_state;
60     lacpif->ptx_state = mif->ptx_state;
61     lacpif->mux_state = mif->mux_state;
62   }
63
64   *out_lacpifs = r_lacpifs;
65
66   return 0;
67 }
68
69 static void
70 show_lacp (vlib_main_t * vm, u32 * sw_if_indices)
71 {
72   int i;
73   member_if_t *mif;
74   bond_if_t *bif;
75
76   if (!sw_if_indices)
77     return;
78
79   vlib_cli_output (vm, "%-55s %-32s %-32s", " ", "actor state",
80                    "partner state");
81   vlib_cli_output (vm, "%-25s %-12s %-16s %-31s  %-31s", "interface name",
82                    "sw_if_index", "bond interface",
83                    "exp/def/dis/col/syn/agg/tim/act",
84                    "exp/def/dis/col/syn/agg/tim/act");
85
86   for (i = 0; i < vec_len (sw_if_indices); i++)
87     {
88       mif = bond_get_member_by_sw_if_index (sw_if_indices[i]);
89       if (!mif || (mif->lacp_enabled == 0))
90         continue;
91       bif = bond_get_bond_if_by_dev_instance (mif->bif_dev_instance);
92       vlib_cli_output (vm,
93                        "%-25U %-12d %-16U %3x %3x %3x %3x %3x %3x %3x %3x "
94                        "%4x %3x %3x %3x %3x %3x %3x %3x",
95                        format_vnet_sw_if_index_name, vnet_get_main (),
96                        mif->sw_if_index, mif->sw_if_index,
97                        format_vnet_sw_if_index_name, vnet_get_main (),
98                        bif->sw_if_index, lacp_bit_test (mif->actor.state, 7),
99                        lacp_bit_test (mif->actor.state, 6),
100                        lacp_bit_test (mif->actor.state, 5),
101                        lacp_bit_test (mif->actor.state, 4),
102                        lacp_bit_test (mif->actor.state, 3),
103                        lacp_bit_test (mif->actor.state, 2),
104                        lacp_bit_test (mif->actor.state, 1),
105                        lacp_bit_test (mif->actor.state, 0),
106                        lacp_bit_test (mif->partner.state, 7),
107                        lacp_bit_test (mif->partner.state, 6),
108                        lacp_bit_test (mif->partner.state, 5),
109                        lacp_bit_test (mif->partner.state, 4),
110                        lacp_bit_test (mif->partner.state, 3),
111                        lacp_bit_test (mif->partner.state, 2),
112                        lacp_bit_test (mif->partner.state, 1),
113                        lacp_bit_test (mif->partner.state, 0));
114       vlib_cli_output (vm,
115                        "  LAG ID: "
116                        "[(%04x,%02x-%02x-%02x-%02x-%02x-%02x,%04x,%04x,%04x), "
117                        "(%04x,%02x-%02x-%02x-%02x-%02x-%02x,%04x,%04x,%04x)]",
118                        ntohs (mif->actor.system_priority),
119                        mif->actor.system[0], mif->actor.system[1],
120                        mif->actor.system[2], mif->actor.system[3],
121                        mif->actor.system[4], mif->actor.system[5],
122                        ntohs (mif->actor.key),
123                        ntohs (mif->actor.port_priority),
124                        ntohs (mif->actor.port_number),
125                        ntohs (mif->partner.system_priority),
126                        mif->partner.system[0], mif->partner.system[1],
127                        mif->partner.system[2], mif->partner.system[3],
128                        mif->partner.system[4], mif->partner.system[5],
129                        ntohs (mif->partner.key),
130                        ntohs (mif->partner.port_priority),
131                        ntohs (mif->partner.port_number));
132       vlib_cli_output (vm,
133                        "  RX-state: %U, TX-state: %U, "
134                        "MUX-state: %U, PTX-state: %U",
135                        format_rx_sm_state, mif->rx_state, format_tx_sm_state,
136                        mif->tx_state, format_mux_sm_state, mif->mux_state,
137                        format_ptx_sm_state, mif->ptx_state);
138     }
139 }
140
141 static void
142 show_lacp_details (vlib_main_t * vm, u32 * sw_if_indices)
143 {
144   lacp_main_t *lm = &lacp_main;
145   member_if_t *mif;
146   lacp_state_struct *state_entry;
147   int i;
148   f64 now;
149
150   vlib_cli_output (vm, "Number of interfaces: %d", lm->lacp_int);
151   if (!sw_if_indices)
152     return;
153
154   now = vlib_time_now (vm);
155   for (i = 0; i < vec_len (sw_if_indices); i++)
156     {
157       mif = bond_get_member_by_sw_if_index (sw_if_indices[i]);
158       if (!mif || (mif->lacp_enabled == 0))
159         continue;
160       vlib_cli_output (vm, "  %U", format_vnet_sw_if_index_name,
161                        vnet_get_main (), mif->sw_if_index);
162       vlib_cli_output (vm, "    Good LACP PDUs received: %llu",
163                        mif->pdu_received);
164       vlib_cli_output (vm, "    Bad LACP PDUs received: %llu",
165                        mif->bad_pdu_received);
166       vlib_cli_output (vm, "    LACP PDUs sent: %llu", mif->pdu_sent);
167       if (lacp_timer_is_running (mif->last_lacpdu_recd_time))
168         vlib_cli_output (vm,
169                          "    last LACP PDU received: %10.2f seconds ago",
170                          now - mif->last_lacpdu_recd_time);
171       if (lacp_timer_is_running (mif->last_lacpdu_sent_time))
172         vlib_cli_output (vm, "    last LACP PDU sent: %10.2f seconds ago",
173                          now - mif->last_lacpdu_sent_time);
174       vlib_cli_output (vm, "    Good Marker PDUs received: %llu",
175                        mif->marker_pdu_received);
176       vlib_cli_output (vm, "    Bad Marker PDUs received: %llu",
177                        mif->marker_bad_pdu_received);
178       if (lacp_timer_is_running (mif->last_marker_pdu_recd_time))
179         vlib_cli_output (vm,
180                          "    last Marker PDU received: %10.2f seconds ago",
181                          now - mif->last_marker_pdu_recd_time);
182       if (lacp_timer_is_running (mif->last_marker_pdu_sent_time))
183         vlib_cli_output (vm, "    last Marker PDU sent: %10.2f seconds ago",
184                          now - mif->last_marker_pdu_sent_time);
185       vlib_cli_output (vm, "    debug: %d", mif->debug);
186       vlib_cli_output (vm, "    loopback port: %d", mif->loopback_port);
187       vlib_cli_output (vm, "    port_enabled: %d", mif->port_enabled);
188       vlib_cli_output (vm, "    port moved: %d", mif->port_moved);
189       vlib_cli_output (vm, "    ready_n: %d", mif->ready_n);
190       vlib_cli_output (vm, "    ready: %d", mif->ready);
191       vlib_cli_output (vm, "    Actor");
192       vlib_cli_output (vm, "      system: %U",
193                        format_ethernet_address, mif->actor.system);
194       vlib_cli_output (vm, "      system priority: %u",
195                        ntohs (mif->actor.system_priority));
196       vlib_cli_output (vm, "      key: %u", ntohs (mif->actor.key));
197       vlib_cli_output (vm, "      port priority: %u",
198                        ntohs (mif->actor.port_priority));
199       vlib_cli_output (vm, "      port number: %u",
200                        ntohs (mif->actor.port_number));
201       vlib_cli_output (vm, "      state: 0x%x", mif->actor.state);
202
203       state_entry = (lacp_state_struct *) & lacp_state_array;
204       while (state_entry->str)
205         {
206           if (mif->actor.state & (1 << state_entry->bit))
207             vlib_cli_output (vm, "        %s (%d)", state_entry->str,
208                              state_entry->bit);
209           state_entry++;
210         }
211
212       vlib_cli_output (vm, "    Partner");
213       vlib_cli_output (vm, "      system: %U",
214                        format_ethernet_address, mif->partner.system);
215       vlib_cli_output (vm, "      system priority: %u",
216                        ntohs (mif->partner.system_priority));
217       vlib_cli_output (vm, "      key: %u", ntohs (mif->partner.key));
218       vlib_cli_output (vm, "      port priority: %u",
219                        ntohs (mif->partner.port_priority));
220       vlib_cli_output (vm, "      port number: %u",
221                        ntohs (mif->partner.port_number));
222       vlib_cli_output (vm, "      state: 0x%x", mif->partner.state);
223
224       state_entry = (lacp_state_struct *) & lacp_state_array;
225       while (state_entry->str)
226         {
227           if (mif->partner.state & (1 << state_entry->bit))
228             vlib_cli_output (vm, "        %s (%d)", state_entry->str,
229                              state_entry->bit);
230           state_entry++;
231         }
232
233       if (!lacp_timer_is_running (mif->wait_while_timer))
234         vlib_cli_output (vm, "      wait while timer: not running");
235       else
236         vlib_cli_output (vm, "      wait while timer: %10.2f seconds",
237                          mif->wait_while_timer - now);
238       if (!lacp_timer_is_running (mif->current_while_timer))
239         vlib_cli_output (vm, "      current while timer: not running");
240       else
241         vlib_cli_output (vm, "      current while timer: %10.2f seconds",
242                          mif->current_while_timer - now);
243       if (!lacp_timer_is_running (mif->periodic_timer))
244         vlib_cli_output (vm, "      periodic timer: not running");
245       else
246         vlib_cli_output (vm, "      periodic timer: %10.2f seconds",
247                          mif->periodic_timer - now);
248       vlib_cli_output (vm, "    RX-state: %U", format_rx_sm_state,
249                        mif->rx_state);
250       vlib_cli_output (vm, "    TX-state: %U", format_tx_sm_state,
251                        mif->tx_state);
252       vlib_cli_output (vm, "    MUX-state: %U", format_mux_sm_state,
253                        mif->mux_state);
254       vlib_cli_output (vm, "    PTX-state: %U", format_ptx_sm_state,
255                        mif->ptx_state);
256       vlib_cli_output (vm, "\n");
257     }
258 }
259
260 static clib_error_t *
261 show_lacp_fn (vlib_main_t * vm, unformat_input_t * input,
262               vlib_cli_command_t * cmd)
263 {
264   bond_main_t *bm = &bond_main;
265   vnet_main_t *vnm = &vnet_main;
266   member_if_t *mif;
267   clib_error_t *error = 0;
268   u8 details = 0;
269   u32 sw_if_index, *sw_if_indices = 0;
270
271   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
272     {
273       if (unformat
274           (input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
275         {
276           mif = bond_get_member_by_sw_if_index (sw_if_index);
277           if (!mif)
278             {
279               error = clib_error_return (0, "interface is not a member");
280               goto done;
281             }
282           vec_add1 (sw_if_indices, mif->sw_if_index);
283         }
284       else if (unformat (input, "details"))
285         details = 1;
286       else
287         {
288           error = clib_error_return (0, "unknown input `%U'",
289                                      format_unformat_error, input);
290           goto done;
291         }
292     }
293
294   if (vec_len (sw_if_indices) == 0)
295     {
296       pool_foreach (mif, bm->neighbors)
297         vec_add1 (sw_if_indices, mif->sw_if_index);
298     }
299
300   if (details)
301     show_lacp_details (vm, sw_if_indices);
302   else
303     show_lacp (vm, sw_if_indices);
304
305 done:
306   vec_free (sw_if_indices);
307   return error;
308 }
309
310 VLIB_CLI_COMMAND (show_lacp_command, static) = {
311   .path = "show lacp",
312   .short_help = "show lacp [<interface>] [details]",
313   .function = show_lacp_fn,
314   .is_mp_safe = 1,
315 };
316
317 static clib_error_t *
318 debug_lacp_command_fn (vlib_main_t * vm, unformat_input_t * input,
319                        vlib_cli_command_t * cmd)
320 {
321   unformat_input_t _line_input, *line_input = &_line_input;
322   clib_error_t *error = NULL;
323   lacp_main_t *lm = &lacp_main;
324   u8 onoff = 0;
325   u8 input_found = 0;
326   u32 sw_if_index = ~0;
327   member_if_t *mif;
328   vnet_main_t *vnm = vnet_get_main ();
329
330   /* Get a line of input. */
331   if (!unformat_user (input, unformat_line_input, line_input))
332     return clib_error_return (0, "missing argument");
333
334   while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
335     {
336       if (unformat (line_input, "%U",
337                     unformat_vnet_sw_interface, vnm, &sw_if_index))
338         ;
339       if (input_found)
340         {
341           error = clib_error_return (0, "unknown input `%U'",
342                                      format_unformat_error, line_input);
343           goto done;
344         }
345       else if (unformat (line_input, "on"))
346         {
347           input_found = 1;
348           onoff = 1;
349         }
350       else if (unformat (line_input, "off"))
351         {
352           input_found = 1;
353           onoff = 0;
354         }
355       else
356         {
357           error = clib_error_return (0, "unknown input `%U'",
358                                      format_unformat_error, line_input);
359           goto done;
360         }
361     }
362
363   if (!input_found)
364     return clib_error_return (0, "must specify on or off");
365
366   if (sw_if_index != ~0)
367     {
368       mif = bond_get_member_by_sw_if_index (sw_if_index);
369       if (!mif)
370         return (clib_error_return
371                 (0, "Please add the member interface first"));
372       mif->debug = onoff;
373     }
374   else
375     lm->debug = onoff;
376
377 done:
378   unformat_free (line_input);
379
380   return error;
381 }
382
383 VLIB_CLI_COMMAND (debug_lacp_command, static) = {
384     .path = "debug lacp",
385     .short_help = "debug lacp <interface> <on | off>",
386     .function = debug_lacp_command_fn,
387 };
388
389 clib_error_t *
390 lacp_cli_init (vlib_main_t * vm)
391 {
392   lacp_main_t *lm = &lacp_main;
393
394   lm->vlib_main = vm;
395   lm->vnet_main = vnet_get_main ();
396
397   return 0;
398 }
399
400 VLIB_INIT_FUNCTION (lacp_cli_init);
401
402 /*
403  * fd.io coding-style-patch-verification: ON
404  *
405  * Local Variables:
406  * eval: (c-set-style "gnu")
407  * End:
408  */