| From a131c52db2d0b56ceafe77f8da12b5640fa5ea30 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 26 Aug 2020 13:11:50 +0800 |
| Subject: net: hns3: Fix for geneve tx checksum bug |
| |
| From: Yi Li <yili@winhong.com> |
| |
| [ Upstream commit a156998fc92d3859c8e820f1583f6d0541d643c3 ] |
| |
| when skb->encapsulation is 0, skb->ip_summed is CHECKSUM_PARTIAL |
| and it is udp packet, which has a dest port as the IANA assigned. |
| the hardware is expected to do the checksum offload, but the |
| hardware will not do the checksum offload when udp dest port is |
| 6081. |
| |
| This patch fixes it by doing the checksum in software. |
| |
| Reported-by: Li Bing <libing@winhong.com> |
| Signed-off-by: Yi Li <yili@winhong.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
| index a8ce6ca0f5081..92af7204711c8 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
| @@ -21,6 +21,7 @@ |
| #include <net/pkt_cls.h> |
| #include <net/tcp.h> |
| #include <net/vxlan.h> |
| +#include <net/geneve.h> |
| |
| #include "hnae3.h" |
| #include "hns3_enet.h" |
| @@ -795,7 +796,7 @@ static int hns3_get_l4_protocol(struct sk_buff *skb, u8 *ol4_proto, |
| * and it is udp packet, which has a dest port as the IANA assigned. |
| * the hardware is expected to do the checksum offload, but the |
| * hardware will not do the checksum offload when udp dest port is |
| - * 4789. |
| + * 4789 or 6081. |
| */ |
| static bool hns3_tunnel_csum_bug(struct sk_buff *skb) |
| { |
| @@ -804,7 +805,8 @@ static bool hns3_tunnel_csum_bug(struct sk_buff *skb) |
| l4.hdr = skb_transport_header(skb); |
| |
| if (!(!skb->encapsulation && |
| - l4.udp->dest == htons(IANA_VXLAN_UDP_PORT))) |
| + (l4.udp->dest == htons(IANA_VXLAN_UDP_PORT) || |
| + l4.udp->dest == htons(GENEVE_UDP_PORT)))) |
| return false; |
| |
| skb_checksum_help(skb); |
| -- |
| 2.25.1 |
| |