diff options
author | Patrick McHardy <kaber@trash.net> | 2006-01-07 02:04:01 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-01-07 15:57:32 -0500 |
commit | 8cdfab8a43bb4b3da686ea503a702cb6f9f6a803 (patch) | |
tree | 9c4f42ff23f0e227e705aa5aae4f74e45297f3cb | |
parent | b05e106698d9966de524e78d9da1bf6407fe0c32 (diff) |
[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>
-rw-r--r-- | include/net/ip.h | 8 | ||||
-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 |
4 files changed, 7 insertions, 5 deletions
diff --git a/include/net/ip.h b/include/net/ip.h index 7bb5804847f2..52f4d9c69704 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -37,11 +37,9 @@ struct inet_skb_parm | |||
37 | struct ip_options opt; /* Compiled IP options */ | 37 | struct ip_options opt; /* Compiled IP options */ |
38 | unsigned char flags; | 38 | unsigned char flags; |
39 | 39 | ||
40 | #define IPSKB_MASQUERADED 1 | 40 | #define IPSKB_FORWARDED 1 |
41 | #define IPSKB_TRANSLATED 2 | 41 | #define IPSKB_XFRM_TUNNEL_SIZE 2 |
42 | #define IPSKB_FORWARDED 4 | 42 | #define IPSKB_FRAG_COMPLETE 4 |
43 | #define IPSKB_XFRM_TUNNEL_SIZE 8 | ||
44 | #define IPSKB_FRAG_COMPLETE 16 | ||
45 | }; | 43 | }; |
46 | 44 | ||
47 | struct ipcm_cookie | 45 | struct ipcm_cookie |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 912c42f57c79..65c3a91ed85e 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) | |||
832 | skb->h.raw = skb->nh.raw; | 832 | skb->h.raw = skb->nh.raw; |
833 | skb->nh.raw = skb_push(skb, gre_hlen); | 833 | skb->nh.raw = skb_push(skb, gre_hlen); |
834 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 834 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
835 | IPCB(skb)->flags &= ~IPSKB_XFRM_TUNNEL_SIZE; | ||
835 | dst_release(skb->dst); | 836 | dst_release(skb->dst); |
836 | skb->dst = &rt->u.dst; | 837 | skb->dst = &rt->u.dst; |
837 | 838 | ||
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 35571cff81c6..078b59be91f4 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) | |||
621 | skb->h.raw = skb->nh.raw; | 621 | skb->h.raw = skb->nh.raw; |
622 | skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); | 622 | skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); |
623 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 623 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
624 | IPCB(skb)->flags &= ~IPSKB_XFRM_TUNNEL_SIZE; | ||
624 | dst_release(skb->dst); | 625 | dst_release(skb->dst); |
625 | skb->dst = &rt->u.dst; | 626 | skb->dst = &rt->u.dst; |
626 | 627 | ||
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 577d49732b0f..02872ae8a439 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -381,6 +381,7 @@ static int ipip6_rcv(struct sk_buff *skb) | |||
381 | skb->mac.raw = skb->nh.raw; | 381 | skb->mac.raw = skb->nh.raw; |
382 | skb->nh.raw = skb->data; | 382 | skb->nh.raw = skb->data; |
383 | memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); | 383 | memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); |
384 | IPCB(skb)->flags = 0; | ||
384 | skb->protocol = htons(ETH_P_IPV6); | 385 | skb->protocol = htons(ETH_P_IPV6); |
385 | skb->pkt_type = PACKET_HOST; | 386 | skb->pkt_type = PACKET_HOST; |
386 | tunnel->stat.rx_packets++; | 387 | tunnel->stat.rx_packets++; |
@@ -552,6 +553,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
552 | skb->h.raw = skb->nh.raw; | 553 | skb->h.raw = skb->nh.raw; |
553 | skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); | 554 | skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); |
554 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 555 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
556 | IPCB(skb)->flags = 0; | ||
555 | dst_release(skb->dst); | 557 | dst_release(skb->dst); |
556 | skb->dst = &rt->u.dst; | 558 | skb->dst = &rt->u.dst; |
557 | 559 | ||