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