Commit 8cdfab8a43bb4b3da686ea503a702cb6f9f6a803
Committed by
David S. Miller
1 parent
b05e106698
Exists in
master
and in
7 other branches
[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>
Showing 4 changed files with 7 additions and 5 deletions Side-by-side Diff
include/net/ip.h
... | ... | @@ -37,11 +37,9 @@ |
37 | 37 | struct ip_options opt; /* Compiled IP options */ |
38 | 38 | unsigned char flags; |
39 | 39 | |
40 | -#define IPSKB_MASQUERADED 1 | |
41 | -#define IPSKB_TRANSLATED 2 | |
42 | -#define IPSKB_FORWARDED 4 | |
43 | -#define IPSKB_XFRM_TUNNEL_SIZE 8 | |
44 | -#define IPSKB_FRAG_COMPLETE 16 | |
40 | +#define IPSKB_FORWARDED 1 | |
41 | +#define IPSKB_XFRM_TUNNEL_SIZE 2 | |
42 | +#define IPSKB_FRAG_COMPLETE 4 | |
45 | 43 | }; |
46 | 44 | |
47 | 45 | struct ipcm_cookie |
net/ipv4/ip_gre.c
net/ipv4/ipip.c
... | ... | @@ -621,6 +621,7 @@ |
621 | 621 | skb->h.raw = skb->nh.raw; |
622 | 622 | skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); |
623 | 623 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
624 | + IPCB(skb)->flags &= ~IPSKB_XFRM_TUNNEL_SIZE; | |
624 | 625 | dst_release(skb->dst); |
625 | 626 | skb->dst = &rt->u.dst; |
626 | 627 |
net/ipv6/sit.c
... | ... | @@ -381,6 +381,7 @@ |
381 | 381 | skb->mac.raw = skb->nh.raw; |
382 | 382 | skb->nh.raw = skb->data; |
383 | 383 | memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); |
384 | + IPCB(skb)->flags = 0; | |
384 | 385 | skb->protocol = htons(ETH_P_IPV6); |
385 | 386 | skb->pkt_type = PACKET_HOST; |
386 | 387 | tunnel->stat.rx_packets++; |
... | ... | @@ -552,6 +553,7 @@ |
552 | 553 | skb->h.raw = skb->nh.raw; |
553 | 554 | skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); |
554 | 555 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
556 | + IPCB(skb)->flags = 0; | |
555 | 557 | dst_release(skb->dst); |
556 | 558 | skb->dst = &rt->u.dst; |
557 | 559 |