File:
[Qemu by Fabrice Bellard] /
qemu /
slirp /
tcp_var.h
Revision
1.1.1.4 (vendor branch):
download - view:
text,
annotated -
select for diffs
Tue Apr 24 17:25:50 2018 UTC (2 years, 11 months ago) by
root
Branches:
qemu,
MAIN
CVS tags:
qemu0125,
qemu0124,
qemu0123,
qemu0122,
qemu0121,
qemu0120,
qemu0111,
qemu0110,
HEAD
qemu 0.11.0
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. 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_var.h 8.3 (Berkeley) 4/10/94
30: * tcp_var.h,v 1.3 1994/08/21 05:27:39 paul Exp
31: */
32:
33: #ifndef _TCP_VAR_H_
34: #define _TCP_VAR_H_
35:
36: #include "tcpip.h"
37: #include "tcp_timer.h"
38:
39: /*
40: * Tcp control block, one per tcp; fields:
41: */
42: struct tcpcb {
43: struct tcpiphdr *seg_next; /* sequencing queue */
44: struct tcpiphdr *seg_prev;
45: short t_state; /* state of this connection */
46: short t_timer[TCPT_NTIMERS]; /* tcp timers */
47: short t_rxtshift; /* log(2) of rexmt exp. backoff */
48: short t_rxtcur; /* current retransmit value */
49: short t_dupacks; /* consecutive dup acks recd */
50: u_short t_maxseg; /* maximum segment size */
51: char t_force; /* 1 if forcing out a byte */
52: u_short t_flags;
53: #define TF_ACKNOW 0x0001 /* ack peer immediately */
54: #define TF_DELACK 0x0002 /* ack, but try to delay it */
55: #define TF_NODELAY 0x0004 /* don't delay packets to coalesce */
56: #define TF_NOOPT 0x0008 /* don't use tcp options */
57: #define TF_SENTFIN 0x0010 /* have sent FIN */
58: #define TF_REQ_SCALE 0x0020 /* have/will request window scaling */
59: #define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */
60: #define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */
61: #define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */
62: #define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */
63:
64: struct tcpiphdr t_template; /* static skeletal packet for xmit */
65:
66: struct socket *t_socket; /* back pointer to socket */
67: /*
68: * The following fields are used as in the protocol specification.
69: * See RFC783, Dec. 1981, page 21.
70: */
71: /* send sequence variables */
72: tcp_seq snd_una; /* send unacknowledged */
73: tcp_seq snd_nxt; /* send next */
74: tcp_seq snd_up; /* send urgent pointer */
75: tcp_seq snd_wl1; /* window update seg seq number */
76: tcp_seq snd_wl2; /* window update seg ack number */
77: tcp_seq iss; /* initial send sequence number */
78: u_int32_t snd_wnd; /* send window */
79: /* receive sequence variables */
80: u_int32_t rcv_wnd; /* receive window */
81: tcp_seq rcv_nxt; /* receive next */
82: tcp_seq rcv_up; /* receive urgent pointer */
83: tcp_seq irs; /* initial receive sequence number */
84: /*
85: * Additional variables for this implementation.
86: */
87: /* receive variables */
88: tcp_seq rcv_adv; /* advertised window */
89: /* retransmit variables */
90: tcp_seq snd_max; /* highest sequence number sent;
91: * used to recognize retransmits
92: */
93: /* congestion control (for slow start, source quench, retransmit after loss) */
94: u_int32_t snd_cwnd; /* congestion-controlled window */
95: u_int32_t snd_ssthresh; /* snd_cwnd size threshold for
96: * for slow start exponential to
97: * linear switch
98: */
99: /*
100: * transmit timing stuff. See below for scale of srtt and rttvar.
101: * "Variance" is actually smoothed difference.
102: */
103: short t_idle; /* inactivity time */
104: short t_rtt; /* round trip time */
105: tcp_seq t_rtseq; /* sequence number being timed */
106: short t_srtt; /* smoothed round-trip time */
107: short t_rttvar; /* variance in round-trip time */
108: u_short t_rttmin; /* minimum rtt allowed */
109: u_int32_t max_sndwnd; /* largest window peer has offered */
110:
111: /* out-of-band data */
112: char t_oobflags; /* have some */
113: char t_iobc; /* input character */
114: #define TCPOOB_HAVEDATA 0x01
115: #define TCPOOB_HADDATA 0x02
116: short t_softerror; /* possible error not yet reported */
117:
118: /* RFC 1323 variables */
119: u_char snd_scale; /* window scaling for send window */
120: u_char rcv_scale; /* window scaling for recv window */
121: u_char request_r_scale; /* pending window scaling */
122: u_char requested_s_scale;
123: u_int32_t ts_recent; /* timestamp echo data */
124: u_int32_t ts_recent_age; /* when last updated */
125: tcp_seq last_ack_sent;
126:
127: };
128:
129: #define sototcpcb(so) ((so)->so_tcpcb)
130:
131: /*
132: * The smoothed round-trip time and estimated variance
133: * are stored as fixed point numbers scaled by the values below.
134: * For convenience, these scales are also used in smoothing the average
135: * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
136: * With these scales, srtt has 3 bits to the right of the binary point,
137: * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the
138: * binary point, and is smoothed with an ALPHA of 0.75.
139: */
140: #define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */
141: #define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */
142: #define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */
143: #define TCP_RTTVAR_SHIFT 2 /* multiplier for rttvar; 2 bits */
144:
145: /*
146: * The initial retransmission should happen at rtt + 4 * rttvar.
147: * Because of the way we do the smoothing, srtt and rttvar
148: * will each average +1/2 tick of bias. When we compute
149: * the retransmit timer, we want 1/2 tick of rounding and
150: * 1 extra tick because of +-1/2 tick uncertainty in the
151: * firing of the timer. The bias will give us exactly the
152: * 1.5 tick we need. But, because the bias is
153: * statistical, we have to test that we don't drop below
154: * the minimum feasible timer (which is 2 ticks).
155: * This macro assumes that the value of TCP_RTTVAR_SCALE
156: * is the same as the multiplier for rttvar.
157: */
158: #define TCP_REXMTVAL(tp) \
159: (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar)
160:
161: #endif
unix.superglobalmegacorp.com