diff options
-rw-r--r-- | src/plugins/vmxnet3/vmxnet3.c | 14 | ||||
-rw-r--r-- | src/vnet/devices/af_packet/af_packet.c | 16 | ||||
-rw-r--r-- | src/vnet/devices/tap/tap.c | 58 | ||||
-rw-r--r-- | src/vnet/devices/virtio/pci.c | 25 | ||||
-rw-r--r-- | src/vnet/devices/virtio/vhost_user.c | 15 |
5 files changed, 65 insertions, 63 deletions
diff --git a/src/plugins/vmxnet3/vmxnet3.c b/src/plugins/vmxnet3/vmxnet3.c index edd0b4f4f75..a0c125a2c97 100644 --- a/src/plugins/vmxnet3/vmxnet3.c +++ b/src/plugins/vmxnet3/vmxnet3.c @@ -621,6 +621,7 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) vmxnet3_device_t *vd; vlib_pci_dev_handle_t h; + vnet_hw_if_caps_change_t cc = {}; clib_error_t *error = 0; u16 qid; u32 num_intr; @@ -814,13 +815,14 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) vd->sw_if_index = sw->sw_if_index; args->sw_if_index = sw->sw_if_index; - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vd->hw_if_index); - hw->caps |= VNET_HW_IF_CAP_INT_MODE; + cc.mask = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; if (vd->gso_enable) - { - hw->caps |= (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | - VNET_HW_IF_CAP_TX_UDP_CKSUM); - } + cc.val = cc.mask; + else + cc.val = VNET_HW_IF_CAP_INT_MODE; + + vnet_hw_if_change_caps (vnm, vd->hw_if_index, &cc); vnet_hw_if_set_input_node (vnm, vd->hw_if_index, vmxnet3_input_node.index); /* Disable interrupts */ diff --git a/src/vnet/devices/af_packet/af_packet.c b/src/vnet/devices/af_packet/af_packet.c index 4c52cf1d5f4..cf32e92c94c 100644 --- a/src/vnet/devices/af_packet/af_packet.c +++ b/src/vnet/devices/af_packet/af_packet.c @@ -253,7 +253,6 @@ af_packet_create_if (af_packet_create_if_arg_t *arg) af_packet_if_t *apif = 0; u8 hw_addr[6]; vnet_sw_interface_t *sw; - vnet_hw_interface_t *hw; vlib_thread_main_t *tm = vlib_get_thread_main (); vnet_main_t *vnm = vnet_get_main (); uword *p; @@ -414,14 +413,13 @@ af_packet_create_if (af_packet_create_if_arg_t *arg) af_packet_ip_device_hw_interface_class.index, if_index); } sw = vnet_get_hw_sw_interface (vnm, apif->hw_if_index); - hw = vnet_get_hw_interface (vnm, apif->hw_if_index); apif->sw_if_index = sw->sw_if_index; vnet_hw_if_set_input_node (vnm, apif->hw_if_index, af_packet_input_node.index); apif->queue_index = vnet_hw_if_register_rx_queue (vnm, apif->hw_if_index, 0, VNET_HW_IF_RXQ_THREAD_ANY); - hw->caps |= VNET_HW_IF_CAP_INT_MODE; + vnet_hw_if_set_caps (vnm, apif->hw_if_index, VNET_HW_IF_CAP_INT_MODE); vnet_hw_interface_set_flags (vnm, apif->hw_if_index, VNET_HW_INTERFACE_FLAG_LINK_UP); @@ -527,20 +525,18 @@ af_packet_set_l4_cksum_offload (u32 sw_if_index, u8 set) { vnet_main_t *vnm = vnet_get_main (); vnet_hw_interface_t *hw; - + vnet_hw_if_caps_t caps = + VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; hw = vnet_get_sup_hw_interface (vnm, sw_if_index); if (hw->dev_class_index != af_packet_device_class.index) return VNET_API_ERROR_INVALID_INTERFACE; if (set) - { - hw->caps &= ~(VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM); - } + vnet_hw_if_set_caps (vnm, hw->hw_if_index, caps); else - { - hw->caps |= (VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM); - } + vnet_hw_if_unset_caps (vnm, hw->hw_if_index, caps); + return 0; } diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c index 19333f0ab10..2e7ad39f3b4 100644 --- a/src/vnet/devices/tap/tap.c +++ b/src/vnet/devices/tap/tap.c @@ -130,6 +130,7 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) tap_main_t *tm = &tap_main; vnet_sw_interface_t *sw; vnet_hw_interface_t *hw; + vnet_hw_if_caps_change_t cc; int i, num_vhost_queues; int old_netns_fd = -1; struct ifreq ifr = {.ifr_flags = IFF_NO_PI | IFF_VNET_HDR }; @@ -665,16 +666,16 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) args->sw_if_index = vif->sw_if_index; args->rv = 0; hw = vnet_get_hw_interface (vnm, vif->hw_if_index); - hw->caps |= VNET_HW_IF_CAP_INT_MODE; + cc.mask = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; + cc.val = VNET_HW_IF_CAP_INT_MODE; + if (args->tap_flags & TAP_FLAG_GSO) - { - hw->caps |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | - VNET_HW_IF_CAP_TX_UDP_CKSUM; - } + cc.val |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM; else if (args->tap_flags & TAP_FLAG_CSUM_OFFLOAD) - { - hw->caps |= VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; - } + cc.val |= VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; + if ((args->tap_flags & TAP_FLAG_GSO) && (args->tap_flags & TAP_FLAG_GRO_COALESCE)) { @@ -690,6 +691,7 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) vnet_sw_interface_set_mtu (vnm, hw->sw_if_index, hw->max_packet_bytes); } + vnet_hw_if_change_caps (vnm, vif->hw_if_index, &cc); virtio_pre_input_node_enable (vm, vif); virtio_vring_set_rx_queues (vm, vif); virtio_vring_set_tx_queues (vm, vif); @@ -770,6 +772,7 @@ tap_csum_offload_enable_disable (vlib_main_t * vm, u32 sw_if_index, virtio_main_t *mm = &virtio_main; virtio_if_t *vif; vnet_hw_interface_t *hw; + vnet_hw_if_caps_change_t cc; clib_error_t *err = 0; int i = 0; @@ -787,21 +790,19 @@ tap_csum_offload_enable_disable (vlib_main_t * vm, u32 sw_if_index, _IOCTL (vif->tap_fds[i], TUNSETOFFLOAD, offload); vif->gso_enabled = 0; vif->packet_coalesce = 0; - vif->csum_offload_enabled = enable_disable ? 1 : 0; - - if ((hw->caps & VNET_HW_IF_CAP_TCP_GSO) != 0) - { - hw->caps &= ~VNET_HW_IF_CAP_TCP_GSO; - } + cc.mask = VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM; if (enable_disable) { - hw->caps |= VNET_HW_IF_CAP_L4_TX_CKSUM; + cc.val = VNET_HW_IF_CAP_L4_TX_CKSUM; + vif->csum_offload_enabled = 1; } else { - hw->caps &= ~VNET_HW_IF_CAP_L4_TX_CKSUM; + cc.val = 0; + vif->csum_offload_enabled = 0; } + vnet_hw_if_change_caps (vnm, vif->hw_if_index, &cc); error: if (err) @@ -821,6 +822,7 @@ tap_gso_enable_disable (vlib_main_t * vm, u32 sw_if_index, int enable_disable, virtio_main_t *mm = &virtio_main; virtio_if_t *vif; vnet_hw_interface_t *hw; + vnet_hw_if_caps_change_t cc; clib_error_t *err = 0; int i = 0; @@ -836,27 +838,25 @@ tap_gso_enable_disable (vlib_main_t * vm, u32 sw_if_index, int enable_disable, unsigned int offload = enable_disable ? gso_on : gso_off; vec_foreach_index (i, vif->tap_fds) _IOCTL (vif->tap_fds[i], TUNSETOFFLOAD, offload); - vif->gso_enabled = enable_disable ? 1 : 0; - vif->csum_offload_enabled = 0; + + cc.mask = VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM; + if (enable_disable) { - if ((hw->caps & VNET_HW_IF_CAP_TCP_GSO) == 0) - { - hw->caps |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM; - } + cc.val = cc.mask; + vif->gso_enabled = 1; + vif->csum_offload_enabled = 1; if (is_packet_coalesce) - { - virtio_set_packet_coalesce (vif); - } + virtio_set_packet_coalesce (vif); } else { - if ((hw->caps & VNET_HW_IF_CAP_TCP_GSO) != 0) - { - hw->caps &= ~(VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM); - } + cc.val = 0; + vif->gso_enabled = 0; + vif->csum_offload_enabled = 0; vif->packet_coalesce = 0; } + vnet_hw_if_change_caps (vnm, vif->hw_if_index, &cc); error: if (err) diff --git a/src/vnet/devices/virtio/pci.c b/src/vnet/devices/virtio/pci.c index b32f72bc66b..3c070b7160c 100644 --- a/src/vnet/devices/virtio/pci.c +++ b/src/vnet/devices/virtio/pci.c @@ -508,7 +508,7 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, int csum_offload_enabled) { vnet_main_t *vnm = vnet_get_main (); - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index); + vnet_hw_if_caps_change_t cc = {}; if ((vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ)) && (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_GUEST_OFFLOADS))) @@ -524,10 +524,10 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, else { vif->gso_enabled = 1; - vif->csum_offload_enabled = 0; - hw->caps |= VNET_HW_IF_CAP_TCP_GSO | - VNET_HW_IF_CAP_TX_TCP_CKSUM | - VNET_HW_IF_CAP_TX_UDP_CKSUM; + vif->csum_offload_enabled = 1; + cc.val = cc.mask = VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM; } } else if (csum_offload_enabled @@ -541,9 +541,10 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, { vif->csum_offload_enabled = 1; vif->gso_enabled = 0; - hw->caps &= ~VNET_HW_IF_CAP_TCP_GSO; - hw->caps |= + cc.val = VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; + cc.mask = VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM; } } else @@ -556,12 +557,15 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, { vif->csum_offload_enabled = 0; vif->gso_enabled = 0; - hw->caps &= - ~(VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO); + cc.val = 0; + cc.mask = VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO; } } } + if (cc.mask) + vnet_hw_if_change_caps (vnm, vif->hw_if_index, &cc); + return 0; } @@ -1473,8 +1477,7 @@ virtio_pci_create_if (vlib_main_t * vm, virtio_pci_create_if_args_t * args) vif->sw_if_index = sw->sw_if_index; args->sw_if_index = sw->sw_if_index; - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index); - hw->caps |= VNET_HW_IF_CAP_INT_MODE; + vnet_hw_if_set_caps (vnm, vif->hw_if_index, VNET_HW_IF_CAP_INT_MODE); if (args->virtio_flags & VIRTIO_FLAG_BUFFERING) { diff --git a/src/vnet/devices/virtio/vhost_user.c b/src/vnet/devices/virtio/vhost_user.c index 2d8cad8da43..0d24ad5aec8 100644 --- a/src/vnet/devices/virtio/vhost_user.c +++ b/src/vnet/devices/virtio/vhost_user.c @@ -553,17 +553,20 @@ vhost_user_socket_read (clib_file_t * uf) (vui->features & VIRTIO_FEATURE (VIRTIO_F_ANY_LAYOUT)) ? 1 : 0; ASSERT (vui->virtio_net_hdr_sz < VLIB_BUFFER_PRE_DATA_SIZE); - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vui->hw_if_index); if (vui->enable_gso && ((vui->features & FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS) == FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS)) { - hw->caps |= (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | - VNET_HW_IF_CAP_TX_UDP_CKSUM); + vnet_hw_if_set_caps (vnm, vui->hw_if_index, + VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM); } else { - hw->caps &= ~(VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM); + vnet_hw_if_unset_caps (vnm, vui->hw_if_index, + VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_L4_TX_CKSUM); } vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0); vui->is_ready = 0; @@ -1596,9 +1599,7 @@ vhost_user_vui_init (vnet_main_t * vnm, vhost_user_intf_t * vui, vnet_sw_interface_t *sw; int q; vhost_user_main_t *vum = &vhost_user_main; - vnet_hw_interface_t *hw; - hw = vnet_get_hw_interface (vnm, vui->hw_if_index); sw = vnet_get_hw_sw_interface (vnm, vui->hw_if_index); if (server_sock_fd != -1) { @@ -1651,7 +1652,7 @@ vhost_user_vui_init (vnet_main_t * vnm, vhost_user_intf_t * vui, for (q = 0; q < vec_len (vui->vrings); q++) vhost_user_vring_init (vui, q); - hw->caps |= VNET_HW_IF_CAP_INT_MODE; + vnet_hw_if_set_caps (vnm, vui->hw_if_index, VNET_HW_IF_CAP_INT_MODE); vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0); if (sw_if_index) |