xref: /aosp_15_r20/external/openthread/third_party/tcplp/bsdtcp/tcp.h (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*-
2*cfb92d14SAndroid Build Coastguard Worker  * Copyright (c) 1982, 1986, 1993
3*cfb92d14SAndroid Build Coastguard Worker  *	The Regents of the University of California.  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*cfb92d14SAndroid Build Coastguard Worker  * are met:
8*cfb92d14SAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
9*cfb92d14SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*cfb92d14SAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
11*cfb92d14SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
12*cfb92d14SAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
13*cfb92d14SAndroid Build Coastguard Worker  * 4. Neither the name of the University nor the names of its contributors
14*cfb92d14SAndroid Build Coastguard Worker  *    may be used to endorse or promote products derived from this software
15*cfb92d14SAndroid Build Coastguard Worker  *    without specific prior written permission.
16*cfb92d14SAndroid Build Coastguard Worker  *
17*cfb92d14SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18*cfb92d14SAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*cfb92d14SAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*cfb92d14SAndroid Build Coastguard Worker  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21*cfb92d14SAndroid Build Coastguard Worker  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*cfb92d14SAndroid Build Coastguard Worker  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*cfb92d14SAndroid Build Coastguard Worker  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*cfb92d14SAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*cfb92d14SAndroid Build Coastguard Worker  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*cfb92d14SAndroid Build Coastguard Worker  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*cfb92d14SAndroid Build Coastguard Worker  * SUCH DAMAGE.
28*cfb92d14SAndroid Build Coastguard Worker  *
29*cfb92d14SAndroid Build Coastguard Worker  *	@(#)tcp.h	8.1 (Berkeley) 6/10/93
30*cfb92d14SAndroid Build Coastguard Worker  * $FreeBSD$
31*cfb92d14SAndroid Build Coastguard Worker  */
32*cfb92d14SAndroid Build Coastguard Worker 
33*cfb92d14SAndroid Build Coastguard Worker /*
34*cfb92d14SAndroid Build Coastguard Worker  * samkumar: In one instance (in struct tcphdr), where there are Big Endian
35*cfb92d14SAndroid Build Coastguard Worker  * and Little Endian alternatives for ordering two fields, I hardcoded the
36*cfb92d14SAndroid Build Coastguard Worker  * Little Endian alternative. If ever we port this to a Big Endian platform,
37*cfb92d14SAndroid Build Coastguard Worker  * we should look at that very closely, and consider rewriting it.
38*cfb92d14SAndroid Build Coastguard Worker  */
39*cfb92d14SAndroid Build Coastguard Worker 
40*cfb92d14SAndroid Build Coastguard Worker #ifndef TCPLP_NETINET_TCP_H_
41*cfb92d14SAndroid Build Coastguard Worker #define TCPLP_NETINET_TCP_H_
42*cfb92d14SAndroid Build Coastguard Worker 
43*cfb92d14SAndroid Build Coastguard Worker #include <stdint.h>
44*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
45*cfb92d14SAndroid Build Coastguard Worker 
46*cfb92d14SAndroid Build Coastguard Worker #define KASSERT(COND, MSG) if (!(COND)) tcplp_sys_panic MSG
47*cfb92d14SAndroid Build Coastguard Worker 
48*cfb92d14SAndroid Build Coastguard Worker typedef	uint32_t tcp_seq;
49*cfb92d14SAndroid Build Coastguard Worker 
50*cfb92d14SAndroid Build Coastguard Worker #define tcp6_seq	tcp_seq	/* for KAME src sync over BSD*'s */
51*cfb92d14SAndroid Build Coastguard Worker #define tcp6hdr		tcphdr	/* for KAME src sync over BSD*'s */
52*cfb92d14SAndroid Build Coastguard Worker 
53*cfb92d14SAndroid Build Coastguard Worker /*
54*cfb92d14SAndroid Build Coastguard Worker  * TCP header.
55*cfb92d14SAndroid Build Coastguard Worker  * Per RFC 793, September, 1981.
56*cfb92d14SAndroid Build Coastguard Worker  */
57*cfb92d14SAndroid Build Coastguard Worker struct tcphdr {
58*cfb92d14SAndroid Build Coastguard Worker 	uint16_t	th_sport;		/* source port */
59*cfb92d14SAndroid Build Coastguard Worker 	uint16_t	th_dport;		/* destination port */
60*cfb92d14SAndroid Build Coastguard Worker 	tcp_seq	th_seq;			/* sequence number */
61*cfb92d14SAndroid Build Coastguard Worker 	tcp_seq	th_ack;			/* acknowledgement number */
62*cfb92d14SAndroid Build Coastguard Worker 
63*cfb92d14SAndroid Build Coastguard Worker 	/*
64*cfb92d14SAndroid Build Coastguard Worker 	 * samkumar: The original FreeBSD code used bit fields for the offset and
65*cfb92d14SAndroid Build Coastguard Worker 	 * unused bits, within this byte. I've rewritten it to avoid the use of
66*cfb92d14SAndroid Build Coastguard Worker 	 * bit fields, so that the code is more portable. The original code, which
67*cfb92d14SAndroid Build Coastguard Worker 	 * defined the order of bit fields based on the platform's endianness, is
68*cfb92d14SAndroid Build Coastguard Worker 	 * included below, commented out using "#if 0".
69*cfb92d14SAndroid Build Coastguard Worker 	 */
70*cfb92d14SAndroid Build Coastguard Worker 	uint8_t th_off_x2; /* data offset and unused bits */
71*cfb92d14SAndroid Build Coastguard Worker #define	TH_OFF_SHIFT	4
72*cfb92d14SAndroid Build Coastguard Worker 
73*cfb92d14SAndroid Build Coastguard Worker #if 0
74*cfb92d14SAndroid Build Coastguard Worker #if BYTE_ORDER == LITTLE_ENDIAN
75*cfb92d14SAndroid Build Coastguard Worker 	uint8_t	th_x2:4,		/* (unused) */
76*cfb92d14SAndroid Build Coastguard Worker 		th_off:4;		/* data offset */
77*cfb92d14SAndroid Build Coastguard Worker #endif
78*cfb92d14SAndroid Build Coastguard Worker #if BYTE_ORDER == BIG_ENDIAN
79*cfb92d14SAndroid Build Coastguard Worker 	uint8_t	th_off:4,		/* data offset */
80*cfb92d14SAndroid Build Coastguard Worker 		th_x2:4;		/* (unused) */
81*cfb92d14SAndroid Build Coastguard Worker #endif
82*cfb92d14SAndroid Build Coastguard Worker #endif
83*cfb92d14SAndroid Build Coastguard Worker 
84*cfb92d14SAndroid Build Coastguard Worker 	uint8_t	th_flags;
85*cfb92d14SAndroid Build Coastguard Worker #define	TH_FIN	0x01
86*cfb92d14SAndroid Build Coastguard Worker #define	TH_SYN	0x02
87*cfb92d14SAndroid Build Coastguard Worker #define	TH_RST	0x04
88*cfb92d14SAndroid Build Coastguard Worker #define	TH_PUSH	0x08
89*cfb92d14SAndroid Build Coastguard Worker #define	TH_ACK	0x10
90*cfb92d14SAndroid Build Coastguard Worker #define	TH_URG	0x20
91*cfb92d14SAndroid Build Coastguard Worker #define	TH_ECE	0x40
92*cfb92d14SAndroid Build Coastguard Worker #define	TH_CWR	0x80
93*cfb92d14SAndroid Build Coastguard Worker #define	TH_FLAGS	(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|TH_ECE|TH_CWR)
94*cfb92d14SAndroid Build Coastguard Worker #define	PRINT_TH_FLAGS	"\20\1FIN\2SYN\3RST\4PUSH\5ACK\6URG\7ECE\10CWR"
95*cfb92d14SAndroid Build Coastguard Worker 
96*cfb92d14SAndroid Build Coastguard Worker 	uint16_t	th_win;			/* window */
97*cfb92d14SAndroid Build Coastguard Worker 	uint16_t	th_sum;			/* checksum */
98*cfb92d14SAndroid Build Coastguard Worker 	uint16_t	th_urp;			/* urgent pointer */
99*cfb92d14SAndroid Build Coastguard Worker };
100*cfb92d14SAndroid Build Coastguard Worker 
101*cfb92d14SAndroid Build Coastguard Worker #define	TCPOPT_EOL		0
102*cfb92d14SAndroid Build Coastguard Worker #define	   TCPOLEN_EOL			1
103*cfb92d14SAndroid Build Coastguard Worker #define	TCPOPT_PAD		0		/* padding after EOL */
104*cfb92d14SAndroid Build Coastguard Worker #define	   TCPOLEN_PAD			1
105*cfb92d14SAndroid Build Coastguard Worker #define	TCPOPT_NOP		1
106*cfb92d14SAndroid Build Coastguard Worker #define	   TCPOLEN_NOP			1
107*cfb92d14SAndroid Build Coastguard Worker #define	TCPOPT_MAXSEG		2
108*cfb92d14SAndroid Build Coastguard Worker #define    TCPOLEN_MAXSEG		4
109*cfb92d14SAndroid Build Coastguard Worker #define TCPOPT_WINDOW		3
110*cfb92d14SAndroid Build Coastguard Worker #define    TCPOLEN_WINDOW		3
111*cfb92d14SAndroid Build Coastguard Worker #define TCPOPT_SACK_PERMITTED	4
112*cfb92d14SAndroid Build Coastguard Worker #define    TCPOLEN_SACK_PERMITTED	2
113*cfb92d14SAndroid Build Coastguard Worker #define TCPOPT_SACK		5
114*cfb92d14SAndroid Build Coastguard Worker #define	   TCPOLEN_SACKHDR		2
115*cfb92d14SAndroid Build Coastguard Worker #define    TCPOLEN_SACK			8	/* 2*sizeof(tcp_seq) */
116*cfb92d14SAndroid Build Coastguard Worker #define TCPOPT_TIMESTAMP	8
117*cfb92d14SAndroid Build Coastguard Worker #define    TCPOLEN_TIMESTAMP		10
118*cfb92d14SAndroid Build Coastguard Worker #define    TCPOLEN_TSTAMP_APPA		(TCPOLEN_TIMESTAMP+2) /* appendix A */
119*cfb92d14SAndroid Build Coastguard Worker #define	TCPOPT_SIGNATURE	19		/* Keyed MD5: RFC 2385 */
120*cfb92d14SAndroid Build Coastguard Worker #define	   TCPOLEN_SIGNATURE		18
121*cfb92d14SAndroid Build Coastguard Worker #define	TCPOPT_FAST_OPEN	34
122*cfb92d14SAndroid Build Coastguard Worker #define	   TCPOLEN_FAST_OPEN_EMPTY	2
123*cfb92d14SAndroid Build Coastguard Worker 
124*cfb92d14SAndroid Build Coastguard Worker /* Miscellaneous constants */
125*cfb92d14SAndroid Build Coastguard Worker #define	MAX_SACK_BLKS	6	/* Max # SACK blocks stored at receiver side */
126*cfb92d14SAndroid Build Coastguard Worker #define	TCP_MAX_SACK	4	/* MAX # SACKs sent in any segment */
127*cfb92d14SAndroid Build Coastguard Worker 
128*cfb92d14SAndroid Build Coastguard Worker 
129*cfb92d14SAndroid Build Coastguard Worker /*
130*cfb92d14SAndroid Build Coastguard Worker  * The default maximum segment size (MSS) to be used for new TCP connections
131*cfb92d14SAndroid Build Coastguard Worker  * when path MTU discovery is not enabled.
132*cfb92d14SAndroid Build Coastguard Worker  *
133*cfb92d14SAndroid Build Coastguard Worker  * RFC879 derives the default MSS from the largest datagram size hosts are
134*cfb92d14SAndroid Build Coastguard Worker  * minimally required to handle directly or through IP reassembly minus the
135*cfb92d14SAndroid Build Coastguard Worker  * size of the IP and TCP header.  With IPv6 the minimum MTU is specified
136*cfb92d14SAndroid Build Coastguard Worker  * in RFC2460.
137*cfb92d14SAndroid Build Coastguard Worker  *
138*cfb92d14SAndroid Build Coastguard Worker  * For IPv4 the MSS is 576 - sizeof(struct tcpiphdr)
139*cfb92d14SAndroid Build Coastguard Worker  * For IPv6 the MSS is IPV6_MMTU - sizeof(struct ip6_hdr) - sizeof(struct tcphdr)
140*cfb92d14SAndroid Build Coastguard Worker  *
141*cfb92d14SAndroid Build Coastguard Worker  * We use explicit numerical definition here to avoid header pollution.
142*cfb92d14SAndroid Build Coastguard Worker  */
143*cfb92d14SAndroid Build Coastguard Worker #define	TCP_MSS		536
144*cfb92d14SAndroid Build Coastguard Worker #define	TCP6_MSS	1220
145*cfb92d14SAndroid Build Coastguard Worker 
146*cfb92d14SAndroid Build Coastguard Worker /*
147*cfb92d14SAndroid Build Coastguard Worker  * Limit the lowest MSS we accept for path MTU discovery and the TCP SYN MSS
148*cfb92d14SAndroid Build Coastguard Worker  * option.  Allowing low values of MSS can consume significant resources and
149*cfb92d14SAndroid Build Coastguard Worker  * be used to mount a resource exhaustion attack.
150*cfb92d14SAndroid Build Coastguard Worker  * Connections requesting lower MSS values will be rounded up to this value
151*cfb92d14SAndroid Build Coastguard Worker  * and the IP_DF flag will be cleared to allow fragmentation along the path.
152*cfb92d14SAndroid Build Coastguard Worker  *
153*cfb92d14SAndroid Build Coastguard Worker  * See tcp_subr.c tcp_minmss SYSCTL declaration for more comments.  Setting
154*cfb92d14SAndroid Build Coastguard Worker  * it to "0" disables the minmss check.
155*cfb92d14SAndroid Build Coastguard Worker  *
156*cfb92d14SAndroid Build Coastguard Worker  * The default value is fine for TCP across the Internet's smallest official
157*cfb92d14SAndroid Build Coastguard Worker  * link MTU (256 bytes for AX.25 packet radio).  However, a connection is very
158*cfb92d14SAndroid Build Coastguard Worker  * unlikely to come across such low MTU interfaces these days (anno domini 2003).
159*cfb92d14SAndroid Build Coastguard Worker  */
160*cfb92d14SAndroid Build Coastguard Worker #define	TCP_MINMSS 216
161*cfb92d14SAndroid Build Coastguard Worker 
162*cfb92d14SAndroid Build Coastguard Worker #define	TCP_MAXWIN	65535	/* largest value for (unscaled) window */
163*cfb92d14SAndroid Build Coastguard Worker #define	TTCP_CLIENT_SND_WND	4096	/* dflt send window for T/TCP client */
164*cfb92d14SAndroid Build Coastguard Worker 
165*cfb92d14SAndroid Build Coastguard Worker #define TCP_MAX_WINSHIFT	14	/* maximum window shift */
166*cfb92d14SAndroid Build Coastguard Worker 
167*cfb92d14SAndroid Build Coastguard Worker #define TCP_MAXBURST		4	/* maximum segments in a burst */
168*cfb92d14SAndroid Build Coastguard Worker 
169*cfb92d14SAndroid Build Coastguard Worker #define TCP_MAXHLEN	(0xf<<2)	/* max length of header in bytes */
170*cfb92d14SAndroid Build Coastguard Worker #define TCP_MAXOLEN	(TCP_MAXHLEN - sizeof(struct tcphdr))
171*cfb92d14SAndroid Build Coastguard Worker 					/* max space left for options */
172*cfb92d14SAndroid Build Coastguard Worker #define TCP_FASTOPEN_MIN_COOKIE_LEN	4	/* Per RFC7413 */
173*cfb92d14SAndroid Build Coastguard Worker #define TCP_FASTOPEN_MAX_COOKIE_LEN	16	/* Per RFC7413 */
174*cfb92d14SAndroid Build Coastguard Worker #define TCP_FASTOPEN_PSK_LEN		16	/* Same as TCP_FASTOPEN_KEY_LEN */
175*cfb92d14SAndroid Build Coastguard Worker 
176*cfb92d14SAndroid Build Coastguard Worker /*
177*cfb92d14SAndroid Build Coastguard Worker  * User-settable options (used with setsockopt).  These are discrete
178*cfb92d14SAndroid Build Coastguard Worker  * values and are not masked together.  Some values appear to be
179*cfb92d14SAndroid Build Coastguard Worker  * bitmasks for historical reasons.
180*cfb92d14SAndroid Build Coastguard Worker  */
181*cfb92d14SAndroid Build Coastguard Worker #define	TCP_NODELAY	1	/* don't delay send to coalesce packets */
182*cfb92d14SAndroid Build Coastguard Worker #define	TCP_MAXSEG	2	/* set maximum segment size */
183*cfb92d14SAndroid Build Coastguard Worker #define TCP_NOPUSH	4	/* don't push last block of write */
184*cfb92d14SAndroid Build Coastguard Worker #define TCP_NOOPT	8	/* don't use TCP options */
185*cfb92d14SAndroid Build Coastguard Worker #define TCP_MD5SIG	16	/* use MD5 digests (RFC2385) */
186*cfb92d14SAndroid Build Coastguard Worker #define	TCP_INFO	32	/* retrieve tcp_info structure */
187*cfb92d14SAndroid Build Coastguard Worker #define	TCP_CONGESTION	64	/* get/set congestion control algorithm */
188*cfb92d14SAndroid Build Coastguard Worker #define	TCP_KEEPINIT	128	/* N, time to establish connection */
189*cfb92d14SAndroid Build Coastguard Worker #define	TCP_KEEPIDLE	256	/* L,N,X start keeplives after this period */
190*cfb92d14SAndroid Build Coastguard Worker #define	TCP_KEEPINTVL	512	/* L,N interval between keepalives */
191*cfb92d14SAndroid Build Coastguard Worker #define	TCP_KEEPCNT	1024	/* L,N number of keepalives before close */
192*cfb92d14SAndroid Build Coastguard Worker #define	TCP_PCAP_OUT	2048	/* number of output packets to keep */
193*cfb92d14SAndroid Build Coastguard Worker #define	TCP_PCAP_IN	4096	/* number of input packets to keep */
194*cfb92d14SAndroid Build Coastguard Worker 
195*cfb92d14SAndroid Build Coastguard Worker /* Start of reserved space for third-party user-settable options. */
196*cfb92d14SAndroid Build Coastguard Worker #define	TCP_VENDOR	SO_VENDOR
197*cfb92d14SAndroid Build Coastguard Worker 
198*cfb92d14SAndroid Build Coastguard Worker #define	TCP_CA_NAME_MAX	16	/* max congestion control name length */
199*cfb92d14SAndroid Build Coastguard Worker 
200*cfb92d14SAndroid Build Coastguard Worker #define	TCPI_OPT_TIMESTAMPS	0x01
201*cfb92d14SAndroid Build Coastguard Worker #define	TCPI_OPT_SACK		0x02
202*cfb92d14SAndroid Build Coastguard Worker #define	TCPI_OPT_WSCALE		0x04
203*cfb92d14SAndroid Build Coastguard Worker #define	TCPI_OPT_ECN		0x08
204*cfb92d14SAndroid Build Coastguard Worker #define	TCPI_OPT_TOE		0x10
205*cfb92d14SAndroid Build Coastguard Worker 
206*cfb92d14SAndroid Build Coastguard Worker #endif /* !_NETINET_TCP_H_ */
207