Ver Fonte

[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>
Joakim Koskela há 18 anos atrás
pai
commit
48b8d78315
2 ficheiros alterados com 4 adições e 3 exclusões
  1. 2 1
      net/xfrm/xfrm_policy.c
  2. 2 2
      net/xfrm/xfrm_state.c

+ 2 - 1
net/xfrm/xfrm_policy.c

@@ -1299,7 +1299,8 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, struct flowi *fl,
 		xfrm_address_t *local  = saddr;
 		xfrm_address_t *local  = saddr;
 		struct xfrm_tmpl *tmpl = &policy->xfrm_vec[i];
 		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;
 			remote = &tmpl->id.daddr;
 			local = &tmpl->saddr;
 			local = &tmpl->saddr;
 			family = tmpl->encap_family;
 			family = tmpl->encap_family;

+ 2 - 2
net/xfrm/xfrm_state.c

@@ -611,7 +611,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
 			      selector.
 			      selector.
 			 */
 			 */
 			if (x->km.state == XFRM_STATE_VALID) {
 			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))
 				    !security_xfrm_state_pol_flow_match(x, pol, fl))
 					continue;
 					continue;
 				if (!best ||
 				if (!best ||
@@ -623,7 +623,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
 				acquire_in_progress = 1;
 				acquire_in_progress = 1;
 			} else if (x->km.state == XFRM_STATE_ERROR ||
 			} else if (x->km.state == XFRM_STATE_ERROR ||
 				   x->km.state == XFRM_STATE_EXPIRED) {
 				   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))
 				    security_xfrm_state_pol_flow_match(x, pol, fl))
 					error = -ESRCH;
 					error = -ESRCH;
 			}
 			}