Improve MTU handling
[vpp.git] / src / vnet / interface_cli.c
index f37f139..8880d97 100644 (file)
@@ -365,11 +365,7 @@ show_sw_interfaces (vlib_main_t * vm,
        ip_lookup_main_t *lm4 = &im4->lookup_main;
        ip_lookup_main_t *lm6 = &im6->lookup_main;
        ip_interface_address_t *ia = 0;
-       ip4_address_t *r4;
-       ip6_address_t *r6;
        u32 fib_index4 = 0, fib_index6 = 0;
-       ip4_fib_t *fib4;
-       ip6_fib_t *fib6;
 
        if (vec_len (im4->fib_index_by_sw_if_index) > si->sw_if_index)
          fib_index4 = vec_elt (im4->fib_index_by_sw_if_index,
@@ -379,85 +375,69 @@ show_sw_interfaces (vlib_main_t * vm,
          fib_index6 = vec_elt (im6->fib_index_by_sw_if_index,
                                si->sw_if_index);
 
-       fib4 = ip4_fib_get (fib_index4);
-       fib6 = ip6_fib_get (fib_index6);
+       ip4_fib_t *fib4 = ip4_fib_get (fib_index4);
+       ip6_fib_t *fib6 = ip6_fib_get (fib_index6);
 
        if (si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)
          vlib_cli_output
            (vm, "%U (%s): \n  unnumbered, use %U",
-            format_vnet_sw_if_index_name,
-            vnm, si->sw_if_index,
+            format_vnet_sw_if_index_name, vnm, si->sw_if_index,
             (si->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ? "up" : "dn",
             format_vnet_sw_if_index_name, vnm, si->unnumbered_sw_if_index);
-
        else
-         {
-           vlib_cli_output (vm, "%U (%s):",
-                            format_vnet_sw_if_index_name,
-                            vnm, si->sw_if_index,
-                            (si->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
-                            ? "up" : "dn");
-         }
+         vlib_cli_output
+           (vm, "%U (%s):",
+            format_vnet_sw_if_index_name, vnm, si->sw_if_index,
+            (si->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ? "up" : "dn");
 
        /* Display any L2 info */
        l2_input_config_t *l2_input = l2input_intf_config (si->sw_if_index);
        if (l2_input->bridge)
          {
+           bd_main_t *bdm = &bd_main;
            u32 bd_id = l2input_main.bd_configs[l2_input->bd_index].bd_id;
-           vlib_cli_output (vm, "  l2 bridge bd_id %d%s%d", bd_id,
-                            l2_input->bvi ? " bvi shg " : " shg ",
-                            l2_input->shg);
+           vlib_cli_output (vm, "  L2 bridge bd-id %d idx %d shg %d %s",
+                            bd_id, bd_find_index (bdm, bd_id), l2_input->shg,
+                            l2_input->bvi ? "bvi" : " ");
          }
        else if (l2_input->xconnect)
-         {
-           vlib_cli_output (vm, "  l2 xconnect %U",
-                            format_vnet_sw_if_index_name,
-                            vnm, l2_input->output_sw_if_index);
-         }
+         vlib_cli_output (vm, "  L2 xconnect %U",
+                          format_vnet_sw_if_index_name, vnm,
+                          l2_input->output_sw_if_index);
 
+       /* *INDENT-OFF* */
        /* Display any IP4 addressing info */
-          /* *INDENT-OFF* */
-         foreach_ip_interface_address (lm4, ia, si->sw_if_index,
-                                       1 /* honor unnumbered */,
-         ({
-            r4 = ip_interface_address_get_address (lm4, ia);
-            if (fib4->table_id)
-              {
-                vlib_cli_output (vm, "  %U/%d table %d",
-                                 format_ip4_address, r4,
-                                 ia->address_length,
-                                 fib4->table_id);
-              }
-            else
-              {
-                vlib_cli_output (vm, "  %U/%d",
-                                 format_ip4_address, r4,
-                                 ia->address_length);
-              }
-          }));
-          /* *INDENT-ON* */
-
+       foreach_ip_interface_address (lm4, ia, si->sw_if_index,
+                                     1 /* honor unnumbered */,
+       ({
+         ip4_address_t *r4 = ip_interface_address_get_address (lm4, ia);
+         if (fib4->table_id)
+           vlib_cli_output (vm, "  L3 %U/%d ip4 table-id %d fib-idx %d",
+                            format_ip4_address, r4, ia->address_length,
+                            fib4->table_id,
+                            ip4_fib_index_from_table_id (fib4->table_id));
+         else
+           vlib_cli_output (vm, "  L3 %U/%d",
+                            format_ip4_address, r4, ia->address_length);
+        }));
+       /* *INDENT-ON* */
+
+       /* *INDENT-OFF* */
        /* Display any IP6 addressing info */
-          /* *INDENT-OFF* */
-          foreach_ip_interface_address (lm6, ia, si->sw_if_index,
-                                        1 /* honor unnumbered */,
-          ({
-            r6 = ip_interface_address_get_address (lm6, ia);
-            if (fib6->table_id)
-              {
-                vlib_cli_output (vm, "  %U/%d table %d",
-                                 format_ip6_address, r6,
-                                 ia->address_length,
-                                 fib6->table_id);
-              }
-            else
-              {
-                vlib_cli_output (vm, "  %U/%d",
-                                 format_ip6_address, r6,
-                                 ia->address_length);
-              }
-          }));
-          /* *INDENT-ON* */
+       foreach_ip_interface_address (lm6, ia, si->sw_if_index,
+                                     1 /* honor unnumbered */,
+        ({
+         ip6_address_t *r6 = ip_interface_address_get_address (lm6, ia);
+         if (fib6->table_id)
+           vlib_cli_output (vm, "  L3 %U/%d ip6 table-id %d fib-idx %d",
+                            format_ip6_address, r6, ia->address_length,
+                            fib6->table_id,
+                            ip6_fib_index_from_table_id (fib6->table_id));
+         else
+           vlib_cli_output (vm, "  L3 %U/%d",
+                            format_ip6_address, r6, ia->address_length);
+        }));
+       /* *INDENT-ON* */
       }
     }
   else
@@ -1152,7 +1132,6 @@ 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 flags = ETHERNET_INTERFACE_FLAG_MTU;
   ethernet_main_t *em = &ethernet_main;
 
   if (unformat (input, "%d %U", &mtu,
@@ -1173,11 +1152,7 @@ mtu_cmd (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd)
        return clib_error_return (0, "Invalid mtu (%d): must be <= (%d)", mtu,
                                  hi->max_supported_packet_bytes);
 
-      if (hi->max_packet_bytes != mtu)
-       {
-         hi->max_packet_bytes = mtu;
-         ethernet_set_flags (vnm, hw_if_index, flags);
-       }
+      vnet_hw_interface_set_mtu (vnm, hw_if_index, mtu);
     }
   else
     return clib_error_return (0, "unknown input `%U'",
@@ -1198,9 +1173,10 @@ set_interface_mac_address (vlib_main_t * vm, unformat_input_t * input,
                           vlib_cli_command_t * cmd)
 {
   vnet_main_t *vnm = vnet_get_main ();
+  vnet_sw_interface_t *si = NULL;
   clib_error_t *error = 0;
   u32 sw_if_index = ~0;
-  u64 mac = 0;
+  u8 mac[6] = { 0 };
 
   if (!unformat_user (input, unformat_vnet_sw_interface, vnm, &sw_if_index))
     {
@@ -1208,13 +1184,14 @@ set_interface_mac_address (vlib_main_t * vm, unformat_input_t * input,
                                 format_unformat_error, input);
       goto done;
     }
-  if (!unformat_user (input, unformat_ethernet_address, &mac))
+  if (!unformat_user (input, unformat_ethernet_address, mac))
     {
       error = clib_error_return (0, "expected mac address `%U'",
                                 format_unformat_error, input);
       goto done;
     }
-  error = vnet_hw_interface_change_mac_address (vnm, sw_if_index, mac);
+  si = vnet_get_sw_interface (vnm, sw_if_index);
+  error = vnet_hw_interface_change_mac_address (vnm, si->hw_if_index, mac);
 done:
   return error;
 }
@@ -1313,6 +1290,8 @@ set_hw_interface_rx_mode (vnet_main_t * vnm, u32 hw_if_index,
       break;
     case VNET_API_ERROR_INVALID_INTERFACE:
       return clib_error_return (0, "invalid interface");
+    case VNET_API_ERROR_INVALID_QUEUE:
+      return clib_error_return (0, "invalid queue");
     default:
       return clib_error_return (0, "unknown error");
     }
@@ -1334,6 +1313,8 @@ set_hw_interface_rx_mode (vnet_main_t * vnm, u32 hw_if_index,
       return clib_error_return (0, "unsupported");
     case VNET_API_ERROR_INVALID_INTERFACE:
       return clib_error_return (0, "invalid interface");
+    case VNET_API_ERROR_INVALID_QUEUE:
+      return clib_error_return (0, "invalid queue");
     default:
       return clib_error_return (0, "unknown error");
     }
@@ -1341,6 +1322,33 @@ set_hw_interface_rx_mode (vnet_main_t * vnm, u32 hw_if_index,
   return 0;
 }
 
+clib_error_t *
+set_hw_interface_change_rx_mode (vnet_main_t * vnm, u32 hw_if_index,
+                                u8 queue_id_valid, u32 queue_id,
+                                vnet_hw_interface_rx_mode mode)
+{
+  clib_error_t *error = 0;
+  vnet_hw_interface_t *hw;
+  int i;
+
+  hw = vnet_get_hw_interface (vnm, hw_if_index);
+
+  if (queue_id_valid == 0)
+    {
+      for (i = 0; i < vec_len (hw->dq_runtime_index_by_queue); i++)
+       {
+         error = set_hw_interface_rx_mode (vnm, hw_if_index, i, mode);
+         if (error)
+           break;
+       }
+      hw->default_rx_mode = mode;
+    }
+  else
+    error = set_hw_interface_rx_mode (vnm, hw_if_index, queue_id, mode);
+
+  return (error);
+}
+
 static clib_error_t *
 set_interface_rx_mode (vlib_main_t * vm, unformat_input_t * input,
                       vlib_cli_command_t * cmd)
@@ -1348,11 +1356,10 @@ set_interface_rx_mode (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_hw_interface_t *hw;
   u32 hw_if_index = (u32) ~ 0;
   u32 queue_id = (u32) ~ 0;
   vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
-  int i;
+  u8 queue_id_valid = 0;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -1363,7 +1370,7 @@ set_interface_rx_mode (vlib_main_t * vm, unformat_input_t * input,
          (line_input, "%U", unformat_vnet_hw_interface, vnm, &hw_if_index))
        ;
       else if (unformat (line_input, "queue %d", &queue_id))
-       ;
+       queue_id_valid = 1;
       else if (unformat (line_input, "polling"))
        mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
       else if (unformat (line_input, "interrupt"))
@@ -1387,20 +1394,8 @@ set_interface_rx_mode (vlib_main_t * vm, unformat_input_t * input,
   if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN)
     return clib_error_return (0, "please specify valid rx-mode");
 
-  hw = vnet_get_hw_interface (vnm, hw_if_index);
-
-  if (queue_id == ~0)
-    {
-      for (i = 0; i < vec_len (hw->dq_runtime_index_by_queue); i++)
-       {
-         error = set_hw_interface_rx_mode (vnm, hw_if_index, i, mode);
-         if (error)
-           break;
-       }
-      hw->default_rx_mode = mode;
-    }
-  else
-    error = set_hw_interface_rx_mode (vnm, hw_if_index, queue_id, mode);
+  error = set_hw_interface_change_rx_mode (vnm, hw_if_index, queue_id_valid,
+                                          queue_id, mode);
 
   return (error);
 }