diff options
author | Patrick McManus <mcmanus@ducksong.com> | 2008-03-21 19:29:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-03-21 19:29:22 -0400 |
commit | e4c78840284f3f51b1896cf3936d60a6033c4d2c (patch) | |
tree | b23dc99e6d96c2aa9813bf41aa1b0af8b95a735d /net/ipv4/inet_connection_sock.c | |
parent | 539fae89bebd16ebeafd57a87169bc56eb530d76 (diff) |
[TCP]: TCP_DEFER_ACCEPT updates - dont retxmt synack
a socket in LISTEN that had completed its 3 way handshake, but not notified
userspace because of SO_DEFER_ACCEPT, would retransmit the already
acked syn-ack during the time it was waiting for the first data byte
from the peer.
Signed-off-by: Patrick McManus <mcmanus@ducksong.com>
Acked-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/inet_connection_sock.c')
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index f24c7d534081..8a45be988709 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -461,8 +461,9 @@ void inet_csk_reqsk_queue_prune(struct sock *parent, | |||
461 | reqp=&lopt->syn_table[i]; | 461 | reqp=&lopt->syn_table[i]; |
462 | while ((req = *reqp) != NULL) { | 462 | while ((req = *reqp) != NULL) { |
463 | if (time_after_eq(now, req->expires)) { | 463 | if (time_after_eq(now, req->expires)) { |
464 | if ((req->retrans < (inet_rsk(req)->acked ? max_retries : thresh)) | 464 | if ((req->retrans < (inet_rsk(req)->acked ? max_retries : thresh)) && |
465 | && !req->rsk_ops->rtx_syn_ack(parent, req)) { | 465 | (inet_rsk(req)->acked || |
466 | !req->rsk_ops->rtx_syn_ack(parent, req))) { | ||
466 | unsigned long timeo; | 467 | unsigned long timeo; |
467 | 468 | ||
468 | if (req->retrans++ == 0) | 469 | if (req->retrans++ == 0) |