Skip to content

Commit

Permalink
vmxnet3: use correct hdr reference when packet is encapsulated
Browse files Browse the repository at this point in the history
'Commit dacce2b ("vmxnet3: add geneve and vxlan tunnel offload
support")' added support for encapsulation offload. However, while
preparing inner tso packet, it uses reference to outer ip headers.

This patch fixes this issue by using correct reference for inner
headers.

Fixes: dacce2b ("vmxnet3: add geneve and vxlan tunnel offload support")
Signed-off-by: Ronak Doshi <doshir@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ronak Doshi authored and David S. Miller committed May 29, 2020
1 parent 394f9eb commit 3643279
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions drivers/net/vmxnet3/vmxnet3_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,14 +859,29 @@ vmxnet3_parse_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
*/
ctx->l4_offset = skb_checksum_start_offset(skb);

if (ctx->ipv4) {
const struct iphdr *iph = ip_hdr(skb);
if (VMXNET3_VERSION_GE_4(adapter) &&
skb->encapsulation) {
struct iphdr *iph = inner_ip_hdr(skb);

if (iph->version == 4) {
protocol = iph->protocol;
} else {
const struct ipv6hdr *ipv6h;

protocol = iph->protocol;
} else if (ctx->ipv6) {
const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
ipv6h = inner_ipv6_hdr(skb);
protocol = ipv6h->nexthdr;
}
} else {
if (ctx->ipv4) {
const struct iphdr *iph = ip_hdr(skb);

protocol = ipv6h->nexthdr;
protocol = iph->protocol;
} else if (ctx->ipv6) {
const struct ipv6hdr *ipv6h;

ipv6h = ipv6_hdr(skb);
protocol = ipv6h->nexthdr;
}
}

switch (protocol) {
Expand Down Expand Up @@ -946,11 +961,11 @@ vmxnet3_prepare_inner_tso(struct sk_buff *skb,
struct tcphdr *tcph = inner_tcp_hdr(skb);
struct iphdr *iph = inner_ip_hdr(skb);

if (ctx->ipv4) {
if (iph->version == 4) {
iph->check = 0;
tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, 0,
IPPROTO_TCP, 0);
} else if (ctx->ipv6) {
} else {
struct ipv6hdr *iph = inner_ipv6_hdr(skb);

tcph->check = ~csum_ipv6_magic(&iph->saddr, &iph->daddr, 0,
Expand Down

0 comments on commit 3643279

Please sign in to comment.