shared->misc.guest_info |= VMXNET3_GOS_TYPE_LINUX;
shared->misc.version_support = VMXNET3_VERSION_SELECT;
shared->misc.upt_features = VMXNET3_F_RXCSUM;
- if (vd->lro_enable)
+ if (vd->gso_enable)
shared->misc.upt_features |= VMXNET3_F_LRO;
if (vd->num_rx_queues > 1)
{
vmxnet3_device_init (vlib_main_t * vm, vmxnet3_device_t * vd,
vmxnet3_create_if_args_t * args)
{
- vnet_main_t *vnm = vnet_get_main ();
- vmxnet3_main_t *vmxm = &vmxnet3_main;
clib_error_t *error = 0;
u32 ret, i, size;
vlib_thread_main_t *tm = vlib_get_thread_main ();
return error;
}
- /* LRO is only supported for version >= 3 */
- if ((vmxm->lro_configured) && (vd->version >= 3))
+ /* GSO is only supported for version >= 3 */
+ if (args->enable_gso && (vd->version >= 3))
{
- vd->lro_enable = 1;
- vnm->interface_main.gso_interface_count++;
+ vd->gso_enable = 1;
}
vmxnet3_reg_write (vd, 1, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK);
pool_foreach (vd, vmxm->devices, ({
if (vd->pci_addr.as_u32 == args->addr.as_u32)
{
- args->rv = VNET_API_ERROR_INVALID_VALUE;
+ args->rv = VNET_API_ERROR_ADDRESS_IN_USE;
args->error =
- clib_error_return (error, "PCI address in use");
+ clib_error_return (error, "%U: %s", format_vlib_pci_addr,
+ &args->addr, "pci address in use");
vlib_log (VLIB_LOG_LEVEL_ERR, vmxm->log_default, "%U: %s",
format_vlib_pci_addr, &args->addr, "pci address in use");
return;
}));
/* *INDENT-ON* */
- pool_get (vmxm->devices, vd);
- vd->num_tx_queues = args->txq_num;
- vd->num_rx_queues = args->rxq_num;
- vd->dev_instance = vd - vmxm->devices;
- vd->per_interface_next_index = ~0;
- vd->pci_addr = args->addr;
-
- if (args->enable_elog)
- vd->flags |= VMXNET3_DEVICE_F_ELOG;
+ if (args->bind)
+ {
+ error = vlib_pci_bind_to_uio (vm, &args->addr, (char *) "auto");
+ if (error)
+ {
+ args->rv = VNET_API_ERROR_INVALID_INTERFACE;
+ args->error =
+ clib_error_return (error, "%U: %s", format_vlib_pci_addr,
+ &args->addr,
+ "error encountered on binding pci device");
+ vlib_log (VLIB_LOG_LEVEL_ERR, vmxm->log_default, "%U: %s",
+ format_vlib_pci_addr, &args->addr,
+ "error encountered on binding pci devicee");
+ return;
+ }
+ }
if ((error =
vlib_pci_device_open (vm, &args->addr, vmxnet3_pci_device_ids, &h)))
{
- pool_put (vmxm->devices, vd);
args->rv = VNET_API_ERROR_INVALID_INTERFACE;
args->error =
- clib_error_return (error, "pci-addr %U", format_vlib_pci_addr,
- &args->addr);
+ clib_error_return (error, "%U: %s", format_vlib_pci_addr,
+ &args->addr,
+ "error encountered on pci device open");
vlib_log (VLIB_LOG_LEVEL_ERR, vmxm->log_default, "%U: %s",
format_vlib_pci_addr, &args->addr,
"error encountered on pci device open");
* Do not use vmxnet3_log_error prior to this line since the macro
* references vd->pci_dev_handle
*/
+ pool_get (vmxm->devices, vd);
+ vd->num_tx_queues = args->txq_num;
+ vd->num_rx_queues = args->rxq_num;
+ vd->dev_instance = vd - vmxm->devices;
+ vd->per_interface_next_index = ~0;
+ vd->pci_addr = args->addr;
+
+ if (args->enable_elog)
+ vd->flags |= VMXNET3_DEVICE_F_ELOG;
+
vd->pci_dev_handle = h;
vd->numa_node = vlib_pci_get_numa_node (vm, h);
vd->num_intrs = vd->num_rx_queues + 1; // +1 for the event interrupt
vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vd->hw_if_index);
hw->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE;
- if (vd->lro_enable)
+ if (vd->gso_enable)
hw->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO;
vnet_hw_interface_set_input_node (vnm, vd->hw_if_index,
clib_memset (vd, 0, sizeof (*vd));
pool_put (vmxm->devices, vd);
- if (vd->lro_enable)
- vnm->interface_main.gso_interface_count--;
}
/*