diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-10-09 16:29:52 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:55:01 -0400 |
commit | 658b219e9379d75fbdc578b9630b598098471258 (patch) | |
tree | fe802c4e1ee6468a9c2558a5e529b2380845a003 /net/xfrm/xfrm_user.c | |
parent | 75ba28c633952f7994a7117c98ae6515b58f8d30 (diff) |
[IPSEC]: Move common code into xfrm_alloc_spi
This patch moves some common code that conceptually belongs to the xfrm core
from af_key/xfrm_user into xfrm_alloc_spi.
In particular, the spin lock on the state is now taken inside xfrm_alloc_spi.
Previously it also protected the construction of the response PF_KEY/XFRM
messages to user-space. This is inconsistent as other identical constructions
are not protected by the state lock. This is bad because they in fact should
be protected but only in certain spots (so as not to hold the lock for too
long which may cause packet drops).
The SPI byte order conversion has also been moved.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm/xfrm_user.c')
-rw-r--r-- | net/xfrm/xfrm_user.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 8e10e9098a83..52c7fce54641 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -784,16 +784,11 @@ static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
784 | if (x == NULL) | 784 | if (x == NULL) |
785 | goto out_noput; | 785 | goto out_noput; |
786 | 786 | ||
787 | resp_skb = ERR_PTR(-ENOENT); | 787 | err = xfrm_alloc_spi(x, p->min, p->max); |
788 | 788 | if (err) | |
789 | spin_lock_bh(&x->lock); | 789 | goto out; |
790 | if (x->km.state != XFRM_STATE_DEAD) { | ||
791 | xfrm_alloc_spi(x, htonl(p->min), htonl(p->max)); | ||
792 | if (x->id.spi) | ||
793 | resp_skb = xfrm_state_netlink(skb, x, nlh->nlmsg_seq); | ||
794 | } | ||
795 | spin_unlock_bh(&x->lock); | ||
796 | 790 | ||
791 | resp_skb = xfrm_state_netlink(skb, x, nlh->nlmsg_seq); | ||
797 | if (IS_ERR(resp_skb)) { | 792 | if (IS_ERR(resp_skb)) { |
798 | err = PTR_ERR(resp_skb); | 793 | err = PTR_ERR(resp_skb); |
799 | goto out; | 794 | goto out; |