aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/xfrm4_policy.c2
-rw-r--r--net/ipv6/xfrm6_policy.c4
-rw-r--r--net/xfrm/xfrm_policy.c8
3 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
index e517981ceadd..42d8ded0f96a 100644
--- a/net/ipv4/xfrm4_policy.c
+++ b/net/ipv4/xfrm4_policy.c
@@ -33,7 +33,7 @@ __xfrm4_find_bundle(struct flowi *fl, struct xfrm_policy *policy)
33 xdst->u.rt.fl.fl4_dst == fl->fl4_dst && 33 xdst->u.rt.fl.fl4_dst == fl->fl4_dst &&
34 xdst->u.rt.fl.fl4_src == fl->fl4_src && 34 xdst->u.rt.fl.fl4_src == fl->fl4_src &&
35 xdst->u.rt.fl.fl4_tos == fl->fl4_tos && 35 xdst->u.rt.fl.fl4_tos == fl->fl4_tos &&
36 xfrm_bundle_ok(xdst, fl, AF_INET)) { 36 xfrm_bundle_ok(xdst, fl, AF_INET, 0)) {
37 dst_clone(dst); 37 dst_clone(dst);
38 break; 38 break;
39 } 39 }
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
index a3f68c8b737e..729b4748d6d3 100644
--- a/net/ipv6/xfrm6_policy.c
+++ b/net/ipv6/xfrm6_policy.c
@@ -50,7 +50,9 @@ __xfrm6_find_bundle(struct flowi *fl, struct xfrm_policy *policy)
50 xdst->u.rt6.rt6i_src.plen); 50 xdst->u.rt6.rt6i_src.plen);
51 if (ipv6_addr_equal(&xdst->u.rt6.rt6i_dst.addr, &fl_dst_prefix) && 51 if (ipv6_addr_equal(&xdst->u.rt6.rt6i_dst.addr, &fl_dst_prefix) &&
52 ipv6_addr_equal(&xdst->u.rt6.rt6i_src.addr, &fl_src_prefix) && 52 ipv6_addr_equal(&xdst->u.rt6.rt6i_src.addr, &fl_src_prefix) &&
53 xfrm_bundle_ok(xdst, fl, AF_INET6)) { 53 xfrm_bundle_ok(xdst, fl, AF_INET6,
54 (xdst->u.rt6.rt6i_dst.plen != 128 ||
55 xdst->u.rt6.rt6i_src.plen != 128))) {
54 dst_clone(dst); 56 dst_clone(dst);
55 break; 57 break;
56 } 58 }
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 56abb5c057d4..ad2a5cba1f5b 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -1167,7 +1167,7 @@ static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie)
1167 1167
1168static int stale_bundle(struct dst_entry *dst) 1168static int stale_bundle(struct dst_entry *dst)
1169{ 1169{
1170 return !xfrm_bundle_ok((struct xfrm_dst *)dst, NULL, AF_UNSPEC); 1170 return !xfrm_bundle_ok((struct xfrm_dst *)dst, NULL, AF_UNSPEC, 0);
1171} 1171}
1172 1172
1173void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev) 1173void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
@@ -1282,7 +1282,7 @@ EXPORT_SYMBOL(xfrm_init_pmtu);
1282 * still valid. 1282 * still valid.
1283 */ 1283 */
1284 1284
1285int xfrm_bundle_ok(struct xfrm_dst *first, struct flowi *fl, int family) 1285int xfrm_bundle_ok(struct xfrm_dst *first, struct flowi *fl, int family, int strict)
1286{ 1286{
1287 struct dst_entry *dst = &first->u.dst; 1287 struct dst_entry *dst = &first->u.dst;
1288 struct xfrm_dst *last; 1288 struct xfrm_dst *last;
@@ -1304,6 +1304,10 @@ int xfrm_bundle_ok(struct xfrm_dst *first, struct flowi *fl, int family)
1304 if (dst->xfrm->km.state != XFRM_STATE_VALID) 1304 if (dst->xfrm->km.state != XFRM_STATE_VALID)
1305 return 0; 1305 return 0;
1306 1306
1307 if (strict && fl && dst->xfrm->props.mode != XFRM_MODE_TUNNEL &&
1308 !xfrm_state_addr_flow_check(dst->xfrm, fl, family))
1309 return 0;
1310
1307 mtu = dst_mtu(dst->child); 1311 mtu = dst_mtu(dst->child);
1308 if (xdst->child_mtu_cached != mtu) { 1312 if (xdst->child_mtu_cached != mtu) {
1309 last = xdst; 1313 last = xdst;