diff options
Diffstat (limited to 'net/ipv4/tcp_timer.c')
-rw-r--r-- | net/ipv4/tcp_timer.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index c03930c48f42..b614ad4d30c9 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c | |||
@@ -424,16 +424,12 @@ out_unlock: | |||
424 | sock_put(sk); | 424 | sock_put(sk); |
425 | } | 425 | } |
426 | 426 | ||
427 | /* | 427 | void reqsk_queue_prune(struct request_sock_queue *queue, struct sock *parent, |
428 | * Timer for listening sockets | 428 | const unsigned long interval, const unsigned long timeout, |
429 | */ | 429 | const unsigned long max_rto, int max_retries) |
430 | |||
431 | static void tcp_synack_timer(struct sock *sk) | ||
432 | { | 430 | { |
433 | struct tcp_sock *tp = tcp_sk(sk); | 431 | struct inet_connection_sock *icsk = inet_csk(parent); |
434 | struct inet_connection_sock *icsk = inet_csk(sk); | 432 | struct listen_sock *lopt = queue->listen_opt; |
435 | struct listen_sock *lopt = icsk->icsk_accept_queue.listen_opt; | ||
436 | int max_retries = icsk->icsk_syn_retries ? : sysctl_tcp_synack_retries; | ||
437 | int thresh = max_retries; | 433 | int thresh = max_retries; |
438 | unsigned long now = jiffies; | 434 | unsigned long now = jiffies; |
439 | struct request_sock **reqp, *req; | 435 | struct request_sock **reqp, *req; |
@@ -470,10 +466,10 @@ static void tcp_synack_timer(struct sock *sk) | |||
470 | } | 466 | } |
471 | } | 467 | } |
472 | 468 | ||
473 | if (tp->defer_accept) | 469 | if (queue->rskq_defer_accept) |
474 | max_retries = tp->defer_accept; | 470 | max_retries = queue->rskq_defer_accept; |
475 | 471 | ||
476 | budget = 2*(TCP_SYNQ_HSIZE/(TCP_TIMEOUT_INIT/TCP_SYNQ_INTERVAL)); | 472 | budget = 2 * (lopt->nr_table_entries / (timeout / interval)); |
477 | i = lopt->clock_hand; | 473 | i = lopt->clock_hand; |
478 | 474 | ||
479 | do { | 475 | do { |
@@ -482,20 +478,19 @@ static void tcp_synack_timer(struct sock *sk) | |||
482 | if (time_after_eq(now, req->expires)) { | 478 | if (time_after_eq(now, req->expires)) { |
483 | if ((req->retrans < thresh || | 479 | if ((req->retrans < thresh || |
484 | (inet_rsk(req)->acked && req->retrans < max_retries)) | 480 | (inet_rsk(req)->acked && req->retrans < max_retries)) |
485 | && !req->rsk_ops->rtx_syn_ack(sk, req, NULL)) { | 481 | && !req->rsk_ops->rtx_syn_ack(parent, req, NULL)) { |
486 | unsigned long timeo; | 482 | unsigned long timeo; |
487 | 483 | ||
488 | if (req->retrans++ == 0) | 484 | if (req->retrans++ == 0) |
489 | lopt->qlen_young--; | 485 | lopt->qlen_young--; |
490 | timeo = min((TCP_TIMEOUT_INIT << req->retrans), | 486 | timeo = min((timeout << req->retrans), max_rto); |
491 | TCP_RTO_MAX); | ||
492 | req->expires = now + timeo; | 487 | req->expires = now + timeo; |
493 | reqp = &req->dl_next; | 488 | reqp = &req->dl_next; |
494 | continue; | 489 | continue; |
495 | } | 490 | } |
496 | 491 | ||
497 | /* Drop this request */ | 492 | /* Drop this request */ |
498 | inet_csk_reqsk_queue_unlink(sk, req, reqp); | 493 | inet_csk_reqsk_queue_unlink(parent, req, reqp); |
499 | reqsk_queue_removed(&icsk->icsk_accept_queue, req); | 494 | reqsk_queue_removed(&icsk->icsk_accept_queue, req); |
500 | reqsk_free(req); | 495 | reqsk_free(req); |
501 | continue; | 496 | continue; |
@@ -503,14 +498,29 @@ static void tcp_synack_timer(struct sock *sk) | |||
503 | reqp = &req->dl_next; | 498 | reqp = &req->dl_next; |
504 | } | 499 | } |
505 | 500 | ||
506 | i = (i+1)&(TCP_SYNQ_HSIZE-1); | 501 | i = (i + 1) & (lopt->nr_table_entries - 1); |
507 | 502 | ||
508 | } while (--budget > 0); | 503 | } while (--budget > 0); |
509 | 504 | ||
510 | lopt->clock_hand = i; | 505 | lopt->clock_hand = i; |
511 | 506 | ||
512 | if (lopt->qlen) | 507 | if (lopt->qlen) |
513 | inet_csk_reset_keepalive_timer(sk, TCP_SYNQ_INTERVAL); | 508 | inet_csk_reset_keepalive_timer(parent, interval); |
509 | } | ||
510 | |||
511 | EXPORT_SYMBOL_GPL(reqsk_queue_prune); | ||
512 | |||
513 | /* | ||
514 | * Timer for listening sockets | ||
515 | */ | ||
516 | |||
517 | static void tcp_synack_timer(struct sock *sk) | ||
518 | { | ||
519 | struct inet_connection_sock *icsk = inet_csk(sk); | ||
520 | const int max_retries = icsk->icsk_syn_retries ? : sysctl_tcp_synack_retries; | ||
521 | |||
522 | reqsk_queue_prune(&icsk->icsk_accept_queue, sk, TCP_SYNQ_INTERVAL, | ||
523 | TCP_TIMEOUT_INIT, TCP_RTO_MAX, max_retries); | ||
514 | } | 524 | } |
515 | 525 | ||
516 | void tcp_set_keepalive(struct sock *sk, int val) | 526 | void tcp_set_keepalive(struct sock *sk, int val) |