[dpdk-dev,v5,1/2] ethdev: introduce generic IP/UDP tunnel checksum and TSO

Message ID 20180417144759.160311-1-xuemingl@mellanox.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Xueming Li April 17, 2018, 2:47 p.m. UTC
  This patch introduce new TX offload flags for device that supports
IP or UDP tunneled packet L3/L4 checksum and TSO offload.

The support from the device is for inner and outer checksums on
IPV4/TCP/UDP and TSO for *any packet with the following format*:

<some headers> / [optional IPv4/IPv6] / [optional TCP/UDP] / <some
headers> / [optional inner IPv4/IPv6] / [optional TCP/UDP]

For example the following packets can use this feature:

1. eth / ipv4 / udp / VXLAN / ip / tcp
2. eth / ipv4 / GRE / MPLS / ipv4 / udp

Please note that tunnel headers that contain payload length, sequence id
or checksum will not be updated.

Signed-off-by: Xueming Li <xuemingl@mellanox.com>
---
 lib/librte_ether/rte_ethdev.h |  4 ++++
 lib/librte_mbuf/rte_mbuf.c    |  6 ++++++
 lib/librte_mbuf/rte_mbuf.h    | 16 ++++++++++++++++
 3 files changed, 26 insertions(+)
  

Comments

Thomas Monjalon April 17, 2018, 9:21 p.m. UTC | #1
17/04/2018 16:47, Xueming Li:
> This patch introduce new TX offload flags for device that supports
> IP or UDP tunneled packet L3/L4 checksum and TSO offload.
> 
> The support from the device is for inner and outer checksums on
> IPV4/TCP/UDP and TSO for *any packet with the following format*:
> 
> <some headers> / [optional IPv4/IPv6] / [optional TCP/UDP] / <some
> headers> / [optional inner IPv4/IPv6] / [optional TCP/UDP]
> 
> For example the following packets can use this feature:
> 
> 1. eth / ipv4 / udp / VXLAN / ip / tcp
> 2. eth / ipv4 / GRE / MPLS / ipv4 / udp
> 
> Please note that tunnel headers that contain payload length, sequence id
> or checksum will not be updated.
[...]
> +/**< Device supports UDP tunneled packet TSO */
> +#define DEV_TX_OFFLOAD_UDP_TNL_TSO      0x00040000
> +/**< Device supports IP based tunnel packet TSO */
> +#define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000

These doxygen comments are related to the constants on the next line.
So the syntax is /** not /**<

[...]

General comment: API description is required for application writers
and PMD developers. You need to provide details about what the offload
is expected to do.

> +/**
> + * Generic IP encapsulated tunnel type, used for TSO offload instead
> + * of defining new tunnel types.

The words "instead of defining new tunnel types" are justifications for
the commit message, not for the code itself.

> This feature relies on offloading
> + * DEV_TX_OFFLOAD_IP_TNL_TSO present.

I think you want to say that DEV_TX_OFFLOAD_IP_TNL_TSO must be enabled.

> + * Tunnel header that contains payload length, sequence id or checksum
> + * is not expected to be updated.

OK
So what is updated by this offload exactly?
inner and outer checksums on IPV4/TCP/UDP? What else?
No IPv6? No SCTP?

> + */
> +#define PKT_TX_TUNNEL_IP (0xDULL << 45)
> +/**
> + * Generic UDP encapsulated tunnel type, used for TSO offload instead
> + * of defining new tunnel types. This feature relies on offloading
> + * DEV_TX_OFFLOAD_UDP_TNL_TSO present.
> + * Tunnel header that contains payload length, sequence id or checksum
> + * is not expected to be updated.
> + */

Same comments as for PKT_TX_TUNNEL_IP.

> +#define PKT_TX_TUNNEL_UDP (0xEULL << 45)
  

Patch

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 4f417f573..51db97a6a 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -980,6 +980,10 @@  struct rte_eth_conf {
  *   the same mempool and has refcnt = 1.
  */
 #define DEV_TX_OFFLOAD_SECURITY         0x00020000
+/**< Device supports UDP tunneled packet TSO */
+#define DEV_TX_OFFLOAD_UDP_TNL_TSO      0x00040000
+/**< Device supports IP based tunnel packet TSO */
+#define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
 
 /*
  * If new Tx offload capabilities are defined, they also must be
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 3f4c83305..64e960d4c 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -390,6 +390,8 @@  const char *rte_get_tx_ol_flag_name(uint64_t mask)
 	case PKT_TX_TUNNEL_IPIP: return "PKT_TX_TUNNEL_IPIP";
 	case PKT_TX_TUNNEL_GENEVE: return "PKT_TX_TUNNEL_GENEVE";
 	case PKT_TX_TUNNEL_MPLSINUDP: return "PKT_TX_TUNNEL_MPLSINUDP";
+	case PKT_TX_TUNNEL_IP: return "PKT_TX_TUNNEL_IP";
+	case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP";
 	case PKT_TX_MACSEC: return "PKT_TX_MACSEC";
 	case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
 	default: return NULL;
@@ -424,6 +426,10 @@  rte_get_tx_ol_flag_list(uint64_t mask, char *buf, size_t buflen)
 		  "PKT_TX_TUNNEL_NONE" },
 		{ PKT_TX_TUNNEL_MPLSINUDP, PKT_TX_TUNNEL_MASK,
 		  "PKT_TX_TUNNEL_NONE" },
+		{ PKT_TX_TUNNEL_IP, PKT_TX_TUNNEL_MASK,
+		  "PKT_TX_TUNNEL_NONE" },
+		{ PKT_TX_TUNNEL_UDP, PKT_TX_TUNNEL_MASK,
+		  "PKT_TX_TUNNEL_NONE" },
 		{ PKT_TX_MACSEC, PKT_TX_MACSEC, NULL },
 		{ PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
 	};
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 06eceba37..639e18f7c 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -210,6 +210,22 @@  extern "C" {
 #define PKT_TX_TUNNEL_GENEVE  (0x4ULL << 45)
 /**< TX packet with MPLS-in-UDP RFC 7510 header. */
 #define PKT_TX_TUNNEL_MPLSINUDP (0x5ULL << 45)
+/**
+ * Generic IP encapsulated tunnel type, used for TSO offload instead
+ * of defining new tunnel types. This feature relies on offloading
+ * DEV_TX_OFFLOAD_IP_TNL_TSO present.
+ * Tunnel header that contains payload length, sequence id or checksum
+ * is not expected to be updated.
+ */
+#define PKT_TX_TUNNEL_IP (0xDULL << 45)
+/**
+ * Generic UDP encapsulated tunnel type, used for TSO offload instead
+ * of defining new tunnel types. This feature relies on offloading
+ * DEV_TX_OFFLOAD_UDP_TNL_TSO present.
+ * Tunnel header that contains payload length, sequence id or checksum
+ * is not expected to be updated.
+ */
+#define PKT_TX_TUNNEL_UDP (0xEULL << 45)
 /* add new TX TUNNEL type here */
 #define PKT_TX_TUNNEL_MASK    (0xFULL << 45)