memif: memory leak when deleting memif interface
[vpp.git] / src / plugins / memif / memif.c
index 2d5866a..f2575fd 100644 (file)
@@ -873,6 +873,7 @@ memif_delete_if (vlib_main_t * vm, memif_if_t * mif)
        }
     }
 
+  vec_free (mif->local_disc_string);
   clib_memset (mif, 0, sizeof (*mif));
   pool_put (mm->interfaces, mif);
 
@@ -897,12 +898,12 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
   memif_main_t *mm = &memif_main;
   vlib_thread_main_t *tm = vlib_get_thread_main ();
   vnet_main_t *vnm = vnet_get_main ();
+  vnet_eth_interface_registration_t eir = {};
   memif_if_t *mif = 0;
   vnet_sw_interface_t *sw;
   clib_error_t *error = 0;
   int ret = 0;
   uword *p;
-  vnet_hw_interface_t *hw;
   memif_socket_file_t *msf = 0;
   int rv = 0;
 
@@ -1012,10 +1013,12 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
          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);
+
+      eir.dev_class_index = memif_device_class.index;
+      eir.dev_instance = mif->dev_instance;
+      eir.address = args->hw_addr;
+      eir.cb.flag_change = memif_eth_flag_change;
+      mif->hw_if_index = vnet_eth_register_interface (vnm, &eir);
     }
   else if (mif->mode == MEMIF_INTERFACE_MODE_IP)
     {
@@ -1090,8 +1093,7 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
        mif->flags |= MEMIF_IF_FLAG_ZERO_COPY;
     }
 
-  hw = vnet_get_hw_interface (vnm, mif->hw_if_index);
-  hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE;
+  vnet_hw_if_set_caps (vnm, mif->hw_if_index, VNET_HW_IF_CAP_INT_MODE);
   vnet_hw_if_set_input_node (vnm, mif->hw_if_index, memif_input_node.index);
   mhash_set (&msf->dev_instance_by_id, &mif->id, mif->dev_instance, 0);