diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 9a009c66c8a3..d86d7f67a597 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -1125,18 +1125,11 @@ do_udp_sendmsg: | |||
1125 | 1125 | ||
1126 | security_sk_classify_flow(sk, &fl); | 1126 | security_sk_classify_flow(sk, &fl); |
1127 | 1127 | ||
1128 | err = ip6_sk_dst_lookup(sk, &dst, &fl); | 1128 | dst = ip6_sk_dst_lookup_flow(sk, &fl, final_p, true); |
1129 | if (err) | 1129 | if (IS_ERR(dst)) { |
1130 | err = PTR_ERR(dst); | ||
1131 | dst = NULL; | ||
1130 | goto out; | 1132 | goto out; |
1131 | if (final_p) | ||
1132 | ipv6_addr_copy(&fl.fl6_dst, final_p); | ||
1133 | |||
1134 | err = __xfrm_lookup(sock_net(sk), &dst, &fl, sk, XFRM_LOOKUP_WAIT); | ||
1135 | if (err < 0) { | ||
1136 | if (err == -EREMOTE) | ||
1137 | err = ip6_dst_blackhole(sk, &dst, &fl); | ||
1138 | if (err < 0) | ||
1139 | goto out; | ||
1140 | } | 1133 | } |
1141 | 1134 | ||
1142 | if (hlimit < 0) { | 1135 | if (hlimit < 0) { |
@@ -1299,7 +1292,7 @@ static int udp6_ufo_send_check(struct sk_buff *skb) | |||
1299 | return 0; | 1292 | return 0; |
1300 | } | 1293 | } |
1301 | 1294 | ||
1302 | static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, int features) | 1295 | static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, u32 features) |
1303 | { | 1296 | { |
1304 | struct sk_buff *segs = ERR_PTR(-EINVAL); | 1297 | struct sk_buff *segs = ERR_PTR(-EINVAL); |
1305 | unsigned int mss; | 1298 | unsigned int mss; |