1 /*
2  * Copyright (c) 1984, 1985, 1986, 1987, 1993
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  *	@(#)spp_var.h	8.1 (Berkeley) 6/10/93
34  * $FreeBSD: src/sys/netns/spp_var.h,v 1.11 1999/12/29 04:46:21 peter Exp $
35  */
36 
37 #ifndef _NETNS_SPP_VAR_H_
38 #define _NETNS_SPP_VAR_H_
39 
40 /*
41  * Sp control block, one per connection
42  */
43 struct sppcb {
44 	struct	spidp_q	s_q;		/* queue for out-of-order receipt */
45 	struct	nspcb	*s_nspcb;	/* backpointer to internet pcb */
46 	u_char	s_state;
47 	u_char	s_flags;
48 #define	SF_ACKNOW	0x01		/* Ack peer immediately */
49 #define	SF_DELACK	0x02		/* Ack, but try to delay it */
50 #define	SF_HI	0x04			/* Show headers on input */
51 #define	SF_HO	0x08			/* Show headers on output */
52 #define	SF_PI	0x10			/* Packet (datagram) interface */
53 #define SF_WIN	0x20			/* Window info changed */
54 #define SF_RXT	0x40			/* Rxt info changed */
55 #define SF_RVD	0x80			/* Calling from read usrreq routine */
56 	u_short s_mtu;			/* Max packet size for this stream */
57 /* use sequence fields in headers to store sequence numbers for this
58    connection */
59 	struct	idp	*s_idp;
60 	struct	sphdr	s_shdr;		/* prototype header to transmit */
61 #define s_cc s_shdr.sp_cc		/* connection control (for EM bit) */
62 #define s_dt s_shdr.sp_dt		/* datastream type */
63 #define s_sid s_shdr.sp_sid		/* source connection identifier */
64 #define s_did s_shdr.sp_did		/* destination connection identifier */
65 #define s_seq s_shdr.sp_seq		/* sequence number */
66 #define s_ack s_shdr.sp_ack		/* acknowledge number */
67 #define s_alo s_shdr.sp_alo		/* allocation number */
68 #define s_dport s_idp->idp_dna.x_port	/* where we are sending */
69 	struct sphdr s_rhdr;		/* last received header (in effect!)*/
70 	u_short s_rack;			/* their acknowledge number */
71 	u_short s_ralo;			/* their allocation number */
72 	u_short s_smax;			/* highest packet # we have sent */
73 	u_short	s_snxt;			/* which packet to send next */
74 
75 /* congestion control */
76 #define	CUNIT	1024			/* scaling for ... */
77 	int	s_cwnd;			/* Congestion-controlled window */
78 					/* in packets * CUNIT */
79 	short	s_swnd;			/* == tcp snd_wnd, in packets */
80 	short	s_smxw;			/* == tcp max_sndwnd */
81 					/* difference of two spp_seq's can be
82 					   no bigger than a short */
83 	u_short	s_swl1;			/* == tcp snd_wl1 */
84 	u_short	s_swl2;			/* == tcp snd_wl2 */
85 	int	s_cwmx;			/* max allowable cwnd */
86 	int	s_ssthresh;		/* s_cwnd size threshhold for
87 					 * slow start exponential-to-
88 					 * linear switch */
89 /* transmit timing stuff
90  * srtt and rttvar are stored as fixed point, for convenience in smoothing.
91  * srtt has 3 bits to the right of the binary point, rttvar has 2.
92  */
93 	short	s_idle;			/* time idle */
94 	short	s_timer[SPPT_NTIMERS];	/* timers */
95 	short	s_rxtshift;		/* log(2) of rexmt exp. backoff */
96 	short	s_rxtcur;		/* current retransmit value */
97 	u_short	s_rtseq;		/* packet being timed */
98 	short	s_rtt;			/* timer for round trips */
99 	short	s_srtt;			/* averaged timer */
100 	short	s_rttvar;		/* variance in round trip time */
101 	char	s_force;		/* which timer expired */
102 	char	s_dupacks;		/* counter to intuit xmt loss */
103 
104 /* out of band data */
105 	char	s_oobflags;
106 #define SF_SOOB	0x08			/* sending out of band data */
107 #define SF_IOOB 0x10			/* receiving out of band data */
108 	char	s_iobc;			/* input characters */
109 /* debug stuff */
110 	u_short	s_want;			/* Last candidate for sending */
111 	char	s_outx;			/* exit taken from spp_output */
112 	char	s_inx;			/* exit taken from spp_input */
113 	u_short	s_flags2;		/* more flags for testing */
114 #define SF_NEWCALL	0x100		/* for new_recvmsg */
115 #define SO_NEWCALL	10		/* for new_recvmsg */
116 };
117 
118 #define	nstosppcb(np)	((struct sppcb *)(np)->nsp_pcb)
119 #define	sotosppcb(so)	(nstosppcb(sotonspcb(so)))
120 
121 struct	sppstat {
122 	long	spps_connattempt;	/* connections initiated */
123 	long	spps_accepts;		/* connections accepted */
124 	long	spps_connects;		/* connections established */
125 	long	spps_drops;		/* connections dropped */
126 	long	spps_conndrops;		/* embryonic connections dropped */
127 	long	spps_closed;		/* conn. closed (includes drops) */
128 	long	spps_segstimed;		/* segs where we tried to get rtt */
129 	long	spps_rttupdated;	/* times we succeeded */
130 	long	spps_delack;		/* delayed acks sent */
131 	long	spps_timeoutdrop;	/* conn. dropped in rxmt timeout */
132 	long	spps_rexmttimeo;	/* retransmit timeouts */
133 	long	spps_persisttimeo;	/* persist timeouts */
134 	long	spps_keeptimeo;		/* keepalive timeouts */
135 	long	spps_keepprobe;		/* keepalive probes sent */
136 	long	spps_keepdrops;		/* connections dropped in keepalive */
137 
138 	long	spps_sndtotal;		/* total packets sent */
139 	long	spps_sndpack;		/* data packets sent */
140 	long	spps_sndbyte;		/* data bytes sent */
141 	long	spps_sndrexmitpack;	/* data packets retransmitted */
142 	long	spps_sndrexmitbyte;	/* data bytes retransmitted */
143 	long	spps_sndacks;		/* ack-only packets sent */
144 	long	spps_sndprobe;		/* window probes sent */
145 	long	spps_sndurg;		/* packets sent with URG only */
146 	long	spps_sndwinup;		/* window update-only packets sent */
147 	long	spps_sndctrl;		/* control (SYN|FIN|RST) packets sent */
148 	long	spps_sndvoid;		/* couldn't find requested packet*/
149 
150 	long	spps_rcvtotal;		/* total packets received */
151 	long	spps_rcvpack;		/* packets received in sequence */
152 	long	spps_rcvbyte;		/* bytes received in sequence */
153 	long	spps_rcvbadsum;		/* packets received with ccksum errs */
154 	long	spps_rcvbadoff;		/* packets received with bad offset */
155 	long	spps_rcvshort;		/* packets received too short */
156 	long	spps_rcvduppack;	/* duplicate-only packets received */
157 	long	spps_rcvdupbyte;	/* duplicate-only bytes received */
158 	long	spps_rcvpartduppack;	/* packets with some duplicate data */
159 	long	spps_rcvpartdupbyte;	/* dup. bytes in part-dup. packets */
160 	long	spps_rcvoopack;		/* out-of-order packets received */
161 	long	spps_rcvoobyte;		/* out-of-order bytes received */
162 	long	spps_rcvpackafterwin;	/* packets with data after window */
163 	long	spps_rcvbyteafterwin;	/* bytes rcvd after window */
164 	long	spps_rcvafterclose;	/* packets rcvd after "close" */
165 	long	spps_rcvwinprobe;	/* rcvd window probe packets */
166 	long	spps_rcvdupack;		/* rcvd duplicate acks */
167 	long	spps_rcvacktoomuch;	/* rcvd acks for unsent data */
168 	long	spps_rcvackpack;	/* rcvd ack packets */
169 	long	spps_rcvackbyte;	/* bytes acked by rcvd acks */
170 	long	spps_rcvwinupd;		/* rcvd window update packets */
171 };
172 struct	spp_istat {
173 	short	hdrops;
174 	short	badsum;
175 	short	badlen;
176 	short	slotim;
177 	short	fastim;
178 	short	nonucn;
179 	short	noconn;
180 	short	notme;
181 	short	wrncon;
182 	short	bdreas;
183 	short	gonawy;
184 	short	notyet;
185 	short	lstdup;
186 	struct sppstat newstats;
187 };
188 
189 #ifdef _KERNEL
190 struct spp_istat spp_istat;
191 
192 /* Following was struct sppstat sppstat; */
193 #ifndef sppstat
194 #define sppstat spp_istat.newstats
195 #endif
196 
197 u_short spp_iss;
198 extern struct sppcb *spp_close(), *spp_disconnect(),
199 	*spp_usrclosed(), *spp_timers(), *spp_drop();
200 #endif
201 
202 #define	SPP_ISSINCR	128
203 /*
204  * SPP sequence numbers are 16 bit integers operated
205  * on with modular arithmetic.  These macros can be
206  * used to compare such integers.
207  */
208 #ifdef sun
209 short xnsCbug;
210 #define	SSEQ_LT(a,b)	((xnsCbug = (short)((a)-(b))) < 0)
211 #define	SSEQ_LEQ(a,b)	((xnsCbug = (short)((a)-(b))) <= 0)
212 #define	SSEQ_GT(a,b)	((xnsCbug = (short)((a)-(b))) > 0)
213 #define	SSEQ_GEQ(a,b)	((xnsCbug = (short)((a)-(b))) >= 0)
214 #else
215 #define	SSEQ_LT(a,b)	(((short)((a)-(b))) < 0)
216 #define	SSEQ_LEQ(a,b)	(((short)((a)-(b))) <= 0)
217 #define	SSEQ_GT(a,b)	(((short)((a)-(b))) > 0)
218 #define	SSEQ_GEQ(a,b)	(((short)((a)-(b))) >= 0)
219 #endif
220 
221 #endif
222