[IPSEC]: Fix transport-mode async resume on intput without netfilter
authorHerbert Xu <herbert@gondor.apana.org.au>
Mon, 31 Dec 2007 05:10:14 +0000 (21:10 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 23:00:10 +0000 (15:00 -0800)
When netfilter is off the transport-mode async resumption doesn't work
because we don't push back the IP header.  This patch fixes that by
moving most of the code outside of ifdef NETFILTER since the only part
that's not common is the short-circuit in the protocol handler.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/xfrm4_input.c
net/ipv6/xfrm6_input.c

index 33f990d56c917baf22e55144dd17707df8e533c3..390dcb1354a5e4f6c76ad0c9bf8d3bc238a217ab 100644 (file)
@@ -51,7 +51,11 @@ int xfrm4_transport_finish(struct sk_buff *skb, int async)
 
        iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol;
 
-#ifdef CONFIG_NETFILTER
+#ifndef CONFIG_NETFILTER
+       if (!async)
+               return -iph->protocol;
+#endif
+
        __skb_push(skb, skb->data - skb_network_header(skb));
        iph->tot_len = htons(skb->len);
        ip_send_check(iph);
@@ -59,12 +63,6 @@ int xfrm4_transport_finish(struct sk_buff *skb, int async)
        NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
                xfrm4_rcv_encap_finish);
        return 0;
-#else
-       if (async)
-               return xfrm4_rcv_encap_finish(skb);
-
-       return -iph->protocol;
-#endif
 }
 
 /* If it's a keepalive packet, then just eat it.
index 063ce6ed1bd095797262bb915c4d16d9175802c6..a4714d76ae6bd72e0a1379a70aa8153e0653eb46 100644 (file)
@@ -34,19 +34,17 @@ int xfrm6_transport_finish(struct sk_buff *skb, int async)
        skb_network_header(skb)[IP6CB(skb)->nhoff] =
                XFRM_MODE_SKB_CB(skb)->protocol;
 
-#ifdef CONFIG_NETFILTER
+#ifndef CONFIG_NETFILTER
+       if (!async)
+               return 1;
+#endif
+
        ipv6_hdr(skb)->payload_len = htons(skb->len);
        __skb_push(skb, skb->data - skb_network_header(skb));
 
        NF_HOOK(PF_INET6, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
                ip6_rcv_finish);
        return -1;
-#else
-       if (async)
-               return ip6_rcv_finish(skb);
-
-       return 1;
-#endif
 }
 
 int xfrm6_rcv(struct sk_buff *skb)