Skip to content

Commit c0513c1

Browse files
mohsinkazmibganne
authored andcommitted
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 <sykazmi@cisco.com> Change-Id: I5ec58722b61e2ff52f58e38ff47d795f260bd1d5
1 parent bbae334 commit c0513c1

6 files changed

Lines changed: 22 additions & 13 deletions

File tree

src/plugins/af_packet/af_packet.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,8 @@ af_packet_create_if (af_packet_create_if_arg_t *arg)
629629
u8 hw_addr[6];
630630
vnet_sw_interface_t *sw;
631631
vnet_main_t *vnm = vnet_get_main ();
632-
vnet_hw_if_caps_t caps = VNET_HW_IF_CAP_INT_MODE;
632+
vnet_hw_if_caps_t caps =
633+
VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TX_FIXED_OFFSET;
633634
uword *p;
634635
uword if_index;
635636
u8 *host_if_name_dup = 0;

src/plugins/vhost/vhost_user.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1636,7 +1636,9 @@ vhost_user_vui_init (vnet_main_t * vnm, vhost_user_intf_t * vui,
16361636
for (q = 0; q < vec_len (vui->vrings); q++)
16371637
vhost_user_vring_init (vui, q);
16381638

1639-
vnet_hw_if_set_caps (vnm, vui->hw_if_index, VNET_HW_IF_CAP_INT_MODE);
1639+
vnet_hw_if_set_caps (vnm, vui->hw_if_index,
1640+
VNET_HW_IF_CAP_INT_MODE |
1641+
VNET_HW_IF_CAP_TX_FIXED_OFFSET);
16401642
vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0);
16411643

16421644
if (sw_if_index)

src/plugins/vmxnet3/vmxnet3.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -814,11 +814,12 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args)
814814
args->sw_if_index = sw->sw_if_index;
815815

816816
cc.mask = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TCP_GSO |
817-
VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM;
817+
VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM |
818+
VNET_HW_IF_CAP_TX_FIXED_OFFSET;
818819
if (vd->gso_enable)
819820
cc.val = cc.mask;
820821
else
821-
cc.val = VNET_HW_IF_CAP_INT_MODE;
822+
cc.val = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TX_FIXED_OFFSET;
822823

823824
vnet_hw_if_change_caps (vnm, vd->hw_if_index, &cc);
824825

src/vnet/devices/tap/tap.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -678,8 +678,9 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
678678
args->rv = 0;
679679
hw = vnet_get_hw_interface (vnm, vif->hw_if_index);
680680
cc.mask = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TCP_GSO |
681-
VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM;
682-
cc.val = VNET_HW_IF_CAP_INT_MODE;
681+
VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM |
682+
VNET_HW_IF_CAP_TX_FIXED_OFFSET;
683+
cc.val = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TX_FIXED_OFFSET;
683684

684685
if (args->tap_flags & TAP_FLAG_GSO)
685686
cc.val |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM |

src/vnet/devices/virtio/pci.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -530,9 +530,9 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled,
530530
{
531531
vif->gso_enabled = 1;
532532
vif->csum_offload_enabled = 1;
533-
cc.val = cc.mask = VNET_HW_IF_CAP_TCP_GSO |
534-
VNET_HW_IF_CAP_TX_TCP_CKSUM |
535-
VNET_HW_IF_CAP_TX_UDP_CKSUM;
533+
cc.val = cc.mask =
534+
VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM |
535+
VNET_HW_IF_CAP_TX_UDP_CKSUM | VNET_HW_IF_CAP_TX_FIXED_OFFSET;
536536
}
537537
}
538538
else if (csum_offload_enabled
@@ -546,10 +546,12 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled,
546546
{
547547
vif->csum_offload_enabled = 1;
548548
vif->gso_enabled = 0;
549-
cc.val =
550-
VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM;
549+
cc.val = VNET_HW_IF_CAP_TX_TCP_CKSUM |
550+
VNET_HW_IF_CAP_TX_UDP_CKSUM |
551+
VNET_HW_IF_CAP_TX_FIXED_OFFSET;
551552
cc.mask = VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM |
552-
VNET_HW_IF_CAP_TX_UDP_CKSUM;
553+
VNET_HW_IF_CAP_TX_UDP_CKSUM |
554+
VNET_HW_IF_CAP_TX_FIXED_OFFSET;
553555
}
554556
}
555557
else
@@ -563,7 +565,8 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled,
563565
vif->csum_offload_enabled = 0;
564566
vif->gso_enabled = 0;
565567
cc.val = 0;
566-
cc.mask = VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO;
568+
cc.mask = VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO |
569+
VNET_HW_IF_CAP_TX_FIXED_OFFSET;
567570
}
568571
}
569572
}

src/vnet/interface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ typedef enum vnet_hw_interface_flags_t_
565565
_ (16, UDP_TNL_GSO, "udp-tnl-gso") \
566566
_ (17, IP_TNL_GSO, "ip-tnl-gso") \
567567
_ (18, TCP_LRO, "tcp-lro") \
568+
_ (19, TX_FIXED_OFFSET, "fixed-offset") /* virtual interfaces */ \
568569
_ (30, INT_MODE, "int-mode") \
569570
_ (31, MAC_FILTER, "mac-filter")
570571

0 commit comments

Comments
 (0)