diff options
author | Florian Westphal <fw@strlen.de> | 2010-06-02 20:43:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-05 05:23:15 -0400 |
commit | 5918e2fb9035b35164002c3a268feaf70b7c04d5 (patch) | |
tree | 3a785e4b13971d9b9e9098a339ad005364949852 /net/ipv4/syncookies.c | |
parent | af9b4738574b46025de7ccbe75c7b24fd8914379 (diff) |
syncookies: update mss tables
- ipv6 msstab: account for ipv6 header size
- ipv4 msstab: add mss for Jumbograms.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/syncookies.c')
-rw-r--r-- | net/ipv4/syncookies.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index c9dac8615958..a7cbcc4b726b 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c | |||
@@ -138,23 +138,23 @@ static __u32 check_tcp_syn_cookie(__u32 cookie, __be32 saddr, __be32 daddr, | |||
138 | } | 138 | } |
139 | 139 | ||
140 | /* | 140 | /* |
141 | * This table has to be sorted and terminated with (__u16)-1. | 141 | * MSS Values are taken from the 2009 paper |
142 | * XXX generate a better table. | 142 | * 'Measuring TCP Maximum Segment Size' by S. Alcock and R. Nelson: |
143 | * Unresolved Issues: HIPPI with a 64k MSS is not well supported. | 143 | * - values 1440 to 1460 accounted for 80% of observed mss values |
144 | * - values outside the 536-1460 range are rare (<0.2%). | ||
145 | * | ||
146 | * Table must be sorted. | ||
144 | */ | 147 | */ |
145 | static __u16 const msstab[] = { | 148 | static __u16 const msstab[] = { |
146 | 64 - 1, | 149 | 64, |
147 | 256 - 1, | 150 | 512, |
148 | 512 - 1, | 151 | 536, |
149 | 536 - 1, | 152 | 1024, |
150 | 1024 - 1, | 153 | 1440, |
151 | 1440 - 1, | 154 | 1460, |
152 | 1460 - 1, | 155 | 4312, |
153 | 4312 - 1, | 156 | 8960, |
154 | (__u16)-1 | ||
155 | }; | 157 | }; |
156 | /* The number doesn't include the -1 terminator */ | ||
157 | #define NUM_MSS (ARRAY_SIZE(msstab) - 1) | ||
158 | 158 | ||
159 | /* | 159 | /* |
160 | * Generate a syncookie. mssp points to the mss, which is returned | 160 | * Generate a syncookie. mssp points to the mss, which is returned |
@@ -169,10 +169,10 @@ __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb, __u16 *mssp) | |||
169 | 169 | ||
170 | tcp_synq_overflow(sk); | 170 | tcp_synq_overflow(sk); |
171 | 171 | ||
172 | /* XXX sort msstab[] by probability? Binary search? */ | 172 | for (mssind = ARRAY_SIZE(msstab) - 1; mssind ; mssind--) |
173 | for (mssind = 0; mss > msstab[mssind + 1]; mssind++) | 173 | if (mss >= msstab[mssind]) |
174 | ; | 174 | break; |
175 | *mssp = msstab[mssind] + 1; | 175 | *mssp = msstab[mssind]; |
176 | 176 | ||
177 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_SYNCOOKIESSENT); | 177 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_SYNCOOKIESSENT); |
178 | 178 | ||
@@ -202,7 +202,7 @@ static inline int cookie_check(struct sk_buff *skb, __u32 cookie) | |||
202 | jiffies / (HZ * 60), | 202 | jiffies / (HZ * 60), |
203 | COUNTER_TRIES); | 203 | COUNTER_TRIES); |
204 | 204 | ||
205 | return mssind < NUM_MSS ? msstab[mssind] + 1 : 0; | 205 | return mssind < ARRAY_SIZE(msstab) ? msstab[mssind] : 0; |
206 | } | 206 | } |
207 | 207 | ||
208 | static inline struct sock *get_cookie_sock(struct sock *sk, struct sk_buff *skb, | 208 | static inline struct sock *get_cookie_sock(struct sock *sk, struct sk_buff *skb, |