1 1.1 rjs /* $KAME: dccp_var.h,v 1.29 2005/11/03 14:59:28 nishida Exp $ */ 2 1.7 ozaki /* $NetBSD: dccp_var.h,v 1.7 2022/10/28 05:20:08 ozaki-r 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.6 andvar u_int8_t pref_cc; /* Client preferred 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 u_int32_t d_maxseg; /* Maximum segment size */ 100 1.1 rjs char options[DCCP_MAX_OPTIONS]; 101 1.1 rjs u_int8_t optlen; 102 1.1 rjs char features[DCCP_MAX_OPTIONS]; 103 1.1 rjs u_int8_t featlen; 104 1.1 rjs u_int8_t ccval; /* ccval */ 105 1.1 rjs 106 1.1 rjs u_int32_t avgpsize; /* Average packet size */ 107 1.1 rjs 108 1.1 rjs /* variables for the local (receiver-side) ack vector */ 109 1.1 rjs u_char *ackvector; /* For acks, 2 bits per packet */ 110 1.1 rjs u_char *av_hp; /* head ptr for ackvector */ 111 1.1 rjs u_int16_t av_size; 112 1.1 rjs dccp_seq av_hs, av_ts; /* highest/lowest seq no in ackvector */ 113 1.1 rjs 114 1.1 rjs u_int8_t remote_ackvector; /* Is recv side using AckVector? */ 115 1.1 rjs u_char shortseq; /* use short seq number */ 116 1.1 rjs u_int32_t scode; /* service core */ 117 1.1 rjs struct ref_seq ref_seq; /* reference sequence number */ 118 1.1 rjs struct ref_seq ref_pseq; /* reference peer sequence number */ 119 1.1 rjs 120 1.1 rjs #ifndef __FreeBSD__ 121 1.1 rjs #ifndef INP_IPV6 122 1.1 rjs #define INP_IPV6 0x1 123 1.1 rjs #endif 124 1.1 rjs #ifndef INP_IPV4 125 1.1 rjs #define INP_IPV4 0x2 126 1.1 rjs #endif 127 1.1 rjs u_int8_t inp_vflag; 128 1.1 rjs u_int8_t inp_ip_ttl; 129 1.1 rjs u_int8_t inp_ip_tos; 130 1.1 rjs #endif 131 1.1 rjs u_int8_t pktlen[DCCP_MAX_PKTS]; 132 1.1 rjs u_int16_t pktlenidx; 133 1.1 rjs u_int16_t pktcnt; 134 1.1 rjs }; 135 1.1 rjs 136 1.1 rjs #ifdef _KERNEL 137 1.1 rjs struct inp_dp { 138 1.1 rjs struct inpcb inp; 139 1.1 rjs struct dccpcb dp; 140 1.1 rjs }; 141 1.1 rjs #endif 142 1.1 rjs 143 1.1 rjs #if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_) 144 1.1 rjs struct xdccpcb { 145 1.1 rjs size_t xd_len; 146 1.1 rjs struct inpcb xd_inp; 147 1.1 rjs struct dccpcb xd_dp; 148 1.1 rjs #ifdef __FreeBSD__ 149 1.1 rjs struct xsocket xd_socket; 150 1.1 rjs #endif 151 1.1 rjs }; 152 1.1 rjs #endif 153 1.1 rjs 154 1.1 rjs #define intodccpcb(ip) ((struct dccpcb *)((ip)->inp_ppcb)) 155 1.1 rjs #define dptosocket(dp) ((dp)->d_inpcb->inp_socket) 156 1.1 rjs 157 1.1 rjs struct dccpstat { 158 1.1 rjs u_long dccps_connattempt; /* Initiated connections */ 159 1.1 rjs u_long dccps_connects; /* Established connections */ 160 1.1 rjs u_long dccps_ipackets; /* Total input packets */ 161 1.1 rjs u_long dccps_ibytes; /* Total input bytes */ 162 1.1 rjs u_long dccps_drops; /* Dropped packets */ 163 1.1 rjs u_long dccps_badsum; /* Checksum error */ 164 1.1 rjs u_long dccps_badlen; /* Bad length */ 165 1.1 rjs u_long dccps_badseq; /* Sequence number not inside loss_window */ 166 1.1 rjs u_long dccps_noport; /* No socket on port */ 167 1.1 rjs 168 1.1 rjs /* TCPlike Sender */ 169 1.1 rjs u_long tcplikes_send_conn; /* Connections established */ 170 1.1 rjs u_long tcplikes_send_reploss; /* Data packets reported lost */ 171 1.1 rjs u_long tcplikes_send_assloss; /* Data packets assumed lost */ 172 1.1 rjs u_long tcplikes_send_ackrecv; /* Acknowledgement (w/ Ack Vector) packets received */ 173 1.1 rjs u_long tcplikes_send_missack; /* Ack packets assumed lost */ 174 1.1 rjs u_long tcplikes_send_badseq; /* Bad sequence number on outgoing packet */ 175 1.1 rjs u_long tcplikes_send_memerr; /* Memory allocation errors */ 176 1.1 rjs 177 1.1 rjs /* TCPlike Receiver */ 178 1.1 rjs u_long tcplikes_recv_conn; /* Connections established */ 179 1.1 rjs u_long tcplikes_recv_datarecv; /* Number of data packets received */ 180 1.1 rjs u_long tcplikes_recv_ackack; /* Ack-on-acks received */ 181 1.1 rjs u_long tcplikes_recv_acksent; /* Acknowledgement (w/ Ack Vector) packets sent */ 182 1.1 rjs u_long tcplikes_recv_memerr; /* Memory allocation errors */ 183 1.1 rjs 184 1.1 rjs /* Some CCID statistic should also be here */ 185 1.1 rjs 186 1.1 rjs u_long dccps_opackets; /* Total output packets */ 187 1.1 rjs u_long dccps_obytes; /* Total output bytes */ 188 1.1 rjs 189 1.1 rjs /* TFRC Sender */ 190 1.1 rjs u_long tfrcs_send_conn; /* Connections established */ 191 1.1 rjs u_long tfrcs_send_nomem; /* Not enough memory */ 192 1.1 rjs u_long tfrcs_send_erropt; /* option error */ 193 1.1 rjs u_long tfrcs_send_noopt; /* no option */ 194 1.1 rjs u_long tfrcs_send_fbacks; /* sent feedbacks */ 195 1.1 rjs 196 1.1 rjs /* TFRC Receiver */ 197 1.1 rjs u_long tfrcs_recv_conn; /* established connection */ 198 1.1 rjs u_long tfrcs_recv_erropt; /* option error */ 199 1.1 rjs u_long tfrcs_recv_losts; /* lost packets */ 200 1.1 rjs u_long tfrcs_recv_nomem; /* no memory */ 201 1.1 rjs u_long tfrcs_recv_noopt; /* no option */ 202 1.1 rjs u_long tfrcs_recv_fbacks; /* receipt feedbacks */ 203 1.1 rjs 204 1.1 rjs }; 205 1.1 rjs 206 1.1 rjs /* 207 1.1 rjs * Names for DCCP sysctl objects 208 1.1 rjs */ 209 1.1 rjs #define DCCPCTL_LOGINVAIN 1 210 1.1 rjs #define DCCPCTL_DOFEATURENEGO 2 211 1.1 rjs 212 1.1 rjs /* 213 1.1 rjs * DCCP States 214 1.1 rjs */ 215 1.1 rjs 216 1.1 rjs #define DCCPS_CLOSED 0 217 1.1 rjs #define DCCPS_LISTEN 1 218 1.1 rjs #define DCCPS_REQUEST 2 219 1.1 rjs #define DCCPS_RESPOND 3 220 1.1 rjs #define DCCPS_ESTAB 4 221 1.1 rjs #define DCCPS_SERVER_CLOSE 5 222 1.1 rjs #define DCCPS_CLIENT_CLOSE 6 223 1.1 rjs #define DCCPS_TIME_WAIT 7 224 1.1 rjs 225 1.1 rjs #define DCCP_NSTATES 8 226 1.1 rjs 227 1.1 rjs #ifdef DCCPSTATES 228 1.1 rjs const char *dccpstates[] = { 229 1.1 rjs "CLOSED", "LISTEN", "REQEST", "RESPOND", 230 1.1 rjs "ESTABLISHED", "SERVER-CLOSE", "CLIENT-CLOSE", "TIME_WAIT", 231 1.1 rjs }; 232 1.1 rjs #else 233 1.1 rjs extern const char *dccpstates[]; 234 1.1 rjs #endif 235 1.1 rjs 236 1.1 rjs #define DCCP_UNDEF 0 237 1.1 rjs #define DCCP_LISTENER 1 238 1.1 rjs #define DCCP_SERVER 2 239 1.1 rjs #define DCCP_CLIENT 3 240 1.1 rjs 241 1.1 rjs #define DCCP_SEQ_LT(a, b) ((int)(((a) << 16) - ((b) << 16)) < 0) 242 1.1 rjs #define DCCP_SEQ_GT(a, b) ((int)(((a) << 16) - ((b) << 16)) > 0) 243 1.1 rjs 244 1.1 rjs /* 245 1.1 rjs * Names for DCCP sysctl objects 246 1.1 rjs */ 247 1.1 rjs #define DCCPCTL_DEFCCID 1 /* Default CCID */ 248 1.1 rjs #define DCCPCTL_STATS 2 /* statistics (read-only) */ 249 1.1 rjs #define DCCPCTL_PCBLIST 3 250 1.1 rjs #define DCCPCTL_SENDSPACE 4 251 1.1 rjs #define DCCPCTL_RECVSPACE 5 252 1.1 rjs 253 1.1 rjs #ifdef _KERNEL 254 1.1 rjs 255 1.1 rjs #ifdef DCCP_DEBUG_ON 256 1.1 rjs #define DCCP_DEBUG(args) dccp_log args 257 1.1 rjs #else 258 1.1 rjs #define DCCP_DEBUG(args) 259 1.1 rjs #endif 260 1.1 rjs 261 1.1 rjs #ifdef ACKDEBUG 262 1.1 rjs #define ACK_DEBUG(args) dccp_log args 263 1.1 rjs #else 264 1.1 rjs #define ACK_DEBUG(args) 265 1.1 rjs #endif 266 1.1 rjs 267 1.1 rjs extern const struct pr_usrreqs dccp_usrreqs; 268 1.1 rjs extern struct inpcbhead dccpb; 269 1.1 rjs extern struct inpcbinfo dccpbinfo; 270 1.1 rjs extern u_long dccp_sendspace; 271 1.1 rjs extern u_long dccp_recvspace; 272 1.1 rjs extern struct dccpstat dccpstat; /* dccp statistics */ 273 1.1 rjs extern int dccp_log_in_vain; /* if we should log connections to 274 1.1 rjs ports w/o listeners */ 275 1.3 msaitoh extern int dccp_do_feature_nego; 276 1.1 rjs 277 1.1 rjs extern struct inpcbtable dccpbtable; 278 1.1 rjs 279 1.1 rjs /* These four functions are called from inetsw (in_proto.c) */ 280 1.1 rjs void dccp_init(void); 281 1.1 rjs void dccp_log(int, const char *, ...); 282 1.5 maxv void dccp_input(struct mbuf *, int, int); 283 1.1 rjs void* dccp_ctlinput(int, const struct sockaddr *, void *); 284 1.1 rjs int dccp_ctloutput(int , struct socket *, struct sockopt *); 285 1.1 rjs int dccp_sysctl(int *, u_int, void *, size_t *, void *, size_t); 286 1.3 msaitoh int dccp_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, 287 1.3 msaitoh struct mbuf *, struct lwp *); 288 1.1 rjs 289 1.1 rjs void dccp_notify(struct inpcb *, int); 290 1.1 rjs struct dccpcb * 291 1.1 rjs dccp_newdccpcb(int, void *); 292 1.1 rjs int dccp_shutdown(struct socket *); 293 1.1 rjs int dccp_output(struct dccpcb *, u_int8_t); 294 1.2 rtr int dccp_doconnect(struct socket *, struct sockaddr *, struct lwp *, int); 295 1.1 rjs int dccp_add_option(struct dccpcb *, u_int8_t, char *, u_int8_t); 296 1.3 msaitoh int dccp_add_feature(struct dccpcb *, u_int8_t, u_int8_t, char *, 297 1.3 msaitoh u_int8_t); 298 1.1 rjs int dccp_detach(struct socket *); 299 1.1 rjs int dccp_attach(struct socket *, int); 300 1.1 rjs int dccp_abort(struct socket *); 301 1.1 rjs int dccp_disconnect(struct socket *); 302 1.2 rtr int dccp_send(struct socket *, struct mbuf *, struct sockaddr *, 303 1.1 rjs struct mbuf *, struct lwp *); 304 1.1 rjs void dccp_retrans_t(void *); 305 1.1 rjs void dccp_connect_t(void *); 306 1.1 rjs 307 1.1 rjs /* No cc functions */ 308 1.1 rjs void* dccp_nocc_init(struct dccpcb *); 309 1.1 rjs void dccp_nocc_free(void *); 310 1.1 rjs int dccp_nocc_send_packet(void*, long); 311 1.1 rjs void dccp_nocc_send_packet_sent(void *, int, long); 312 1.1 rjs void dccp_nocc_packet_recv(void*, char *, int); 313 1.1 rjs 314 1.1 rjs #endif 315 1.1 rjs 316 1.1 rjs #endif 317