interface: add a new cap for virtual interfaces 84/42184/6
authorMohsin Kazmi <[email protected]>
Mon, 27 Jan 2025 16:07:30 +0000 (16:07 +0000)
committerBenoit Ganne <[email protected]>
Tue, 27 May 2025 10:41:09 +0000 (10:41 +0000)
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 <[email protected]>
Change-Id: I5ec58722b61e2ff52f58e38ff47d795f260bd1d5

src/plugins/af_packet/af_packet.c
src/plugins/vhost/vhost_user.c
src/plugins/vmxnet3/vmxnet3.c
src/vnet/devices/tap/tap.c
src/vnet/devices/virtio/pci.c
src/vnet/interface.h

index e15d967..56d90c0 100644 (file)
@@ -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;
index 592a126..9959676 100644 (file)
@@ -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)
index e64e0d1..60189fc 100644 (file)
@@ -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);
 
index bb91200..a987400 100644 (file)
@@ -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 |
index 9562bdc..3a56732 100644 (file)
@@ -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;
            }
        }
     }
index 81d7729..0cb4b53 100644 (file)
@@ -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")