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>
This commit is contained in:
committed by
David S. Miller
parent
519855c508
commit
435cf559f0
@@ -1864,6 +1864,19 @@ static int tcp_v6_init_sock(struct sock *sk)
|
||||
tp->af_specific = &tcp_sock_ipv6_specific;
|
||||
#endif
|
||||
|
||||
/* TCP Cookie Transactions */
|
||||
if (sysctl_tcp_cookie_size > 0) {
|
||||
/* Default, cookies without s_data_payload. */
|
||||
tp->cookie_values =
|
||||
kzalloc(sizeof(*tp->cookie_values),
|
||||
sk->sk_allocation);
|
||||
if (tp->cookie_values != NULL)
|
||||
kref_init(&tp->cookie_values->kref);
|
||||
}
|
||||
/* Presumed zeroed, in order of appearance:
|
||||
* cookie_in_always, cookie_out_never,
|
||||
* s_data_constant, s_data_in, s_data_out
|
||||
*/
|
||||
sk->sk_sndbuf = sysctl_tcp_wmem[1];
|
||||
sk->sk_rcvbuf = sysctl_tcp_rmem[1];
|
||||
|
||||
|
Reference in New Issue
Block a user