/* * Copyright (c) 2017 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define _GNU_SOURCE #include <vnet/bonding/node.h> #include <lacp/node.h> int lacp_dump_ifs (lacp_interface_details_t ** out_lacpifs) { vnet_main_t *vnm = vnet_get_main (); bond_main_t *bm = &bond_main; slave_if_t *sif; bond_if_t *bif; vnet_hw_interface_t *hi; lacp_interface_details_t *r_lacpifs = NULL; lacp_interface_details_t *lacpif = NULL; /* *INDENT-OFF* */ pool_foreach (sif, bm->neighbors, if (sif->lacp_enabled == 0) continue; vec_add2(r_lacpifs, lacpif, 1); clib_memset (lacpif, 0, sizeof (*lacpif)); lacpif->sw_if_index = sif->sw_if_index; hi = vnet_get_hw_interface (vnm, sif->hw_if_index); clib_memcpy(lacpif->interface_name, hi->name, MIN (ARRAY_LEN (lacpif->interface_name) - 1, strlen ((const char *) hi->name))); bif = bond_get_master_by_dev_instance (sif->bif_dev_instance); hi = vnet_get_hw_interface (vnm, bif->hw_if_index); clib_memcpy(lacpif->bond_interface_name, hi->name, MIN (ARRAY_LEN (lacpif->bond_interface_name) - 1, strlen ((const char *) hi->name))); clib_memcpy (lacpif->actor_system, sif->actor.system, 6); lacpif->actor_system_priority = sif->actor.system_priority; lacpif->actor_key = sif->actor.key; lacpif->actor_port_priority = sif->actor.port_priority; lacpif->actor_port_number = sif->actor.port_number; lacpif->actor_state = sif->actor.state; clib_memcpy (lacpif->partner_system, sif->partner.system, 6); lacpif->partner_system_priority = sif->partner.system_priority; lacpif->partner_key = sif->partner.key; lacpif->partner_port_priority = sif->partner.port_priority; lacpif->partner_port_number = sif->partner.port_number; lacpif->partner_state = sif->partner.state; lacpif->rx_state = sif->rx_state; lacpif->tx_state = sif->tx_state; lacpif->ptx_state = sif->ptx_state; lacpif->mux_state = sif->mux_state; ); /* *INDENT-ON* */ *out_lacpifs = r_lacpifs; return 0; } static void show_lacp (vlib_main_t * vm, u32 * sw_if_indices) { int i; slave_if_t *sif; bond_if_t *bif; if (!sw_if_indices) return; vlib_cli_output (vm, "%-55s %-32s %-32s", " ", "actor state", "partner state"); vlib_cli_output (vm, "%-25s %-12s %-16s %-31s %-31s", "interface name", "sw_if_index", "bond interface", "exp/def/dis/col/syn/agg/tim/act", "exp/def/dis/col/syn/agg/tim/act"); for (i = 0; i < vec_len (sw_if_indices); i++) { sif = bond_get_slave_by_sw_if_index (sw_if_indices[i]); if (!sif || (sif->lacp_enabled == 0)) continue; bif = bond_get_master_by_dev_instance (sif->bif_dev_instance); vlib_cli_output (vm, "%-25U %-12d %-16U %3x %3x %3x %3x %3x %3x %3x %3x " "%4x %3x %3x %3x %3x %3x %3x %3x", format_vnet_sw_if_index_name, vnet_get_main (), sif->sw_if_index, sif->sw_if_index, format_vnet_sw_if_index_name, vnet_get_main (), bif->sw_if_index, lacp_bit_test (sif->actor.state, 7), lacp_bit_test (sif->actor.state, 6), lacp_bit_test (sif->actor.state, 5), lacp_bit_test (sif->actor.state, 4), lacp_bit_test (sif->actor.state, 3), lacp_bit_test (sif->actor.state, 2), lacp_bit_test (sif->actor.state, 1), lacp_bit_test (sif->actor.state, 0), lacp_bit_test (sif->partner.state, 7), lacp_bit_test (sif->partner.state, 6), lacp_bit_test (sif->partner.state, 5), lacp_bit_test (sif->partner.state, 4), lacp_bit_test (sif->partner.state, 3), lacp_bit_test (sif->partner.state, 2), lacp_bit_test (sif->partner.state, 1), lacp_bit_test (sif->partner.state, 0)); vlib_cli_output (vm, " LAG ID: " "[(%04x,%02x-%02x-%02x-%02x-%02x-%02x,%04x,%04x,%04x), " "(%04x,%02x-%02x-%02x-%02x-%02x-%02x,%04x,%04x,%04x)]", ntohs (sif->actor.system_priority), sif->actor.system[0], sif->actor.system[1], sif->actor.system[2], sif->actor.system[3], sif->actor.system[4], sif->actor.system[5], ntohs (sif->actor.key), ntohs (sif->actor.port_priority), ntohs (sif->actor.port_number), ntohs (sif->partner.system_priority), sif->partner.system[0], sif->partner.system[1], sif->partner.system[2], sif->partner.system[3], sif->partner.system[4], sif->partner.system[5], ntohs (sif->partner.key), ntohs (sif->partner.port_priority), ntohs (sif->partner.port_number)); vlib_cli_output (vm, " RX-state: %U, TX-state: %U, " "MUX-state: %U, PTX-state: %U", format_rx_sm_state, sif->rx_state, format_tx_sm_state, sif->tx_state, format_mux_sm_state, sif->mux_state, format_ptx_sm_state, sif->ptx_state); } } static void show<style>.highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span>packet-generator new { name x limit 1 node ip4-input size 64-64 data { ICMP: 1.0.0.2 -> 2.2.2.2 ICMP echo_request incrementing 100 } } loop create loop create set int state loop0 up set int state loop1 up set int ip address loop0 1.0.0.1/24 set int ip address loop1 2.0.0.1/24 ip route add 2.2.2.2/32 via 2.0.0.2 loop1 out-label 33 trace add pg-input 100 </pre></div> </code></pre></td></tr></table> </div> <!-- class=content --> <div id="lfcollabprojects-footer"> <div class="gray-diagonal"> <div class="footer-inner"> <p> © 2016 <a href="https://www.fd.io/">FD.io</a> a Linux Foundation Collaborative Project. All Rights Reserved. </p> <p> Linux Foundation is a registered trademark of The Linux Foundation. Linux is a registered <a href="http://www.linuxfoundation.org/programs/legal/trademark" title="Linux Mark Institute" >trademark</a > of Linus Torvalds. </p> <p> Please see our <a href="http://www.linuxfoundation.org/privacy">privacy policy</a> and <a href="http://www.linuxfoundation.org/terms">terms of use</a> </p> </div> </div> </div> </div> <!-- id=cgit --> </body> </html> w_lacp_command, static) = { .path = "show lacp", .short_help = "show lacp [<interface>] [details]", .function = show_lacp_fn, .is_mp_safe = 1, }; /* *INDENT-ON* */ static clib_error_t * debug_lacp_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { unformat_input_t _line_input, *line_input = &_line_input; clib_error_t *error = NULL; lacp_main_t *lm = &lacp_main; u8 onoff = 0; u8 input_found = 0; u32 sw_if_index = ~0; slave_if_t *sif; vnet_main_t *vnm = vnet_get_main (); /* Get a line of input. */ if (!unformat_user (input, unformat_line_input, line_input)) return clib_error_return (0, "missing argument"); while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index)) ; if (input_found) { error = clib_error_return (0, "unknown input `%U'", format_unformat_error, line_input); goto done; } else if (unformat (line_input, "on")) { input_found = 1; onoff = 1; } else if (unformat (line_input, "off")) { input_found = 1; onoff = 0; } else { error = clib_error_return (0, "unknown input `%U'", format_unformat_error, line_input); goto done; } } if (!input_found) return clib_error_return (0, "must specify on or off"); if (sw_if_index != ~0) { sif = bond_get_slave_by_sw_if_index (sw_if_index); if (!sif) return (clib_error_return (0, "Please enslave the interface first")); sif->debug = onoff; } else lm->debug = onoff; done: unformat_free (line_input); return error; } /* *INDENT-OFF* */ VLIB_CLI_COMMAND (debug_lacp_command, static) = { .path = "debug lacp", .short_help = "debug lacp <interface> <on | off>", .function = debug_lacp_command_fn, }; /* *INDENT-ON* */ clib_error_t * lacp_cli_init (vlib_main_t * vm) { lacp_main_t *lm = &lacp_main; lm->vlib_main = vm; lm->vnet_main = vnet_get_main (); return 0; } VLIB_INIT_FUNCTION (lacp_cli_init); /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */