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