diff options
Diffstat (limited to 'net/ipv6/syncookies.c')
-rw-r--r-- | net/ipv6/syncookies.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c index 09fd34f0dbf2..352c26081f5d 100644 --- a/net/ipv6/syncookies.c +++ b/net/ipv6/syncookies.c | |||
@@ -232,23 +232,20 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
232 | */ | 232 | */ |
233 | { | 233 | { |
234 | struct in6_addr *final_p, final; | 234 | struct in6_addr *final_p, final; |
235 | struct flowi fl; | 235 | struct flowi6 fl6; |
236 | memset(&fl, 0, sizeof(fl)); | 236 | memset(&fl6, 0, sizeof(fl6)); |
237 | fl.proto = IPPROTO_TCP; | 237 | fl6.flowi6_proto = IPPROTO_TCP; |
238 | ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr); | 238 | ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr); |
239 | final_p = fl6_update_dst(&fl, np->opt, &final); | 239 | final_p = fl6_update_dst(&fl6, np->opt, &final); |
240 | ipv6_addr_copy(&fl.fl6_src, &ireq6->loc_addr); | 240 | ipv6_addr_copy(&fl6.saddr, &ireq6->loc_addr); |
241 | fl.oif = sk->sk_bound_dev_if; | 241 | fl6.flowi6_oif = sk->sk_bound_dev_if; |
242 | fl.mark = sk->sk_mark; | 242 | fl6.flowi6_mark = sk->sk_mark; |
243 | fl.fl_ip_dport = inet_rsk(req)->rmt_port; | 243 | fl6.fl6_dport = inet_rsk(req)->rmt_port; |
244 | fl.fl_ip_sport = inet_sk(sk)->inet_sport; | 244 | fl6.fl6_sport = inet_sk(sk)->inet_sport; |
245 | security_req_classify_flow(req, &fl); | 245 | security_req_classify_flow(req, flowi6_to_flowi(&fl6)); |
246 | if (ip6_dst_lookup(sk, &dst, &fl)) | 246 | |
247 | goto out_free; | 247 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false); |
248 | 248 | if (IS_ERR(dst)) | |
249 | if (final_p) | ||
250 | ipv6_addr_copy(&fl.fl6_dst, final_p); | ||
251 | if ((xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0) | ||
252 | goto out_free; | 249 | goto out_free; |
253 | } | 250 | } |
254 | 251 | ||