net: hns3: add UDP segmentation offload support
authorHuazhong Tan <tanhuazhong@huawei.com>
Tue, 29 Sep 2020 09:32:01 +0000 (17:32 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 29 Sep 2020 20:14:24 +0000 (13:14 -0700)
Add support for UDP segmentation offload to the HNS3 driver
when the device can do it.

Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

index df52abb2779a00957293826a5eb1a652b589c606..a362516a31853a0ed809a14b01ba844a1c71126b 100644 (file)
@@ -696,12 +696,19 @@ static int hns3_set_tso(struct sk_buff *skb, u32 *paylen,
 
        /* normal or tunnel packet */
        l4_offset = l4.hdr - skb->data;
-       hdr_len = (l4.tcp->doff << 2) + l4_offset;
 
        /* remove payload length from inner pseudo checksum when tso */
        l4_paylen = skb->len - l4_offset;
-       csum_replace_by_diff(&l4.tcp->check,
-                            (__force __wsum)htonl(l4_paylen));
+
+       if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
+               hdr_len = sizeof(*l4.udp) + l4_offset;
+               csum_replace_by_diff(&l4.udp->check,
+                                    (__force __wsum)htonl(l4_paylen));
+       } else {
+               hdr_len = (l4.tcp->doff << 2) + l4_offset;
+               csum_replace_by_diff(&l4.tcp->check,
+                                    (__force __wsum)htonl(l4_paylen));
+       }
 
        /* find the txbd field values */
        *paylen = skb->len - hdr_len;
@@ -2311,6 +2318,13 @@ static void hns3_set_default_feature(struct net_device *netdev)
                        netdev->features |= NETIF_F_NTUPLE;
                }
        }
+
+       if (test_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, ae_dev->caps)) {
+               netdev->hw_features |= NETIF_F_GSO_UDP_L4;
+               netdev->features |= NETIF_F_GSO_UDP_L4;
+               netdev->vlan_features |= NETIF_F_GSO_UDP_L4;
+               netdev->hw_enc_features |= NETIF_F_GSO_UDP_L4;
+       }
 }
 
 static int hns3_alloc_buffer(struct hns3_enet_ring *ring,