Commit a156998f authored by Yi Li's avatar Yi Li Committed by David S. Miller

net: hns3: Fix for geneve tx checksum bug

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: default avatarLi Bing <libing@winhong.com>
Signed-off-by: default avatarYi Li <yili@winhong.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0a3445b8
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tcp.h> #include <net/tcp.h>
#include <net/vxlan.h> #include <net/vxlan.h>
#include <net/geneve.h>
#include "hnae3.h" #include "hnae3.h"
#include "hns3_enet.h" #include "hns3_enet.h"
...@@ -780,7 +781,7 @@ static int hns3_get_l4_protocol(struct sk_buff *skb, u8 *ol4_proto, ...@@ -780,7 +781,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. * 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 * the hardware is expected to do the checksum offload, but the
* hardware will not do the checksum offload when udp dest port is * 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) static bool hns3_tunnel_csum_bug(struct sk_buff *skb)
{ {
...@@ -789,7 +790,8 @@ static bool hns3_tunnel_csum_bug(struct sk_buff *skb) ...@@ -789,7 +790,8 @@ static bool hns3_tunnel_csum_bug(struct sk_buff *skb)
l4.hdr = skb_transport_header(skb); l4.hdr = skb_transport_header(skb);
if (!(!skb->encapsulation && 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; return false;
skb_checksum_help(skb); skb_checksum_help(skb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment