diff options
Diffstat (limited to 'net/ipv4/syncookies.c')
| -rw-r--r-- | net/ipv4/syncookies.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index 26399ad2a289..66fd80ef2473 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c | |||
| @@ -277,6 +277,13 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | |||
| 277 | 277 | ||
| 278 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_SYNCOOKIESRECV); | 278 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_SYNCOOKIESRECV); |
| 279 | 279 | ||
| 280 | /* check for timestamp cookie support */ | ||
| 281 | memset(&tcp_opt, 0, sizeof(tcp_opt)); | ||
| 282 | tcp_parse_options(skb, &tcp_opt, &hash_location, 0); | ||
| 283 | |||
| 284 | if (tcp_opt.saw_tstamp) | ||
| 285 | cookie_check_timestamp(&tcp_opt); | ||
| 286 | |||
| 280 | ret = NULL; | 287 | ret = NULL; |
| 281 | req = inet_reqsk_alloc(&tcp_request_sock_ops); /* for safety */ | 288 | req = inet_reqsk_alloc(&tcp_request_sock_ops); /* for safety */ |
| 282 | if (!req) | 289 | if (!req) |
| @@ -292,6 +299,12 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | |||
| 292 | ireq->loc_addr = ip_hdr(skb)->daddr; | 299 | ireq->loc_addr = ip_hdr(skb)->daddr; |
| 293 | ireq->rmt_addr = ip_hdr(skb)->saddr; | 300 | ireq->rmt_addr = ip_hdr(skb)->saddr; |
| 294 | ireq->ecn_ok = 0; | 301 | ireq->ecn_ok = 0; |
| 302 | ireq->snd_wscale = tcp_opt.snd_wscale; | ||
| 303 | ireq->rcv_wscale = tcp_opt.rcv_wscale; | ||
| 304 | ireq->sack_ok = tcp_opt.sack_ok; | ||
| 305 | ireq->wscale_ok = tcp_opt.wscale_ok; | ||
| 306 | ireq->tstamp_ok = tcp_opt.saw_tstamp; | ||
| 307 | req->ts_recent = tcp_opt.saw_tstamp ? tcp_opt.rcv_tsval : 0; | ||
| 295 | 308 | ||
| 296 | /* We throwed the options of the initial SYN away, so we hope | 309 | /* We throwed the options of the initial SYN away, so we hope |
| 297 | * the ACK carries the same options again (see RFC1122 4.2.3.8) | 310 | * the ACK carries the same options again (see RFC1122 4.2.3.8) |
| @@ -340,20 +353,6 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | |||
| 340 | } | 353 | } |
| 341 | } | 354 | } |
| 342 | 355 | ||
| 343 | /* check for timestamp cookie support */ | ||
| 344 | memset(&tcp_opt, 0, sizeof(tcp_opt)); | ||
| 345 | tcp_parse_options(skb, &tcp_opt, &hash_location, 0, &rt->u.dst); | ||
| 346 | |||
| 347 | if (tcp_opt.saw_tstamp) | ||
| 348 | cookie_check_timestamp(&tcp_opt); | ||
| 349 | |||
| 350 | ireq->snd_wscale = tcp_opt.snd_wscale; | ||
| 351 | ireq->rcv_wscale = tcp_opt.rcv_wscale; | ||
| 352 | ireq->sack_ok = tcp_opt.sack_ok; | ||
| 353 | ireq->wscale_ok = tcp_opt.wscale_ok; | ||
| 354 | ireq->tstamp_ok = tcp_opt.saw_tstamp; | ||
| 355 | req->ts_recent = tcp_opt.saw_tstamp ? tcp_opt.rcv_tsval : 0; | ||
| 356 | |||
| 357 | /* Try to redo what tcp_v4_send_synack did. */ | 356 | /* Try to redo what tcp_v4_send_synack did. */ |
| 358 | req->window_clamp = tp->window_clamp ? :dst_metric(&rt->u.dst, RTAX_WINDOW); | 357 | req->window_clamp = tp->window_clamp ? :dst_metric(&rt->u.dst, RTAX_WINDOW); |
| 359 | 358 | ||
