diff options
author | Patrick McHardy <kaber@trash.net> | 2006-01-06 23:04:01 -0800 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-01-07 12:57:32 -0800 |
commit | 8cdfab8a43bb4b3da686ea503a702cb6f9f6a803 (patch) | |
tree | 9c4f42ff23f0e227e705aa5aae4f74e45297f3cb /net | |
parent | b05e106698d9966de524e78d9da1bf6407fe0c32 (diff) | |
download | linux-3.10-8cdfab8a43bb4b3da686ea503a702cb6f9f6a803.tar.gz linux-3.10-8cdfab8a43bb4b3da686ea503a702cb6f9f6a803.tar.bz2 linux-3.10-8cdfab8a43bb4b3da686ea503a702cb6f9f6a803.zip |
[IPV4]: reset IPCB flags when neccessary
Reset IPSKB_XFRM_TUNNEL_SIZE flags in ipip and ip_gre hard_start_xmit
function before the packet reenters IP. This is neccessary so the
encapsulated packets are checked not to be oversized in xfrm4_output.c
again. Reset all flags in sit when a packet changes its address family.
Also remove some obsolete IPSKB flags.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/ip_gre.c | 1 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 1 | ||||
-rw-r--r-- | net/ipv6/sit.c | 2 |
3 files changed, 4 insertions, 0 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 912c42f57c7..65c3a91ed85 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -832,6 +832,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, gre_hlen); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); + IPCB(skb)->flags &= ~IPSKB_XFRM_TUNNEL_SIZE; dst_release(skb->dst); skb->dst = &rt->u.dst; diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 35571cff81c..078b59be91f 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c @@ -621,6 +621,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); + IPCB(skb)->flags &= ~IPSKB_XFRM_TUNNEL_SIZE; dst_release(skb->dst); skb->dst = &rt->u.dst; diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 577d49732b0..02872ae8a43 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -381,6 +381,7 @@ static int ipip6_rcv(struct sk_buff *skb) skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); + IPCB(skb)->flags = 0; skb->protocol = htons(ETH_P_IPV6); skb->pkt_type = PACKET_HOST; tunnel->stat.rx_packets++; @@ -552,6 +553,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); + IPCB(skb)->flags = 0; dst_release(skb->dst); skb->dst = &rt->u.dst; |