diff options
| author | Alexey Dobriyan <adobriyan@gmail.com> | 2008-11-25 17:30:50 -0800 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-11-25 17:30:50 -0800 | 
| commit | 221df1ed33c9284fc7a6f6e47ca7f8d5f3665d43 (patch) | |
| tree | 1961ab9f9061b595e10449a24e7275d91f422de2 /net/xfrm | |
| parent | 0e6024519b4da2d9413b97be1de8122d5709ccc1 (diff) | |
| download | linux-221df1ed33c9284fc7a6f6e47ca7f8d5f3665d43.tar.bz2 | |
netns xfrm: state lookup in netns
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm')
| -rw-r--r-- | net/xfrm/xfrm_input.c | 2 | ||||
| -rw-r--r-- | net/xfrm/xfrm_state.c | 34 | ||||
| -rw-r--r-- | net/xfrm/xfrm_user.c | 12 | 
3 files changed, 26 insertions, 22 deletions
| diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index 75279402ccf4..c08a93e98a36 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c @@ -151,7 +151,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)  			goto drop;  		} -		x = xfrm_state_lookup(daddr, spi, nexthdr, family); +		x = xfrm_state_lookup(&init_net, daddr, spi, nexthdr, family);  		if (x == NULL) {  			XFRM_INC_STATS(LINUX_MIB_XFRMINNOSTATES);  			xfrm_audit_state_notfound(skb, family, spi, seq); diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 5f4c5340ba30..afde47498cdc 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -670,13 +670,13 @@ xfrm_init_tempsel(struct xfrm_state *x, struct flowi *fl,  	return 0;  } -static struct xfrm_state *__xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family) +static struct xfrm_state *__xfrm_state_lookup(struct net *net, xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family)  { -	unsigned int h = xfrm_spi_hash(&init_net, daddr, spi, proto, family); +	unsigned int h = xfrm_spi_hash(net, daddr, spi, proto, family);  	struct xfrm_state *x;  	struct hlist_node *entry; -	hlist_for_each_entry(x, entry, init_net.xfrm.state_byspi+h, byspi) { +	hlist_for_each_entry(x, entry, net->xfrm.state_byspi+h, byspi) {  		if (x->props.family != family ||  		    x->id.spi       != spi ||  		    x->id.proto     != proto) @@ -702,13 +702,13 @@ static struct xfrm_state *__xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi,  	return NULL;  } -static struct xfrm_state *__xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family) +static struct xfrm_state *__xfrm_state_lookup_byaddr(struct net *net, xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family)  { -	unsigned int h = xfrm_src_hash(&init_net, daddr, saddr, family); +	unsigned int h = xfrm_src_hash(net, daddr, saddr, family);  	struct xfrm_state *x;  	struct hlist_node *entry; -	hlist_for_each_entry(x, entry, init_net.xfrm.state_bysrc+h, bysrc) { +	hlist_for_each_entry(x, entry, net->xfrm.state_bysrc+h, bysrc) {  		if (x->props.family != family ||  		    x->id.proto     != proto)  			continue; @@ -740,11 +740,13 @@ static struct xfrm_state *__xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm  static inline struct xfrm_state *  __xfrm_state_locate(struct xfrm_state *x, int use_spi, int family)  { +	struct net *net = xs_net(x); +  	if (use_spi) -		return __xfrm_state_lookup(&x->id.daddr, x->id.spi, +		return __xfrm_state_lookup(net, &x->id.daddr, x->id.spi,  					   x->id.proto, family);  	else -		return __xfrm_state_lookup_byaddr(&x->id.daddr, +		return __xfrm_state_lookup_byaddr(net, &x->id.daddr,  						  &x->props.saddr,  						  x->id.proto, family);  } @@ -818,7 +820,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,  	x = best;  	if (!x && !error && !acquire_in_progress) {  		if (tmpl->id.spi && -		    (x0 = __xfrm_state_lookup(daddr, tmpl->id.spi, +		    (x0 = __xfrm_state_lookup(&init_net, daddr, tmpl->id.spi,  					      tmpl->id.proto, family)) != NULL) {  			to_put = x0;  			error = -EEXIST; @@ -1361,26 +1363,27 @@ int xfrm_state_check_expire(struct xfrm_state *x)  EXPORT_SYMBOL(xfrm_state_check_expire);  struct xfrm_state * -xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, +xfrm_state_lookup(struct net *net, xfrm_address_t *daddr, __be32 spi, u8 proto,  		  unsigned short family)  {  	struct xfrm_state *x;  	spin_lock_bh(&xfrm_state_lock); -	x = __xfrm_state_lookup(daddr, spi, proto, family); +	x = __xfrm_state_lookup(net, daddr, spi, proto, family);  	spin_unlock_bh(&xfrm_state_lock);  	return x;  }  EXPORT_SYMBOL(xfrm_state_lookup);  struct xfrm_state * -xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, +xfrm_state_lookup_byaddr(struct net *net, +			 xfrm_address_t *daddr, xfrm_address_t *saddr,  			 u8 proto, unsigned short family)  {  	struct xfrm_state *x;  	spin_lock_bh(&xfrm_state_lock); -	x = __xfrm_state_lookup_byaddr(daddr, saddr, proto, family); +	x = __xfrm_state_lookup_byaddr(net, daddr, saddr, proto, family);  	spin_unlock_bh(&xfrm_state_lock);  	return x;  } @@ -1486,6 +1489,7 @@ EXPORT_SYMBOL(xfrm_get_acqseq);  int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high)  { +	struct net *net = xs_net(x);  	unsigned int h;  	struct xfrm_state *x0;  	int err = -ENOENT; @@ -1503,7 +1507,7 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high)  	err = -ENOENT;  	if (minspi == maxspi) { -		x0 = xfrm_state_lookup(&x->id.daddr, minspi, x->id.proto, x->props.family); +		x0 = xfrm_state_lookup(net, &x->id.daddr, minspi, x->id.proto, x->props.family);  		if (x0) {  			xfrm_state_put(x0);  			goto unlock; @@ -1513,7 +1517,7 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high)  		u32 spi = 0;  		for (h=0; h<high-low+1; h++) {  			spi = low + net_random()%(high-low+1); -			x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family); +			x0 = xfrm_state_lookup(net, &x->id.daddr, htonl(spi), x->id.proto, x->props.family);  			if (x0 == NULL) {  				x->id.spi = htonl(spi);  				break; diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 49a7e897ba96..e02ef3361190 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -440,7 +440,7 @@ static struct xfrm_state *xfrm_user_state_lookup(struct xfrm_usersa_id *p,  	if (xfrm_id_proto_match(p->proto, IPSEC_PROTO_ANY)) {  		err = -ESRCH; -		x = xfrm_state_lookup(&p->daddr, p->spi, p->proto, p->family); +		x = xfrm_state_lookup(&init_net, &p->daddr, p->spi, p->proto, p->family);  	} else {  		xfrm_address_t *saddr = NULL; @@ -451,8 +451,8 @@ static struct xfrm_state *xfrm_user_state_lookup(struct xfrm_usersa_id *p,  		}  		err = -ESRCH; -		x = xfrm_state_lookup_byaddr(&p->daddr, saddr, p->proto, -					     p->family); +		x = xfrm_state_lookup_byaddr(&init_net, &p->daddr, saddr, +					     p->proto, p->family);  	}   out: @@ -1468,7 +1468,7 @@ static int xfrm_get_ae(struct sk_buff *skb, struct nlmsghdr *nlh,  	if (r_skb == NULL)  		return -ENOMEM; -	x = xfrm_state_lookup(&id->daddr, id->spi, id->proto, id->family); +	x = xfrm_state_lookup(&init_net, &id->daddr, id->spi, id->proto, id->family);  	if (x == NULL) {  		kfree_skb(r_skb);  		return -ESRCH; @@ -1509,7 +1509,7 @@ static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh,  	if (!(nlh->nlmsg_flags&NLM_F_REPLACE))  		return err; -	x = xfrm_state_lookup(&p->sa_id.daddr, p->sa_id.spi, p->sa_id.proto, p->sa_id.family); +	x = xfrm_state_lookup(&init_net, &p->sa_id.daddr, p->sa_id.spi, p->sa_id.proto, p->sa_id.family);  	if (x == NULL)  		return -ESRCH; @@ -1628,7 +1628,7 @@ static int xfrm_add_sa_expire(struct sk_buff *skb, struct nlmsghdr *nlh,  	struct xfrm_user_expire *ue = nlmsg_data(nlh);  	struct xfrm_usersa_info *p = &ue->state; -	x = xfrm_state_lookup(&p->id.daddr, p->id.spi, p->id.proto, p->family); +	x = xfrm_state_lookup(&init_net, &p->id.daddr, p->id.spi, p->id.proto, p->family);  	err = -ENOENT;  	if (x == NULL) |