1 /*
2  * Copyright (c) 1982, 1986, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *	@(#)tcp.h	8.1 (Berkeley) 6/10/93
30  */
31 
32 #ifndef _NETINET_TCP_H
33 #define _NETINET_TCP_H	1
34 
35 #include <features.h>
36 
37 /*
38  * User-settable options (used with setsockopt).
39  */
40 #define	TCP_NODELAY		 1  /* Don't delay send to coalesce packets  */
41 #define	TCP_MAXSEG		 2  /* Set maximum segment size  */
42 #define TCP_CORK		 3  /* Control sending of partial frames  */
43 #define TCP_KEEPIDLE		 4  /* Start keeplives after this period */
44 #define TCP_KEEPINTVL		 5  /* Interval between keepalives */
45 #define TCP_KEEPCNT		 6  /* Number of keepalives before death */
46 #define TCP_SYNCNT		 7  /* Number of SYN retransmits */
47 #define TCP_LINGER2		 8  /* Life time of orphaned FIN-WAIT-2 state */
48 #define TCP_DEFER_ACCEPT	 9  /* Wake up listener only when data arrive */
49 #define TCP_WINDOW_CLAMP	 10 /* Bound advertised window */
50 #define TCP_INFO		 11 /* Information about this connection. */
51 #define	TCP_QUICKACK		 12 /* Bock/reenable quick ACKs.  */
52 #define TCP_CONGESTION		 13 /* Congestion control algorithm.  */
53 #define TCP_MD5SIG		 14 /* TCP MD5 Signature (RFC2385) */
54 #define TCP_COOKIE_TRANSACTIONS	 15 /* TCP Cookie Transactions */
55 #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/
56 #define TCP_THIN_DUPACK		 17 /* Fast retrans. after 1 dupack */
57 #define TCP_USER_TIMEOUT	 18 /* How long for loss retry before timeout */
58 #define TCP_REPAIR		 19 /* TCP sock is under repair right now */
59 #define TCP_REPAIR_QUEUE	 20 /* Set TCP queue to repair */
60 #define TCP_QUEUE_SEQ		 21 /* Set sequence number of repaired queue. */
61 #define TCP_REPAIR_OPTIONS	 22 /* Repair TCP connection options */
62 #define TCP_FASTOPEN		 23 /* Enable FastOpen on listeners */
63 #define TCP_TIMESTAMP		 24 /* TCP time stamp */
64 #define TCP_NOTSENT_LOWAT	 25 /* Limit number of unsent bytes in
65 				       write queue.  */
66 #define TCP_CC_INFO		 26 /* Get Congestion Control
67 				       (optional) info.  */
68 #define TCP_SAVE_SYN		 27 /* Record SYN headers for new
69 				       connections.  */
70 #define TCP_SAVED_SYN		 28 /* Get SYN headers recorded for
71 				       connection.  */
72 #define TCP_REPAIR_WINDOW	 29 /* Get/set window parameters.  */
73 #define TCP_FASTOPEN_CONNECT	 30 /* Attempt FastOpen with connect.  */
74 #define TCP_ULP			 31 /* Attach a ULP to a TCP connection.  */
75 #define TCP_MD5SIG_EXT		 32 /* TCP MD5 Signature with extensions.  */
76 #define TCP_FASTOPEN_KEY	 33 /* Set the key for Fast Open (cookie).  */
77 #define TCP_FASTOPEN_NO_COOKIE	 34 /* Enable TFO without a TFO cookie.  */
78 #define TCP_ZEROCOPY_RECEIVE	 35
79 #define TCP_INQ			 36 /* Notify bytes available to read
80 				       as a cmsg on read.  */
81 #define TCP_CM_INQ		 TCP_INQ
82 #define TCP_TX_DELAY		 37 /* Delay outgoing packets by XX usec.  */
83 
84 #define TCP_REPAIR_ON		 1
85 #define TCP_REPAIR_OFF		 0
86 #define TCP_REPAIR_OFF_NO_WP	 -1
87 
88 #ifdef __USE_MISC
89 # include <sys/types.h>
90 # include <sys/socket.h>
91 # include <stdint.h>
92 
93 typedef	uint32_t tcp_seq;
94 /*
95  * TCP header.
96  * Per RFC 793, September, 1981.
97  */
98 struct tcphdr
99   {
100     __extension__ union
101     {
102       struct
103       {
104 	uint16_t th_sport;	/* source port */
105 	uint16_t th_dport;	/* destination port */
106 	tcp_seq th_seq;		/* sequence number */
107 	tcp_seq th_ack;		/* acknowledgement number */
108 # if __BYTE_ORDER == __LITTLE_ENDIAN
109 	uint8_t th_x2:4;	/* (unused) */
110 	uint8_t th_off:4;	/* data offset */
111 # endif
112 # if __BYTE_ORDER == __BIG_ENDIAN
113 	uint8_t th_off:4;	/* data offset */
114 	uint8_t th_x2:4;	/* (unused) */
115 # endif
116 	uint8_t th_flags;
117 # define TH_FIN	0x01
118 # define TH_SYN	0x02
119 # define TH_RST	0x04
120 # define TH_PUSH	0x08
121 # define TH_ACK	0x10
122 # define TH_URG	0x20
123 	uint16_t th_win;	/* window */
124 	uint16_t th_sum;	/* checksum */
125 	uint16_t th_urp;	/* urgent pointer */
126       };
127       struct
128       {
129 	uint16_t source;
130 	uint16_t dest;
131 	uint32_t seq;
132 	uint32_t ack_seq;
133 # if __BYTE_ORDER == __LITTLE_ENDIAN
134 	uint16_t res1:4;
135 	uint16_t doff:4;
136 	uint16_t fin:1;
137 	uint16_t syn:1;
138 	uint16_t rst:1;
139 	uint16_t psh:1;
140 	uint16_t ack:1;
141 	uint16_t urg:1;
142 	uint16_t res2:2;
143 # elif __BYTE_ORDER == __BIG_ENDIAN
144 	uint16_t doff:4;
145 	uint16_t res1:4;
146 	uint16_t res2:2;
147 	uint16_t urg:1;
148 	uint16_t ack:1;
149 	uint16_t psh:1;
150 	uint16_t rst:1;
151 	uint16_t syn:1;
152 	uint16_t fin:1;
153 # else
154 #  error "Adjust your <bits/endian.h> defines"
155 # endif
156 	uint16_t window;
157 	uint16_t check;
158 	uint16_t urg_ptr;
159       };
160     };
161 };
162 
163 enum
164 {
165   TCP_ESTABLISHED = 1,
166   TCP_SYN_SENT,
167   TCP_SYN_RECV,
168   TCP_FIN_WAIT1,
169   TCP_FIN_WAIT2,
170   TCP_TIME_WAIT,
171   TCP_CLOSE,
172   TCP_CLOSE_WAIT,
173   TCP_LAST_ACK,
174   TCP_LISTEN,
175   TCP_CLOSING   /* now a valid state */
176 };
177 
178 # define TCPOPT_EOL		0
179 # define TCPOPT_NOP		1
180 # define TCPOPT_MAXSEG		2
181 # define TCPOLEN_MAXSEG		4
182 # define TCPOPT_WINDOW		3
183 # define TCPOLEN_WINDOW		3
184 # define TCPOPT_SACK_PERMITTED	4		/* Experimental */
185 # define TCPOLEN_SACK_PERMITTED	2
186 # define TCPOPT_SACK		5		/* Experimental */
187 # define TCPOPT_TIMESTAMP	8
188 # define TCPOLEN_TIMESTAMP	10
189 # define TCPOLEN_TSTAMP_APPA	(TCPOLEN_TIMESTAMP+2) /* appendix A */
190 
191 # define TCPOPT_TSTAMP_HDR	\
192     (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
193 
194 /*
195  * Default maximum segment size for TCP.
196  * With an IP MSS of 576, this is 536,
197  * but 512 is probably more convenient.
198  * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)).
199  */
200 # define TCP_MSS	512
201 
202 # define TCP_MAXWIN	65535	/* largest value for (unscaled) window */
203 
204 # define TCP_MAX_WINSHIFT	14	/* maximum window shift */
205 
206 # define SOL_TCP		6	/* TCP level */
207 
208 
209 # define TCPI_OPT_TIMESTAMPS	1
210 # define TCPI_OPT_SACK		2
211 # define TCPI_OPT_WSCALE	4
212 # define TCPI_OPT_ECN		8  /* ECN was negociated at TCP session init */
213 # define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */
214 # define TCPI_OPT_SYN_DATA	32 /* SYN-ACK acked data in SYN sent or rcvd */
215 
216 /* Values for tcpi_state.  */
217 enum tcp_ca_state
218 {
219   TCP_CA_Open = 0,
220   TCP_CA_Disorder = 1,
221   TCP_CA_CWR = 2,
222   TCP_CA_Recovery = 3,
223   TCP_CA_Loss = 4
224 };
225 
226 struct tcp_info
227 {
228   uint8_t	tcpi_state;
229   uint8_t	tcpi_ca_state;
230   uint8_t	tcpi_retransmits;
231   uint8_t	tcpi_probes;
232   uint8_t	tcpi_backoff;
233   uint8_t	tcpi_options;
234   uint8_t	tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
235 
236   uint32_t	tcpi_rto;
237   uint32_t	tcpi_ato;
238   uint32_t	tcpi_snd_mss;
239   uint32_t	tcpi_rcv_mss;
240 
241   uint32_t	tcpi_unacked;
242   uint32_t	tcpi_sacked;
243   uint32_t	tcpi_lost;
244   uint32_t	tcpi_retrans;
245   uint32_t	tcpi_fackets;
246 
247   /* Times. */
248   uint32_t	tcpi_last_data_sent;
249   uint32_t	tcpi_last_ack_sent;	/* Not remembered, sorry.  */
250   uint32_t	tcpi_last_data_recv;
251   uint32_t	tcpi_last_ack_recv;
252 
253   /* Metrics. */
254   uint32_t	tcpi_pmtu;
255   uint32_t	tcpi_rcv_ssthresh;
256   uint32_t	tcpi_rtt;
257   uint32_t	tcpi_rttvar;
258   uint32_t	tcpi_snd_ssthresh;
259   uint32_t	tcpi_snd_cwnd;
260   uint32_t	tcpi_advmss;
261   uint32_t	tcpi_reordering;
262 
263   uint32_t	tcpi_rcv_rtt;
264   uint32_t	tcpi_rcv_space;
265 
266   uint32_t	tcpi_total_retrans;
267 };
268 
269 
270 /* For TCP_MD5SIG socket option.  */
271 #define TCP_MD5SIG_MAXKEYLEN	80
272 
273 /* tcp_md5sig extension flags for TCP_MD5SIG_EXT.  */
274 #define TCP_MD5SIG_FLAG_PREFIX	1 /* Address prefix length.  */
275 
276 struct tcp_md5sig
277 {
278   struct sockaddr_storage tcpm_addr;		/* Address associated.  */
279   uint8_t	tcpm_flags;			/* Extension flags.  */
280   uint8_t	tcpm_prefixlen;			/* Address prefix.  */
281   uint16_t	tcpm_keylen;			/* Key length.  */
282   uint32_t	__tcpm_pad;			/* Zero.  */
283   uint8_t	tcpm_key[TCP_MD5SIG_MAXKEYLEN];	/* Key (binary).  */
284 };
285 
286 /* For socket repair options.  */
287 struct tcp_repair_opt
288 {
289   uint32_t	opt_code;
290   uint32_t	opt_val;
291 };
292 
293 /* Queue to repair, for TCP_REPAIR_QUEUE.  */
294 enum
295 {
296   TCP_NO_QUEUE,
297   TCP_RECV_QUEUE,
298   TCP_SEND_QUEUE,
299   TCP_QUEUES_NR,
300 };
301 
302 /* For cookie transactions socket options.  */
303 #define TCP_COOKIE_MIN		8		/*  64-bits */
304 #define TCP_COOKIE_MAX		16		/* 128-bits */
305 #define TCP_COOKIE_PAIR_SIZE	(2*TCP_COOKIE_MAX)
306 
307 /* Flags for both getsockopt and setsockopt */
308 #define TCP_COOKIE_IN_ALWAYS	(1 << 0)	/* Discard SYN without cookie */
309 #define TCP_COOKIE_OUT_NEVER	(1 << 1)	/* Prohibit outgoing cookies,
310 						 * supercedes everything. */
311 
312 /* Flags for getsockopt */
313 #define TCP_S_DATA_IN		(1 << 2)	/* Was data received? */
314 #define TCP_S_DATA_OUT		(1 << 3)	/* Was data sent? */
315 
316 #define TCP_MSS_DEFAULT		 536U	/* IPv4 (RFC1122, RFC2581) */
317 #define TCP_MSS_DESIRED		1220U	/* IPv6 (tunneled), EDNS0 (RFC3226) */
318 
319 struct tcp_cookie_transactions
320 {
321   uint16_t	tcpct_flags;
322   uint8_t	__tcpct_pad1;
323   uint8_t	tcpct_cookie_desired;
324   uint16_t	tcpct_s_data_desired;
325   uint16_t	tcpct_used;
326   uint8_t	tcpct_value[TCP_MSS_DEFAULT];
327 };
328 
329 /* For use with TCP_REPAIR_WINDOW.  */
330 struct tcp_repair_window
331 {
332   uint32_t snd_wl1;
333   uint32_t snd_wnd;
334   uint32_t max_window;
335   uint32_t rcv_wnd;
336   uint32_t rcv_wup;
337 };
338 
339 /* For use with TCP_ZEROCOPY_RECEIVE.  */
340 struct tcp_zerocopy_receive
341 {
342   uint64_t address; /* In: address of mapping.  */
343   uint32_t length; /* In/out: number of bytes to map/mapped.  */
344   uint32_t recv_skip_hint; /* Out: amount of bytes to skip.  */
345 };
346 
347 #endif /* Misc.  */
348 
349 #endif /* netinet/tcp.h */