dccp_var.h revision 1.5 1 1.1 rjs /* $KAME: dccp_var.h,v 1.29 2005/11/03 14:59:28 nishida Exp $ */
2 1.5 maxv /* $NetBSD: dccp_var.h,v 1.5 2018/09/14 05:09:51 maxv Exp $ */
3 1.1 rjs
4 1.1 rjs /*
5 1.1 rjs * Copyright (c) 2003 Joacim Hggmark, Magnus Erixzon, Nils-Erik Mattsson
6 1.1 rjs * All rights reserved.
7 1.1 rjs *
8 1.1 rjs * Redistribution and use in source and binary forms, with or without
9 1.1 rjs * modification, are permitted provided that the following conditions
10 1.1 rjs * are met:
11 1.1 rjs *
12 1.1 rjs * 1. Redistributions of source code must retain the above copyright
13 1.1 rjs * notice, this list of conditions and the following disclaimer.
14 1.1 rjs * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 rjs * notice, this list of conditions and the following disclaimer in the
16 1.1 rjs * documentation and/or other materials provided with the distribution.
17 1.1 rjs * 3. The name of the author may not be used to endorse or promote products
18 1.1 rjs * derived from this software without specific prior written permission.
19 1.1 rjs *
20 1.1 rjs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 1.1 rjs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 1.1 rjs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 1.1 rjs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 1.1 rjs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 1.1 rjs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 1.1 rjs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 1.1 rjs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 1.1 rjs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 1.1 rjs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 1.1 rjs *
31 1.1 rjs * Id: dccp_var.h,v 1.25 2003/07/31 11:17:15 joahag-9 Exp
32 1.1 rjs */
33 1.1 rjs
34 1.1 rjs #ifndef _NETINET_DCCP_VAR_H_
35 1.1 rjs #define _NETINET_DCCP_VAR_H_
36 1.1 rjs
37 1.1 rjs typedef u_int64_t dccp_seq;
38 1.1 rjs
39 1.1 rjs #define DSEQ_TO_DHDR(x, y) { \
40 1.1 rjs (x)->dh_seq = htons(y >> 32);\
41 1.1 rjs (x)->dh_seq2 = htonl(y & 4294967295U);\
42 1.1 rjs }
43 1.1 rjs
44 1.1 rjs #define DHDR_TO_DSEQ(x, y) { \
45 1.1 rjs x = ((u_int64_t)ntohs(y->dh_seq) << 32) | ntohl(y->dh_seq2);\
46 1.1 rjs }
47 1.1 rjs
48 1.1 rjs #define DSEQ_TO_DAHDR(x, y) { \
49 1.1 rjs (x).dah_ack = htons(y >> 32);\
50 1.1 rjs (x).dah_ack2 = htonl(y & 4294967295U);\
51 1.1 rjs }
52 1.1 rjs
53 1.1 rjs #define DAHDR_TO_DSEQ(x, y) { \
54 1.1 rjs x = ((u_int64_t)ntohs(y.dah_ack) << 32) | ntohl(y.dah_ack2);\
55 1.1 rjs }
56 1.1 rjs
57 1.1 rjs #define CONVERT_TO_LONGSEQ(S, ref) \
58 1.1 rjs ((((~(S- ref.lo) +1) <= 0x7fffff) && (S < ref.lo))? \
59 1.1 rjs (((u_int64_t)(ref.hi + 1) << 24) | S) % 281474976710656ll: \
60 1.1 rjs (((u_int64_t)ref.hi << 24) | S) % 281474976710656ll)
61 1.1 rjs
62 1.1 rjs struct ref_seq {
63 1.1 rjs u_int32_t hi;
64 1.1 rjs u_int32_t lo;
65 1.1 rjs };
66 1.1 rjs
67 1.1 rjs struct dccpcb {
68 1.1 rjs u_int8_t state; /* initial, listening, connecting, established,
69 1.1 rjs closing, closed etc */
70 1.1 rjs u_int8_t who; /* undef, server, client, listener */
71 1.1 rjs
72 1.1 rjs struct callout connect_timer; /* Connection timer */
73 1.1 rjs struct callout retrans_timer; /* Retransmit timer */
74 1.1 rjs struct callout close_timer; /* Closing timer */
75 1.1 rjs struct callout timewait_timer; /* Time wait timer */
76 1.1 rjs
77 1.1 rjs u_int32_t retrans;
78 1.1 rjs
79 1.1 rjs dccp_seq seq_snd;
80 1.1 rjs dccp_seq ack_snd; /* ack num to send in Ack or DataAck packet */
81 1.1 rjs dccp_seq gsn_rcv; /* Greatest received sequence number */
82 1.1 rjs
83 1.1 rjs /* values representing last incoming packet. are set in dccp_input */
84 1.1 rjs dccp_seq seq_rcv; /* Seq num of received packet */
85 1.1 rjs dccp_seq ack_rcv; /* Ack num received in Ack or DataAck packet */
86 1.1 rjs u_int8_t type_rcv; /* Type of packet received */
87 1.1 rjs u_int32_t len_rcv; /* Length of data received */
88 1.1 rjs u_int8_t ndp_rcv; /* ndp value of received packet */
89 1.1 rjs
90 1.1 rjs u_int8_t cslen; /* How much of outgoing packets are covered by the checksum */
91 1.1 rjs u_int8_t pref_cc; /* Client prefered CC */
92 1.1 rjs u_int8_t ndp; /* Number of non data packets */
93 1.1 rjs u_int32_t loss_window; /* Loss window (defaults to 1000) */
94 1.1 rjs u_int16_t ack_ratio; /* Ack Ratio Feature */
95 1.1 rjs int8_t cc_in_use[2]; /* Current CC in use
96 1.1 rjs (in each direction) */
97 1.1 rjs void *cc_state[2];
98 1.1 rjs struct inpcb *d_inpcb; /* Pointer back to Internet PCB */
99 1.1 rjs struct in6pcb *d_in6pcb;
100 1.1 rjs u_int32_t d_maxseg; /* Maximum segment size */
101 1.1 rjs char options[DCCP_MAX_OPTIONS];
102 1.1 rjs u_int8_t optlen;
103 1.1 rjs char features[DCCP_MAX_OPTIONS];
104 1.1 rjs u_int8_t featlen;
105 1.1 rjs u_int8_t ccval; /* ccval */
106 1.1 rjs
107 1.1 rjs u_int32_t avgpsize; /* Average packet size */
108 1.1 rjs
109 1.1 rjs /* variables for the local (receiver-side) ack vector */
110 1.1 rjs u_char *ackvector; /* For acks, 2 bits per packet */
111 1.1 rjs u_char *av_hp; /* head ptr for ackvector */
112 1.1 rjs u_int16_t av_size;
113 1.1 rjs dccp_seq av_hs, av_ts; /* highest/lowest seq no in ackvector */
114 1.1 rjs
115 1.1 rjs u_int8_t remote_ackvector; /* Is recv side using AckVector? */
116 1.1 rjs u_char shortseq; /* use short seq number */
117 1.1 rjs u_int32_t scode; /* service core */
118 1.1 rjs struct ref_seq ref_seq; /* reference sequence number */
119 1.1 rjs struct ref_seq ref_pseq; /* reference peer sequence number */
120 1.1 rjs
121 1.1 rjs #ifndef __FreeBSD__
122 1.1 rjs #ifndef INP_IPV6
123 1.1 rjs #define INP_IPV6 0x1
124 1.1 rjs #endif
125 1.1 rjs #ifndef INP_IPV4
126 1.1 rjs #define INP_IPV4 0x2
127 1.1 rjs #endif
128 1.1 rjs u_int8_t inp_vflag;
129 1.1 rjs u_int8_t inp_ip_ttl;
130 1.1 rjs u_int8_t inp_ip_tos;
131 1.1 rjs #endif
132 1.1 rjs u_int8_t pktlen[DCCP_MAX_PKTS];
133 1.1 rjs u_int16_t pktlenidx;
134 1.1 rjs u_int16_t pktcnt;
135 1.1 rjs };
136 1.1 rjs
137 1.1 rjs #ifdef _KERNEL
138 1.1 rjs struct inp_dp {
139 1.1 rjs struct inpcb inp;
140 1.1 rjs struct dccpcb dp;
141 1.1 rjs };
142 1.1 rjs #endif
143 1.1 rjs
144 1.1 rjs #if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_)
145 1.1 rjs struct xdccpcb {
146 1.1 rjs size_t xd_len;
147 1.1 rjs struct inpcb xd_inp;
148 1.1 rjs struct dccpcb xd_dp;
149 1.1 rjs #ifdef __FreeBSD__
150 1.1 rjs struct xsocket xd_socket;
151 1.1 rjs #endif
152 1.1 rjs };
153 1.1 rjs #endif
154 1.1 rjs
155 1.1 rjs #define intodccpcb(ip) ((struct dccpcb *)((ip)->inp_ppcb))
156 1.1 rjs #define in6todccpcb(ip) ((struct dccpcb *)((ip)->in6p_ppcb))
157 1.1 rjs
158 1.1 rjs #ifdef __NetBSD__
159 1.1 rjs #define dptosocket(dp) (((dp)->d_inpcb) ? (dp)->d_inpcb->inp_socket : \
160 1.1 rjs (((dp)->d_in6pcb) ? (dp)->d_in6pcb->in6p_socket : NULL))
161 1.1 rjs #else
162 1.1 rjs #define dptosocket(dp) ((dp)->d_inpcb->inp_socket)
163 1.1 rjs #endif
164 1.1 rjs
165 1.1 rjs struct dccpstat {
166 1.1 rjs u_long dccps_connattempt; /* Initiated connections */
167 1.1 rjs u_long dccps_connects; /* Established connections */
168 1.1 rjs u_long dccps_ipackets; /* Total input packets */
169 1.1 rjs u_long dccps_ibytes; /* Total input bytes */
170 1.1 rjs u_long dccps_drops; /* Dropped packets */
171 1.1 rjs u_long dccps_badsum; /* Checksum error */
172 1.1 rjs u_long dccps_badlen; /* Bad length */
173 1.1 rjs u_long dccps_badseq; /* Sequence number not inside loss_window */
174 1.1 rjs u_long dccps_noport; /* No socket on port */
175 1.1 rjs
176 1.1 rjs /* TCPlike Sender */
177 1.1 rjs u_long tcplikes_send_conn; /* Connections established */
178 1.1 rjs u_long tcplikes_send_reploss; /* Data packets reported lost */
179 1.1 rjs u_long tcplikes_send_assloss; /* Data packets assumed lost */
180 1.1 rjs u_long tcplikes_send_ackrecv; /* Acknowledgement (w/ Ack Vector) packets received */
181 1.1 rjs u_long tcplikes_send_missack; /* Ack packets assumed lost */
182 1.1 rjs u_long tcplikes_send_badseq; /* Bad sequence number on outgoing packet */
183 1.1 rjs u_long tcplikes_send_memerr; /* Memory allocation errors */
184 1.1 rjs
185 1.1 rjs /* TCPlike Receiver */
186 1.1 rjs u_long tcplikes_recv_conn; /* Connections established */
187 1.1 rjs u_long tcplikes_recv_datarecv; /* Number of data packets received */
188 1.1 rjs u_long tcplikes_recv_ackack; /* Ack-on-acks received */
189 1.1 rjs u_long tcplikes_recv_acksent; /* Acknowledgement (w/ Ack Vector) packets sent */
190 1.1 rjs u_long tcplikes_recv_memerr; /* Memory allocation errors */
191 1.1 rjs
192 1.1 rjs /* Some CCID statistic should also be here */
193 1.1 rjs
194 1.1 rjs u_long dccps_opackets; /* Total output packets */
195 1.1 rjs u_long dccps_obytes; /* Total output bytes */
196 1.1 rjs
197 1.1 rjs /* TFRC Sender */
198 1.1 rjs u_long tfrcs_send_conn; /* Connections established */
199 1.1 rjs u_long tfrcs_send_nomem; /* Not enough memory */
200 1.1 rjs u_long tfrcs_send_erropt; /* option error */
201 1.1 rjs u_long tfrcs_send_noopt; /* no option */
202 1.1 rjs u_long tfrcs_send_fbacks; /* sent feedbacks */
203 1.1 rjs
204 1.1 rjs /* TFRC Receiver */
205 1.1 rjs u_long tfrcs_recv_conn; /* established connection */
206 1.1 rjs u_long tfrcs_recv_erropt; /* option error */
207 1.1 rjs u_long tfrcs_recv_losts; /* lost packets */
208 1.1 rjs u_long tfrcs_recv_nomem; /* no memory */
209 1.1 rjs u_long tfrcs_recv_noopt; /* no option */
210 1.1 rjs u_long tfrcs_recv_fbacks; /* receipt feedbacks */
211 1.1 rjs
212 1.1 rjs };
213 1.1 rjs
214 1.1 rjs /*
215 1.1 rjs * Names for DCCP sysctl objects
216 1.1 rjs */
217 1.1 rjs #define DCCPCTL_LOGINVAIN 1
218 1.1 rjs #define DCCPCTL_DOFEATURENEGO 2
219 1.1 rjs
220 1.1 rjs /*
221 1.1 rjs * DCCP States
222 1.1 rjs */
223 1.1 rjs
224 1.1 rjs #define DCCPS_CLOSED 0
225 1.1 rjs #define DCCPS_LISTEN 1
226 1.1 rjs #define DCCPS_REQUEST 2
227 1.1 rjs #define DCCPS_RESPOND 3
228 1.1 rjs #define DCCPS_ESTAB 4
229 1.1 rjs #define DCCPS_SERVER_CLOSE 5
230 1.1 rjs #define DCCPS_CLIENT_CLOSE 6
231 1.1 rjs #define DCCPS_TIME_WAIT 7
232 1.1 rjs
233 1.1 rjs #define DCCP_NSTATES 8
234 1.1 rjs
235 1.1 rjs #ifdef DCCPSTATES
236 1.1 rjs const char *dccpstates[] = {
237 1.1 rjs "CLOSED", "LISTEN", "REQEST", "RESPOND",
238 1.1 rjs "ESTABLISHED", "SERVER-CLOSE", "CLIENT-CLOSE", "TIME_WAIT",
239 1.1 rjs };
240 1.1 rjs #else
241 1.1 rjs extern const char *dccpstates[];
242 1.1 rjs #endif
243 1.1 rjs
244 1.1 rjs #define DCCP_UNDEF 0
245 1.1 rjs #define DCCP_LISTENER 1
246 1.1 rjs #define DCCP_SERVER 2
247 1.1 rjs #define DCCP_CLIENT 3
248 1.1 rjs
249 1.1 rjs #define DCCP_SEQ_LT(a, b) ((int)(((a) << 16) - ((b) << 16)) < 0)
250 1.1 rjs #define DCCP_SEQ_GT(a, b) ((int)(((a) << 16) - ((b) << 16)) > 0)
251 1.1 rjs
252 1.1 rjs /*
253 1.1 rjs * Names for DCCP sysctl objects
254 1.1 rjs */
255 1.1 rjs #define DCCPCTL_DEFCCID 1 /* Default CCID */
256 1.1 rjs #define DCCPCTL_STATS 2 /* statistics (read-only) */
257 1.1 rjs #define DCCPCTL_PCBLIST 3
258 1.1 rjs #define DCCPCTL_SENDSPACE 4
259 1.1 rjs #define DCCPCTL_RECVSPACE 5
260 1.1 rjs
261 1.1 rjs #ifdef _KERNEL
262 1.1 rjs
263 1.1 rjs #ifdef DCCP_DEBUG_ON
264 1.1 rjs #define DCCP_DEBUG(args) dccp_log args
265 1.1 rjs #else
266 1.1 rjs #define DCCP_DEBUG(args)
267 1.1 rjs #endif
268 1.1 rjs
269 1.1 rjs #ifdef ACKDEBUG
270 1.1 rjs #define ACK_DEBUG(args) dccp_log args
271 1.1 rjs #else
272 1.1 rjs #define ACK_DEBUG(args)
273 1.1 rjs #endif
274 1.1 rjs
275 1.1 rjs extern const struct pr_usrreqs dccp_usrreqs;
276 1.1 rjs extern struct inpcbhead dccpb;
277 1.1 rjs extern struct inpcbinfo dccpbinfo;
278 1.1 rjs extern u_long dccp_sendspace;
279 1.1 rjs extern u_long dccp_recvspace;
280 1.1 rjs extern struct dccpstat dccpstat; /* dccp statistics */
281 1.1 rjs extern int dccp_log_in_vain; /* if we should log connections to
282 1.1 rjs ports w/o listeners */
283 1.3 msaitoh extern int dccp_do_feature_nego;
284 1.1 rjs
285 1.1 rjs extern struct inpcbtable dccpbtable;
286 1.1 rjs
287 1.1 rjs /* These four functions are called from inetsw (in_proto.c) */
288 1.1 rjs void dccp_init(void);
289 1.1 rjs void dccp_log(int, const char *, ...);
290 1.5 maxv void dccp_input(struct mbuf *, int, int);
291 1.1 rjs void* dccp_ctlinput(int, const struct sockaddr *, void *);
292 1.1 rjs int dccp_ctloutput(int , struct socket *, struct sockopt *);
293 1.1 rjs int dccp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
294 1.3 msaitoh int dccp_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
295 1.3 msaitoh struct mbuf *, struct lwp *);
296 1.1 rjs
297 1.1 rjs void dccp_notify(struct inpcb *, int);
298 1.1 rjs struct dccpcb *
299 1.1 rjs dccp_newdccpcb(int, void *);
300 1.1 rjs int dccp_shutdown(struct socket *);
301 1.1 rjs int dccp_output(struct dccpcb *, u_int8_t);
302 1.2 rtr int dccp_doconnect(struct socket *, struct sockaddr *, struct lwp *, int);
303 1.1 rjs int dccp_add_option(struct dccpcb *, u_int8_t, char *, u_int8_t);
304 1.3 msaitoh int dccp_add_feature(struct dccpcb *, u_int8_t, u_int8_t, char *,
305 1.3 msaitoh u_int8_t);
306 1.1 rjs int dccp_detach(struct socket *);
307 1.1 rjs int dccp_attach(struct socket *, int);
308 1.1 rjs int dccp_abort(struct socket *);
309 1.1 rjs int dccp_disconnect(struct socket *);
310 1.2 rtr int dccp_send(struct socket *, struct mbuf *, struct sockaddr *,
311 1.1 rjs struct mbuf *, struct lwp *);
312 1.1 rjs void dccp_retrans_t(void *);
313 1.1 rjs void dccp_connect_t(void *);
314 1.1 rjs
315 1.1 rjs /* No cc functions */
316 1.1 rjs void* dccp_nocc_init(struct dccpcb *);
317 1.1 rjs void dccp_nocc_free(void *);
318 1.1 rjs int dccp_nocc_send_packet(void*, long);
319 1.1 rjs void dccp_nocc_send_packet_sent(void *, int, long);
320 1.1 rjs void dccp_nocc_packet_recv(void*, char *, int);
321 1.1 rjs
322 1.1 rjs #endif
323 1.1 rjs
324 1.1 rjs #endif
325