Skip to content

Commit 1dac3b1

Browse files
Ronak Doshidavem330
authored andcommitted
vmxnet3: fix cksum offload issues for non-udp tunnels
Commit dacce2b ("vmxnet3: add geneve and vxlan tunnel offload support") added support for encapsulation offload. However, the inner offload capability is to be restrictued to UDP tunnels. This patch fixes the issue for non-udp tunnels by adding features check capability and filtering appropriate features for non-udp tunnels. Fixes: dacce2b ("vmxnet3: add geneve and vxlan tunnel offload support") Signed-off-by: Ronak Doshi <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent abe2f12 commit 1dac3b1

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

drivers/net/vmxnet3/vmxnet3_drv.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,6 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
10321032
/* Use temporary descriptor to avoid touching bits multiple times */
10331033
union Vmxnet3_GenericDesc tempTxDesc;
10341034
#endif
1035-
struct udphdr *udph;
10361035

10371036
count = txd_estimate(skb);
10381037

@@ -1135,8 +1134,7 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
11351134
gdesc->txd.om = VMXNET3_OM_ENCAP;
11361135
gdesc->txd.msscof = ctx.mss;
11371136

1138-
udph = udp_hdr(skb);
1139-
if (udph->check)
1137+
if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL_CSUM)
11401138
gdesc->txd.oco = 1;
11411139
} else {
11421140
gdesc->txd.hlen = ctx.l4_offset + ctx.l4_hdr_size;
@@ -3371,6 +3369,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
33713369
.ndo_change_mtu = vmxnet3_change_mtu,
33723370
.ndo_fix_features = vmxnet3_fix_features,
33733371
.ndo_set_features = vmxnet3_set_features,
3372+
.ndo_features_check = vmxnet3_features_check,
33743373
.ndo_get_stats64 = vmxnet3_get_stats64,
33753374
.ndo_tx_timeout = vmxnet3_tx_timeout,
33763375
.ndo_set_rx_mode = vmxnet3_set_mc,

drivers/net/vmxnet3/vmxnet3_ethtool.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,34 @@ netdev_features_t vmxnet3_fix_features(struct net_device *netdev,
267267
return features;
268268
}
269269

270+
netdev_features_t vmxnet3_features_check(struct sk_buff *skb,
271+
struct net_device *netdev,
272+
netdev_features_t features)
273+
{
274+
struct vmxnet3_adapter *adapter = netdev_priv(netdev);
275+
276+
/* Validate if the tunneled packet is being offloaded by the device */
277+
if (VMXNET3_VERSION_GE_4(adapter) &&
278+
skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL) {
279+
u8 l4_proto = 0;
280+
281+
switch (vlan_get_protocol(skb)) {
282+
case htons(ETH_P_IP):
283+
l4_proto = ip_hdr(skb)->protocol;
284+
break;
285+
case htons(ETH_P_IPV6):
286+
l4_proto = ipv6_hdr(skb)->nexthdr;
287+
break;
288+
default:
289+
return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
290+
}
291+
292+
if (l4_proto != IPPROTO_UDP)
293+
return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
294+
}
295+
return features;
296+
}
297+
270298
static void vmxnet3_enable_encap_offloads(struct net_device *netdev)
271299
{
272300
struct vmxnet3_adapter *adapter = netdev_priv(netdev);

drivers/net/vmxnet3/vmxnet3_int.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,10 @@ vmxnet3_rq_destroy_all(struct vmxnet3_adapter *adapter);
470470
netdev_features_t
471471
vmxnet3_fix_features(struct net_device *netdev, netdev_features_t features);
472472

473+
netdev_features_t
474+
vmxnet3_features_check(struct sk_buff *skb,
475+
struct net_device *netdev, netdev_features_t features);
476+
473477
int
474478
vmxnet3_set_features(struct net_device *netdev, netdev_features_t features);
475479

0 commit comments

Comments
 (0)