acl-plugin: add hitcount to applied hash-acl entries
[vpp.git] / src / plugins / memif / memif.c
index f082b58..af81faf 100644 (file)
@@ -67,6 +67,7 @@ memif_queue_intfd_close (memif_queue_t * mq)
 void
 memif_disconnect (memif_if_t * mif, clib_error_t * err)
 {
+  memif_main_t *mm = &memif_main;
   vnet_main_t *vnm = vnet_get_main ();
   memif_region_t *mr;
   memif_queue_t *mq;
@@ -94,6 +95,9 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err)
   /* close connection socket */
   if (mif->conn_unix_file_index != ~0)
     {
+      memif_socket_file_t *msf = vec_elt_at_index (mm->socket_files,
+                                                  mif->socket_file_index);
+      hash_unset (msf->dev_instance_by_fd, mif->conn_fd);
       memif_file_del_by_index (mif->conn_unix_file_index);
       mif->conn_unix_file_index = ~0;
     }
@@ -218,11 +222,19 @@ memif_connect (memif_if_t * mif)
       }
     vnet_hw_interface_assign_rx_thread (vnm, mif->hw_if_index, i, ~0);
     rv = vnet_hw_interface_set_rx_mode (vnm, mif->hw_if_index, i,
-                                       VNET_HW_INTERFACE_RX_MODE_INTERRUPT);
+                                       VNET_HW_INTERFACE_RX_MODE_DEFAULT);
     if (rv)
       clib_warning
        ("Warning: unable to set rx mode for interface %d queue %d: "
         "rc=%d", mif->hw_if_index, i, rv);
+    else
+      {
+       vnet_hw_interface_rx_mode rxmode;
+       vnet_hw_interface_get_rx_mode (vnm, mif->hw_if_index, i, &rxmode);
+
+       if (rxmode == VNET_HW_INTERFACE_RX_MODE_POLLING)
+         mq->ring->flags |= MEMIF_RING_FLAG_MASK_INT;
+      }
   }
 
   mif->flags &= ~MEMIF_IF_FLAG_CONNECTING;
@@ -478,7 +490,10 @@ memif_delete_if (vlib_main_t * vm, memif_if_t * mif)
   clib_error_free (err);
 
   /* remove the interface */
-  ethernet_delete_interface (vnm, mif->hw_if_index);
+  if (mif->mode == MEMIF_INTERFACE_MODE_IP)
+    vnet_delete_hw_interface (vnm, mif->hw_if_index);
+  else
+    ethernet_delete_interface (vnm, mif->hw_if_index);
   mif->hw_if_index = ~0;
 
   /* free interface data structures */
@@ -515,6 +530,14 @@ memif_delete_if (vlib_main_t * vm, memif_if_t * mif)
   return 0;
 }
 
+/* *INDENT-OFF* */
+VNET_HW_INTERFACE_CLASS (memif_ip_hw_if_class, static) =
+{
+  .name = "memif-ip",
+  .flags = VNET_HW_INTERFACE_CLASS_FLAG_P2P,
+};
+/* *INDENT-ON* */
+
 int
 memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
 {
@@ -533,15 +556,19 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
 
   if (args->socket_filename == 0 || args->socket_filename[0] != '/')
     {
-      rv = mkdir (MEMIF_DEFAULT_SOCKET_DIR, 0755);
-      if (rv && errno != EEXIST)
-       return VNET_API_ERROR_SYSCALL_ERROR_1;
+      clib_error_t *error;
+      error = vlib_unix_recursive_mkdir (vlib_unix_get_runtime_dir ());
+      if (error)
+       {
+         clib_error_free (error);
+         return VNET_API_ERROR_SYSCALL_ERROR_1;
+       }
 
       if (args->socket_filename == 0)
-       socket_filename = format (0, "%s/%s%c", MEMIF_DEFAULT_SOCKET_DIR,
+       socket_filename = format (0, "%s/%s%c", vlib_unix_get_runtime_dir (),
                                  MEMIF_DEFAULT_SOCKET_FILENAME, 0);
       else
-       socket_filename = format (0, "%s/%s%c", MEMIF_DEFAULT_SOCKET_DIR,
+       socket_filename = format (0, "%s/%s%c", vlib_unix_get_runtime_dir (),
                                  args->socket_filename, 0);
 
     }
@@ -610,28 +637,43 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
   mif->sw_if_index = mif->hw_if_index = mif->per_interface_next_index = ~0;
   mif->conn_unix_file_index = ~0;
   mif->conn_fd = -1;
+  mif->mode = args->mode;
   if (args->secret)
     mif->secret = vec_dup (args->secret);
 
   if (tm->n_vlib_mains > 1)
     clib_spinlock_init (&mif->lockp);
 
-  if (!args->hw_addr_set)
+
+  if (mif->mode == MEMIF_INTERFACE_MODE_ETHERNET)
     {
-      f64 now = vlib_time_now (vm);
-      u32 rnd;
-      rnd = (u32) (now * 1e6);
-      rnd = random_u32 (&rnd);
-
-      memcpy (args->hw_addr + 2, &rnd, sizeof (rnd));
-      args->hw_addr[0] = 2;
-      args->hw_addr[1] = 0xfe;
-    }
 
-  error = ethernet_register_interface (vnm, memif_device_class.index,
-                                      mif->dev_instance, args->hw_addr,
-                                      &mif->hw_if_index,
-                                      memif_eth_flag_change);
+      if (!args->hw_addr_set)
+       {
+         f64 now = vlib_time_now (vm);
+         u32 rnd;
+         rnd = (u32) (now * 1e6);
+         rnd = random_u32 (&rnd);
+
+         memcpy (args->hw_addr + 2, &rnd, sizeof (rnd));
+         args->hw_addr[0] = 2;
+         args->hw_addr[1] = 0xfe;
+       }
+      error = ethernet_register_interface (vnm, memif_device_class.index,
+                                          mif->dev_instance, args->hw_addr,
+                                          &mif->hw_if_index,
+                                          memif_eth_flag_change);
+    }
+  else if (mif->mode == MEMIF_INTERFACE_MODE_IP)
+    {
+      mif->hw_if_index =
+       vnet_register_interface (vnm, memif_device_class.index,
+                                mif->dev_instance,
+                                memif_ip_hw_if_class.index,
+                                mif->dev_instance);
+    }
+  else
+    error = clib_error_return (0, "unsupported interface mode");
 
   if (error)
     {
@@ -721,7 +763,10 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
 error:
   if (mif->hw_if_index != ~0)
     {
-      ethernet_delete_interface (vnm, mif->hw_if_index);
+      if (mif->mode == MEMIF_INTERFACE_MODE_IP)
+       vnet_delete_hw_interface (vnm, mif->hw_if_index);
+      else
+       ethernet_delete_interface (vnm, mif->hw_if_index);
       mif->hw_if_index = ~0;
     }
   memif_delete_if (vm, mif);