aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-12-31 00:10:14 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:00:10 -0500
commit0883ae0e5599656b5f3b0e9ce474e01dee7dfee4 (patch)
treece21b9b78418aca9caf5cbc709de523c953a2db2 /net
parentfcb8c156c8277ee9d71c8c81587d494c9c5240b3 (diff)
[IPSEC]: Fix transport-mode async resume on intput without netfilter
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>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/xfrm4_input.c12
-rw-r--r--net/ipv6/xfrm6_input.c12
2 files changed, 10 insertions, 14 deletions
diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c
index 33f990d56c91..390dcb1354a5 100644
--- a/net/ipv4/xfrm4_input.c
+++ b/net/ipv4/xfrm4_input.c
@@ -51,7 +51,11 @@ int xfrm4_transport_finish(struct sk_buff *skb, int async)
51 51
52 iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol; 52 iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol;
53 53
54#ifdef CONFIG_NETFILTER 54#ifndef CONFIG_NETFILTER
55 if (!async)
56 return -iph->protocol;
57#endif
58
55 __skb_push(skb, skb->data - skb_network_header(skb)); 59 __skb_push(skb, skb->data - skb_network_header(skb));
56 iph->tot_len = htons(skb->len); 60 iph->tot_len = htons(skb->len);
57 ip_send_check(iph); 61 ip_send_check(iph);
@@ -59,12 +63,6 @@ int xfrm4_transport_finish(struct sk_buff *skb, int async)
59 NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, skb->dev, NULL, 63 NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
60 xfrm4_rcv_encap_finish); 64 xfrm4_rcv_encap_finish);
61 return 0; 65 return 0;
62#else
63 if (async)
64 return xfrm4_rcv_encap_finish(skb);
65
66 return -iph->protocol;
67#endif
68} 66}
69 67
70/* If it's a keepalive packet, then just eat it. 68/* If it's a keepalive packet, then just eat it.
diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c
index 063ce6ed1bd0..a4714d76ae6b 100644
--- a/net/ipv6/xfrm6_input.c
+++ b/net/ipv6/xfrm6_input.c
@@ -34,19 +34,17 @@ int xfrm6_transport_finish(struct sk_buff *skb, int async)
34 skb_network_header(skb)[IP6CB(skb)->nhoff] = 34 skb_network_header(skb)[IP6CB(skb)->nhoff] =
35 XFRM_MODE_SKB_CB(skb)->protocol; 35 XFRM_MODE_SKB_CB(skb)->protocol;
36 36
37#ifdef CONFIG_NETFILTER 37#ifndef CONFIG_NETFILTER
38 if (!async)
39 return 1;
40#endif
41
38 ipv6_hdr(skb)->payload_len = htons(skb->len); 42 ipv6_hdr(skb)->payload_len = htons(skb->len);
39 __skb_push(skb, skb->data - skb_network_header(skb)); 43 __skb_push(skb, skb->data - skb_network_header(skb));
40 44
41 NF_HOOK(PF_INET6, NF_INET_PRE_ROUTING, skb, skb->dev, NULL, 45 NF_HOOK(PF_INET6, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
42 ip6_rcv_finish); 46 ip6_rcv_finish);
43 return -1; 47 return -1;
44#else
45 if (async)
46 return ip6_rcv_finish(skb);
47
48 return 1;
49#endif
50} 48}
51 49
52int xfrm6_rcv(struct sk_buff *skb) 50int xfrm6_rcv(struct sk_buff *skb)