aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_policy.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/xfrm/xfrm_policy.c')
-rw-r--r--net/xfrm/xfrm_policy.c8
1 files changed, 6 insertions, 2 deletions
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;