summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/netinet/tcp_var.h
blob: 636ffca6eed93f882dd5393a6d22be80db14fa31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
 * Copyright (c) 1997-1998 by Sun Microsystems, Inc.
 * All rights reserved.
 */

/*
 * Copyright (c) 1982, 1986 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

/*
 * Kernel variables for tcp.
 */

#ifndef	_NETINET_TCP_VAR_H
#define	_NETINET_TCP_VAR_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"
/* tcp_var.h 1.11 88/08/19 SMI; from UCB 7.3 6/30/87	*/

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Tcp control block, one per tcp; fields:
 */
struct tcpcb {
	struct	tcpiphdr *seg_next;	/* sequencing queue */
	struct	tcpiphdr *seg_prev;
	short	t_state;		/* state of this connection */
	short	t_timer[TCPT_NTIMERS];	/* tcp timers */
	short	t_rxtshift;		/* log(2) of rexmt exp. backoff */
	short	t_rxtcur;		/* current retransmit value */
	short	t_dupacks;		/* consecutive dup acks recd */
	ushort_t t_maxseg;		/* maximum segment size */
	char	t_force;		/* 1 if forcing out a byte */
	uchar_t	t_flags;
#define	TF_ACKNOW	0x01		/* ack peer immediately */
#define	TF_DELACK	0x02		/* ack, but try to delay it */
#define	TF_NODELAY	0x04		/* don't delay packets to coalesce */
#define	TF_NOOPT	0x08		/* don't use tcp options */
#define	TF_SENTFIN	0x10		/* have sent FIN */
	struct	tcpiphdr *t_template;	/* skeletal packet for transmit */
	struct	inpcb *t_inpcb;		/* back pointer to internet pcb */
/*
 * The following fields are used as in the protocol specification.
 * See RFC783, Dec. 1981, page 21.
 */
/* send sequence variables */
	tcp_seq	snd_una;		/* send unacknowledged */
	tcp_seq	snd_nxt;		/* send next */
	tcp_seq	snd_up;			/* send urgent pointer */
	tcp_seq	snd_wl1;		/* window update seg seq number */
	tcp_seq	snd_wl2;		/* window update seg ack number */
	tcp_seq	iss;			/* initial send sequence number */
	ushort_t snd_wnd;		/* send window */
/* receive sequence variables */
	ushort_t rcv_wnd;		/* receive window */
	tcp_seq	rcv_nxt;		/* receive next */
	tcp_seq	rcv_up;			/* receive urgent pointer */
	tcp_seq	irs;			/* initial receive sequence number */
/*
 * Additional variables for this implementation.
 */
/* receive variables */
	tcp_seq	rcv_adv;		/* advertised window */
/* retransmit variables */
	tcp_seq	snd_max;		/* highest sequence number sent */
					/* used to recognize retransmits */

/* congestion control (for slow start, source quench, retransmit after loss) */
	ushort_t snd_cwnd;		/* congestion-controlled window */
	ushort_t snd_ssthresh;		/* snd_cwnd size threshhold for */
					/* for slow start exponential to */
/*
 * transmit timing stuff.
 * srtt and rttvar are stored as fixed point; for convenience in smoothing,
 * srtt has 3 bits to the right of the binary point, rttvar has 2.
 * "Variance" is actually smoothed difference.
 */
	short	t_idle;			/* inactivity time */
	short	t_rtt;			/* round trip time */
	tcp_seq	t_rtseq;		/* sequence number being timed */
	short	t_srtt;			/* smoothed round-trip time */
	short	t_rttvar;		/* variance in round-trip time */
	ushort_t max_rcvd;		/* most peer has sent into window */
	ushort_t max_sndwnd;		/* largest window peer has offered */
/* out-of-band data */
	char	t_oobflags;		/* have some */
	char	t_iobc;			/* input character */
#define	TCPOOB_HAVEDATA	0x01
#define	TCPOOB_HADDATA	0x02
};

