[IPV4]: reset IPCB flags when neccessary
authorPatrick McHardy <kaber@trash.net>
Sat, 7 Jan 2006 07:04:01 +0000 (23:04 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sat, 7 Jan 2006 20:57:32 +0000 (12:57 -0800)
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>
include/net/ip.h
net/ipv4/ip_gre.c
net/ipv4/ipip.c
net/ipv6/sit.c

index 7bb5804847f29d2ea457383cdce7b0929e16a65a..52f4d9c69704906c753b29b6aba71a5419b4a350 100644 (file)
@@ -37,11 +37,9 @@ struct inet_skb_parm
        struct ip_options       opt;            /* Compiled IP options          */
        unsigned char           flags;
 
-#define IPSKB_MASQUERADED      1
-#define IPSKB_TRANSLATED       2
-#define IPSKB_FORWARDED                4
-#define IPSKB_XFRM_TUNNEL_SIZE 8
-#define IPSKB_FRAG_COMPLETE    16
+#define IPSKB_FORWARDED                1
+#define IPSKB_XFRM_TUNNEL_SIZE 2
+#define IPSKB_FRAG_COMPLETE    4
 };
 
 struct ipcm_cookie
index 912c42f57c79089cc1ea581ba60316204cb5704d..65c3a91ed85e9ddd850bb5e19216dd06baef9383 100644 (file)
@@ -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;
 
index 35571cff81c6eae38033ee3ce47ba590afff67ea..078b59be91f417feb19fe11fd53c947271dc3cfb 100644 (file)
@@ -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;
 
index 577d49732b0fdb04e35587028a7a98e7d21716ec..02872ae8a439b0a664e16cf765c2880ff1ad5fbf 100644 (file)
@@ -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;