devices: vhost not reading packets from vring
[vpp.git] / src / vnet / devices / virtio / vhost_user.c
index f16d015..c61828e 100644 (file)
@@ -557,6 +557,24 @@ vhost_user_socket_read (clib_file_t * uf)
 
          vui->nregions++;
        }
+
+      /*
+       * Re-compute desc, used, and avail descriptor table if vring address
+       * is set.
+       */
+      for (q = 0; q < VHOST_VRING_MAX_N; q++)
+       {
+         if (vui->vrings[q].desc_user_addr &&
+             vui->vrings[q].used_user_addr && vui->vrings[q].avail_user_addr)
+           {
+             vui->vrings[q].desc =
+               map_user_mem (vui, vui->vrings[q].desc_user_addr);
+             vui->vrings[q].used =
+               map_user_mem (vui, vui->vrings[q].used_user_addr);
+             vui->vrings[q].avail =
+               map_user_mem (vui, vui->vrings[q].avail_user_addr);
+           }
+       }
       vlib_worker_thread_barrier_release (vm);
       break;
 
@@ -600,6 +618,10 @@ vhost_user_socket_read (clib_file_t * uf)
          goto close_socket;
        }
 
+      vui->vrings[msg.state.index].desc_user_addr = msg.addr.desc_user_addr;
+      vui->vrings[msg.state.index].used_user_addr = msg.addr.used_user_addr;
+      vui->vrings[msg.state.index].avail_user_addr = msg.addr.avail_user_addr;
+
       vlib_worker_thread_barrier_sync (vm);
       vui->vrings[msg.state.index].desc = desc;
       vui->vrings[msg.state.index].used = used;
@@ -1250,8 +1272,10 @@ vhost_user_delete_if (vnet_main_t * vnm, vlib_main_t * vm, u32 sw_if_index)
   vnet_hw_interface_t *hwif;
   u16 qid;
 
-  if (!(hwif = vnet_get_sup_hw_interface (vnm, sw_if_index)) ||
-      hwif->dev_class_index != vhost_user_device_class.index)
+  if (!
+      (hwif =
+       vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index))
+      || hwif->dev_class_index != vhost_user_device_class.index)
     return VNET_API_ERROR_INVALID_SW_IF_INDEX;
 
   vui = pool_elt_at_index (vum->vhost_user_interfaces, hwif->dev_instance);
@@ -1534,8 +1558,10 @@ vhost_user_modify_if (vnet_main_t * vnm, vlib_main_t * vm,
   vnet_hw_interface_t *hwif;
   uword *if_index;
 
-  if (!(hwif = vnet_get_sup_hw_interface (vnm, sw_if_index)) ||
-      hwif->dev_class_index != vhost_user_device_class.index)
+  if (!
+      (hwif =
+       vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index))
+      || hwif->dev_class_index != vhost_user_device_class.index)
     return VNET_API_ERROR_INVALID_SW_IF_INDEX;
 
   if (sock_filename == NULL || !(strlen (sock_filename) > 0))
@@ -1658,7 +1684,7 @@ vhost_user_delete_command_fn (vlib_main_t * vm,
                &sw_if_index))
        {
          vnet_hw_interface_t *hwif =
-           vnet_get_sup_hw_interface (vnm, sw_if_index);
+           vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
          if (hwif == NULL ||
              vhost_user_device_class.index != hwif->dev_class_index)
            {