diff options
author | William Allen Simpson <william.allen.simpson@gmail.com> | 2009-12-02 13:25:27 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-03 01:07:26 -0500 |
commit | 4957faade11b3a278c3b3cade3411ddc20afa791 (patch) | |
tree | 57f994bab69353baf5f554b89cf9107c3372ecce /net/ipv4/tcp_minisocks.c | |
parent | bd0388ae77075026d6a9f9eb6026dfd1d52ce0e9 (diff) |
TCPCT part 1g: Responder Cookie => Initiator
Parse incoming TCP_COOKIE option(s).
Calculate <SYN,ACK> TCP_COOKIE option.
Send optional <SYN,ACK> data.
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
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
TCPCT part 1d: define TCP cookie option, extend existing struct's
TCPCT part 1e: implement socket option TCP_COOKIE_TRANSACTIONS
TCPCT part 1f: Initiator Cookie => Responder
Signed-off-by: William.Allen.Simpson@gmail.com
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_minisocks.c')
-rw-r--r-- | net/ipv4/tcp_minisocks.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 96852af43ca7..87accec8d097 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -90,13 +90,14 @@ enum tcp_tw_status | |||
90 | tcp_timewait_state_process(struct inet_timewait_sock *tw, struct sk_buff *skb, | 90 | tcp_timewait_state_process(struct inet_timewait_sock *tw, struct sk_buff *skb, |
91 | const struct tcphdr *th) | 91 | const struct tcphdr *th) |
92 | { | 92 | { |
93 | struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw); | ||
94 | struct tcp_options_received tmp_opt; | 93 | struct tcp_options_received tmp_opt; |
94 | u8 *hash_location; | ||
95 | struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw); | ||
95 | int paws_reject = 0; | 96 | int paws_reject = 0; |
96 | 97 | ||
97 | if (th->doff > (sizeof(*th) >> 2) && tcptw->tw_ts_recent_stamp) { | 98 | if (th->doff > (sizeof(*th) >> 2) && tcptw->tw_ts_recent_stamp) { |
98 | tmp_opt.tstamp_ok = 1; | 99 | tmp_opt.tstamp_ok = 1; |
99 | tcp_parse_options(skb, &tmp_opt, 1, NULL); | 100 | tcp_parse_options(skb, &tmp_opt, &hash_location, 1, NULL); |
100 | 101 | ||
101 | if (tmp_opt.saw_tstamp) { | 102 | if (tmp_opt.saw_tstamp) { |
102 | tmp_opt.ts_recent = tcptw->tw_ts_recent; | 103 | tmp_opt.ts_recent = tcptw->tw_ts_recent; |
@@ -518,15 +519,16 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb, | |||
518 | struct request_sock *req, | 519 | struct request_sock *req, |
519 | struct request_sock **prev) | 520 | struct request_sock **prev) |
520 | { | 521 | { |
522 | struct tcp_options_received tmp_opt; | ||
523 | u8 *hash_location; | ||
524 | struct sock *child; | ||
521 | const struct tcphdr *th = tcp_hdr(skb); | 525 | const struct tcphdr *th = tcp_hdr(skb); |
522 | __be32 flg = tcp_flag_word(th) & (TCP_FLAG_RST|TCP_FLAG_SYN|TCP_FLAG_ACK); | 526 | __be32 flg = tcp_flag_word(th) & (TCP_FLAG_RST|TCP_FLAG_SYN|TCP_FLAG_ACK); |
523 | int paws_reject = 0; | 527 | int paws_reject = 0; |
524 | struct tcp_options_received tmp_opt; | ||
525 | struct sock *child; | ||
526 | 528 | ||
527 | if ((th->doff > (sizeof(struct tcphdr)>>2)) && (req->ts_recent)) { | 529 | if ((th->doff > (sizeof(*th) >> 2)) && (req->ts_recent)) { |
528 | tmp_opt.tstamp_ok = 1; | 530 | tmp_opt.tstamp_ok = 1; |
529 | tcp_parse_options(skb, &tmp_opt, 1, NULL); | 531 | tcp_parse_options(skb, &tmp_opt, &hash_location, 1, NULL); |
530 | 532 | ||
531 | if (tmp_opt.saw_tstamp) { | 533 | if (tmp_opt.saw_tstamp) { |
532 | tmp_opt.ts_recent = req->ts_recent; | 534 | tmp_opt.ts_recent = req->ts_recent; |