Use thread local storage for thread index
[vpp.git] / src / vnet / unix / tapcli.c
index e9dbf72..0fc62f6 100644 (file)
@@ -355,8 +355,7 @@ static uword tapcli_rx_iface(vlib_main_t * vm,
     to_next++;
     n_left_to_next--;
 
-    vnet_feature_start_device_input_x1 (ti->sw_if_index, &next_index, 
-                                        b_first, 0);
+    vnet_feature_start_device_input_x1 (ti->sw_if_index, &next_index, b_first);
 
     vlib_validate_buffer_enqueue_x1 (vm, node, next,
                                      to_next, n_left_to_next,
@@ -367,7 +366,7 @@ static uword tapcli_rx_iface(vlib_main_t * vm,
       vlib_increment_combined_counter (
           vnet_main.interface_main.combined_sw_if_counters
           + VNET_INTERFACE_COUNTER_RX,
-          os_get_cpu_number(), ti->sw_if_index,
+          vlib_get_thread_index(), ti->sw_if_index,
           1, n_bytes_in_packet);
 
       if (PREDICT_FALSE(n_trace > 0)) {
@@ -1308,6 +1307,7 @@ tap_connect_command_fn (vlib_main_t * vm,
   int ip6_address_set = 0;
   u32 ip4_mask_width = 0;
   u32 ip6_mask_width = 0;
+  clib_error_t *error = NULL;
 
   if (tm->is_disabled)
     return clib_error_return (0, "device disabled...");
@@ -1336,10 +1336,19 @@ tap_connect_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "%s", &intfc_name))
         ;
       else
-        return clib_error_return (0, "unknown input `%U'",
-                                  format_unformat_error, line_input);
+        {
+          error = clib_error_return (0, "unknown input `%U'",
+                                     format_unformat_error, line_input);
+          goto done;
+        }
     }
   
+  if (intfc_name == 0)
+    {
+      error = clib_error_return (0, "interface name must be specified");
+      goto done;
+    }
+
   memset (ap, 0, sizeof (*ap));
 
   ap->intfc_name = intfc_name;
@@ -1364,53 +1373,70 @@ tap_connect_command_fn (vlib_main_t * vm,
   switch (rv) 
     {
     case VNET_API_ERROR_SYSCALL_ERROR_1:
-      return clib_error_return (0, "Couldn't open /dev/net/tun");
+      error = clib_error_return (0, "Couldn't open /dev/net/tun");
+      goto done;
       
     case VNET_API_ERROR_SYSCALL_ERROR_2:
-      return clib_error_return (0, "Error setting flags on '%s'", intfc_name);
-  
+      error = clib_error_return (0, "Error setting flags on '%s'", intfc_name);
+      goto done;
+
     case VNET_API_ERROR_SYSCALL_ERROR_3:
-      return clib_error_return (0,  "Couldn't open provisioning socket");
+      error = clib_error_return (0,  "Couldn't open provisioning socket");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_4:
-      return clib_error_return (0,  "Couldn't get if_index");
+      error = clib_error_return (0,  "Couldn't get if_index");
+      goto done;
     
     case VNET_API_ERROR_SYSCALL_ERROR_5:
-      return clib_error_return (0,  "Couldn't bind provisioning socket");
+      error = clib_error_return (0,  "Couldn't bind provisioning socket");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_6:
-      return clib_error_return (0,  "Couldn't set device non-blocking flag");
+      error = clib_error_return (0,  "Couldn't set device non-blocking flag");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_7:
-      return clib_error_return (0,  "Couldn't set device MTU");
+      error = clib_error_return (0,  "Couldn't set device MTU");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_8:
-      return clib_error_return (0,  "Couldn't get interface flags");
+      error = clib_error_return (0,  "Couldn't get interface flags");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_9:
-      return clib_error_return (0,  "Couldn't set intfc admin state up");
+      error = clib_error_return (0,  "Couldn't set intfc admin state up");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_10:
-      return clib_error_return (0,  "Couldn't set intfc address/mask");
+      error = clib_error_return (0,  "Couldn't set intfc address/mask");
+      goto done;
 
     case VNET_API_ERROR_INVALID_REGISTRATION:
-      return clib_error_return (0,  "Invalid registration");
+      error = clib_error_return (0,  "Invalid registration");
+      goto done;
 
     case 0:
       break;
 
     default:
-      return clib_error_return (0,  "Unknown error: %d", rv);
+      error = clib_error_return (0,  "Unknown error: %d", rv);
+      goto done;
     }
 
   vlib_cli_output(vm, "%U\n", format_vnet_sw_if_index_name, 
                   vnet_get_main(), sw_if_index);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (tap_connect_command, static) = {
     .path = "tap connect",
-    .short_help = "tap connect <intfc-name> [hwaddr <addr>]",
+    .short_help =
+       "tap connect <intfc-name> [address <ip-addr>/mw] [hwaddr <addr>]",
     .function = tap_connect_command_fn,
 };