Merge branch 'tcp-tcstamp_ack-frag-coalesce'
[cascardo/linux.git] / net / ipv6 / sit.c
index f45b8ff..a13d8c1 100644 (file)
@@ -681,14 +681,16 @@ static int ipip6_rcv(struct sk_buff *skb)
                skb->mac_header = skb->network_header;
                skb_reset_network_header(skb);
                IPCB(skb)->flags = 0;
-               skb->protocol = htons(ETH_P_IPV6);
+               skb->dev = tunnel->dev;
 
                if (packet_is_spoofed(skb, iph, tunnel)) {
                        tunnel->dev->stats.rx_errors++;
                        goto out;
                }
 
-               __skb_tunnel_rx(skb, tunnel->dev, tunnel->net);
+               if (iptunnel_pull_header(skb, 0, htons(ETH_P_IPV6),
+                   !net_eq(tunnel->net, dev_net(tunnel->dev))))
+                       goto out;
 
                err = IP_ECN_decapsulate(iph, skb);
                if (unlikely(err)) {
@@ -911,10 +913,9 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                goto tx_error;
        }
 
-       skb = iptunnel_handle_offloads(skb, SKB_GSO_SIT);
-       if (IS_ERR(skb)) {
+       if (iptunnel_handle_offloads(skb, SKB_GSO_SIT)) {
                ip_rt_put(rt);
-               goto out;
+               goto tx_error;
        }
 
        if (df) {
@@ -990,7 +991,6 @@ tx_error_icmp:
        dst_link_failure(skb);
 tx_error:
        kfree_skb(skb);
-out:
        dev->stats.tx_errors++;
        return NETDEV_TX_OK;
 }
@@ -1000,15 +1000,15 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
        struct ip_tunnel *tunnel = netdev_priv(dev);
        const struct iphdr  *tiph = &tunnel->parms.iph;
 
-       skb = iptunnel_handle_offloads(skb, SKB_GSO_IPIP);
-       if (IS_ERR(skb))
-               goto out;
+       if (iptunnel_handle_offloads(skb, SKB_GSO_IPIP))
+               goto tx_error;
 
        skb_set_inner_ipproto(skb, IPPROTO_IPIP);
 
        ip_tunnel_xmit(skb, dev, tiph, IPPROTO_IPIP);
        return NETDEV_TX_OK;
-out:
+tx_error:
+       kfree_skb(skb);
        dev->stats.tx_errors++;
        return NETDEV_TX_OK;
 }