1 /* $KAME: dccp_tfrc.h,v 1.10 2005/10/26 11:36:49 nishida Exp $ */ 2 /* $NetBSD: dccp_tfrc.h,v 1.2 2016/07/07 06:55:43 msaitoh Exp $ */ 3 4 /* 5 * Copyright (c) 2003 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_tfrc.h,v 1.34 2003/05/28 17:36:15 nilmat-8 Exp 32 */ 33 34 35 #ifndef _NETINET_DCCP_TFRC_H_ 36 #define _NETINET_DCCP_TFRC_H_ 37 38 #define TFRC_STD_PACKET_SIZE 256 39 #define TFRC_MIN_PACKET_SIZE 16 40 #define TFRC_MAX_PACKET_SIZE 65535 41 42 #define TFRC_OPSYS_TIME_GRAN 10000 43 #define TFRC_WIN_COUNT_LIMIT 16 44 #define TFRC_WIN_COUNT_PER_RTT 4 45 #define TFRC_SMALLEST_P 4 /* 0.00004 */ 46 /* 47 * TFRC sender 48 */ 49 50 /* TFRC sender states */ 51 #define TFRC_SSTATE_NO_SENT 1 52 #define TFRC_SSTATE_NO_FBACK 2 53 #define TFRC_SSTATE_FBACK 3 54 #define TFRC_SSTATE_TERM 4 55 56 /* Mechanism parameters */ 57 #define TFRC_INITIAL_TIMEOUT 2 58 #define TFRC_MAX_BACK_OFF_TIME 64 59 #define TFRC_RTT_FILTER_CONST 9000 /* 0.9 */ 60 #define TFRC_SEND_WAIT_TERM 20 61 62 /* Packet history */ 63 TAILQ_HEAD(s_hist_head,s_hist_entry); 64 65 struct fixpoint { 66 long long num; 67 long long denom; 68 }; 69 70 struct s_hist_entry { 71 TAILQ_ENTRY(s_hist_entry) linfo; /* Tail queue. */ 72 u_int64_t seq; /* Sequence number */ 73 struct timeval t_sent; /* When the packet was sent */ 74 u_int8_t win_count; /* Windowcounter for packet */ 75 }; 76 77 /* TFRC sender congestion control block (ccb) */ 78 struct tfrc_send_ccb { 79 kmutex_t mutex; /* Lock for this structure */ 80 struct dccpcb *pcb; /* Pointer to associated dccpcb */ 81 u_int8_t state; /* Sender state */ 82 83 struct fixpoint x; /* Current sending rate */ 84 struct fixpoint x_recv; /* Receive rate */ 85 struct fixpoint x_calc; /* Calculated send (?) rate */ 86 87 u_int16_t s; /* Packet size */ 88 89 u_int32_t rtt; /* Estimate of current round trip time */ 90 struct fixpoint p; /* Current loss event rate */ 91 u_int8_t last_win_count; /* Last window counter sent */ 92 /* Timestamp of earliest packet with last_win_count value sent */ 93 struct timeval t_last_win_count; 94 u_int8_t idle; 95 u_int32_t t_rto; /* Time out value = 4*rtt */ 96 struct timeval t_ld; /* Time last doubled during slow start */ 97 98 struct timeval t_nom; /* Nominal send time of next packet */ 99 struct timeval t_ipi; /* Interpacket (send) interval */ 100 struct timeval delta; /* Send timer delta */ 101 102 struct callout ch_stimer; /* Handle to scheduled send timer */ 103 struct callout ch_nftimer; /* Handle to no feedback timer */ 104 105 struct s_hist_head hist; /* Packet history */ 106 }; 107 108 #ifdef _KERNEL 109 110 /* Functions declared in struct dccp_cc_sw */ 111 112 /* 113 * Initialises the sender side 114 * args: pcb - pointer to dccpcb of associated connection 115 * returns: pointer to a tfrc_send_ccb struct on success, otherwise 0 116 */ 117 void *tfrc_send_init(struct dccpcb *); 118 119 /* 120 * Free the sender side 121 * args: ccb - ccb of sender 122 */ 123 void tfrc_send_free(void *); 124 125 /* 126 * Ask TFRC wheter one can send a packet or not 127 * args: ccb - ccb block for current connection 128 * returns: 1 if ok, else 0. 129 */ 130 int tfrc_send_packet(void *, long); 131 132 /* 133 * Notify sender that a packet has been sent 134 * args: ccb - ccb block for current connection 135 * moreToSend - if there exists more packets to send 136 * datasize - packet size 137 */ 138 void tfrc_send_packet_sent(void *, int, long); 139 140 /* 141 * Notify that a an ack package was received (i.e. a feedback packet) 142 * args: ccb - ccb block for current connection 143 */ 144 void tfrc_send_packet_recv(void *, char *, int); 145 146 #endif 147 148 /* 149 * TFRC Receiver 150 */ 151 152 /* TFRC specific dccp options */ 153 #define TFRC_OPT_LOSS_RATE 192 154 #define TFRC_OPT_LOSS_INTERVAL 193 155 //#define TFRC_OPT_ELAPSED_TIME 193 156 #define TFRC_OPT_RECEIVE_RATE 194 157 158 /* TFRC receiver states */ 159 #define TFRC_RSTATE_NO_DATA 1 160 #define TFRC_RSTATE_DATA 2 161 #define TFRC_RSTATE_TERM 127 162 163 /* Receiver mechanism parameters */ 164 /* 165 * seq_num x,y; if y-x is smaller than this number (note, wrap around) then 166 * y is newer than x 167 */ 168 #define TFRC_RECV_NEW_SEQ_RANGE 10000000 169 /* number of later packets received before one is considered lost */ 170 #define TFRC_RECV_NUM_LATE_LOSS 3 171 /* length(w[]) */ 172 #define TFRC_RECV_IVAL_F_LENGTH 8 173 174 /* Packet history */ 175 TAILQ_HEAD(r_hist_head,r_hist_entry); 176 177 struct r_hist_entry { 178 TAILQ_ENTRY(r_hist_entry) linfo; /* Tail queue. */ 179 u_int64_t seq; /* Sequence number */ 180 struct timeval t_recv; /* When the packet was received */ 181 u_int8_t win_count; /* Window counter for that packet */ 182 u_int8_t type; /* Packet type received */ 183 u_int8_t ndp; /* no data packets value */ 184 }; 185 186 /* Loss interval history */ 187 TAILQ_HEAD(li_hist_head,li_hist_entry); 188 189 struct li_hist_entry { 190 TAILQ_ENTRY(li_hist_entry) linfo; /* Tail queue. */ 191 u_int32_t interval; /* Loss interval */ 192 u_int64_t seq; /* Sequence number of the packet that started the interval */ 193 u_int8_t win_count; /* Window counter for previous received packet */ 194 }; 195 196 /* TFRC receiver congestion control block (ccb) */ 197 struct tfrc_recv_ccb { 198 kmutex_t mutex; /* Lock for this structure */ 199 struct dccpcb *pcb; /* Pointer to associated dccpcb */ 200 u_int8_t state; /* Receiver state */ 201 202 struct fixpoint p; /* Loss event rate */ 203 204 struct li_hist_head li_hist; /* Loss interval history */ 205 206 /* 207 * Highest value of the window counter received when last feedback 208 * was sent 209 */ 210 u_int8_t last_counter; 211 /* Sequence number of the packet above */ 212 u_int64_t seq_last_counter; 213 214 /* Timestamp of when last feedback was sent */ 215 struct timeval t_last_feedback; 216 u_int32_t bytes_recv; /* Bytes received since t_last_feedback */ 217 218 struct r_hist_head hist; /* Packet history */ 219 220 u_int16_t s; /* Packet size */ 221 }; 222 223 #ifdef _KERNEL 224 225 /* Functions declared in struct dccp_cc_sw */ 226 227 /* Initialises the receiver side 228 * args: pcb - pointer to dccpcb of associated connection 229 * returns: pointer to a tfrc_recv_ccb struct on success, otherwise 0 230 */ 231 void *tfrc_recv_init(struct dccpcb *); 232 233 /* Free the receiver side 234 * args: ccb - ccb of recevier 235 */ 236 void tfrc_recv_free(void *); 237 238 /* 239 * Tell TFRC that a packet has been received 240 * args: ccb - ccb block for current connection 241 */ 242 void tfrc_recv_packet_recv(void *, char *, int); 243 244 #endif 245 246 #endif 247