On 10/11/2019 9:53 AM, Josh Hunt wrote:
Based on a series from Alexander Duyck this change adds UDP segmentation
offload support to the i40e driver.

CC: Alexander Duyck <alexander.h.du...@intel.com>
CC: Willem de Bruijn <will...@google.com>
Signed-off-by: Josh Hunt <joh...@akamai.com>
---
  drivers/net/ethernet/intel/i40e/i40e_main.c |  1 +
  drivers/net/ethernet/intel/i40e/i40e_txrx.c | 12 +++++++++---
  2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 6031223eafab..56f8c52cbba1 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -12911,6 +12911,7 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
                          NETIF_F_GSO_IPXIP6            |
                          NETIF_F_GSO_UDP_TUNNEL        |
                          NETIF_F_GSO_UDP_TUNNEL_CSUM   |
+                         NETIF_F_GSO_UDP_L4            |
                          NETIF_F_SCTP_CRC              |
                          NETIF_F_RXHASH                |
                          NETIF_F_RXCSUM                |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c 
b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index e3f29dc8b290..b8496037ef7f 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -2960,10 +2960,16 @@ static int i40e_tso(struct i40e_tx_buffer *first, u8 
*hdr_len,
/* remove payload length from inner checksum */
        paylen = skb->len - l4_offset;
-       csum_replace_by_diff(&l4.tcp->check, (__force __wsum)htonl(paylen));
- /* compute length of segmentation header */
-       *hdr_len = (l4.tcp->doff * 4) + l4_offset;
+       if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
+               csum_replace_by_diff(&l4.udp->check, (__force 
__wsum)htonl(paylen));
+               /* compute length of segmentation header */
+               *hdr_len = sizeof(*l4.udp) + l4_offset;
+       } else {
+               csum_replace_by_diff(&l4.tcp->check, (__force 
__wsum)htonl(paylen));
+               /* compute length of segmentation header */
+               *hdr_len = (l4.tcp->doff * 4) + l4_offset;
+       }

Is it guaranteed that gso_type can be either UDP or TCP only if we reach here? Don't we need to handle the case where it is neither and return from this function?

/* pull values out of skb_shinfo */
        gso_size = skb_shinfo(skb)->gso_size;

Reply via email to