diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/xfrm4_policy.c | 2 | ||||
-rw-r--r-- | net/ipv6/xfrm6_policy.c | 4 | ||||
-rw-r--r-- | net/xfrm/xfrm_policy.c | 8 |
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 | ||
1168 | static int stale_bundle(struct dst_entry *dst) | 1168 | static 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 | ||
1173 | void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev) | 1173 | void 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 | ||
1285 | int xfrm_bundle_ok(struct xfrm_dst *first, struct flowi *fl, int family) | 1285 | int 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; |