From: Mohsin Kazmi Date: Mon, 27 Jan 2025 16:07:30 +0000 (+0000) Subject: interface: add a new cap for virtual interfaces X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F84%2F42184%2F6;p=vpp.git interface: add a new cap for virtual interfaces Type: improvement The virtual interfaces can not process the headers at variable offsets from start of the packet. It requires some of the packet offload processing to be done in software i.e. checksums or GSO for packets with tunnel headers. This patch introduces a new capability flag VNET_HW_IF_CAP_TX_FIXED_OFFSET to represent this behavior in virtual interfaces. Signed-off-by: Mohsin Kazmi Change-Id: I5ec58722b61e2ff52f58e38ff47d795f260bd1d5 --- diff --git a/src/plugins/af_packet/af_packet.c b/src/plugins/af_packet/af_packet.c index e15d9676fc2..56d90c0c986 100644 --- a/src/plugins/af_packet/af_packet.c +++ b/src/plugins/af_packet/af_packet.c @@ -629,7 +629,8 @@ af_packet_create_if (af_packet_create_if_arg_t *arg) u8 hw_addr[6]; vnet_sw_interface_t *sw; vnet_main_t *vnm = vnet_get_main (); - vnet_hw_if_caps_t caps = VNET_HW_IF_CAP_INT_MODE; + vnet_hw_if_caps_t caps = + VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TX_FIXED_OFFSET; uword *p; uword if_index; u8 *host_if_name_dup = 0; diff --git a/src/plugins/vhost/vhost_user.c b/src/plugins/vhost/vhost_user.c index 592a126c683..9959676d5df 100644 --- a/src/plugins/vhost/vhost_user.c +++ b/src/plugins/vhost/vhost_user.c @@ -1636,7 +1636,9 @@ 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); - vnet_hw_if_set_caps (vnm, vui->hw_if_index, VNET_HW_IF_CAP_INT_MODE); + vnet_hw_if_set_caps (vnm, vui->hw_if_index, + VNET_HW_IF_CAP_INT_MODE | + VNET_HW_IF_CAP_TX_FIXED_OFFSET); vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0); if (sw_if_index) diff --git a/src/plugins/vmxnet3/vmxnet3.c b/src/plugins/vmxnet3/vmxnet3.c index e64e0d135d6..60189fcc087 100644 --- a/src/plugins/vmxnet3/vmxnet3.c +++ b/src/plugins/vmxnet3/vmxnet3.c @@ -814,11 +814,12 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) args->sw_if_index = sw->sw_if_index; 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; + VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM | + VNET_HW_IF_CAP_TX_FIXED_OFFSET; if (vd->gso_enable) cc.val = cc.mask; else - cc.val = VNET_HW_IF_CAP_INT_MODE; + cc.val = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TX_FIXED_OFFSET; vnet_hw_if_change_caps (vnm, vd->hw_if_index, &cc); diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c index bb91200a525..a987400dc65 100644 --- a/src/vnet/devices/tap/tap.c +++ b/src/vnet/devices/tap/tap.c @@ -678,8 +678,9 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) args->rv = 0; hw = vnet_get_hw_interface (vnm, vif->hw_if_index); 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; + VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM | + VNET_HW_IF_CAP_TX_FIXED_OFFSET; + cc.val = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TX_FIXED_OFFSET; if (args->tap_flags & TAP_FLAG_GSO) cc.val |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | diff --git a/src/vnet/devices/virtio/pci.c b/src/vnet/devices/virtio/pci.c index 9562bdc6369..3a56732c3e9 100644 --- a/src/vnet/devices/virtio/pci.c +++ b/src/vnet/devices/virtio/pci.c @@ -530,9 +530,9 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, { vif->gso_enabled = 1; 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; + cc.val = cc.mask = + VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM | VNET_HW_IF_CAP_TX_FIXED_OFFSET; } } else if (csum_offload_enabled @@ -546,10 +546,12 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, { vif->csum_offload_enabled = 1; vif->gso_enabled = 0; - cc.val = - 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 | + VNET_HW_IF_CAP_TX_FIXED_OFFSET; cc.mask = VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | - VNET_HW_IF_CAP_TX_UDP_CKSUM; + VNET_HW_IF_CAP_TX_UDP_CKSUM | + VNET_HW_IF_CAP_TX_FIXED_OFFSET; } } else @@ -563,7 +565,8 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, vif->csum_offload_enabled = 0; vif->gso_enabled = 0; cc.val = 0; - cc.mask = VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO; + cc.mask = VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_FIXED_OFFSET; } } } diff --git a/src/vnet/interface.h b/src/vnet/interface.h index 81d7729700b..0cb4b53ca17 100644 --- a/src/vnet/interface.h +++ b/src/vnet/interface.h @@ -565,6 +565,7 @@ typedef enum vnet_hw_interface_flags_t_ _ (16, UDP_TNL_GSO, "udp-tnl-gso") \ _ (17, IP_TNL_GSO, "ip-tnl-gso") \ _ (18, TCP_LRO, "tcp-lro") \ + _ (19, TX_FIXED_OFFSET, "fixed-offset") /* virtual interfaces */ \ _ (30, INT_MODE, "int-mode") \ _ (31, MAC_FILTER, "mac-filter")