Commit fc70fb640b159f1d6bf5ad2321cd55e874c8d1b8

Authored by Alexander Duyck
Committed by David S. Miller
1 parent 6a674e9c75

net: Handle encapsulated offloads before fragmentation or handing to lower dev

This change allows the VXLAN to enable Tx checksum offloading even on
devices that do not support encapsulated checksum offloads. The
advantage to this is that it allows for the lower device to change due
to routing table changes without impacting features on the VXLAN itself.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 2 changed files with 17 additions and 2 deletions Side-by-side Diff

... ... @@ -2324,6 +2324,13 @@
2324 2324 skb->vlan_tci = 0;
2325 2325 }
2326 2326  
  2327 + /* If encapsulation offload request, verify we are testing
  2328 + * hardware encapsulation features instead of standard
  2329 + * features for the netdev
  2330 + */
  2331 + if (skb->encapsulation)
  2332 + features &= dev->hw_enc_features;
  2333 +
2327 2334 if (netif_needs_gso(skb, features)) {
2328 2335 if (unlikely(dev_gso_segment(skb, features)))
2329 2336 goto out_kfree_skb;
... ... @@ -2339,8 +2346,12 @@
2339 2346 * checksumming here.
2340 2347 */
2341 2348 if (skb->ip_summed == CHECKSUM_PARTIAL) {
2342   - skb_set_transport_header(skb,
2343   - skb_checksum_start_offset(skb));
  2349 + if (skb->encapsulation)
  2350 + skb_set_inner_transport_header(skb,
  2351 + skb_checksum_start_offset(skb));
  2352 + else
  2353 + skb_set_transport_header(skb,
  2354 + skb_checksum_start_offset(skb));
2344 2355 if (!(features & NETIF_F_ALL_CSUM) &&
2345 2356 skb_checksum_help(skb))
2346 2357 goto out_kfree_skb;
net/ipv4/ip_output.c
... ... @@ -595,6 +595,10 @@
595 595 }
596 596  
597 597 slow_path:
  598 + /* for offloaded checksums cleanup checksum before fragmentation */
  599 + if ((skb->ip_summed == CHECKSUM_PARTIAL) && skb_checksum_help(skb))
  600 + goto fail;
  601 +
598 602 left = skb->len - hlen; /* Space per frame */
599 603 ptr = hlen; /* Where to start from */
600 604