#define	intotcpcb(ip)	((struct tcpcb *)(ip)->inp_ppcb)
#define	sototcpcb(so)	(intotcpcb(sotoinpcb(so)))

/*
 * TCP statistics.
 * Many of these should be kept per connection,
 * but that's inconvenient at the moment.
 */
struct	tcpstat {
	uint_t	tcps_connattempt;	/* connections initiated */
	uint_t	tcps_accepts;		/* connections accepted */
	uint_t	tcps_connects;		/* connections established */
	uint_t	tcps_drops;		/* connections dropped */
	uint_t	tcps_conndrops;		/* embryonic connections dropped */
	uint_t	tcps_closed;		/* conn. closed (includes drops) */
	uint_t	tcps_segstimed;		/* segs where we tried to get rtt */
	uint_t	tcps_rttupdated;	/* times we succeeded */
	uint_t	tcps_delack;		/* delayed acks sent */
	uint_t	tcps_timeoutdrop;	/* conn. dropped in rxmt timeout */
	uint_t	tcps_rexmttimeo;	/* retransmit timeouts */
	uint_t	tcps_persisttimeo;	/* persist timeouts */
	uint_t	tcps_keeptimeo;		/* keepalive timeouts */
	uint_t	tcps_keepprobe;		/* keepalive probes sent */
	uint_t	tcps_keepdrops;		/* connections dropped in keepalive */

	uint_t	tcps_sndtotal;		/* total packets sent */
	uint_t	tcps_sndpack;		/* data packets sent */
	uint_t	tcps_sndbyte;		/* data bytes sent */
	uint_t	tcps_sndrexmitpack;	/* data packets retransmitted */
	uint_t	tcps_sndrexmitbyte;	/* data bytes retransmitted */
	uint_t	tcps_sndacks;		/* ack-only packets sent */
	uint_t	tcps_sndprobe;		/* window probes sent */
	uint_t	tcps_sndurg;		/* packets sent with URG only */
	uint_t	tcps_sndwinup;		/* window update-only packets sent */
	uint_t	tcps_sndctrl;		/* control (SYN|FIN|RST) packets sent */

	uint_t	tcps_rcvtotal;		/* total packets received */
	uint_t	tcps_rcvpack;		/* packets received in sequence */
	uint_t	tcps_rcvbyte;		/* bytes received in sequence */
	uint_t	tcps_rcvbadsum;		/* packets received with ccksum errs */
	uint_t	tcps_rcvbadoff;		/* packets received with bad offset */
	uint_t	tcps_rcvshort;		/* packets received too short */
	uint_t	tcps_rcvduppack;	/* duplicate-only packets received */
	uint_t	tcps_rcvdupbyte;	/* duplicate-only bytes received */
	uint_t	tcps_rcvpartduppack;	/* packets with some duplicate data */
	uint_t	tcps_rcvpartdupbyte;	/* dup. bytes in part-dup. packets */
	uint_t	tcps_rcvoopack;		/* out-of-order packets received */
	uint_t	tcps_rcvoobyte;		/* out-of-order bytes received */
	uint_t	tcps_rcvpackafterwin;	/* packets with data after window */
	uint_t	tcps_rcvbyteafterwin;	/* bytes rcvd after window */
	uint_t	tcps_rcvafterclose;	/* packets rcvd after "close" */
	uint_t	tcps_rcvwinprobe;	/* rcvd window probe packets */
	uint_t	tcps_rcvdupack;		/* rcvd duplicate acks */
	uint_t	tcps_rcvacktoomuch;	/* rcvd acks for unsent data */
	uint_t	tcps_rcvackpack;	/* rcvd ack packets */
	uint_t	tcps_rcvackbyte;	/* bytes acked by rcvd acks */
	uint_t	tcps_rcvwinupd;		/* rcvd window update packets */
};

#define	TCP_COMPAT_42

#ifdef	__cplusplus
}
#endif

#endif	/* _NETINET_TCP_VAR_H */