dpdk: use whole vmbus address as hash key for devconf
[vpp.git] / src / plugins / dpdk / device / init.c
index 8e4bf55..19d664a 100644 (file)
@@ -291,8 +291,8 @@ dpdk_lib_init (dpdk_main_t * dm)
          if (unformat (&input_vmbus, "%U", unformat_vlib_vmbus_addr,
                        &vmbus_addr))
            {
-             p = hash_get (dm->conf->device_config_index_by_vmbus_addr,
-                           vmbus_addr.as_u32[0]);
+             p = mhash_get (&dm->conf->device_config_index_by_vmbus_addr,
+                            &vmbus_addr);
            }
        }
 
@@ -1062,15 +1062,15 @@ dpdk_bind_vmbus_devices_to_uio (dpdk_config_main_t * conf)
       dpdk_device_config_t *devconf = 0;
       if (num_whitelisted)
        {
-         uword *p = hash_get (conf->device_config_index_by_vmbus_addr,
-                              addr->as_u32[0]);
+         uword *p =
+           mhash_get (&conf->device_config_index_by_vmbus_addr, addr);
          if (!p)
            {
              /* No devices blacklisted, but have whitelisted. blacklist all
               * non-whitelisted */
              pool_get (conf->dev_confs, devconf);
-             hash_set (conf->device_config_index_by_vmbus_addr,
-                       addr->as_u32[0], devconf - conf->dev_confs);
+             mhash_set (&conf->device_config_index_by_vmbus_addr, addr,
+                        devconf - conf->dev_confs, 0);
              devconf->vmbus_addr = *addr;
              devconf->dev_addr_type = VNET_DEV_ADDR_VMBUS;
              devconf->is_blacklisted = 1;
@@ -1084,15 +1084,16 @@ dpdk_bind_vmbus_devices_to_uio (dpdk_config_main_t * conf)
       /* Enforce Device blacklist by vmbus_addr */
       for (i = 0; i < vec_len (conf->blacklist_by_vmbus_addr); i++)
        {
-         u32 vmbus_as_u32 = conf->blacklist_by_vmbus_addr[i];
-         if (vmbus_as_u32 == addr->as_u32[0])
+         vlib_vmbus_addr_t *a1 = &conf->blacklist_by_vmbus_addr[i];
+         vlib_vmbus_addr_t *a2 = addr;
+         if (memcmp (a1, a2, sizeof (vlib_vmbus_addr_t)) == 0)
            {
              if (devconf == 0)
                {
                  /* Device not whitelisted */
                  pool_get (conf->dev_confs, devconf);
-                 hash_set (conf->device_config_index_by_vmbus_addr,
-                           addr->as_u32[0], devconf - conf->dev_confs);
+                 mhash_set (&conf->device_config_index_by_vmbus_addr, addr,
+                            devconf - conf->dev_confs, 0);
                  devconf->vmbus_addr = *addr;
                  devconf->dev_addr_type = VNET_DEV_ADDR_VMBUS;
                  devconf->is_blacklisted = 1;
@@ -1111,8 +1112,8 @@ dpdk_bind_vmbus_devices_to_uio (dpdk_config_main_t * conf)
          if (devconf == 0)
            {
              pool_get (conf->dev_confs, devconf);
-             hash_set (conf->device_config_index_by_vmbus_addr,
-                       addr->as_u32[0], devconf - conf->dev_confs);
+             mhash_set (&conf->device_config_index_by_vmbus_addr, addr,
+                        devconf - conf->dev_confs, 0);
              devconf->vmbus_addr = *addr;
            }
          devconf->dev_addr_type = VNET_DEV_ADDR_VMBUS;
@@ -1156,15 +1157,14 @@ dpdk_device_config (dpdk_config_main_t *conf, void *addr,
     }
   else if (addr_type == VNET_DEV_ADDR_VMBUS)
     {
-      p = hash_get (conf->device_config_index_by_vmbus_addr,
-                   ((vlib_vmbus_addr_t *) (addr))->as_u32[0]);
+      p = mhash_get (&conf->device_config_index_by_vmbus_addr,
+                    (vlib_vmbus_addr_t *) (addr));
 
       if (!p)
        {
          pool_get (conf->dev_confs, devconf);
-         hash_set (conf->device_config_index_by_vmbus_addr,
-                   ((vlib_vmbus_addr_t *) (addr))->as_u32[0],
-                   devconf - conf->dev_confs);
+         mhash_set (&conf->device_config_index_by_vmbus_addr, addr,
+                    devconf - conf->dev_confs, 0);
        }
       else
        return clib_error_return (
@@ -1310,7 +1310,8 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
     format (0, "%s/hugepages%c", vlib_unix_get_runtime_dir (), 0);
 
   conf->device_config_index_by_pci_addr = hash_create (0, sizeof (uword));
-  conf->device_config_index_by_vmbus_addr = hash_create (0, sizeof (uword));
+  mhash_init (&conf->device_config_index_by_vmbus_addr, sizeof (uword),
+             sizeof (vlib_vmbus_addr_t));
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
@@ -1407,7 +1408,7 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
       else if (unformat (input, "blacklist %U", unformat_vlib_vmbus_addr,
                         &vmbus_addr))
        {
-         vec_add1 (conf->blacklist_by_vmbus_addr, vmbus_addr.as_u32[0]);
+         vec_add1 (conf->blacklist_by_vmbus_addr, vmbus_addr);
        }
       else
        if (unformat