diff options
author | William Allen Simpson <william.allen.simpson@gmail.com> | 2009-12-02 13:17:05 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-03 01:07:25 -0500 |
commit | 435cf559f02ea3a3159eb316f97dc88bdebe9432 (patch) | |
tree | 0b2a7e9110c46b193176b0a59fe5689eae7c18f3 /net/ipv6/tcp_ipv6.c | |
parent | 519855c508b9a17878c0977a3cdefc09b59b30df (diff) |
TCPCT part 1d: define TCP cookie option, extend existing struct's
Data structures are carefully composed to require minimal additions.
For example, the struct tcp_options_received cookie_plus variable fits
between existing 16-bit and 8-bit variables, requiring no additional
space (taking alignment into consideration). There are no additions to
tcp_request_sock, and only 1 pointer in tcp_sock.
This is a significantly revised implementation of an earlier (year-old)
patch that no longer applies cleanly, with permission of the original
author (Adam Langley):
http://thread.gmane.org/gmane.linux.network/102586
The principle difference is using a TCP option to carry the cookie nonce,
instead of a user configured offset in the data. This is more flexible and
less subject to user configuration error. Such a cookie option has been
suggested for many years, and is also useful without SYN data, allowing
several related concepts to use the same extension option.
"Re: SYN floods (was: does history repeat itself?)", September 9, 1996.
http://www.merit.net/mail.archives/nanog/1996-09/msg00235.html
"Re: what a new TCP header might look like", May 12, 1998.
ftp://ftp.isi.edu/end2end/end2end-interest-1998.mail
These functions will also be used in subsequent patches that implement
additional features.
Requires:
TCPCT part 1a: add request_values parameter for sending SYNACK
TCPCT part 1b: generate Responder Cookie secret
TCPCT part 1c: sysctl_tcp_cookie_size, socket option TCP_COOKIE_TRANSACTIONS
Signed-off-by: William.Allen.Simpson@gmail.com
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index da6e24416d75..f2ec38289a4a 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1864,6 +1864,19 @@ static int tcp_v6_init_sock(struct sock *sk) | |||
1864 | tp->af_specific = &tcp_sock_ipv6_specific; | 1864 | tp->af_specific = &tcp_sock_ipv6_specific; |
1865 | #endif | 1865 | #endif |
1866 | 1866 | ||
1867 | /* TCP Cookie Transactions */ | ||
1868 | if (sysctl_tcp_cookie_size > 0) { | ||
1869 | /* Default, cookies without s_data_payload. */ | ||
1870 | tp->cookie_values = | ||
1871 | kzalloc(sizeof(*tp->cookie_values), | ||
1872 | sk->sk_allocation); | ||
1873 | if (tp->cookie_values != NULL) | ||
1874 | kref_init(&tp->cookie_values->kref); | ||
1875 | } | ||
1876 | /* Presumed zeroed, in order of appearance: | ||
1877 | * cookie_in_always, cookie_out_never, | ||
1878 | * s_data_constant, s_data_in, s_data_out | ||
1879 | */ | ||
1867 | sk->sk_sndbuf = sysctl_tcp_wmem[1]; | 1880 | sk->sk_sndbuf = sysctl_tcp_wmem[1]; |
1868 | sk->sk_rcvbuf = sysctl_tcp_rmem[1]; | 1881 | sk->sk_rcvbuf = sysctl_tcp_rmem[1]; |
1869 | 1882 | ||