dccp_tfrc.h revision 1.2.16.2 1 1.2.16.2 jdolecek /* $KAME: dccp_tfrc.h,v 1.10 2005/10/26 11:36:49 nishida Exp $ */
2 1.2.16.2 jdolecek /* $NetBSD: dccp_tfrc.h,v 1.2.16.2 2017/12/03 11:39:03 jdolecek Exp $ */
3 1.2.16.2 jdolecek
4 1.2.16.2 jdolecek /*
5 1.2.16.2 jdolecek * Copyright (c) 2003 Nils-Erik Mattsson
6 1.2.16.2 jdolecek * All rights reserved.
7 1.2.16.2 jdolecek *
8 1.2.16.2 jdolecek * Redistribution and use in source and binary forms, with or without
9 1.2.16.2 jdolecek * modification, are permitted provided that the following conditions
10 1.2.16.2 jdolecek * are met:
11 1.2.16.2 jdolecek *
12 1.2.16.2 jdolecek * 1. Redistributions of source code must retain the above copyright
13 1.2.16.2 jdolecek * notice, this list of conditions and the following disclaimer.
14 1.2.16.2 jdolecek * 2. Redistributions in binary form must reproduce the above copyright
15 1.2.16.2 jdolecek * notice, this list of conditions and the following disclaimer in the
16 1.2.16.2 jdolecek * documentation and/or other materials provided with the distribution.
17 1.2.16.2 jdolecek * 3. The name of the author may not be used to endorse or promote products
18 1.2.16.2 jdolecek * derived from this software without specific prior written permission.
19 1.2.16.2 jdolecek *
20 1.2.16.2 jdolecek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 1.2.16.2 jdolecek * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 1.2.16.2 jdolecek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 1.2.16.2 jdolecek * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 1.2.16.2 jdolecek * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 1.2.16.2 jdolecek * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 1.2.16.2 jdolecek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 1.2.16.2 jdolecek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 1.2.16.2 jdolecek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 1.2.16.2 jdolecek * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 1.2.16.2 jdolecek *
31 1.2.16.2 jdolecek * Id: dccp_tfrc.h,v 1.34 2003/05/28 17:36:15 nilmat-8 Exp
32 1.2.16.2 jdolecek */
33 1.2.16.2 jdolecek
34 1.2.16.2 jdolecek
35 1.2.16.2 jdolecek #ifndef _NETINET_DCCP_TFRC_H_
36 1.2.16.2 jdolecek #define _NETINET_DCCP_TFRC_H_
37 1.2.16.2 jdolecek
38 1.2.16.2 jdolecek #define TFRC_STD_PACKET_SIZE 256
39 1.2.16.2 jdolecek #define TFRC_MIN_PACKET_SIZE 16
40 1.2.16.2 jdolecek #define TFRC_MAX_PACKET_SIZE 65535
41 1.2.16.2 jdolecek
42 1.2.16.2 jdolecek #define TFRC_OPSYS_TIME_GRAN 10000
43 1.2.16.2 jdolecek #define TFRC_WIN_COUNT_LIMIT 16
44 1.2.16.2 jdolecek #define TFRC_WIN_COUNT_PER_RTT 4
45 1.2.16.2 jdolecek #define TFRC_SMALLEST_P 4 /* 0.00004 */
46 1.2.16.2 jdolecek /*
47 1.2.16.2 jdolecek * TFRC sender
48 1.2.16.2 jdolecek */
49 1.2.16.2 jdolecek
50 1.2.16.2 jdolecek /* TFRC sender states */
51 1.2.16.2 jdolecek #define TFRC_SSTATE_NO_SENT 1
52 1.2.16.2 jdolecek #define TFRC_SSTATE_NO_FBACK 2
53 1.2.16.2 jdolecek #define TFRC_SSTATE_FBACK 3
54 1.2.16.2 jdolecek #define TFRC_SSTATE_TERM 4
55 1.2.16.2 jdolecek
56 1.2.16.2 jdolecek /* Mechanism parameters */
57 1.2.16.2 jdolecek #define TFRC_INITIAL_TIMEOUT 2
58 1.2.16.2 jdolecek #define TFRC_MAX_BACK_OFF_TIME 64
59 1.2.16.2 jdolecek #define TFRC_RTT_FILTER_CONST 9000 /* 0.9 */
60 1.2.16.2 jdolecek #define TFRC_SEND_WAIT_TERM 20
61 1.2.16.2 jdolecek
62 1.2.16.2 jdolecek /* Packet history */
63 1.2.16.2 jdolecek TAILQ_HEAD(s_hist_head,s_hist_entry);
64 1.2.16.2 jdolecek
65 1.2.16.2 jdolecek struct fixpoint {
66 1.2.16.2 jdolecek long long num;
67 1.2.16.2 jdolecek long long denom;
68 1.2.16.2 jdolecek };
69 1.2.16.2 jdolecek
70 1.2.16.2 jdolecek struct s_hist_entry {
71 1.2.16.2 jdolecek TAILQ_ENTRY(s_hist_entry) linfo; /* Tail queue. */
72 1.2.16.2 jdolecek u_int64_t seq; /* Sequence number */
73 1.2.16.2 jdolecek struct timeval t_sent; /* When the packet was sent */
74 1.2.16.2 jdolecek u_int8_t win_count; /* Windowcounter for packet */
75 1.2.16.2 jdolecek };
76 1.2.16.2 jdolecek
77 1.2.16.2 jdolecek /* TFRC sender congestion control block (ccb) */
78 1.2.16.2 jdolecek struct tfrc_send_ccb {
79 1.2.16.2 jdolecek kmutex_t mutex; /* Lock for this structure */
80 1.2.16.2 jdolecek struct dccpcb *pcb; /* Pointer to associated dccpcb */
81 1.2.16.2 jdolecek u_int8_t state; /* Sender state */
82 1.2.16.2 jdolecek
83 1.2.16.2 jdolecek struct fixpoint x; /* Current sending rate */
84 1.2.16.2 jdolecek struct fixpoint x_recv; /* Receive rate */
85 1.2.16.2 jdolecek struct fixpoint x_calc; /* Calculated send (?) rate */
86 1.2.16.2 jdolecek
87 1.2.16.2 jdolecek u_int16_t s; /* Packet size */
88 1.2.16.2 jdolecek
89 1.2.16.2 jdolecek u_int32_t rtt; /* Estimate of current round trip time */
90 1.2.16.2 jdolecek struct fixpoint p; /* Current loss event rate */
91 1.2.16.2 jdolecek u_int8_t last_win_count; /* Last window counter sent */
92 1.2.16.2 jdolecek /* Timestamp of earliest packet with last_win_count value sent */
93 1.2.16.2 jdolecek struct timeval t_last_win_count;
94 1.2.16.2 jdolecek u_int8_t idle;
95 1.2.16.2 jdolecek u_int32_t t_rto; /* Time out value = 4*rtt */
96 1.2.16.2 jdolecek struct timeval t_ld; /* Time last doubled during slow start */
97 1.2.16.2 jdolecek
98 1.2.16.2 jdolecek struct timeval t_nom; /* Nominal send time of next packet */
99 1.2.16.2 jdolecek struct timeval t_ipi; /* Interpacket (send) interval */
100 1.2.16.2 jdolecek struct timeval delta; /* Send timer delta */
101 1.2.16.2 jdolecek
102 1.2.16.2 jdolecek struct callout ch_stimer; /* Handle to scheduled send timer */
103 1.2.16.2 jdolecek struct callout ch_nftimer; /* Handle to no feedback timer */
104 1.2.16.2 jdolecek
105 1.2.16.2 jdolecek struct s_hist_head hist; /* Packet history */
106 1.2.16.2 jdolecek };
107 1.2.16.2 jdolecek
108 1.2.16.2 jdolecek #ifdef _KERNEL
109 1.2.16.2 jdolecek
110 1.2.16.2 jdolecek /* Functions declared in struct dccp_cc_sw */
111 1.2.16.2 jdolecek
112 1.2.16.2 jdolecek /*
113 1.2.16.2 jdolecek * Initialises the sender side
114 1.2.16.2 jdolecek * args: pcb - pointer to dccpcb of associated connection
115 1.2.16.2 jdolecek * returns: pointer to a tfrc_send_ccb struct on success, otherwise 0
116 1.2.16.2 jdolecek */
117 1.2.16.2 jdolecek void *tfrc_send_init(struct dccpcb *);
118 1.2.16.2 jdolecek
119 1.2.16.2 jdolecek /*
120 1.2.16.2 jdolecek * Free the sender side
121 1.2.16.2 jdolecek * args: ccb - ccb of sender
122 1.2.16.2 jdolecek */
123 1.2.16.2 jdolecek void tfrc_send_free(void *);
124 1.2.16.2 jdolecek
125 1.2.16.2 jdolecek /*
126 1.2.16.2 jdolecek * Ask TFRC wheter one can send a packet or not
127 1.2.16.2 jdolecek * args: ccb - ccb block for current connection
128 1.2.16.2 jdolecek * returns: 1 if ok, else 0.
129 1.2.16.2 jdolecek */
130 1.2.16.2 jdolecek int tfrc_send_packet(void *, long);
131 1.2.16.2 jdolecek
132 1.2.16.2 jdolecek /*
133 1.2.16.2 jdolecek * Notify sender that a packet has been sent
134 1.2.16.2 jdolecek * args: ccb - ccb block for current connection
135 1.2.16.2 jdolecek * moreToSend - if there exists more packets to send
136 1.2.16.2 jdolecek * datasize - packet size
137 1.2.16.2 jdolecek */
138 1.2.16.2 jdolecek void tfrc_send_packet_sent(void *, int, long);
139 1.2.16.2 jdolecek
140 1.2.16.2 jdolecek /*
141 1.2.16.2 jdolecek * Notify that a an ack package was received (i.e. a feedback packet)
142 1.2.16.2 jdolecek * args: ccb - ccb block for current connection
143 1.2.16.2 jdolecek */
144 1.2.16.2 jdolecek void tfrc_send_packet_recv(void *, char *, int);
145 1.2.16.2 jdolecek
146 1.2.16.2 jdolecek #endif
147 1.2.16.2 jdolecek
148 1.2.16.2 jdolecek /*
149 1.2.16.2 jdolecek * TFRC Receiver
150 1.2.16.2 jdolecek */
151 1.2.16.2 jdolecek
152 1.2.16.2 jdolecek /* TFRC specific dccp options */
153 1.2.16.2 jdolecek #define TFRC_OPT_LOSS_RATE 192
154 1.2.16.2 jdolecek #define TFRC_OPT_LOSS_INTERVAL 193
155 1.2.16.2 jdolecek //#define TFRC_OPT_ELAPSED_TIME 193
156 1.2.16.2 jdolecek #define TFRC_OPT_RECEIVE_RATE 194
157 1.2.16.2 jdolecek
158 1.2.16.2 jdolecek /* TFRC receiver states */
159 1.2.16.2 jdolecek #define TFRC_RSTATE_NO_DATA 1
160 1.2.16.2 jdolecek #define TFRC_RSTATE_DATA 2
161 1.2.16.2 jdolecek #define TFRC_RSTATE_TERM 127
162 1.2.16.2 jdolecek
163 1.2.16.2 jdolecek /* Receiver mechanism parameters */
164 1.2.16.2 jdolecek /*
165 1.2.16.2 jdolecek * seq_num x,y; if y-x is smaller than this number (note, wrap around) then
166 1.2.16.2 jdolecek * y is newer than x
167 1.2.16.2 jdolecek */
168 1.2.16.2 jdolecek #define TFRC_RECV_NEW_SEQ_RANGE 10000000
169 1.2.16.2 jdolecek /* number of later packets received before one is considered lost */
170 1.2.16.2 jdolecek #define TFRC_RECV_NUM_LATE_LOSS 3
171 1.2.16.2 jdolecek /* length(w[]) */
172 1.2.16.2 jdolecek #define TFRC_RECV_IVAL_F_LENGTH 8
173 1.2.16.2 jdolecek
174 1.2.16.2 jdolecek /* Packet history */
175 1.2.16.2 jdolecek TAILQ_HEAD(r_hist_head,r_hist_entry);
176 1.2.16.2 jdolecek
177 1.2.16.2 jdolecek struct r_hist_entry {
178 1.2.16.2 jdolecek TAILQ_ENTRY(r_hist_entry) linfo; /* Tail queue. */
179 1.2.16.2 jdolecek u_int64_t seq; /* Sequence number */
180 1.2.16.2 jdolecek struct timeval t_recv; /* When the packet was received */
181 1.2.16.2 jdolecek u_int8_t win_count; /* Window counter for that packet */
182 1.2.16.2 jdolecek u_int8_t type; /* Packet type received */
183 1.2.16.2 jdolecek u_int8_t ndp; /* no data packets value */
184 1.2.16.2 jdolecek };
185 1.2.16.2 jdolecek
186 1.2.16.2 jdolecek /* Loss interval history */
187 1.2.16.2 jdolecek TAILQ_HEAD(li_hist_head,li_hist_entry);
188 1.2.16.2 jdolecek
189 1.2.16.2 jdolecek struct li_hist_entry {
190 1.2.16.2 jdolecek TAILQ_ENTRY(li_hist_entry) linfo; /* Tail queue. */
191 1.2.16.2 jdolecek u_int32_t interval; /* Loss interval */
192 1.2.16.2 jdolecek u_int64_t seq; /* Sequence number of the packet that started the interval */
193 1.2.16.2 jdolecek u_int8_t win_count; /* Window counter for previous received packet */
194 1.2.16.2 jdolecek };
195 1.2.16.2 jdolecek
196 1.2.16.2 jdolecek /* TFRC receiver congestion control block (ccb) */
197 1.2.16.2 jdolecek struct tfrc_recv_ccb {
198 1.2.16.2 jdolecek kmutex_t mutex; /* Lock for this structure */
199 1.2.16.2 jdolecek struct dccpcb *pcb; /* Pointer to associated dccpcb */
200 1.2.16.2 jdolecek u_int8_t state; /* Receiver state */
201 1.2.16.2 jdolecek
202 1.2.16.2 jdolecek struct fixpoint p; /* Loss event rate */
203 1.2.16.2 jdolecek
204 1.2.16.2 jdolecek struct li_hist_head li_hist; /* Loss interval history */
205 1.2.16.2 jdolecek
206 1.2.16.2 jdolecek /*
207 1.2.16.2 jdolecek * Highest value of the window counter received when last feedback
208 1.2.16.2 jdolecek * was sent
209 1.2.16.2 jdolecek */
210 1.2.16.2 jdolecek u_int8_t last_counter;
211 1.2.16.2 jdolecek /* Sequence number of the packet above */
212 1.2.16.2 jdolecek u_int64_t seq_last_counter;
213 1.2.16.2 jdolecek
214 1.2.16.2 jdolecek /* Timestamp of when last feedback was sent */
215 1.2.16.2 jdolecek struct timeval t_last_feedback;
216 1.2.16.2 jdolecek u_int32_t bytes_recv; /* Bytes received since t_last_feedback */
217 1.2.16.2 jdolecek
218 1.2.16.2 jdolecek struct r_hist_head hist; /* Packet history */
219 1.2.16.2 jdolecek
220 1.2.16.2 jdolecek u_int16_t s; /* Packet size */
221 1.2.16.2 jdolecek };
222 1.2.16.2 jdolecek
223 1.2.16.2 jdolecek #ifdef _KERNEL
224 1.2.16.2 jdolecek
225 1.2.16.2 jdolecek /* Functions declared in struct dccp_cc_sw */
226 1.2.16.2 jdolecek
227 1.2.16.2 jdolecek /* Initialises the receiver side
228 1.2.16.2 jdolecek * args: pcb - pointer to dccpcb of associated connection
229 1.2.16.2 jdolecek * returns: pointer to a tfrc_recv_ccb struct on success, otherwise 0
230 1.2.16.2 jdolecek */
231 1.2.16.2 jdolecek void *tfrc_recv_init(struct dccpcb *);
232 1.2.16.2 jdolecek
233 1.2.16.2 jdolecek /* Free the receiver side
234 1.2.16.2 jdolecek * args: ccb - ccb of recevier
235 1.2.16.2 jdolecek */
236 1.2.16.2 jdolecek void tfrc_recv_free(void *);
237 1.2.16.2 jdolecek
238 1.2.16.2 jdolecek /*
239 1.2.16.2 jdolecek * Tell TFRC that a packet has been received
240 1.2.16.2 jdolecek * args: ccb - ccb block for current connection
241 1.2.16.2 jdolecek */
242 1.2.16.2 jdolecek void tfrc_recv_packet_recv(void *, char *, int);
243 1.2.16.2 jdolecek
244 1.2.16.2 jdolecek #endif
245 1.2.16.2 jdolecek
246 1.2.16.2 jdolecek #endif
247