diff options
Diffstat (limited to 'include/linux/tcp.h')
| -rw-r--r-- | include/linux/tcp.h | 79 |
1 files changed, 68 insertions, 11 deletions
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 61723a7c21fe..a778ee024590 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
| @@ -81,6 +81,12 @@ enum { | |||
| 81 | TCP_DATA_OFFSET = __cpu_to_be32(0xF0000000) | 81 | TCP_DATA_OFFSET = __cpu_to_be32(0xF0000000) |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| 84 | /* | ||
| 85 | * TCP general constants | ||
| 86 | */ | ||
| 87 | #define TCP_MSS_DEFAULT 536U /* IPv4 (RFC1122, RFC2581) */ | ||
| 88 | #define TCP_MSS_DESIRED 1220U /* IPv6 (tunneled), EDNS0 (RFC3226) */ | ||
| 89 | |||
| 84 | /* TCP socket options */ | 90 | /* TCP socket options */ |
| 85 | #define TCP_NODELAY 1 /* Turn off Nagle's algorithm. */ | 91 | #define TCP_NODELAY 1 /* Turn off Nagle's algorithm. */ |
| 86 | #define TCP_MAXSEG 2 /* Limit MSS */ | 92 | #define TCP_MAXSEG 2 /* Limit MSS */ |
| @@ -96,14 +102,17 @@ enum { | |||
| 96 | #define TCP_QUICKACK 12 /* Block/reenable quick acks */ | 102 | #define TCP_QUICKACK 12 /* Block/reenable quick acks */ |
| 97 | #define TCP_CONGESTION 13 /* Congestion control algorithm */ | 103 | #define TCP_CONGESTION 13 /* Congestion control algorithm */ |
| 98 | #define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ | 104 | #define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ |
| 105 | #define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ | ||
| 106 | #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ | ||
| 107 | #define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ | ||
| 99 | 108 | ||
| 109 | /* for TCP_INFO socket option */ | ||
| 100 | #define TCPI_OPT_TIMESTAMPS 1 | 110 | #define TCPI_OPT_TIMESTAMPS 1 |
| 101 | #define TCPI_OPT_SACK 2 | 111 | #define TCPI_OPT_SACK 2 |
| 102 | #define TCPI_OPT_WSCALE 4 | 112 | #define TCPI_OPT_WSCALE 4 |
| 103 | #define TCPI_OPT_ECN 8 | 113 | #define TCPI_OPT_ECN 8 |
| 104 | 114 | ||
| 105 | enum tcp_ca_state | 115 | enum tcp_ca_state { |
| 106 | { | ||
| 107 | TCP_CA_Open = 0, | 116 | TCP_CA_Open = 0, |
| 108 | #define TCPF_CA_Open (1<<TCP_CA_Open) | 117 | #define TCPF_CA_Open (1<<TCP_CA_Open) |
| 109 | TCP_CA_Disorder = 1, | 118 | TCP_CA_Disorder = 1, |
| @@ -116,8 +125,7 @@ enum tcp_ca_state | |||
| 116 | #define TCPF_CA_Loss (1<<TCP_CA_Loss) | 125 | #define TCPF_CA_Loss (1<<TCP_CA_Loss) |
| 117 | }; | 126 | }; |
| 118 | 127 | ||
| 119 | struct tcp_info | 128 | struct tcp_info { |
| 120 | { | ||
| 121 | __u8 tcpi_state; | 129 | __u8 tcpi_state; |
| 122 | __u8 tcpi_ca_state; | 130 | __u8 tcpi_ca_state; |
| 123 | __u8 tcpi_retransmits; | 131 | __u8 tcpi_retransmits; |
| @@ -170,6 +178,30 @@ struct tcp_md5sig { | |||
| 170 | __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* key (binary) */ | 178 | __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* key (binary) */ |
| 171 | }; | 179 | }; |
| 172 | 180 | ||
| 181 | /* for TCP_COOKIE_TRANSACTIONS (TCPCT) socket option */ | ||
| 182 | #define TCP_COOKIE_MIN 8 /* 64-bits */ | ||
| 183 | #define TCP_COOKIE_MAX 16 /* 128-bits */ | ||
| 184 | #define TCP_COOKIE_PAIR_SIZE (2*TCP_COOKIE_MAX) | ||
| 185 | |||
| 186 | /* Flags for both getsockopt and setsockopt */ | ||
| 187 | #define TCP_COOKIE_IN_ALWAYS (1 << 0) /* Discard SYN without cookie */ | ||
| 188 | #define TCP_COOKIE_OUT_NEVER (1 << 1) /* Prohibit outgoing cookies, | ||
| 189 | * supercedes everything. */ | ||
| 190 | |||
| 191 | /* Flags for getsockopt */ | ||
| 192 | #define TCP_S_DATA_IN (1 << 2) /* Was data received? */ | ||
| 193 | #define TCP_S_DATA_OUT (1 << 3) /* Was data sent? */ | ||
| 194 | |||
| 195 | /* TCP_COOKIE_TRANSACTIONS data */ | ||
| 196 | struct tcp_cookie_transactions { | ||
| 197 | __u16 tcpct_flags; /* see above */ | ||
| 198 | __u8 __tcpct_pad1; /* zero */ | ||
| 199 | __u8 tcpct_cookie_desired; /* bytes */ | ||
| 200 | __u16 tcpct_s_data_desired; /* bytes of variable data */ | ||
| 201 | __u16 tcpct_used; /* bytes in value */ | ||
| 202 | __u8 tcpct_value[TCP_MSS_DEFAULT]; | ||
| 203 | }; | ||
| 204 | |||
| 173 | #ifdef __KERNEL__ | 205 | #ifdef __KERNEL__ |
| 174 | 206 | ||
| 175 | #include <linux/skbuff.h> | 207 | #include <linux/skbuff.h> |
| @@ -217,26 +249,38 @@ struct tcp_options_received { | |||
| 217 | sack_ok : 4, /* SACK seen on SYN packet */ | 249 | sack_ok : 4, /* SACK seen on SYN packet */ |
| 218 | snd_wscale : 4, /* Window scaling received from sender */ | 250 | snd_wscale : 4, /* Window scaling received from sender */ |
| 219 | rcv_wscale : 4; /* Window scaling to send to receiver */ | 251 | rcv_wscale : 4; /* Window scaling to send to receiver */ |
| 220 | /* SACKs data */ | 252 | u8 cookie_plus:6, /* bytes in authenticator/cookie option */ |
| 253 | cookie_out_never:1, | ||
| 254 | cookie_in_always:1; | ||
| 221 | u8 num_sacks; /* Number of SACK blocks */ | 255 | u8 num_sacks; /* Number of SACK blocks */ |
| 222 | u16 user_mss; /* mss requested by user in ioctl */ | 256 | u16 user_mss; /* mss requested by user in ioctl */ |
| 223 | u16 mss_clamp; /* Maximal mss, negotiated at connection setup */ | 257 | u16 mss_clamp; /* Maximal mss, negotiated at connection setup */ |
| 224 | }; | 258 | }; |
| 225 | 259 | ||
| 260 | static inline void tcp_clear_options(struct tcp_options_received *rx_opt) | ||
| 261 | { | ||
| 262 | rx_opt->tstamp_ok = rx_opt->sack_ok = 0; | ||
| 263 | rx_opt->wscale_ok = rx_opt->snd_wscale = 0; | ||
| 264 | rx_opt->cookie_plus = 0; | ||
| 265 | } | ||
| 266 | |||
| 226 | /* This is the max number of SACKS that we'll generate and process. It's safe | 267 | /* This is the max number of SACKS that we'll generate and process. It's safe |
| 227 | * to increse this, although since: | 268 | * to increase this, although since: |
| 228 | * size = TCPOLEN_SACK_BASE_ALIGNED (4) + n * TCPOLEN_SACK_PERBLOCK (8) | 269 | * size = TCPOLEN_SACK_BASE_ALIGNED (4) + n * TCPOLEN_SACK_PERBLOCK (8) |
| 229 | * only four options will fit in a standard TCP header */ | 270 | * only four options will fit in a standard TCP header */ |
| 230 | #define TCP_NUM_SACKS 4 | 271 | #define TCP_NUM_SACKS 4 |
| 231 | 272 | ||
| 273 | struct tcp_cookie_values; | ||
| 274 | struct tcp_request_sock_ops; | ||
| 275 | |||
| 232 | struct tcp_request_sock { | 276 | struct tcp_request_sock { |
| 233 | struct inet_request_sock req; | 277 | struct inet_request_sock req; |
| 234 | #ifdef CONFIG_TCP_MD5SIG | 278 | #ifdef CONFIG_TCP_MD5SIG |
| 235 | /* Only used by TCP MD5 Signature so far. */ | 279 | /* Only used by TCP MD5 Signature so far. */ |
| 236 | const struct tcp_request_sock_ops *af_specific; | 280 | const struct tcp_request_sock_ops *af_specific; |
| 237 | #endif | 281 | #endif |
| 238 | u32 rcv_isn; | 282 | u32 rcv_isn; |
| 239 | u32 snt_isn; | 283 | u32 snt_isn; |
| 240 | }; | 284 | }; |
| 241 | 285 | ||
| 242 | static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req) | 286 | static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req) |
| @@ -298,7 +342,10 @@ struct tcp_sock { | |||
| 298 | u32 frto_highmark; /* snd_nxt when RTO occurred */ | 342 | u32 frto_highmark; /* snd_nxt when RTO occurred */ |
| 299 | u16 advmss; /* Advertised MSS */ | 343 | u16 advmss; /* Advertised MSS */ |
| 300 | u8 frto_counter; /* Number of new acks after RTO */ | 344 | u8 frto_counter; /* Number of new acks after RTO */ |
| 301 | u8 nonagle; /* Disable Nagle algorithm? */ | 345 | u8 nonagle : 4,/* Disable Nagle algorithm? */ |
| 346 | thin_lto : 1,/* Use linear timeouts for thin streams */ | ||
| 347 | thin_dupack : 1,/* Fast retransmit on first dupack */ | ||
| 348 | unused : 2; | ||
| 302 | 349 | ||
| 303 | /* RTT measurement */ | 350 | /* RTT measurement */ |
| 304 | u32 srtt; /* smoothed round trip time << 3 */ | 351 | u32 srtt; /* smoothed round trip time << 3 */ |
| @@ -406,6 +453,12 @@ struct tcp_sock { | |||
| 406 | /* TCP MD5 Signature Option information */ | 453 | /* TCP MD5 Signature Option information */ |
| 407 | struct tcp_md5sig_info *md5sig_info; | 454 | struct tcp_md5sig_info *md5sig_info; |
| 408 | #endif | 455 | #endif |
| 456 | |||
| 457 | /* When the cookie options are generated and exchanged, then this | ||
| 458 | * object holds a reference to them (cookie_values->kref). Also | ||
| 459 | * contains related tcp_cookie_transactions fields. | ||
| 460 | */ | ||
| 461 | struct tcp_cookie_values *cookie_values; | ||
| 409 | }; | 462 | }; |
| 410 | 463 | ||
| 411 | static inline struct tcp_sock *tcp_sk(const struct sock *sk) | 464 | static inline struct tcp_sock *tcp_sk(const struct sock *sk) |
| @@ -424,6 +477,10 @@ struct tcp_timewait_sock { | |||
| 424 | u16 tw_md5_keylen; | 477 | u16 tw_md5_keylen; |
| 425 | u8 tw_md5_key[TCP_MD5SIG_MAXKEYLEN]; | 478 | u8 tw_md5_key[TCP_MD5SIG_MAXKEYLEN]; |
| 426 | #endif | 479 | #endif |
| 480 | /* Few sockets in timewait have cookies; in that case, then this | ||
| 481 | * object holds a reference to them (tw_cookie_values->kref). | ||
| 482 | */ | ||
| 483 | struct tcp_cookie_values *tw_cookie_values; | ||
| 427 | }; | 484 | }; |
| 428 | 485 | ||
| 429 | static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk) | 486 | static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk) |
| @@ -431,6 +488,6 @@ static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk) | |||
| 431 | return (struct tcp_timewait_sock *)sk; | 488 | return (struct tcp_timewait_sock *)sk; |
| 432 | } | 489 | } |
| 433 | 490 | ||
| 434 | #endif | 491 | #endif /* __KERNEL__ */ |
| 435 | 492 | ||
| 436 | #endif /* _LINUX_TCP_H */ | 493 | #endif /* _LINUX_TCP_H */ |
