tapv2: abort in tap_create_if (VPP-1179)
[vpp.git] / src / vnet / devices / tap / tap.c
index a7d10fe..eb5a7a9 100644 (file)
@@ -80,6 +80,7 @@ void
 tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
 {
   vnet_main_t *vnm = vnet_get_main ();
+  vlib_thread_main_t *thm = vlib_get_thread_main ();
   virtio_main_t *vim = &virtio_main;
   tap_main_t *tm = &tap_main;
   vnet_sw_interface_t *sw;
@@ -292,6 +293,26 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
       goto error;
     }
 
+  if (args->host_ip4_gw_set)
+    {
+      args->error = vnet_netlink_add_ip4_route (0, 0, &args->host_ip4_gw);
+      if (args->error)
+       {
+         args->rv = VNET_API_ERROR_NETLINK_ERROR;
+         goto error;
+       }
+    }
+
+  if (args->host_ip6_gw_set)
+    {
+      args->error = vnet_netlink_add_ip6_route (0, 0, &args->host_ip6_gw);
+      if (args->error)
+       {
+         args->rv = VNET_API_ERROR_NETLINK_ERROR;
+         goto error;
+       }
+    }
+
   /* switch back to old net namespace */
   if (args->host_namespace)
     {
@@ -377,6 +398,8 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
   vif->flags |= VIRTIO_IF_FLAG_ADMIN_UP;
   vnet_hw_interface_set_flags (vnm, vif->hw_if_index,
                               VNET_HW_INTERFACE_FLAG_LINK_UP);
+  if (thm->n_vlib_mains > 1)
+    clib_spinlock_init (&vif->lockp);
   goto done;
 
 error:
@@ -420,6 +443,7 @@ tap_delete_if (vlib_main_t * vm, u32 sw_if_index)
   /* bring down the interface */
   vnet_hw_interface_set_flags (vnm, vif->hw_if_index, 0);
   vnet_sw_interface_set_flags (vnm, vif->sw_if_index, 0);
+  vnet_hw_interface_unassign_rx_thread (vnm, vif->hw_if_index, 0);
 
   ethernet_delete_interface (vnm, vif->hw_if_index);
   vif->hw_if_index = ~0;
@@ -433,6 +457,7 @@ tap_delete_if (vlib_main_t * vm, u32 sw_if_index)
   vec_free (vif->vrings);
 
   hash_unset (tm->dev_instance_by_interface_id, vif->id);
+  clib_spinlock_free (&vif->lockp);
   memset (vif, 0, sizeof (*vif));
   pool_put (mm->interfaces, vif);