Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cdfab8a authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[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: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b05e1066
Loading
Loading
Loading
Loading
+3 −5
Original line number Original line Diff line number Diff line
@@ -37,11 +37,9 @@ struct inet_skb_parm
	struct ip_options	opt;		/* Compiled IP options		*/
	struct ip_options	opt;		/* Compiled IP options		*/
	unsigned char		flags;
	unsigned char		flags;


#define IPSKB_MASQUERADED	1
#define IPSKB_FORWARDED		1
#define IPSKB_TRANSLATED	2
#define IPSKB_XFRM_TUNNEL_SIZE	2
#define IPSKB_FORWARDED		4
#define IPSKB_FRAG_COMPLETE	4
#define IPSKB_XFRM_TUNNEL_SIZE	8
#define IPSKB_FRAG_COMPLETE	16
};
};


struct ipcm_cookie
struct ipcm_cookie
+1 −0
Original line number Original line Diff line number Diff line
@@ -832,6 +832,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
	skb->h.raw = skb->nh.raw;
	skb->h.raw = skb->nh.raw;
	skb->nh.raw = skb_push(skb, gre_hlen);
	skb->nh.raw = skb_push(skb, gre_hlen);
	memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
	memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
	IPCB(skb)->flags &= ~IPSKB_XFRM_TUNNEL_SIZE;
	dst_release(skb->dst);
	dst_release(skb->dst);
	skb->dst = &rt->u.dst;
	skb->dst = &rt->u.dst;


+1 −0
Original line number Original line Diff line number Diff line
@@ -621,6 +621,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
	skb->h.raw = skb->nh.raw;
	skb->h.raw = skb->nh.raw;
	skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
	skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
	memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
	memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
	IPCB(skb)->flags &= ~IPSKB_XFRM_TUNNEL_SIZE;
	dst_release(skb->dst);
	dst_release(skb->dst);
	skb->dst = &rt->u.dst;
	skb->dst = &rt->u.dst;


+2 −0
Original line number Original line Diff line number Diff line
@@ -381,6 +381,7 @@ static int ipip6_rcv(struct sk_buff *skb)
		skb->mac.raw = skb->nh.raw;
		skb->mac.raw = skb->nh.raw;
		skb->nh.raw = skb->data;
		skb->nh.raw = skb->data;
		memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
		memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
		IPCB(skb)->flags = 0;
		skb->protocol = htons(ETH_P_IPV6);
		skb->protocol = htons(ETH_P_IPV6);
		skb->pkt_type = PACKET_HOST;
		skb->pkt_type = PACKET_HOST;
		tunnel->stat.rx_packets++;
		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->h.raw = skb->nh.raw;
	skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
	skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
	memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
	memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
	IPCB(skb)->flags = 0;
	dst_release(skb->dst);
	dst_release(skb->dst);
	skb->dst = &rt->u.dst;
	skb->dst = &rt->u.dst;