1 | /* SPDX-License-Identifier: BSD-3-Clause */ |
2 | /* |
3 | * Copyright (c) 1982, 1986, 1993 |
4 | * The Regents of the University of California. All rights reserved. |
5 | * |
6 | * Redistribution and use in source and binary forms, with or without |
7 | * modification, are permitted provided that the following conditions |
8 | * are met: |
9 | * 1. Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * 2. Redistributions in binary form must reproduce the above copyright |
12 | * notice, this list of conditions and the following disclaimer in the |
13 | * documentation and/or other materials provided with the distribution. |
14 | * 3. Neither the name of the University nor the names of its contributors |
15 | * may be used to endorse or promote products derived from this software |
16 | * without specific prior written permission. |
17 | * |
18 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
19 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
20 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
21 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
22 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
23 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
24 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
25 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
26 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
27 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
28 | * SUCH DAMAGE. |
29 | * |
30 | * @(#)tcp.h 8.1 (Berkeley) 6/10/93 |
31 | * tcp.h,v 1.3 1994/08/21 05:27:34 paul Exp |
32 | */ |
33 | |
34 | #ifndef TCP_H |
35 | #define TCP_H |
36 | |
37 | #include <glib.h> |
38 | |
39 | typedef uint32_t tcp_seq; |
40 | |
41 | #define PR_SLOWHZ 2 /* 2 slow timeouts per second (approx) */ |
42 | #define PR_FASTHZ 5 /* 5 fast timeouts per second (not important) */ |
43 | |
44 | #define TCP_SNDSPACE 8192 |
45 | #define TCP_RCVSPACE 8192 |
46 | |
47 | /* |
48 | * TCP header. |
49 | * Per RFC 793, September, 1981. |
50 | */ |
51 | #define tcphdr slirp_tcphdr |
52 | struct tcphdr { |
53 | uint16_t th_sport; /* source port */ |
54 | uint16_t th_dport; /* destination port */ |
55 | tcp_seq th_seq; /* sequence number */ |
56 | tcp_seq th_ack; /* acknowledgement number */ |
57 | #if G_BYTE_ORDER == G_BIG_ENDIAN |
58 | uint8_t th_off : 4, /* data offset */ |
59 | th_x2 : 4; /* (unused) */ |
60 | #else |
61 | uint8_t th_x2 : 4, /* (unused) */ |
62 | th_off : 4; /* data offset */ |
63 | #endif |
64 | uint8_t th_flags; |
65 | uint16_t th_win; /* window */ |
66 | uint16_t th_sum; /* checksum */ |
67 | uint16_t th_urp; /* urgent pointer */ |
68 | }; |
69 | |
70 | #include "tcp_var.h" |
71 | |
72 | #ifndef TH_FIN |
73 | #define TH_FIN 0x01 |
74 | #define TH_SYN 0x02 |
75 | #define TH_RST 0x04 |
76 | #define TH_PUSH 0x08 |
77 | #define TH_ACK 0x10 |
78 | #define TH_URG 0x20 |
79 | #endif |
80 | |
81 | #ifndef TCPOPT_EOL |
82 | #define TCPOPT_EOL 0 |
83 | #define TCPOPT_NOP 1 |
84 | #define TCPOPT_MAXSEG 2 |
85 | #define TCPOPT_WINDOW 3 |
86 | #define TCPOPT_SACK_PERMITTED 4 /* Experimental */ |
87 | #define TCPOPT_SACK 5 /* Experimental */ |
88 | #define TCPOPT_TIMESTAMP 8 |
89 | |
90 | #define TCPOPT_TSTAMP_HDR \ |
91 | (TCPOPT_NOP << 24 | TCPOPT_NOP << 16 | TCPOPT_TIMESTAMP << 8 | \ |
92 | TCPOLEN_TIMESTAMP) |
93 | #endif |
94 | |
95 | #ifndef TCPOLEN_MAXSEG |
96 | #define TCPOLEN_MAXSEG 4 |
97 | #define TCPOLEN_WINDOW 3 |
98 | #define TCPOLEN_SACK_PERMITTED 2 |
99 | #define TCPOLEN_TIMESTAMP 10 |
100 | #define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP + 2) /* appendix A */ |
101 | #endif |
102 | |
103 | /* |
104 | * Default maximum segment size for TCP. |
105 | * With an IP MSS of 576, this is 536, |
106 | * but 512 is probably more convenient. |
107 | * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). |
108 | * |
109 | * We make this 1460 because we only care about Ethernet in the qemu context. |
110 | */ |
111 | #undef TCP_MSS |
112 | #define TCP_MSS 1460 |
113 | #undef TCP6_MSS |
114 | #define TCP6_MSS 1440 |
115 | |
116 | #undef TCP_MAXWIN |
117 | #define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ |
118 | |
119 | #undef TCP_MAX_WINSHIFT |
120 | #define TCP_MAX_WINSHIFT 14 /* maximum window shift */ |
121 | |
122 | /* |
123 | * User-settable options (used with setsockopt). |
124 | * |
125 | * We don't use the system headers on unix because we have conflicting |
126 | * local structures. We can't avoid the system definitions on Windows, |
127 | * so we undefine them. |
128 | */ |
129 | #undef TCP_NODELAY |
130 | #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ |
131 | #undef TCP_MAXSEG |
132 | |
133 | /* |
134 | * TCP FSM state definitions. |
135 | * Per RFC793, September, 1981. |
136 | */ |
137 | |
138 | #define TCP_NSTATES 11 |
139 | |
140 | #define TCPS_CLOSED 0 /* closed */ |
141 | #define TCPS_LISTEN 1 /* listening for connection */ |
142 | #define TCPS_SYN_SENT 2 /* active, have sent syn */ |
143 | #define TCPS_SYN_RECEIVED 3 /* have send and received syn */ |
144 | /* states < TCPS_ESTABLISHED are those where connections not established */ |
145 | #define TCPS_ESTABLISHED 4 /* established */ |
146 | #define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */ |
147 | /* states > TCPS_CLOSE_WAIT are those where user has closed */ |
148 | #define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */ |
149 | #define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */ |
150 | #define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */ |
151 | /* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */ |
152 | #define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */ |
153 | #define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */ |
154 | |
155 | #define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED) |
156 | #define TCPS_HAVEESTABLISHED(s) ((s) >= TCPS_ESTABLISHED) |
157 | #define TCPS_HAVERCVDFIN(s) ((s) >= TCPS_TIME_WAIT) |
158 | |
159 | /* |
160 | * TCP sequence numbers are 32 bit integers operated |
161 | * on with modular arithmetic. These macros can be |
162 | * used to compare such integers. |
163 | */ |
164 | #define SEQ_LT(a, b) ((int)((a) - (b)) < 0) |
165 | #define SEQ_LEQ(a, b) ((int)((a) - (b)) <= 0) |
166 | #define SEQ_GT(a, b) ((int)((a) - (b)) > 0) |
167 | #define SEQ_GEQ(a, b) ((int)((a) - (b)) >= 0) |
168 | |
169 | /* |
170 | * Macros to initialize tcp sequence numbers for |
171 | * send and receive from initial send and receive |
172 | * sequence numbers. |
173 | */ |
174 | #define tcp_rcvseqinit(tp) (tp)->rcv_adv = (tp)->rcv_nxt = (tp)->irs + 1 |
175 | |
176 | #define tcp_sendseqinit(tp) \ |
177 | (tp)->snd_una = (tp)->snd_nxt = (tp)->snd_max = (tp)->snd_up = (tp)->iss |
178 | |
179 | #define TCP_ISSINCR (125 * 1024) /* increment for tcp_iss each second */ |
180 | |
181 | #endif |
182 | |