diff options
author | Jerry Chu <hkchu@google.com> | 2010-08-27 15:13:28 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-08-30 16:23:33 -0400 |
commit | dca43c75e7e545694a9dd6288553f55c53e2a3a3 (patch) | |
tree | 4df6b0b295ecd571fa95004b486d9af1636d6a30 /net/ipv4/tcp.c | |
parent | 409456b10f87b28303643fec37543103f9ada00c (diff) |
tcp: Add TCP_USER_TIMEOUT socket option.
This patch provides a "user timeout" support as described in RFC793. The
socket option is also needed for the the local half of RFC5482 "TCP User
Timeout Option".
TCP_USER_TIMEOUT is a TCP level socket option that takes an unsigned int,
when > 0, to specify the maximum amount of time in ms that transmitted
data may remain unacknowledged before TCP will forcefully close the
corresponding connection and return ETIMEDOUT to the application. If
0 is given, TCP will continue to use the system default.
Increasing the user timeouts allows a TCP connection to survive extended
periods without end-to-end connectivity. Decreasing the user timeouts
allows applications to "fail fast" if so desired. Otherwise it may take
upto 20 minutes with the current system defaults in a normal WAN
environment.
The socket option can be made during any state of a TCP connection, but
is only effective during the synchronized states of a connection
(ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, or LAST-ACK).
Moreover, when used with the TCP keepalive (SO_KEEPALIVE) option,
TCP_USER_TIMEOUT will overtake keepalive to determine when to close a
connection due to keepalive failure.
The option does not change in anyway when TCP retransmits a packet, nor
when a keepalive probe will be sent.
This option, like many others, will be inherited by an acceptor from its
listener.
Signed-off-by: H.K. Jerry Chu <hkchu@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r-- | net/ipv4/tcp.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 176e11aaea77..cf3254528753 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2391,7 +2391,12 @@ static int do_tcp_setsockopt(struct sock *sk, int level, | |||
2391 | err = tp->af_specific->md5_parse(sk, optval, optlen); | 2391 | err = tp->af_specific->md5_parse(sk, optval, optlen); |
2392 | break; | 2392 | break; |
2393 | #endif | 2393 | #endif |
2394 | 2394 | case TCP_USER_TIMEOUT: | |
2395 | /* Cap the max timeout in ms TCP will retry/retrans | ||
2396 | * before giving up and aborting (ETIMEDOUT) a connection. | ||
2397 | */ | ||
2398 | icsk->icsk_user_timeout = msecs_to_jiffies(val); | ||
2399 | break; | ||
2395 | default: | 2400 | default: |
2396 | err = -ENOPROTOOPT; | 2401 | err = -ENOPROTOOPT; |
2397 | break; | 2402 | break; |
@@ -2610,6 +2615,10 @@ static int do_tcp_getsockopt(struct sock *sk, int level, | |||
2610 | case TCP_THIN_DUPACK: | 2615 | case TCP_THIN_DUPACK: |
2611 | val = tp->thin_dupack; | 2616 | val = tp->thin_dupack; |
2612 | break; | 2617 | break; |
2618 | |||
2619 | case TCP_USER_TIMEOUT: | ||
2620 | val = jiffies_to_msecs(icsk->icsk_user_timeout); | ||
2621 | break; | ||
2613 | default: | 2622 | default: |
2614 | return -ENOPROTOOPT; | 2623 | return -ENOPROTOOPT; |
2615 | } | 2624 | } |