diff options
| author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-10-08 17:16:30 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 16:54:53 -0700 | 
| commit | 406ef77c893ebd882209be4e393d64b01fe72054 (patch) | |
| tree | 815d753889769b355fba7e648abef7ad1422559e /net/ipv6/xfrm6_output.c | |
| parent | bc31d3b2c7d7f2a03721a05cb3c9a3ce8b1e2e5a (diff) | |
| download | olio-linux-3.10-406ef77c893ebd882209be4e393d64b01fe72054.tar.xz olio-linux-3.10-406ef77c893ebd882209be4e393d64b01fe72054.zip  | |
[IPSEC]: Move common output code to xfrm_output
Most of the code in xfrm4_output_one and xfrm6_output_one are identical so
this patch moves them into a common xfrm_output function which will live
in net/xfrm.
In fact this would seem to fix a bug as on IPv4 we never reset the network
header after a transform which may upset netfilter later on.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/xfrm6_output.c')
| -rw-r--r-- | net/ipv6/xfrm6_output.c | 45 | 
1 files changed, 5 insertions, 40 deletions
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c index 56364a5f676..f21596f8998 100644 --- a/net/ipv6/xfrm6_output.c +++ b/net/ipv6/xfrm6_output.c @@ -9,9 +9,9 @@   * 2 of the License, or (at your option) any later version.   */ +#include <linux/if_ether.h>  #include <linux/compiler.h>  #include <linux/skbuff.h> -#include <linux/spinlock.h>  #include <linux/icmpv6.h>  #include <linux/netfilter_ipv6.h>  #include <net/ipv6.h> @@ -43,62 +43,27 @@ static int xfrm6_tunnel_check_size(struct sk_buff *skb)  	return ret;  } -static int xfrm6_output_one(struct sk_buff *skb) +static inline int xfrm6_output_one(struct sk_buff *skb)  {  	struct dst_entry *dst = skb->dst;  	struct xfrm_state *x = dst->xfrm;  	int err; -	if (skb->ip_summed == CHECKSUM_PARTIAL) { -		err = skb_checksum_help(skb); -		if (err) -			goto error_nolock; -	} -  	if (x->props.mode == XFRM_MODE_TUNNEL) {  		err = xfrm6_tunnel_check_size(skb);  		if (err)  			goto error_nolock;  	} -	do { -		spin_lock_bh(&x->lock); -		err = xfrm_state_check(x, skb); -		if (err) -			goto error; - -		err = x->mode->output(x, skb); -		if (err) -			goto error; - -		err = x->type->output(x, skb); -		if (err) -			goto error; - -		x->curlft.bytes += skb->len; -		x->curlft.packets++; -		if (x->props.mode == XFRM_MODE_ROUTEOPTIMIZATION) -			x->lastused = get_seconds(); - -		spin_unlock_bh(&x->lock); - -		skb_reset_network_header(skb); - -		if (!(skb->dst = dst_pop(dst))) { -			err = -EHOSTUNREACH; -			goto error_nolock; -		} -		dst = skb->dst; -		x = dst->xfrm; -	} while (x && (x->props.mode != XFRM_MODE_TUNNEL)); +	err = xfrm_output(skb); +	if (err) +		goto error_nolock;  	IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED;  	err = 0;  out_exit:  	return err; -error: -	spin_unlock_bh(&x->lock);  error_nolock:  	kfree_skb(skb);  	goto out_exit;  |