|
@@ -477,6 +477,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|
|
struct ip_tunnel *tunnel;
|
|
|
int offset = 4;
|
|
|
__be16 gre_proto;
|
|
|
+ unsigned int len;
|
|
|
|
|
|
if (!pskb_may_pull(skb, 16))
|
|
|
goto drop_nolock;
|
|
@@ -567,6 +568,8 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|
|
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)) {
|
|
@@ -581,7 +584,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|
|
}
|
|
|
|
|
|
stats->rx_packets++;
|
|
|
- stats->rx_bytes += skb->len;
|
|
|
+ stats->rx_bytes += len;
|
|
|
skb->dev = tunnel->dev;
|
|
|
dst_release(skb->dst);
|
|
|
skb->dst = NULL;
|
|
@@ -770,7 +773,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
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));
|