]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ice: Support UDP segmentation offload
authorBrett Creeley <brett.creeley@intel.com>
Thu, 12 Dec 2019 11:12:53 +0000 (03:12 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 4 Jan 2020 00:08:32 +0000 (16:08 -0800)
Based on the work done by Alex Duyck on other Intel drivers, add code to
support UDP segmentation offload (USO) for the ice driver.

Signed-off-by: Brett Creeley <brett.creeley@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ice/ice_main.c
drivers/net/ethernet/intel/ice/ice_txrx.c

index 4d5220c9c7211a24396d519e9dcf2b7e93ea805f..1fc6c350487b1bde9433d5cb74b1f8af35b16ab6 100644 (file)
@@ -2330,7 +2330,8 @@ static void ice_set_netdev_features(struct net_device *netdev)
                         NETIF_F_HW_VLAN_CTAG_TX     |
                         NETIF_F_HW_VLAN_CTAG_RX;
 
-       tso_features = NETIF_F_TSO;
+       tso_features = NETIF_F_TSO              |
+                      NETIF_F_GSO_UDP_L4;
 
        /* set features that user can change */
        netdev->hw_features = dflt_features | csumo_features |
index 2c212f64d99f2e392b2f2adc469527aa9162029a..b77514bbd7ba1a484b8b60444f2649d3b0484651 100644 (file)
@@ -1925,6 +1925,7 @@ int ice_tso(struct ice_tx_buf *first, struct ice_tx_offload_params *off)
        } ip;
        union {
                struct tcphdr *tcp;
+               struct udphdr *udp;
                unsigned char *hdr;
        } l4;
        u64 cd_mss, cd_tso_len;
@@ -1958,10 +1959,18 @@ int ice_tso(struct ice_tx_buf *first, struct ice_tx_offload_params *off)
 
        /* remove payload length from checksum */
        paylen = skb->len - l4_start;
-       csum_replace_by_diff(&l4.tcp->check, (__force __wsum)htonl(paylen));
 
-       /* compute length of segmentation header */
-       off->header_len = (l4.tcp->doff * 4) + l4_start;
+       if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
+               csum_replace_by_diff(&l4.udp->check,
+                                    (__force __wsum)htonl(paylen));
+               /* compute length of UDP segmentation header */
+               off->header_len = sizeof(l4.udp) + l4_start;
+       } else {
+               csum_replace_by_diff(&l4.tcp->check,
+                                    (__force __wsum)htonl(paylen));
+               /* compute length of TCP segmentation header */
+               off->header_len = (l4.tcp->doff * 4) + l4_start;
+       }
 
        /* update gso_segs and bytecount */
        first->gso_segs = skb_shinfo(skb)->gso_segs;