VirtualBox

source: vbox/trunk/src/VBox/Devices/Network/slirp/tcp_var.h@ 14293

Last change on this file since 14293 was 14293, checked in by vboxsync, 16 years ago

redirecting 64 workaround macro definitions to works like in 32bit world
in case both VBOX_WITH_BSD_REASS and VBOX_WITH_BSD_TCP_REASS are defined

  • Property svn:eol-style set to native
File size: 12.5 KB
Line 
1/*
2 * Copyright (c) 1982, 1986, 1993, 1994
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 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)tcp_var.h 8.3 (Berkeley) 4/10/94
34 * tcp_var.h,v 1.3 1994/08/21 05:27:39 paul Exp
35 */
36
37#ifndef _TCP_VAR_H_
38#define _TCP_VAR_H_
39
40#ifdef VBOX_WITH_BSD_TCP_REASS
41#include <sys/queue.h>
42#endif /* VBOX_WITH_BSD_TCP_REASS */
43
44#include "tcpip.h"
45#include "tcp_timer.h"
46
47#if SIZEOF_CHAR_P == 4
48 typedef struct tcpiphdr *tcpiphdrp_32;
49# define u32ptr_done(pData, u32, ptr) do {} while (0)
50# define ptr_to_u32(pData, ptr) (ptr)
51# define u32_to_ptr(pData, u32, type) ((type)(u32))
52#else
53 typedef u_int32_t tcpiphdrp_32;
54# include <iprt/types.h>
55# include <iprt/assert.h>
56
57#if defined(VBOX_WITH_BSD_TCP_REASS) && defined(VBOX_WITH_BSD_REASS)
58# define u32ptr_done(pData, u32, ptr) do {} while (0)
59# define ptr_to_u32(pData, ptr) (ptr)
60# define u32_to_ptr(pData, u32, type) ((type)(u32))
61#else /* VBOX_WITH_BSD_REASS && VBOX_WITH_BSD_TCP_REASS */
62# define u32ptr_done(pData, u32, ptr) VBoxU32PtrDone((pData), (ptr), (u32))
63# define ptr_to_u32(pData, ptr) VBoxU32PtrHash((pData), (ptr))
64# define u32_to_ptr(pData, u32, type) ((type)VBoxU32PtrLookup((pData), (u32)))
65#endif /* !VBOX_WITH_BSD_REASS || !VBOX_WITH_BSD_TCP_REASS*/
66
67#endif
68
69#ifdef VBOX_WITH_BSD_TCP_REASS
70/* TCP segment queue entry */
71struct tseg_qent {
72 LIST_ENTRY(tseg_qent) tqe_q;
73 int tqe_len; /* TCP segment data length */
74 struct tcphdr *tqe_th; /* a pointer to tcp header */
75 struct mbuf *tqe_m; /* mbuf contains packet */
76};
77LIST_HEAD(tsegqe_head, tseg_qent);
78#endif
79
80/*
81 * Tcp control block, one per tcp; fields:
82 */
83struct tcpcb {
84#ifndef VBOX_WITH_BSD_TCP_REASS
85 tcpiphdrp_32 seg_next; /* sequencing queue */
86 tcpiphdrp_32 seg_prev;
87#else /* !VBOX_WITH_BSD_TCP_REASS */
88 LIST_ENTRY(tcpcb) t_list;
89 struct tsegqe_head t_segq; /* segment reassembly queue */
90 int t_segqlen; /* segment reassembly queue length */
91#endif /* VBOX_WITH_BSD_TCP_REASS */
92 short t_state; /* state of this connection */
93 short t_timer[TCPT_NTIMERS]; /* tcp timers */
94 short t_rxtshift; /* log(2) of rexmt exp. backoff */
95 short t_rxtcur; /* current retransmit value */
96 short t_dupacks; /* consecutive dup acks recd */
97 u_short t_maxseg; /* maximum segment size */
98 char t_force; /* 1 if forcing out a byte */
99 u_short t_flags;
100#define TF_ACKNOW 0x0001 /* ack peer immediately */
101#define TF_DELACK 0x0002 /* ack, but try to delay it */
102#define TF_NODELAY 0x0004 /* don't delay packets to coalesce */
103#define TF_NOOPT 0x0008 /* don't use tcp options */
104#define TF_SENTFIN 0x0010 /* have sent FIN */
105#define TF_REQ_SCALE 0x0020 /* have/will request window scaling */
106#define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */
107#define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */
108#define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */
109#define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */
110
111 /* Make it static for now */
112/* struct tcpiphdr *t_template; / * skeletal packet for transmit */
113 struct tcpiphdr t_template;
114
115 struct socket *t_socket; /* back pointer to socket */
116/*
117 * The following fields are used as in the protocol specification.
118 * See RFC783, Dec. 1981, page 21.
119 */
120/* send sequence variables */
121 tcp_seq snd_una; /* send unacknowledged */
122 tcp_seq snd_nxt; /* send next */
123 tcp_seq snd_up; /* send urgent pointer */
124 tcp_seq snd_wl1; /* window update seg seq number */
125 tcp_seq snd_wl2; /* window update seg ack number */
126 tcp_seq iss; /* initial send sequence number */
127 u_int32_t snd_wnd; /* send window */
128/* receive sequence variables */
129 u_int32_t rcv_wnd; /* receive window */
130 tcp_seq rcv_nxt; /* receive next */
131 tcp_seq rcv_up; /* receive urgent pointer */
132 tcp_seq irs; /* initial receive sequence number */
133/*
134 * Additional variables for this implementation.
135 */
136/* receive variables */
137 tcp_seq rcv_adv; /* advertised window */
138/* retransmit variables */
139 tcp_seq snd_max; /* highest sequence number sent;
140 * used to recognize retransmits
141 */
142/* congestion control (for slow start, source quench, retransmit after loss) */
143 u_int32_t snd_cwnd; /* congestion-controlled window */
144 u_int32_t snd_ssthresh; /* snd_cwnd size threshold for
145 * for slow start exponential to
146 * linear switch
147 */
148/*
149 * transmit timing stuff. See below for scale of srtt and rttvar.
150 * "Variance" is actually smoothed difference.
151 */
152 short t_idle; /* inactivity time */
153 short t_rtt; /* round trip time */
154 tcp_seq t_rtseq; /* sequence number being timed */
155 short t_srtt; /* smoothed round-trip time */
156 short t_rttvar; /* variance in round-trip time */
157 u_short t_rttmin; /* minimum rtt allowed */
158 u_int32_t max_sndwnd; /* largest window peer has offered */
159
160/* out-of-band data */
161 char t_oobflags; /* have some */
162 char t_iobc; /* input character */
163#define TCPOOB_HAVEDATA 0x01
164#define TCPOOB_HADDATA 0x02
165 short t_softerror; /* possible error not yet reported */
166
167/* RFC 1323 variables */
168 u_char snd_scale; /* window scaling for send window */
169 u_char rcv_scale; /* window scaling for recv window */
170 u_char request_r_scale; /* pending window scaling */
171 u_char requested_s_scale;
172 u_int32_t ts_recent; /* timestamp echo data */
173 u_int32_t ts_recent_age; /* when last updated */
174 tcp_seq last_ack_sent;
175
176};
177
178#ifdef VBOX_WITH_BSD_TCP_REASS
179LIST_HEAD(tcpcbhead, tcpcb);
180#endif /*VBOX_WITH_BSD_TCP_REASS*/
181
182#define sototcpcb(so) ((so)->so_tcpcb)
183
184/*
185 * The smoothed round-trip time and estimated variance
186 * are stored as fixed point numbers scaled by the values below.
187 * For convenience, these scales are also used in smoothing the average
188 * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
189 * With these scales, srtt has 3 bits to the right of the binary point,
190 * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the
191 * binary point, and is smoothed with an ALPHA of 0.75.
192 */
193#define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */
194#define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */
195#define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */
196#define TCP_RTTVAR_SHIFT 2 /* multiplier for rttvar; 2 bits */
197
198/*
199 * The initial retransmission should happen at rtt + 4 * rttvar.
200 * Because of the way we do the smoothing, srtt and rttvar
201 * will each average +1/2 tick of bias. When we compute
202 * the retransmit timer, we want 1/2 tick of rounding and
203 * 1 extra tick because of +-1/2 tick uncertainty in the
204 * firing of the timer. The bias will give us exactly the
205 * 1.5 tick we need. But, because the bias is
206 * statistical, we have to test that we don't drop below
207 * the minimum feasible timer (which is 2 ticks).
208 * This macro assumes that the value of TCP_RTTVAR_SCALE
209 * is the same as the multiplier for rttvar.
210 */
211#define TCP_REXMTVAL(tp) \
212 (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar)
213
214/* XXX
215 * We want to avoid doing m_pullup on incoming packets but that
216 * means avoiding dtom on the tcp reassembly code. That in turn means
217 * keeping an mbuf pointer in the reassembly queue (since we might
218 * have a cluster). As a quick hack, the source & destination
219 * port numbers (which are no longer needed once we've located the
220 * tcpcb) are overlayed with an mbuf pointer.
221 */
222#if SIZEOF_CHAR_P == 4
223typedef struct mbuf *mbufp_32;
224/* VBox change which is too much bother to #ifdef */
225# define REASS_MBUF_SET(ti, p) (*(mbufp_32 *)&((ti)->ti_t)) = (p)
226# define REASS_MBUF_GET(ti) ((struct mbuf *)(*(mbufp_32 *)&((ti)->ti_t)))
227#else
228typedef u_int32_t mbufp_32;
229/* VBox change which is too much bother to #ifdef */
230# define REASS_MBUF_SET(ti, p) (*(mbufp_32 *)&((ti)->ti_t)) = ptr_to_u32(pData, p)
231# define REASS_MBUF_GET(ti) u32_to_ptr(pData, (*(mbufp_32 *)&((ti)->ti_t)), struct mbuf *)
232#endif
233/*#define REASS_MBUF(ti) (*(mbufp_32 *)&((ti)->ti_t)) - replaced by REASS_MBUF_GET/SET */
234
235/*
236 * TCP statistics.
237 * Many of these should be kept per connection,
238 * but that's inconvenient at the moment.
239 */
240struct tcpstat_t {
241 u_long tcps_connattempt; /* connections initiated */
242 u_long tcps_accepts; /* connections accepted */
243 u_long tcps_connects; /* connections established */
244 u_long tcps_drops; /* connections dropped */
245 u_long tcps_conndrops; /* embryonic connections dropped */
246 u_long tcps_closed; /* conn. closed (includes drops) */
247 u_long tcps_segstimed; /* segs where we tried to get rtt */
248 u_long tcps_rttupdated; /* times we succeeded */
249 u_long tcps_delack; /* delayed acks sent */
250 u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */
251 u_long tcps_rexmttimeo; /* retransmit timeouts */
252 u_long tcps_persisttimeo; /* persist timeouts */
253 u_long tcps_keeptimeo; /* keepalive timeouts */
254 u_long tcps_keepprobe; /* keepalive probes sent */
255 u_long tcps_keepdrops; /* connections dropped in keepalive */
256
257 u_long tcps_sndtotal; /* total packets sent */
258 u_long tcps_sndpack; /* data packets sent */
259 u_long tcps_sndbyte; /* data bytes sent */
260 u_long tcps_sndrexmitpack; /* data packets retransmitted */
261 u_long tcps_sndrexmitbyte; /* data bytes retransmitted */
262 u_long tcps_sndacks; /* ack-only packets sent */
263 u_long tcps_sndprobe; /* window probes sent */
264 u_long tcps_sndurg; /* packets sent with URG only */
265 u_long tcps_sndwinup; /* window update-only packets sent */
266 u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */
267
268 u_long tcps_rcvtotal; /* total packets received */
269 u_long tcps_rcvpack; /* packets received in sequence */
270 u_long tcps_rcvbyte; /* bytes received in sequence */
271 u_long tcps_rcvbadsum; /* packets received with ccksum errs */
272 u_long tcps_rcvbadoff; /* packets received with bad offset */
273/* u_long tcps_rcvshort; */ /* packets received too short */
274 u_long tcps_rcvduppack; /* duplicate-only packets received */
275 u_long tcps_rcvdupbyte; /* duplicate-only bytes received */
276 u_long tcps_rcvpartduppack; /* packets with some duplicate data */
277 u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */
278 u_long tcps_rcvoopack; /* out-of-order packets received */
279 u_long tcps_rcvoobyte; /* out-of-order bytes received */
280 u_long tcps_rcvpackafterwin; /* packets with data after window */
281 u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */
282 u_long tcps_rcvafterclose; /* packets rcvd after "close" */
283 u_long tcps_rcvwinprobe; /* rcvd window probe packets */
284 u_long tcps_rcvdupack; /* rcvd duplicate acks */
285 u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */
286 u_long tcps_rcvackpack; /* rcvd ack packets */
287 u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */
288 u_long tcps_rcvwinupd; /* rcvd window update packets */
289/* u_long tcps_pawsdrop; */ /* segments dropped due to PAWS */
290 u_long tcps_predack; /* times hdr predict ok for acks */
291 u_long tcps_preddat; /* times hdr predict ok for data pkts */
292 u_long tcps_socachemiss; /* tcp_last_so misses */
293 u_long tcps_didnuttin; /* Times tcp_output didn't do anything XXX */
294#ifdef VBOX_WITH_BSD_TCP_REASS
295 u_long tcps_rcvmemdrop;
296#endif /* VBOX_WITH_BSD_TCP_REASS */
297};
298
299
300#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette