vmxnet3: fix cksum offload issues for tunnels with non-default udp ports
Commitdacce2be33
("vmxnet3: add geneve and vxlan tunnel offload support") added support for encapsulation offload. However, the inner offload capability is to be restricted to UDP tunnels with default Vxlan and Geneve ports. This patch fixes the issue for tunnels with non-default ports using features check capability and filtering appropriate features for such tunnels. Fixes:dacce2be33
("vmxnet3: add geneve and vxlan tunnel offload support") Signed-off-by: Ronak Doshi <doshir@vmware.com> Acked-by: Guolin Yang <gyang@vmware.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
99f47ea437
Коммит
b22580233d
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Linux driver for VMware's vmxnet3 ethernet NIC.
|
||||
*
|
||||
* Copyright (C) 2008-2020, VMware, Inc. All Rights Reserved.
|
||||
* Copyright (C) 2008-2021, VMware, Inc. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
@ -26,6 +26,10 @@
|
|||
|
||||
|
||||
#include "vmxnet3_int.h"
|
||||
#include <net/vxlan.h>
|
||||
#include <net/geneve.h>
|
||||
|
||||
#define VXLAN_UDP_PORT 8472
|
||||
|
||||
struct vmxnet3_stat_desc {
|
||||
char desc[ETH_GSTRING_LEN];
|
||||
|
@ -262,6 +266,8 @@ netdev_features_t vmxnet3_features_check(struct sk_buff *skb,
|
|||
if (VMXNET3_VERSION_GE_4(adapter) &&
|
||||
skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
u8 l4_proto = 0;
|
||||
u16 port;
|
||||
struct udphdr *udph;
|
||||
|
||||
switch (vlan_get_protocol(skb)) {
|
||||
case htons(ETH_P_IP):
|
||||
|
@ -274,8 +280,20 @@ netdev_features_t vmxnet3_features_check(struct sk_buff *skb,
|
|||
return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
|
||||
}
|
||||
|
||||
if (l4_proto != IPPROTO_UDP)
|
||||
switch (l4_proto) {
|
||||
case IPPROTO_UDP:
|
||||
udph = udp_hdr(skb);
|
||||
port = be16_to_cpu(udph->dest);
|
||||
/* Check if offloaded port is supported */
|
||||
if (port != GENEVE_UDP_PORT &&
|
||||
port != IANA_VXLAN_UDP_PORT &&
|
||||
port != VXLAN_UDP_PORT) {
|
||||
return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
|
||||
}
|
||||
}
|
||||
return features;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче