X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_cli.c;h=360898ea0fb17a7ac68143e55a6de57ab52428da;hb=75b9f45;hp=b803a31c05f7b1affb57edc93b788f497ee4f72c;hpb=525c9d0f8645ef9901316f042c195adc970b4546;p=vpp.git diff --git a/src/vnet/interface_cli.c b/src/vnet/interface_cli.c index b803a31c05f..360898ea0fb 100644 --- a/src/vnet/interface_cli.c +++ b/src/vnet/interface_cli.c @@ -362,7 +362,7 @@ show_sw_interfaces (vlib_main_t * vm, if (visible) vec_add1 (sorted_sis, si[0]);} )); - /* *INDENT-OFF* */ + /* *INDENT-ON* */ /* Sort by name. */ vec_sort_with_function (sorted_sis, sw_interface_name_compare); } @@ -449,20 +449,19 @@ show_sw_interfaces (vlib_main_t * vm, format_ip6_address, r6, ia->address_length); })); /* *INDENT-ON* */ + } + } + else + { + vec_foreach (si, sorted_sis) + { + vlib_cli_output (vm, "%U\n", format_vnet_sw_interface, vnm, si); + } } -} - -else -{ - vec_foreach (si, sorted_sis) - { - vlib_cli_output (vm, "%U\n", format_vnet_sw_interface, vnm, si); - } -} done: -vec_free (sorted_sis); -return error; + vec_free (sorted_sis); + return error; } /* *INDENT-OFF* */ @@ -815,14 +814,14 @@ done: * subinterfaces to handle a range of VLAN IDs. * * - create sub-interfaces dot1q|dot1ad |any [exact-match] - - * Use this command to specify the outer VLAN ID, to either be explicited or to make the + * Use this command to specify the outer VLAN ID, to either be explicit or to make the * VLAN ID different from the 'subId'. * * - create sub-interfaces dot1q|dot1ad |any inner-dot1q * |any [exact-match] - Use this command to specify the outer VLAN ID and - * the innner VLAN ID. + * the inner VLAN ID. * - * When 'dot1q' or 'dot1ad' is explictly entered, subinterfaces + * When 'dot1q' or 'dot1ad' is explicitly entered, subinterfaces * can be configured as either exact-match or non-exact match. Non-exact match is the CLI * default. If 'exact-match' is specified, packets must have the same number of * VLAN tags as the configuration. For non-exact-match, packets must at least that number @@ -965,7 +964,7 @@ set_unnumbered (vlib_main_t * vm, if (~0 == unnumbered_sw_if_index) return clib_error_return (0, "Specify the unnumbered interface"); if (enable && ~0 == inherit_from_sw_if_index) - return clib_error_return (0, "When enabling unnumberered specify the" + return clib_error_return (0, "When enabling unnumbered specify the" " IP enabled interface that it uses"); vnet_sw_interface_update_unnumbered (unnumbered_sw_if_index, @@ -1115,12 +1114,17 @@ static clib_error_t * mtu_cmd (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { vnet_main_t *vnm = vnet_get_main (); - u32 hw_if_index, mtu; + u32 hw_if_index, sw_if_index, mtu; ethernet_main_t *em = ðernet_main; + u32 mtus[VNET_N_MTU] = { 0, 0, 0, 0 }; if (unformat (input, "%d %U", &mtu, unformat_vnet_hw_interface, vnm, &hw_if_index)) { + /* + * Change physical MTU on interface. Only supported for Ethernet + * interfaces + */ vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index); ethernet_interface_t *eif = ethernet_get_interface (em, hw_if_index); @@ -1137,17 +1141,35 @@ mtu_cmd (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) hi->max_supported_packet_bytes); vnet_hw_interface_set_mtu (vnm, hw_if_index, mtu); + goto done; } + else if (unformat (input, "packet %d %U", &mtu, + unformat_vnet_sw_interface, vnm, &sw_if_index)) + /* Set default packet MTU (including L3 header */ + mtus[VNET_MTU_L3] = mtu; + else if (unformat (input, "ip4 %d %U", &mtu, + unformat_vnet_sw_interface, vnm, &sw_if_index)) + mtus[VNET_MTU_IP4] = mtu; + else if (unformat (input, "ip6 %d %U", &mtu, + unformat_vnet_sw_interface, vnm, &sw_if_index)) + mtus[VNET_MTU_IP6] = mtu; + else if (unformat (input, "mpls %d %U", &mtu, + unformat_vnet_sw_interface, vnm, &sw_if_index)) + mtus[VNET_MTU_MPLS] = mtu; else return clib_error_return (0, "unknown input `%U'", format_unformat_error, input); + + vnet_sw_interface_set_protocol_mtu (vnm, sw_if_index, mtus); + +done: return 0; } /* *INDENT-OFF* */ VLIB_CLI_COMMAND (set_interface_mtu_cmd, static) = { .path = "set interface mtu", - .short_help = "set interface mtu ", + .short_help = "set interface mtu [packet|ip4|ip6|mpls] ", .function = mtu_cmd, }; /* *INDENT-ON* */ @@ -1251,6 +1273,46 @@ VLIB_CLI_COMMAND (clear_tag_command, static) = { }; /* *INDENT-ON* */ +static clib_error_t * +set_ip_directed_broadcast (vlib_main_t * vm, + unformat_input_t * input, vlib_cli_command_t * cmd) +{ + vnet_main_t *vnm = vnet_get_main (); + u32 sw_if_index = ~0; + u8 enable = 0; + + if (!unformat (input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index)); + else if (unformat (input, "enable")) + enable = 1; + else if (unformat (input, "disable")) + enable = 0; + else + return clib_error_return (0, "unknown input: `%U'", + format_unformat_error, input); + + if (~0 == sw_if_index) + return clib_error_return (0, "specify an interface: `%U'", + format_unformat_error, input); + + vnet_sw_interface_ip_directed_broadcast (vnm, sw_if_index, enable); + + return 0; +} + +/*? + * This command is used to enable/disable IP directed broadcast + * If directed broadcast is enabled a packet sent to the interface's + * subnet broadcast address will be sent L2 broadcast on the interface, + * otherwise it is dropped. + ?*/ +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (set_ip_directed_broadcast_command, static) = { + .path = "set interface ip directed-broadcast", + .short_help = "set interface enable ", + .function = set_ip_directed_broadcast, +}; +/* *INDENT-ON* */ + static clib_error_t * set_hw_interface_rx_mode (vnet_main_t * vnm, u32 hw_if_index, u32 queue_id, vnet_hw_interface_rx_mode mode) @@ -1458,7 +1520,7 @@ show_interface_rx_placement_fn (vlib_main_t * vm, unformat_input_t * input, })); if (vec_len (s) > 0) { - vlib_cli_output(vm, "Thread %u (%v):\n%v", index, + vlib_cli_output(vm, "Thread %u (%s):\n%v", index, vlib_worker_threads[index].name, s); vec_reset_length (s); } @@ -1503,6 +1565,42 @@ VLIB_CLI_COMMAND (show_interface_rx_placement, static) = { }; /* *INDENT-ON* */ +clib_error_t * +set_hw_interface_rx_placement (u32 hw_if_index, u32 queue_id, + u32 thread_index, u8 is_main) +{ + vnet_main_t *vnm = vnet_get_main (); + vnet_device_main_t *vdm = &vnet_device_main; + clib_error_t *error = 0; + vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN; + int rv; + + if (is_main) + thread_index = 0; + else + thread_index += vdm->first_worker_thread_index; + + if (thread_index > vdm->last_worker_thread_index) + return clib_error_return (0, + "please specify valid worker thread or main"); + + rv = vnet_hw_interface_get_rx_mode (vnm, hw_if_index, queue_id, &mode); + + if (rv) + return clib_error_return (0, "not found"); + + rv = vnet_hw_interface_unassign_rx_thread (vnm, hw_if_index, queue_id); + + if (rv) + return clib_error_return (0, "not found"); + + vnet_hw_interface_assign_rx_thread (vnm, hw_if_index, queue_id, + thread_index); + vnet_hw_interface_set_rx_mode (vnm, hw_if_index, queue_id, mode); + + return (error); +} + static clib_error_t * set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) @@ -1510,12 +1608,10 @@ set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input, clib_error_t *error = 0; unformat_input_t _line_input, *line_input = &_line_input; vnet_main_t *vnm = vnet_get_main (); - vnet_device_main_t *vdm = &vnet_device_main; - vnet_hw_interface_rx_mode mode; u32 hw_if_index = (u32) ~ 0; u32 queue_id = (u32) 0; u32 thread_index = (u32) ~ 0; - int rv; + u8 is_main = 0; if (!unformat_user (input, unformat_line_input, line_input)) return 0; @@ -1528,9 +1624,9 @@ set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input, else if (unformat (line_input, "queue %d", &queue_id)) ; else if (unformat (line_input, "main", &thread_index)) - thread_index = 0; + is_main = 1; else if (unformat (line_input, "worker %d", &thread_index)) - thread_index += vdm->first_worker_thread_index; + ; else { error = clib_error_return (0, "parse error: '%U'", @@ -1545,25 +1641,10 @@ set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input, if (hw_if_index == (u32) ~ 0) return clib_error_return (0, "please specify valid interface name"); - if (thread_index > vdm->last_worker_thread_index) - return clib_error_return (0, - "please specify valid worker thread or main"); - - rv = vnet_hw_interface_get_rx_mode (vnm, hw_if_index, queue_id, &mode); - - if (rv) - return clib_error_return (0, "not found"); + error = set_hw_interface_rx_placement (hw_if_index, queue_id, thread_index, + is_main); - rv = vnet_hw_interface_unassign_rx_thread (vnm, hw_if_index, queue_id); - - if (rv) - return clib_error_return (0, "not found"); - - vnet_hw_interface_assign_rx_thread (vnm, hw_if_index, queue_id, - thread_index); - vnet_hw_interface_set_rx_mode (vnm, hw_if_index, queue_id, mode); - - return 0; + return (error); } /*?