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 H�ggmark, 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