diff options
author | Daniel Lee <Longinus00@gmail.com> | 2015-04-06 17:37:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-04-07 18:36:39 -0400 |
commit | 2646c831c00c5d22aa72b79d24069c1b412cda7c (patch) | |
tree | f6e61181b9dc10969a0501fc1e3a8af5be021dfe /net/ipv4/tcp_output.c | |
parent | 7f9b838b71eb78a27de27a12ca5de8542fac3115 (diff) |
tcp: RFC7413 option support for Fast Open client
Fast Open has been using an experimental option with a magic number
(RFC6994). This patch makes the client by default use the RFC7413
option (34) to get and send Fast Open cookies. This patch makes
the client solicit cookies from a given server first with the
RFC7413 option. If that fails to elicit a cookie, then it tries
the RFC6994 experimental option. If that also fails, it uses the
RFC7413 option on all subsequent connect attempts. If the server
returns a Fast Open cookie then the client caches the form of the
option that successfully elicited a cookie, and uses that form on
later connects when it presents that cookie.
The idea is to gradually obsolete the use of experimental options as
the servers and clients upgrade, while keeping the interoperability
meanwhile.
Signed-off-by: Daniel Lee <Longinus00@gmail.com>
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 464bd8c5de69..e662d85d1635 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -592,13 +592,17 @@ static unsigned int tcp_syn_options(struct sock *sk, struct sk_buff *skb, | |||
592 | } | 592 | } |
593 | 593 | ||
594 | if (fastopen && fastopen->cookie.len >= 0) { | 594 | if (fastopen && fastopen->cookie.len >= 0) { |
595 | u32 need = TCPOLEN_EXP_FASTOPEN_BASE + fastopen->cookie.len; | 595 | u32 need = fastopen->cookie.len; |
596 | |||
597 | need += fastopen->cookie.exp ? TCPOLEN_EXP_FASTOPEN_BASE : | ||
598 | TCPOLEN_FASTOPEN_BASE; | ||
596 | need = (need + 3) & ~3U; /* Align to 32 bits */ | 599 | need = (need + 3) & ~3U; /* Align to 32 bits */ |
597 | if (remaining >= need) { | 600 | if (remaining >= need) { |
598 | opts->options |= OPTION_FAST_OPEN_COOKIE; | 601 | opts->options |= OPTION_FAST_OPEN_COOKIE; |
599 | opts->fastopen_cookie = &fastopen->cookie; | 602 | opts->fastopen_cookie = &fastopen->cookie; |
600 | remaining -= need; | 603 | remaining -= need; |
601 | tp->syn_fastopen = 1; | 604 | tp->syn_fastopen = 1; |
605 | tp->syn_fastopen_exp = fastopen->cookie.exp ? 1 : 0; | ||
602 | } | 606 | } |
603 | } | 607 | } |
604 | 608 | ||