root / lab4 / .minix-src / include / netinet / tcp.h @ 14
History | View | Annotate | Download (6.94 KB)
1 | 13 | up20180614 | /* $NetBSD: tcp.h,v 1.31 2015/02/14 12:57:53 he Exp $ */
|
---|---|---|---|
2 | |||
3 | /*
|
||
4 | * Copyright (c) 1982, 1986, 1993
|
||
5 | * The Regents of the University of California. All rights reserved.
|
||
6 | *
|
||
7 | * Redistribution and use in source and binary forms, with or without
|
||
8 | * modification, are permitted provided that the following conditions
|
||
9 | * are met:
|
||
10 | * 1. Redistributions of source code must retain the above copyright
|
||
11 | * notice, this list of conditions and the following disclaimer.
|
||
12 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
13 | * notice, this list of conditions and the following disclaimer in the
|
||
14 | * documentation and/or other materials provided with the distribution.
|
||
15 | * 3. Neither the name of the University nor the names of its contributors
|
||
16 | * may be used to endorse or promote products derived from this software
|
||
17 | * without specific prior written permission.
|
||
18 | *
|
||
19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
29 | * SUCH DAMAGE.
|
||
30 | *
|
||
31 | * @(#)tcp.h 8.1 (Berkeley) 6/10/93
|
||
32 | */
|
||
33 | |||
34 | #ifndef _NETINET_TCP_H_
|
||
35 | #define _NETINET_TCP_H_
|
||
36 | |||
37 | #include <sys/featuretest.h> |
||
38 | |||
39 | #if defined(_NETBSD_SOURCE)
|
||
40 | #include <sys/types.h> |
||
41 | |||
42 | typedef uint32_t tcp_seq;
|
||
43 | /*
|
||
44 | * TCP header.
|
||
45 | * Per RFC 793, September, 1981.
|
||
46 | * Updated by RFC 3168, September, 2001.
|
||
47 | */
|
||
48 | struct tcphdr {
|
||
49 | uint16_t th_sport; /* source port */
|
||
50 | uint16_t th_dport; /* destination port */
|
||
51 | tcp_seq th_seq; /* sequence number */
|
||
52 | tcp_seq th_ack; /* acknowledgement number */
|
||
53 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
54 | /*LINTED non-portable bitfields*/
|
||
55 | uint8_t th_x2:4, /* (unused) */ |
||
56 | th_off:4; /* data offset */ |
||
57 | #endif
|
||
58 | #if BYTE_ORDER == BIG_ENDIAN
|
||
59 | /*LINTED non-portable bitfields*/
|
||
60 | uint8_t th_off:4, /* data offset */ |
||
61 | th_x2:4; /* (unused) */ |
||
62 | #endif
|
||
63 | uint8_t th_flags; |
||
64 | #define TH_FIN 0x01 |
||
65 | #define TH_SYN 0x02 |
||
66 | #define TH_RST 0x04 |
||
67 | #define TH_PUSH 0x08 |
||
68 | #define TH_ACK 0x10 |
||
69 | #define TH_URG 0x20 |
||
70 | #define TH_ECE 0x40 |
||
71 | #define TH_CWR 0x80 |
||
72 | uint16_t th_win; /* window */
|
||
73 | uint16_t th_sum; /* checksum */
|
||
74 | uint16_t th_urp; /* urgent pointer */
|
||
75 | } __packed; |
||
76 | |||
77 | #define TCPOPT_EOL 0 |
||
78 | #define TCPOPT_NOP 1 |
||
79 | #define TCPOPT_MAXSEG 2 |
||
80 | #define TCPOLEN_MAXSEG 4 |
||
81 | #define TCPOPT_WINDOW 3 |
||
82 | #define TCPOLEN_WINDOW 3 |
||
83 | #define TCPOPT_SACK_PERMITTED 4 /* Experimental */ |
||
84 | #define TCPOLEN_SACK_PERMITTED 2 |
||
85 | #define TCPOPT_SACK 5 /* Experimental */ |
||
86 | #define TCPOPT_TIMESTAMP 8 |
||
87 | #define TCPOLEN_TIMESTAMP 10 |
||
88 | #define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ |
||
89 | |||
90 | #define TCPOPT_TSTAMP_HDR \
|
||
91 | (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) |
||
92 | |||
93 | #define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */ |
||
94 | #define TCPOLEN_SIGNATURE 18 |
||
95 | #define TCPOLEN_SIGLEN (TCPOLEN_SIGNATURE+2) /* padding */ |
||
96 | |||
97 | #define MAX_TCPOPTLEN 40 /* max # bytes that go in options */ |
||
98 | |||
99 | /*
|
||
100 | * Default maximum segment size for TCP.
|
||
101 | * This is defined by RFC 1112 Sec 4.2.2.6.
|
||
102 | */
|
||
103 | #define TCP_MSS 536 |
||
104 | |||
105 | #define TCP_MINMSS 216 |
||
106 | |||
107 | #define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ |
||
108 | |||
109 | #define TCP_MAX_WINSHIFT 14 /* maximum window shift */ |
||
110 | |||
111 | #define TCP_MAXBURST 4 /* maximum segments in a burst */ |
||
112 | |||
113 | #endif /* _NETBSD_SOURCE */ |
||
114 | |||
115 | /*
|
||
116 | * User-settable options (used with setsockopt).
|
||
117 | */
|
||
118 | #define TCP_NODELAY 1 /* don't delay send to coalesce packets */ |
||
119 | #define TCP_MAXSEG 2 /* set maximum segment size */ |
||
120 | #define TCP_KEEPIDLE 3 |
||
121 | #ifdef notyet
|
||
122 | #define TCP_NOPUSH 4 /* reserved for FreeBSD compat */ |
||
123 | #endif
|
||
124 | #define TCP_KEEPINTVL 5 |
||
125 | #define TCP_KEEPCNT 6 |
||
126 | #define TCP_KEEPINIT 7 |
||
127 | #ifdef notyet
|
||
128 | #define TCP_NOOPT 8 /* reserved for FreeBSD compat */ |
||
129 | #endif
|
||
130 | #define TCP_INFO 9 /* retrieve tcp_info structure */ |
||
131 | #define TCP_MD5SIG 0x10 /* use MD5 digests (RFC2385) */ |
||
132 | #define TCP_CONGCTL 0x20 /* selected congestion control */ |
||
133 | |||
134 | #define TCPI_OPT_TIMESTAMPS 0x01 |
||
135 | #define TCPI_OPT_SACK 0x02 |
||
136 | #define TCPI_OPT_WSCALE 0x04 |
||
137 | #define TCPI_OPT_ECN 0x08 |
||
138 | #define TCPI_OPT_TOE 0x10 |
||
139 | |||
140 | /*
|
||
141 | * The TCP_INFO socket option comes from the Linux 2.6 TCP API, and permits
|
||
142 | * the caller to query certain information about the state of a TCP
|
||
143 | * connection. We provide an overlapping set of fields with the Linux
|
||
144 | * implementation, but since this is a fixed size structure, room has been
|
||
145 | * left for growth. In order to maximize potential future compatibility with
|
||
146 | * the Linux API, the same variable names and order have been adopted, and
|
||
147 | * padding left to make room for omitted fields in case they are added later.
|
||
148 | *
|
||
149 | * XXX: This is currently an unstable ABI/API, in that it is expected to
|
||
150 | * change.
|
||
151 | */
|
||
152 | struct tcp_info {
|
||
153 | uint8_t tcpi_state; /* TCP FSM state. */
|
||
154 | uint8_t __tcpi_ca_state; |
||
155 | uint8_t __tcpi_retransmits; |
||
156 | uint8_t __tcpi_probes; |
||
157 | uint8_t __tcpi_backoff; |
||
158 | uint8_t tcpi_options; /* Options enabled on conn. */
|
||
159 | uint8_t tcpi_snd_wscale:4, /* RFC1323 send shift value. */ |
||
160 | tcpi_rcv_wscale:4; /* RFC1323 recv shift value. */ |
||
161 | |||
162 | uint32_t tcpi_rto; /* Retransmission timeout (usec). */
|
||
163 | uint32_t __tcpi_ato; |
||
164 | uint32_t tcpi_snd_mss; /* Max segment size for send. */
|
||
165 | uint32_t tcpi_rcv_mss; /* Max segment size for receive. */
|
||
166 | |||
167 | uint32_t __tcpi_unacked; |
||
168 | uint32_t __tcpi_sacked; |
||
169 | uint32_t __tcpi_lost; |
||
170 | uint32_t __tcpi_retrans; |
||
171 | uint32_t __tcpi_fackets; |
||
172 | |||
173 | /* Times; measurements in usecs. */
|
||
174 | uint32_t __tcpi_last_data_sent; |
||
175 | uint32_t __tcpi_last_ack_sent; /* Also unimpl. on Linux? */
|
||
176 | uint32_t tcpi_last_data_recv; /* Time since last recv data. */
|
||
177 | uint32_t __tcpi_last_ack_recv; |
||
178 | |||
179 | /* Metrics; variable units. */
|
||
180 | uint32_t __tcpi_pmtu; |
||
181 | uint32_t __tcpi_rcv_ssthresh; |
||
182 | uint32_t tcpi_rtt; /* Smoothed RTT in usecs. */
|
||
183 | uint32_t tcpi_rttvar; /* RTT variance in usecs. */
|
||
184 | uint32_t tcpi_snd_ssthresh; /* Slow start threshold. */
|
||
185 | uint32_t tcpi_snd_cwnd; /* Send congestion window. */
|
||
186 | uint32_t __tcpi_advmss; |
||
187 | uint32_t __tcpi_reordering; |
||
188 | |||
189 | uint32_t __tcpi_rcv_rtt; |
||
190 | uint32_t tcpi_rcv_space; /* Advertised recv window. */
|
||
191 | |||
192 | /* FreeBSD/NetBSD extensions to tcp_info. */
|
||
193 | uint32_t tcpi_snd_wnd; /* Advertised send window. */
|
||
194 | uint32_t tcpi_snd_bwnd; /* No longer used. */
|
||
195 | uint32_t tcpi_snd_nxt; /* Next egress seqno */
|
||
196 | uint32_t tcpi_rcv_nxt; /* Next ingress seqno */
|
||
197 | uint32_t tcpi_toe_tid; /* HWTID for TOE endpoints */
|
||
198 | uint32_t tcpi_snd_rexmitpack; /* Retransmitted packets */
|
||
199 | uint32_t tcpi_rcv_ooopack; /* Out-of-order packets */
|
||
200 | uint32_t tcpi_snd_zerowin; /* Zero-sized windows sent */
|
||
201 | |||
202 | /* Padding to grow without breaking ABI. */
|
||
203 | uint32_t __tcpi_pad[26]; /* Padding. */ |
||
204 | }; |
||
205 | |||
206 | #endif /* !_NETINET_TCP_H_ */ |