Generic Segmentation Offload (GSO) is a SW technique to split large packets into small ones. Akin to TSO, GSO enables applications to operate on large packets, thus reducing per-packet processing overhead.
To enable more flexibility to applications, DPDK GSO is implemented as a standalone library. Applications explicitly use the GSO library to segment packets. This patch adds GSO support to DPDK for specific packet types: specifically, TCP/IPv4, VxLAN, and GRE. The first patch introduces the GSO API framework. The second patch adds GSO support for TCP/IPv4 packets (containing an optional VLAN tag). The third patch adds GSO support for VxLAN packets that contain outer IPv4, and inner TCP/IPv4 headers (plus optional inner and/or outer VLAN tags). The fourth patch adds GSO support for GRE packets that contain outer IPv4, and inner TCP/IPv4 headers (with optional outer VLAN tag). The last patch in the series enables TCP/IPv4, VxLAN, and GRE GSO in testpmd's checksum forwarding engine. The performance of TCP/IPv4 GSO on a 10Gbps link is demonstrated using iperf. Setup for the test is described as follows: a. Connect 2 x 10Gbps physical ports (P0, P1), together physically. b. Launch testpmd with P0 and a vhost-user port, and use csum forwarding engine. c. Select IP and TCP HW checksum calculation for P0; select TCP HW checksum calculation for vhost-user port. d. Launch a VM with csum and tso offloading enabled. e. Run iperf-client on virtio-net port in the VM to send TCP packets. With GSO enabled for P0 in testpmd, observed iperf throughput is ~9Gbps. The experimental data of VxLAN and GRE will be shown later. Jiayu Hu (3): lib: add Generic Segmentation Offload API framework gso/lib: add TCP/IPv4 GSO support app/testpmd: enable TCP/IPv4, VxLAN and GRE GSO Mark Kavanagh (2): lib/gso: add VxLAN GSO support lib/gso: add GRE GSO support app/test-pmd/cmdline.c | 121 +++++++++ app/test-pmd/config.c | 25 ++ app/test-pmd/csumonly.c | 68 ++++- app/test-pmd/testpmd.c | 9 + app/test-pmd/testpmd.h | 10 + config/common_base | 5 + lib/Makefile | 2 + lib/librte_eal/common/include/rte_log.h | 1 + lib/librte_gso/Makefile | 52 ++++ lib/librte_gso/gso_common.c | 431 ++++++++++++++++++++++++++++++++ lib/librte_gso/gso_common.h | 180 +++++++++++++ lib/librte_gso/gso_tcp.c | 82 ++++++ lib/librte_gso/gso_tcp.h | 73 ++++++ lib/librte_gso/gso_tunnel.c | 62 +++++ lib/librte_gso/gso_tunnel.h | 46 ++++ lib/librte_gso/rte_gso.c | 100 ++++++++ lib/librte_gso/rte_gso.h | 122 +++++++++ lib/librte_gso/rte_gso_version.map | 7 + mk/rte.app.mk | 1 + 19 files changed, 1392 insertions(+), 5 deletions(-) create mode 100644 lib/librte_gso/Makefile create mode 100644 lib/librte_gso/gso_common.c create mode 100644 lib/librte_gso/gso_common.h create mode 100644 lib/librte_gso/gso_tcp.c create mode 100644 lib/librte_gso/gso_tcp.h create mode 100644 lib/librte_gso/gso_tunnel.c create mode 100644 lib/librte_gso/gso_tunnel.h create mode 100644 lib/librte_gso/rte_gso.c create mode 100644 lib/librte_gso/rte_gso.h create mode 100644 lib/librte_gso/rte_gso_version.map -- 2.7.4