• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
64 #ifdef __USE_MISC
65 # include <sys/types.h>
66 # include <sys/socket.h>
67 
68 # ifdef __FAVOR_BSD
69 typedef	u_int32_t tcp_seq;
70 /*
71  * TCP header.
72  * Per RFC 793, September, 1981.
73  */
74 struct tcphdr
75   {
76     u_int16_t th_sport;		/* source port */
77     u_int16_t th_dport;		/* destination port */
78     tcp_seq th_seq;		/* sequence number */
79     tcp_seq th_ack;		/* acknowledgement number */
80 #  if __BYTE_ORDER == __LITTLE_ENDIAN
81     u_int8_t th_x2:4;		/* (unused) */
82     u_int8_t th_off:4;		/* data offset */
83 #  endif
84 #  if __BYTE_ORDER == __BIG_ENDIAN
85     u_int8_t th_off:4;		/* data offset */
86     u_int8_t th_x2:4;		/* (unused) */
87 #  endif
88     u_int8_t th_flags;
89 #  define TH_FIN	0x01
90 #  define TH_SYN	0x02
91 #  define TH_RST	0x04
92 #  define TH_PUSH	0x08
93 #  define TH_ACK	0x10
94 #  define TH_URG	0x20
95     u_int16_t th_win;		/* window */
96     u_int16_t th_sum;		/* checksum */
97     u_int16_t th_urp;		/* urgent pointer */
98 };
99 
100 # else /* !__FAVOR_BSD */
101 struct tcphdr
102   {
103     u_int16_t source;
104     u_int16_t dest;
105     u_int32_t seq;
106     u_int32_t ack_seq;
107 #  if __BYTE_ORDER == __LITTLE_ENDIAN
108     u_int16_t res1:4;
109     u_int16_t doff:4;
110     u_int16_t fin:1;
111     u_int16_t syn:1;
112     u_int16_t rst:1;
113     u_int16_t psh:1;
114     u_int16_t ack:1;
115     u_int16_t urg:1;
116     u_int16_t res2:2;
117 #  elif __BYTE_ORDER == __BIG_ENDIAN
118     u_int16_t doff:4;
119     u_int16_t res1:4;
120     u_int16_t res2:2;
121     u_int16_t urg:1;
122     u_int16_t ack:1;
123     u_int16_t psh:1;
124     u_int16_t rst:1;
125     u_int16_t syn:1;
126     u_int16_t fin:1;
127 #  else
128 #   error "Adjust your <bits/endian.h> defines"
129 #  endif
130     u_int16_t window;
131     u_int16_t check;
132     u_int16_t urg_ptr;
133 };
134 # endif /* __FAVOR_BSD */
135 
136 enum
137 {
138   TCP_ESTABLISHED = 1,
139   TCP_SYN_SENT,
140   TCP_SYN_RECV,
141   TCP_FIN_WAIT1,
142   TCP_FIN_WAIT2,
143   TCP_TIME_WAIT,
144   TCP_CLOSE,
145   TCP_CLOSE_WAIT,
146   TCP_LAST_ACK,
147   TCP_LISTEN,
148   TCP_CLOSING   /* now a valid state */
149 };
150 
151 # define TCPOPT_EOL		0
152 # define TCPOPT_NOP		1
153 # define TCPOPT_MAXSEG		2
154 # define TCPOLEN_MAXSEG		4
155 # define TCPOPT_WINDOW		3
156 # define TCPOLEN_WINDOW		3
157 # define TCPOPT_SACK_PERMITTED	4		/* Experimental */
158 # define TCPOLEN_SACK_PERMITTED	2
159 # define TCPOPT_SACK		5		/* Experimental */
160 # define TCPOPT_TIMESTAMP	8
161 # define TCPOLEN_TIMESTAMP	10
162 # define TCPOLEN_TSTAMP_APPA	(TCPOLEN_TIMESTAMP+2) /* appendix A */
163 
164 # define TCPOPT_TSTAMP_HDR	\
165     (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
166 
167 /*
168  * Default maximum segment size for TCP.
169  * With an IP MSS of 576, this is 536,
170  * but 512 is probably more convenient.
171  * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)).
172  */
173 # define TCP_MSS	512
174 
175 # define TCP_MAXWIN	65535	/* largest value for (unscaled) window */
176 
177 # define TCP_MAX_WINSHIFT	14	/* maximum window shift */
178 
179 # define SOL_TCP		6	/* TCP level */
180 
181 
182 # define TCPI_OPT_TIMESTAMPS	1
183 # define TCPI_OPT_SACK		2
184 # define TCPI_OPT_WSCALE	4
185 # define TCPI_OPT_ECN		8  /* ECN was negociated at TCP session init */
186 # define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */
187 # define TCPI_OPT_SYN_DATA	32 /* SYN-ACK acked data in SYN sent or rcvd */
188 
189 /* Values for tcpi_state.  */
190 enum tcp_ca_state
191 {
192   TCP_CA_Open = 0,
193   TCP_CA_Disorder = 1,
194   TCP_CA_CWR = 2,
195   TCP_CA_Recovery = 3,
196   TCP_CA_Loss = 4
197 };
198 
199 struct tcp_info
200 {
201   u_int8_t	tcpi_state;
202   u_int8_t	tcpi_ca_state;
203   u_int8_t	tcpi_retransmits;
204   u_int8_t	tcpi_probes;
205   u_int8_t	tcpi_backoff;
206   u_int8_t	tcpi_options;
207   u_int8_t	tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
208 
209   u_int32_t	tcpi_rto;
210   u_int32_t	tcpi_ato;
211   u_int32_t	tcpi_snd_mss;
212   u_int32_t	tcpi_rcv_mss;
213 
214   u_int32_t	tcpi_unacked;
215   u_int32_t	tcpi_sacked;
216   u_int32_t	tcpi_lost;
217   u_int32_t	tcpi_retrans;
218   u_int32_t	tcpi_fackets;
219 
220   /* Times. */
221   u_int32_t	tcpi_last_data_sent;
222   u_int32_t	tcpi_last_ack_sent;	/* Not remembered, sorry.  */
223   u_int32_t	tcpi_last_data_recv;
224   u_int32_t	tcpi_last_ack_recv;
225 
226   /* Metrics. */
227   u_int32_t	tcpi_pmtu;
228   u_int32_t	tcpi_rcv_ssthresh;
229   u_int32_t	tcpi_rtt;
230   u_int32_t	tcpi_rttvar;
231   u_int32_t	tcpi_snd_ssthresh;
232   u_int32_t	tcpi_snd_cwnd;
233   u_int32_t	tcpi_advmss;
234   u_int32_t	tcpi_reordering;
235 
236   u_int32_t	tcpi_rcv_rtt;
237   u_int32_t	tcpi_rcv_space;
238 
239   u_int32_t	tcpi_total_retrans;
240 };
241 
242 
243 /* For TCP_MD5SIG socket option.  */
244 #define TCP_MD5SIG_MAXKEYLEN	80
245 
246 struct tcp_md5sig
247 {
248   struct sockaddr_storage tcpm_addr;		/* Address associated.  */
249   u_int16_t	__tcpm_pad1;			/* Zero.  */
250   u_int16_t	tcpm_keylen;			/* Key length.  */
251   u_int32_t	__tcpm_pad2;			/* Zero.  */
252   u_int8_t	tcpm_key[TCP_MD5SIG_MAXKEYLEN];	/* Key (binary).  */
253 };
254 
255 /* For socket repair options.  */
256 struct tcp_repair_opt
257 {
258   u_int32_t	opt_code;
259   u_int32_t	opt_val;
260 };
261 
262 /* Queue to repair, for TCP_REPAIR_QUEUE.  */
263 enum
264 {
265   TCP_NO_QUEUE,
266   TCP_RECV_QUEUE,
267   TCP_SEND_QUEUE,
268   TCP_QUEUES_NR,
269 };
270 
271 /* For cookie transactions socket options.  */
272 #define TCP_COOKIE_MIN		8		/*  64-bits */
273 #define TCP_COOKIE_MAX		16		/* 128-bits */
274 #define TCP_COOKIE_PAIR_SIZE	(2*TCP_COOKIE_MAX)
275 
276 /* Flags for both getsockopt and setsockopt */
277 #define TCP_COOKIE_IN_ALWAYS	(1 << 0)	/* Discard SYN without cookie */
278 #define TCP_COOKIE_OUT_NEVER	(1 << 1)	/* Prohibit outgoing cookies,
279 						 * supercedes everything. */
280 
281 /* Flags for getsockopt */
282 #define TCP_S_DATA_IN		(1 << 2)	/* Was data received? */
283 #define TCP_S_DATA_OUT		(1 << 3)	/* Was data sent? */
284 
285 #define TCP_MSS_DEFAULT		 536U	/* IPv4 (RFC1122, RFC2581) */
286 #define TCP_MSS_DESIRED		1220U	/* IPv6 (tunneled), EDNS0 (RFC3226) */
287 
288 struct tcp_cookie_transactions
289 {
290   u_int16_t	tcpct_flags;
291   u_int8_t	__tcpct_pad1;
292   u_int8_t	tcpct_cookie_desired;
293   u_int16_t	tcpct_s_data_desired;
294   u_int16_t	tcpct_used;
295   u_int8_t	tcpct_value[TCP_MSS_DEFAULT];
296 };
297 
298 #endif /* Misc.  */
299 
300 #endif /* netinet/tcp.h */
301