|
@@ -252,10 +252,6 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
|
|
|
struct ip_tunnel *tunnel = netdev_priv(dev);
|
|
|
const struct iphdr *tnl_params;
|
|
|
|
|
|
- skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM));
|
|
|
- if (IS_ERR(skb))
|
|
|
- goto out;
|
|
|
-
|
|
|
if (dev->header_ops) {
|
|
|
/* Need space for new headers */
|
|
|
if (skb_cow_head(skb, dev->needed_headroom -
|
|
@@ -268,6 +264,7 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
|
|
|
* to gre header.
|
|
|
*/
|
|
|
skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
|
|
|
+ skb_reset_mac_header(skb);
|
|
|
} else {
|
|
|
if (skb_cow_head(skb, dev->needed_headroom))
|
|
|
goto free_skb;
|
|
@@ -275,6 +272,10 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
|
|
|
tnl_params = &tunnel->parms.iph;
|
|
|
}
|
|
|
|
|
|
+ skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM));
|
|
|
+ if (IS_ERR(skb))
|
|
|
+ goto out;
|
|
|
+
|
|
|
__gre_xmit(skb, dev, tnl_params, skb->protocol);
|
|
|
|
|
|
return NETDEV_TX_OK;
|