forked from mirrors/linux
		
	[XFRM]: State selection update to use inner addresses.
This patch modifies the xfrm state selection logic to use the inner addresses where the outer have been (incorrectly) used. This is required for beet mode in general and interfamily setups in both tunnel and beet mode. Signed-off-by: Joakim Koskela <jookos@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Diego Beltrami <diego.beltrami@gmail.com> Signed-off-by: Miika Komu <miika@iki.fi> Acked-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									196b003620
								
							
						
					
					
						commit
						48b8d78315
					
				
					 2 changed files with 4 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -1299,7 +1299,8 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, struct flowi *fl,
 | 
			
		|||
		xfrm_address_t *local  = saddr;
 | 
			
		||||
		struct xfrm_tmpl *tmpl = &policy->xfrm_vec[i];
 | 
			
		||||
 | 
			
		||||
		if (tmpl->mode == XFRM_MODE_TUNNEL) {
 | 
			
		||||
		if (tmpl->mode == XFRM_MODE_TUNNEL ||
 | 
			
		||||
		    tmpl->mode == XFRM_MODE_BEET) {
 | 
			
		||||
			remote = &tmpl->id.daddr;
 | 
			
		||||
			local = &tmpl->saddr;
 | 
			
		||||
			family = tmpl->encap_family;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -611,7 +611,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
 | 
			
		|||
			      selector.
 | 
			
		||||
			 */
 | 
			
		||||
			if (x->km.state == XFRM_STATE_VALID) {
 | 
			
		||||
				if (!xfrm_selector_match(&x->sel, fl, family) ||
 | 
			
		||||
				if (!xfrm_selector_match(&x->sel, fl, x->sel.family) ||
 | 
			
		||||
				    !security_xfrm_state_pol_flow_match(x, pol, fl))
 | 
			
		||||
					continue;
 | 
			
		||||
				if (!best ||
 | 
			
		||||
| 
						 | 
				
			
			@ -623,7 +623,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
 | 
			
		|||
				acquire_in_progress = 1;
 | 
			
		||||
			} else if (x->km.state == XFRM_STATE_ERROR ||
 | 
			
		||||
				   x->km.state == XFRM_STATE_EXPIRED) {
 | 
			
		||||
				if (xfrm_selector_match(&x->sel, fl, family) &&
 | 
			
		||||
				if (xfrm_selector_match(&x->sel, fl, x->sel.family) &&
 | 
			
		||||
				    security_xfrm_state_pol_flow_match(x, pol, fl))
 | 
			
		||||
					error = -ESRCH;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue