#define IPTUNNEL_XMIT() do {                                           \
        int err;                                                        \
-       int pkt_len = skb->len;                                         \
+       int pkt_len = skb->len - skb_transport_offset(skb);             \
                                                                        \
        skb->ip_summed = CHECKSUM_NONE;                                 \
        ip_select_ident(iph, &rt->u.dst, NULL);                         \
 
        struct ip_tunnel *tunnel;
        int    offset = 4;
        __be16 gre_proto;
+       unsigned int len;
 
        if (!pskb_may_pull(skb, 16))
                goto drop_nolock;
                        tunnel->i_seqno = seqno + 1;
                }
 
+               len = skb->len;
+
                /* Warning: All skb pointers will be invalidated! */
                if (tunnel->dev->type == ARPHRD_ETHER) {
                        if (!pskb_may_pull(skb, ETH_HLEN)) {
                }
 
                stats->rx_packets++;
-               stats->rx_bytes += skb->len;
+               stats->rx_bytes += len;
                skb->dev = tunnel->dev;
                dst_release(skb->dst);
                skb->dst = NULL;
                old_iph = ip_hdr(skb);
        }
 
-       skb->transport_header = skb->network_header;
+       skb_reset_transport_header(skb);
        skb_push(skb, gre_hlen);
        skb_reset_network_header(skb);
        memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));