[DCCP] ccid3: Fix bug in calculation of send rate
[safe/jmp/linux-2.6] / net / dccp / ccids / ccid3.c
1 /*
2  *  net/dccp/ccids/ccid3.c
3  *
4  *  Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand.
5  *  Copyright (c) 2005-6 Ian McDonald <ian.mcdonald@jandi.co.nz>
6  *
7  *  An implementation of the DCCP protocol
8  *
9  *  This code has been developed by the University of Waikato WAND
10  *  research group. For further information please see http://www.wand.net.nz/
11  *
12  *  This code also uses code from Lulea University, rereleased as GPL by its
13  *  authors:
14  *  Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon
15  *
16  *  Changes to meet Linux coding standards, to make it meet latest ccid3 draft
17  *  and to make it work as a loadable module in the DCCP stack written by
18  *  Arnaldo Carvalho de Melo <acme@conectiva.com.br>.
19  *
20  *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
21  *
22  *  This program is free software; you can redistribute it and/or modify
23  *  it under the terms of the GNU General Public License as published by
24  *  the Free Software Foundation; either version 2 of the License, or
25  *  (at your option) any later version.
26  *
27  *  This program is distributed in the hope that it will be useful,
28  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
29  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30  *  GNU General Public License for more details.
31  *
32  *  You should have received a copy of the GNU General Public License
33  *  along with this program; if not, write to the Free Software
34  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35  */
36
37 #include "../ccid.h"
38 #include "../dccp.h"
39 #include "lib/packet_history.h"
40 #include "lib/loss_interval.h"
41 #include "lib/tfrc.h"
42 #include "ccid3.h"
43
44 /*
45  * Reason for maths here is to avoid 32 bit overflow when a is big.
46  * With this we get close to the limit.
47  */
48 static u32 usecs_div(const u32 a, const u32 b)
49 {
50         const u32 div = a < (UINT_MAX / (USEC_PER_SEC /    10)) ?    10 :
51                         a < (UINT_MAX / (USEC_PER_SEC /    50)) ?    50 :
52                         a < (UINT_MAX / (USEC_PER_SEC /   100)) ?   100 :
53                         a < (UINT_MAX / (USEC_PER_SEC /   500)) ?   500 :
54                         a < (UINT_MAX / (USEC_PER_SEC /  1000)) ?  1000 :
55                         a < (UINT_MAX / (USEC_PER_SEC /  5000)) ?  5000 :
56                         a < (UINT_MAX / (USEC_PER_SEC / 10000)) ? 10000 :
57                         a < (UINT_MAX / (USEC_PER_SEC / 50000)) ? 50000 :
58                                                                  100000;
59         const u32 tmp = a * (USEC_PER_SEC / div);
60         return (b >= 2 * div) ? tmp / (b / div) : tmp;
61 }
62
63
64
65 #ifdef CONFIG_IP_DCCP_CCID3_DEBUG
66 static int ccid3_debug;
67 #define ccid3_pr_debug(format, a...)    DCCP_PR_DEBUG(ccid3_debug, format, ##a)
68 #else
69 #define ccid3_pr_debug(format, a...)
70 #endif
71
72 static struct dccp_tx_hist *ccid3_tx_hist;
73 static struct dccp_rx_hist *ccid3_rx_hist;
74 static struct dccp_li_hist *ccid3_li_hist;
75
76 #ifdef CONFIG_IP_DCCP_CCID3_DEBUG
77 static const char *ccid3_tx_state_name(enum ccid3_hc_tx_states state)
78 {
79         static char *ccid3_state_names[] = {
80         [TFRC_SSTATE_NO_SENT]  = "NO_SENT",
81         [TFRC_SSTATE_NO_FBACK] = "NO_FBACK",
82         [TFRC_SSTATE_FBACK]    = "FBACK",
83         [TFRC_SSTATE_TERM]     = "TERM",
84         };
85
86         return ccid3_state_names[state];
87 }
88 #endif
89
90 static void ccid3_hc_tx_set_state(struct sock *sk,
91                                   enum ccid3_hc_tx_states state)
92 {
93         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
94         enum ccid3_hc_tx_states oldstate = hctx->ccid3hctx_state;
95
96         ccid3_pr_debug("%s(%p) %-8.8s -> %s\n",
97                        dccp_role(sk), sk, ccid3_tx_state_name(oldstate),
98                        ccid3_tx_state_name(state));
99         WARN_ON(state == oldstate);
100         hctx->ccid3hctx_state = state;
101 }
102
103 /*
104  * Recalculate scheduled nominal send time t_nom, inter-packet interval
105  * t_ipi, and delta value. Should be called after each change to X.
106  */
107 static inline void ccid3_update_send_time(struct ccid3_hc_tx_sock *hctx)
108 {
109         timeval_sub_usecs(&hctx->ccid3hctx_t_nom, hctx->ccid3hctx_t_ipi);
110
111         /* Calculate new t_ipi (inter packet interval) by t_ipi = s / X_inst */
112         hctx->ccid3hctx_t_ipi = usecs_div(hctx->ccid3hctx_s, hctx->ccid3hctx_x);
113
114         /* Update nominal send time with regard to the new t_ipi */
115         timeval_add_usecs(&hctx->ccid3hctx_t_nom, hctx->ccid3hctx_t_ipi);
116
117         /* Calculate new delta by delta = min(t_ipi / 2, t_gran / 2) */
118         hctx->ccid3hctx_delta = min_t(u32, hctx->ccid3hctx_t_ipi / 2,
119                                            TFRC_OPSYS_HALF_TIME_GRAN);
120 }
121 /*
122  * Update X by
123  *    If (p > 0)
124  *       X_calc = calcX(s, R, p);
125  *       X = max(min(X_calc, 2 * X_recv), s / t_mbi);
126  *    Else
127  *       If (now - tld >= R)
128  *          X = max(min(2 * X, 2 * X_recv), s / R);
129  *          tld = now;
130  *
131  * If X has changed, we also update the scheduled send time t_now,
132  * the inter-packet interval t_ipi, and the delta value.
133  */ 
134 static void ccid3_hc_tx_update_x(struct sock *sk, struct timeval *now)
135
136 {
137         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
138         const __u32 old_x = hctx->ccid3hctx_x;
139
140         /* To avoid large error in calcX */
141         if (hctx->ccid3hctx_p >= TFRC_SMALLEST_P) {
142                 hctx->ccid3hctx_x_calc = tfrc_calc_x(hctx->ccid3hctx_s,
143                                                      hctx->ccid3hctx_rtt,
144                                                      hctx->ccid3hctx_p);
145                 hctx->ccid3hctx_x = max_t(u32, min(hctx->ccid3hctx_x_calc,
146                                                    hctx->ccid3hctx_x_recv * 2),
147                                                hctx->ccid3hctx_s / TFRC_T_MBI);
148
149         } else if (timeval_delta(now, &hctx->ccid3hctx_t_ld) >=
150                                                           hctx->ccid3hctx_rtt) {
151                 hctx->ccid3hctx_x = max(min(hctx->ccid3hctx_x_recv,
152                                             hctx->ccid3hctx_x      ) * 2,
153                                         usecs_div(hctx->ccid3hctx_s,
154                                                   hctx->ccid3hctx_rtt)   );
155                 hctx->ccid3hctx_t_ld = *now;
156         } else
157                 ccid3_pr_debug("Not changing X\n");
158
159         if (hctx->ccid3hctx_x != old_x)
160                 ccid3_update_send_time(hctx);
161 }
162
163 /*
164  *      Track the mean packet size `s' (cf. RFC 4342, 5.3 and  RFC 3448, 4.1)
165  *      @len: DCCP packet payload size in bytes
166  */
167 static inline void ccid3_hc_tx_update_s(struct ccid3_hc_tx_sock *hctx, int len)
168 {
169         if (unlikely(len == 0))
170                 ccid3_pr_debug("Packet payload length is 0 - not updating\n");
171         else
172                 hctx->ccid3hctx_s = hctx->ccid3hctx_s == 0 ? len :
173                                     (9 * hctx->ccid3hctx_s + len) / 10;
174         /*
175          * Note: We could do a potential optimisation here - when `s' changes,
176          *       recalculate sending rate and consequently t_ipi, t_delta, and
177          *       t_now. This is however non-standard, and the benefits are not
178          *       clear, so it is currently left out.
179          */
180 }
181
182 static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
183 {
184         struct sock *sk = (struct sock *)data;
185         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
186         unsigned long t_nfb = USEC_PER_SEC / 5;
187
188         bh_lock_sock(sk);
189         if (sock_owned_by_user(sk)) {
190                 /* Try again later. */
191                 /* XXX: set some sensible MIB */
192                 goto restart_timer;
193         }
194
195         ccid3_pr_debug("%s, sk=%p, state=%s\n", dccp_role(sk), sk,
196                        ccid3_tx_state_name(hctx->ccid3hctx_state));
197         
198         switch (hctx->ccid3hctx_state) {
199         case TFRC_SSTATE_NO_FBACK:
200                 /* RFC 3448, 4.4: Halve send rate directly */
201                 hctx->ccid3hctx_x = min_t(u32, hctx->ccid3hctx_x / 2,
202                                                hctx->ccid3hctx_s / TFRC_T_MBI);
203
204                 ccid3_pr_debug("%s, sk=%p, state=%s, updated tx rate to %d "
205                                "bytes/s\n",
206                                dccp_role(sk), sk,
207                                ccid3_tx_state_name(hctx->ccid3hctx_state),
208                                hctx->ccid3hctx_x);
209                 /* The value of R is still undefined and so we can not recompute
210                  * the timout value. Keep initial value as per [RFC 4342, 5]. */
211                 t_nfb = TFRC_INITIAL_TIMEOUT;
212                 ccid3_update_send_time(hctx);
213                 break;
214         case TFRC_SSTATE_FBACK:
215                 /*
216                  * Check if IDLE since last timeout and recv rate is less than
217                  * 4 packets per RTT
218                  */
219                 if (!hctx->ccid3hctx_idle ||
220                     (hctx->ccid3hctx_x_recv >=
221                      4 * usecs_div(hctx->ccid3hctx_s, hctx->ccid3hctx_rtt))) {
222                         struct timeval now;
223
224                         ccid3_pr_debug("%s, sk=%p, state=%s, not idle\n",
225                                        dccp_role(sk), sk,
226                                        ccid3_tx_state_name(hctx->ccid3hctx_state));
227                         /* Halve sending rate */
228
229                         /*  If (X_calc > 2 * X_recv)
230                          *    X_recv = max(X_recv / 2, s / (2 * t_mbi));
231                          *  Else
232                          *    X_recv = X_calc / 4;
233                          */
234                         BUG_ON(hctx->ccid3hctx_p >= TFRC_SMALLEST_P &&
235                                hctx->ccid3hctx_x_calc == 0);
236
237                         /* check also if p is zero -> x_calc is infinity? */
238                         if (hctx->ccid3hctx_p < TFRC_SMALLEST_P ||
239                             hctx->ccid3hctx_x_calc > 2 * hctx->ccid3hctx_x_recv)
240                                 hctx->ccid3hctx_x_recv = max_t(u32, hctx->ccid3hctx_x_recv / 2,
241                                                                     hctx->ccid3hctx_s / (2 * TFRC_T_MBI));
242                         else
243                                 hctx->ccid3hctx_x_recv = hctx->ccid3hctx_x_calc / 4;
244
245                         /* Update sending rate */
246                         dccp_timestamp(sk, &now);
247                         ccid3_hc_tx_update_x(sk, &now);
248                 }
249                 /*
250                  * Schedule no feedback timer to expire in
251                  * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
252                  * See comments in packet_recv() regarding the value of t_RTO.
253                  */
254                 t_nfb = max(hctx->ccid3hctx_t_rto, 2 * hctx->ccid3hctx_t_ipi);
255                 break;
256         case TFRC_SSTATE_NO_SENT:
257                 DCCP_BUG("Illegal %s state NO_SENT, sk=%p", dccp_role(sk), sk);
258                 /* fall through */
259         case TFRC_SSTATE_TERM:
260                 goto out;
261         }
262
263         hctx->ccid3hctx_idle = 1;
264
265 restart_timer:
266         sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
267                            jiffies + usecs_to_jiffies(t_nfb));
268 out:
269         bh_unlock_sock(sk);
270         sock_put(sk);
271 }
272
273 /*
274  * returns
275  *   > 0: delay (in msecs) that should pass before actually sending
276  *   = 0: can send immediately
277  *   < 0: error condition; do not send packet
278  */
279 static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
280 {
281         struct dccp_sock *dp = dccp_sk(sk);
282         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
283         struct dccp_tx_hist_entry *new_packet;
284         struct timeval now;
285         long delay;
286
287         BUG_ON(hctx == NULL);
288
289         /*
290          * This function is called only for Data and DataAck packets. Sending
291          * zero-sized Data(Ack)s is theoretically possible, but for congestion
292          * control this case is pathological - ignore it.
293          */
294         if (unlikely(skb->len == 0))
295                 return -EBADMSG;
296
297         /* See if last packet allocated was not sent */
298         new_packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist);
299         if (new_packet == NULL || new_packet->dccphtx_sent) {
300                 new_packet = dccp_tx_hist_entry_new(ccid3_tx_hist,
301                                                     SLAB_ATOMIC);
302
303                 if (unlikely(new_packet == NULL)) {
304                         DCCP_WARN("%s, sk=%p, not enough mem to add to history,"
305                                   "send refused\n", dccp_role(sk), sk);
306                         return -ENOBUFS;
307                 }
308
309                 dccp_tx_hist_add_entry(&hctx->ccid3hctx_hist, new_packet);
310         }
311
312         dccp_timestamp(sk, &now);
313
314         switch (hctx->ccid3hctx_state) {
315         case TFRC_SSTATE_NO_SENT:
316                 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
317                                jiffies + usecs_to_jiffies(TFRC_INITIAL_TIMEOUT));
318                 hctx->ccid3hctx_last_win_count   = 0;
319                 hctx->ccid3hctx_t_last_win_count = now;
320                 ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK);
321
322                 /* Set initial sending rate to 1 packet per second */
323                 ccid3_hc_tx_update_s(hctx, skb->len);
324                 hctx->ccid3hctx_x     = hctx->ccid3hctx_s;
325
326                 /* First timeout, according to [RFC 3448, 4.2], is 1 second */
327                 hctx->ccid3hctx_t_ipi = USEC_PER_SEC;
328                 /* Initial delta: minimum of 0.5 sec and t_gran/2 */
329                 hctx->ccid3hctx_delta = TFRC_OPSYS_HALF_TIME_GRAN;
330
331                 /* Set t_0 for initial packet */
332                 hctx->ccid3hctx_t_nom = now;
333                 break;
334         case TFRC_SSTATE_NO_FBACK:
335         case TFRC_SSTATE_FBACK:
336                 delay = timeval_delta(&hctx->ccid3hctx_t_nom, &now);
337                 /*
338                  *      Scheduling of packet transmissions [RFC 3448, 4.6]
339                  *
340                  * if (t_now > t_nom - delta)
341                  *       // send the packet now
342                  * else
343                  *       // send the packet in (t_nom - t_now) milliseconds.
344                  */
345                 if (delay - (long)hctx->ccid3hctx_delta >= 0)
346                         return delay / 1000L;
347                 break;
348         case TFRC_SSTATE_TERM:
349                 DCCP_BUG("Illegal %s state TERM, sk=%p", dccp_role(sk), sk);
350                 return -EINVAL;
351         }
352
353         /* prepare to send now (add options etc.) */
354         dp->dccps_hc_tx_insert_options = 1;
355         new_packet->dccphtx_ccval = DCCP_SKB_CB(skb)->dccpd_ccval =
356                                     hctx->ccid3hctx_last_win_count;
357         timeval_add_usecs(&hctx->ccid3hctx_t_nom, hctx->ccid3hctx_t_ipi);
358
359         return 0;
360 }
361
362 static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, unsigned int len)
363 {
364         const struct dccp_sock *dp = dccp_sk(sk);
365         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
366         struct timeval now;
367         unsigned long quarter_rtt;
368         struct dccp_tx_hist_entry *packet;
369
370         BUG_ON(hctx == NULL);
371
372         dccp_timestamp(sk, &now);
373
374         ccid3_hc_tx_update_s(hctx, len);
375
376         packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist);
377         if (unlikely(packet == NULL)) {
378                 DCCP_WARN("packet doesn't exist in history!\n");
379                 return;
380         }
381         if (unlikely(packet->dccphtx_sent)) {
382                 DCCP_WARN("no unsent packet in history!\n");
383                 return;
384         }
385         packet->dccphtx_tstamp = now;
386         packet->dccphtx_seqno  = dp->dccps_gss;
387         /*
388          * Check if win_count have changed
389          * Algorithm in "8.1. Window Counter Value" in RFC 4342.
390          */
391         quarter_rtt = timeval_delta(&now, &hctx->ccid3hctx_t_last_win_count);
392         if (likely(hctx->ccid3hctx_rtt > 8))
393                 quarter_rtt /= hctx->ccid3hctx_rtt / 4;
394
395         if (quarter_rtt > 0) {
396                 hctx->ccid3hctx_t_last_win_count = now;
397                 hctx->ccid3hctx_last_win_count   = (hctx->ccid3hctx_last_win_count +
398                                                     min_t(unsigned long, quarter_rtt, 5)) % 16;
399                 ccid3_pr_debug("%s, sk=%p, window changed from "
400                                "%u to %u!\n",
401                                dccp_role(sk), sk,
402                                packet->dccphtx_ccval,
403                                hctx->ccid3hctx_last_win_count);
404         }
405
406         hctx->ccid3hctx_idle = 0;
407         packet->dccphtx_rtt  = hctx->ccid3hctx_rtt;
408         packet->dccphtx_sent = 1;
409 }
410
411 static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
412 {
413         const struct dccp_sock *dp = dccp_sk(sk);
414         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
415         struct ccid3_options_received *opt_recv;
416         struct dccp_tx_hist_entry *packet;
417         struct timeval now;
418         unsigned long t_nfb;
419         u32 pinv;
420         long r_sample, t_elapsed;
421
422         BUG_ON(hctx == NULL);
423
424         /* we are only interested in ACKs */
425         if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK ||
426               DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_DATAACK))
427                 return;
428
429         opt_recv = &hctx->ccid3hctx_options_received;
430
431         switch (hctx->ccid3hctx_state) {
432         case TFRC_SSTATE_NO_FBACK:
433         case TFRC_SSTATE_FBACK:
434                 /* get packet from history to look up t_recvdata */
435                 packet = dccp_tx_hist_find_entry(&hctx->ccid3hctx_hist,
436                                                  DCCP_SKB_CB(skb)->dccpd_ack_seq);
437                 if (unlikely(packet == NULL)) {
438                         DCCP_WARN("%s(%p), seqno %llu(%s) doesn't exist "
439                                   "in history!\n",  dccp_role(sk), sk,
440                             (unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq,
441                                   dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type));
442                         return;
443                 }
444
445                 /* Update receive rate */
446                 hctx->ccid3hctx_x_recv = opt_recv->ccid3or_receive_rate;
447
448                 /* Update loss event rate */
449                 pinv = opt_recv->ccid3or_loss_event_rate;
450                 if (pinv == ~0U || pinv == 0)
451                         hctx->ccid3hctx_p = 0;
452                 else {
453                         hctx->ccid3hctx_p = 1000000 / pinv;
454
455                         if (hctx->ccid3hctx_p < TFRC_SMALLEST_P) {
456                                 hctx->ccid3hctx_p = TFRC_SMALLEST_P;
457                                 ccid3_pr_debug("%s, sk=%p, Smallest p used!\n",
458                                                dccp_role(sk), sk);
459                         }
460                 }
461
462                 dccp_timestamp(sk, &now);
463
464                 /*
465                  * Calculate new round trip sample as per [RFC 3448, 4.3] by
466                  *      R_sample  =  (now - t_recvdata) - t_elapsed
467                  */
468                 r_sample  = timeval_delta(&now, &packet->dccphtx_tstamp);
469                 t_elapsed = dp->dccps_options_received.dccpor_elapsed_time * 10;
470
471                 if (unlikely(r_sample <= 0)) {
472                         DCCP_WARN("WARNING: R_sample (%ld) <= 0!\n", r_sample);
473                         r_sample = 0;
474                 } else if (unlikely(r_sample <= t_elapsed))
475                         DCCP_WARN("WARNING: r_sample=%ldus <= t_elapsed=%ldus\n",
476                                   r_sample, t_elapsed);
477                 else
478                         r_sample -= t_elapsed;
479
480                 /* Update RTT estimate by 
481                  * If (No feedback recv)
482                  *    R = R_sample;
483                  * Else
484                  *    R = q * R + (1 - q) * R_sample;
485                  *
486                  * q is a constant, RFC 3448 recomments 0.9
487                  */
488                 if (hctx->ccid3hctx_state == TFRC_SSTATE_NO_FBACK) {
489                         /* Use Larger Initial Windows [RFC 4342, sec. 5]
490                          * We deviate in that we use `s' instead of `MSS'. */
491                         u16 w_init = max(    4 * hctx->ccid3hctx_s,
492                                          max(2 * hctx->ccid3hctx_s, 4380));
493                         hctx->ccid3hctx_rtt  = r_sample;
494                         hctx->ccid3hctx_x    = usecs_div(w_init, r_sample);
495                         hctx->ccid3hctx_t_ld = now;
496
497                         ccid3_update_send_time(hctx);
498
499                         ccid3_pr_debug("%s(%p), s=%u, w_init=%u, "
500                                        "R_sample=%ldus, X=%u\n", dccp_role(sk),
501                                        sk, hctx->ccid3hctx_s, w_init, r_sample,
502                                        hctx->ccid3hctx_x);
503
504                         ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK);
505                 } else {
506                         hctx->ccid3hctx_rtt = (9 * hctx->ccid3hctx_rtt +
507                                                    (u32)r_sample        ) / 10;
508
509                         ccid3_hc_tx_update_x(sk, &now);
510
511                         ccid3_pr_debug("%s(%p), RTT=%uus (sample=%ldus), s=%u, "
512                                        "p=%u, X_calc=%u, X=%u\n", dccp_role(sk),
513                                        sk, hctx->ccid3hctx_rtt, r_sample,
514                                        hctx->ccid3hctx_s, hctx->ccid3hctx_p,
515                                        hctx->ccid3hctx_x_calc,
516                                        hctx->ccid3hctx_x);
517                 }
518
519                 /* unschedule no feedback timer */
520                 sk_stop_timer(sk, &hctx->ccid3hctx_no_feedback_timer);
521
522                 /* remove all packets older than the one acked from history */
523                 dccp_tx_hist_purge_older(ccid3_tx_hist,
524                                          &hctx->ccid3hctx_hist, packet);
525                 /*
526                  * As we have calculated new ipi, delta, t_nom it is possible that
527                  * we now can send a packet, so wake up dccp_wait_for_ccid
528                  */
529                 sk->sk_write_space(sk);
530
531                 /*
532                  * Update timeout interval for the nofeedback timer.
533                  * We use a configuration option to increase the lower bound.
534                  * This can help avoid triggering the nofeedback timer too often
535                  * ('spinning') on LANs with small RTTs.
536                  */
537                 hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
538                                                    CONFIG_IP_DCCP_CCID3_RTO *
539                                                    (USEC_PER_SEC/1000)       );
540                 /*
541                  * Schedule no feedback timer to expire in
542                  * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
543                  */
544                 t_nfb = max(hctx->ccid3hctx_t_rto, 2 * hctx->ccid3hctx_t_ipi);
545                         
546                 ccid3_pr_debug("%s, sk=%p, Scheduled no feedback timer to "
547                                "expire in %lu jiffies (%luus)\n",
548                                dccp_role(sk), sk,
549                                usecs_to_jiffies(t_nfb), t_nfb);
550
551                 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer, 
552                                    jiffies + usecs_to_jiffies(t_nfb));
553
554                 /* set idle flag */
555                 hctx->ccid3hctx_idle = 1;   
556                 break;
557         case TFRC_SSTATE_NO_SENT:
558                 DCCP_WARN("Illegal ACK received - no packet has been sent\n");
559                 /* fall through */
560         case TFRC_SSTATE_TERM:          /* ignore feedback when closing */
561                 break;
562         }
563 }
564
565 static int ccid3_hc_tx_insert_options(struct sock *sk, struct sk_buff *skb)
566 {
567         const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
568
569         BUG_ON(hctx == NULL);
570
571         if (sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN)
572                 DCCP_SKB_CB(skb)->dccpd_ccval = hctx->ccid3hctx_last_win_count;
573         return 0;
574 }
575
576 static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
577                                      unsigned char len, u16 idx,
578                                      unsigned char *value)
579 {
580         int rc = 0;
581         const struct dccp_sock *dp = dccp_sk(sk);
582         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
583         struct ccid3_options_received *opt_recv;
584
585         BUG_ON(hctx == NULL);
586
587         opt_recv = &hctx->ccid3hctx_options_received;
588
589         if (opt_recv->ccid3or_seqno != dp->dccps_gsr) {
590                 opt_recv->ccid3or_seqno              = dp->dccps_gsr;
591                 opt_recv->ccid3or_loss_event_rate    = ~0;
592                 opt_recv->ccid3or_loss_intervals_idx = 0;
593                 opt_recv->ccid3or_loss_intervals_len = 0;
594                 opt_recv->ccid3or_receive_rate       = 0;
595         }
596
597         switch (option) {
598         case TFRC_OPT_LOSS_EVENT_RATE:
599                 if (unlikely(len != 4)) {
600                         DCCP_WARN("%s, sk=%p, invalid len %d "
601                                   "for TFRC_OPT_LOSS_EVENT_RATE\n",
602                                   dccp_role(sk), sk, len);
603                         rc = -EINVAL;
604                 } else {
605                         opt_recv->ccid3or_loss_event_rate = ntohl(*(__be32 *)value);
606                         ccid3_pr_debug("%s, sk=%p, LOSS_EVENT_RATE=%u\n",
607                                        dccp_role(sk), sk,
608                                        opt_recv->ccid3or_loss_event_rate);
609                 }
610                 break;
611         case TFRC_OPT_LOSS_INTERVALS:
612                 opt_recv->ccid3or_loss_intervals_idx = idx;
613                 opt_recv->ccid3or_loss_intervals_len = len;
614                 ccid3_pr_debug("%s, sk=%p, LOSS_INTERVALS=(%u, %u)\n",
615                                dccp_role(sk), sk,
616                                opt_recv->ccid3or_loss_intervals_idx,
617                                opt_recv->ccid3or_loss_intervals_len);
618                 break;
619         case TFRC_OPT_RECEIVE_RATE:
620                 if (unlikely(len != 4)) {
621                         DCCP_WARN("%s, sk=%p, invalid len %d "
622                                   "for TFRC_OPT_RECEIVE_RATE\n",
623                                   dccp_role(sk), sk, len);
624                         rc = -EINVAL;
625                 } else {
626                         opt_recv->ccid3or_receive_rate = ntohl(*(__be32 *)value);
627                         ccid3_pr_debug("%s, sk=%p, RECEIVE_RATE=%u\n",
628                                        dccp_role(sk), sk,
629                                        opt_recv->ccid3or_receive_rate);
630                 }
631                 break;
632         }
633
634         return rc;
635 }
636
637 static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
638 {
639         struct ccid3_hc_tx_sock *hctx = ccid_priv(ccid);
640
641         hctx->ccid3hctx_s     = 0;
642         hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
643         INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
644
645         hctx->ccid3hctx_no_feedback_timer.function = ccid3_hc_tx_no_feedback_timer;
646         hctx->ccid3hctx_no_feedback_timer.data     = (unsigned long)sk;
647         init_timer(&hctx->ccid3hctx_no_feedback_timer);
648
649         return 0;
650 }
651
652 static void ccid3_hc_tx_exit(struct sock *sk)
653 {
654         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
655
656         BUG_ON(hctx == NULL);
657
658         ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM);
659         sk_stop_timer(sk, &hctx->ccid3hctx_no_feedback_timer);
660
661         /* Empty packet history */
662         dccp_tx_hist_purge(ccid3_tx_hist, &hctx->ccid3hctx_hist);
663 }
664
665 /*
666  * RX Half Connection methods
667  */
668
669 #ifdef CONFIG_IP_DCCP_CCID3_DEBUG
670 static const char *ccid3_rx_state_name(enum ccid3_hc_rx_states state)
671 {
672         static char *ccid3_rx_state_names[] = {
673         [TFRC_RSTATE_NO_DATA] = "NO_DATA",
674         [TFRC_RSTATE_DATA]    = "DATA",
675         [TFRC_RSTATE_TERM]    = "TERM",
676         };
677
678         return ccid3_rx_state_names[state];
679 }
680 #endif
681
682 static void ccid3_hc_rx_set_state(struct sock *sk,
683                                   enum ccid3_hc_rx_states state)
684 {
685         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
686         enum ccid3_hc_rx_states oldstate = hcrx->ccid3hcrx_state;
687
688         ccid3_pr_debug("%s(%p) %-8.8s -> %s\n",
689                        dccp_role(sk), sk, ccid3_rx_state_name(oldstate),
690                        ccid3_rx_state_name(state));
691         WARN_ON(state == oldstate);
692         hcrx->ccid3hcrx_state = state;
693 }
694
695 static inline void ccid3_hc_rx_update_s(struct ccid3_hc_rx_sock *hcrx, int len)
696 {
697         if (unlikely(len == 0)) /* don't update on empty packets (e.g. ACKs) */
698                 ccid3_pr_debug("Packet payload length is 0 - not updating\n");
699         else
700                 hcrx->ccid3hcrx_s = hcrx->ccid3hcrx_s == 0 ? len :
701                                     (9 * hcrx->ccid3hcrx_s + len) / 10;
702 }
703
704 static void ccid3_hc_rx_send_feedback(struct sock *sk)
705 {
706         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
707         struct dccp_sock *dp = dccp_sk(sk);
708         struct dccp_rx_hist_entry *packet;
709         struct timeval now;
710
711         ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk);
712
713         dccp_timestamp(sk, &now);
714
715         switch (hcrx->ccid3hcrx_state) {
716         case TFRC_RSTATE_NO_DATA:
717                 hcrx->ccid3hcrx_x_recv = 0;
718                 break;
719         case TFRC_RSTATE_DATA: {
720                 const u32 delta = timeval_delta(&now,
721                                         &hcrx->ccid3hcrx_tstamp_last_feedback);
722                 hcrx->ccid3hcrx_x_recv = usecs_div(hcrx->ccid3hcrx_bytes_recv,
723                                                    delta);
724         }
725                 break;
726         case TFRC_RSTATE_TERM:
727                 DCCP_BUG("Illegal %s state TERM, sk=%p", dccp_role(sk), sk);
728                 return;
729         }
730
731         packet = dccp_rx_hist_find_data_packet(&hcrx->ccid3hcrx_hist);
732         if (unlikely(packet == NULL)) {
733                 DCCP_WARN("%s, sk=%p, no data packet in history!\n",
734                           dccp_role(sk), sk);
735                 return;
736         }
737
738         hcrx->ccid3hcrx_tstamp_last_feedback = now;
739         hcrx->ccid3hcrx_ccval_last_counter   = packet->dccphrx_ccval;
740         hcrx->ccid3hcrx_bytes_recv           = 0;
741
742         /* Convert to multiples of 10us */
743         hcrx->ccid3hcrx_elapsed_time =
744                         timeval_delta(&now, &packet->dccphrx_tstamp) / 10;
745         if (hcrx->ccid3hcrx_p == 0)
746                 hcrx->ccid3hcrx_pinv = ~0;
747         else
748                 hcrx->ccid3hcrx_pinv = 1000000 / hcrx->ccid3hcrx_p;
749         dp->dccps_hc_rx_insert_options = 1;
750         dccp_send_ack(sk);
751 }
752
753 static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
754 {
755         const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
756         __be32 x_recv, pinv;
757
758         BUG_ON(hcrx == NULL);
759
760         if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN))
761                 return 0;
762
763         DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_ccval_last_counter;
764
765         if (dccp_packet_without_ack(skb))
766                 return 0;
767
768         x_recv = htonl(hcrx->ccid3hcrx_x_recv);
769         pinv   = htonl(hcrx->ccid3hcrx_pinv);
770
771         if ((hcrx->ccid3hcrx_elapsed_time != 0 &&
772              dccp_insert_option_elapsed_time(sk, skb,
773                                              hcrx->ccid3hcrx_elapsed_time)) ||
774             dccp_insert_option_timestamp(sk, skb) ||
775             dccp_insert_option(sk, skb, TFRC_OPT_LOSS_EVENT_RATE,
776                                &pinv, sizeof(pinv)) ||
777             dccp_insert_option(sk, skb, TFRC_OPT_RECEIVE_RATE,
778                                &x_recv, sizeof(x_recv)))
779                 return -1;
780
781         return 0;
782 }
783
784 /* calculate first loss interval
785  *
786  * returns estimated loss interval in usecs */
787
788 static u32 ccid3_hc_rx_calc_first_li(struct sock *sk)
789 {
790         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
791         struct dccp_rx_hist_entry *entry, *next, *tail = NULL;
792         u32 rtt, delta, x_recv, fval, p, tmp2;
793         struct timeval tstamp = { 0, };
794         int interval = 0;
795         int win_count = 0;
796         int step = 0;
797         u64 tmp1;
798
799         list_for_each_entry_safe(entry, next, &hcrx->ccid3hcrx_hist,
800                                  dccphrx_node) {
801                 if (dccp_rx_hist_entry_data_packet(entry)) {
802                         tail = entry;
803
804                         switch (step) {
805                         case 0:
806                                 tstamp    = entry->dccphrx_tstamp;
807                                 win_count = entry->dccphrx_ccval;
808                                 step = 1;
809                                 break;
810                         case 1:
811                                 interval = win_count - entry->dccphrx_ccval;
812                                 if (interval < 0)
813                                         interval += TFRC_WIN_COUNT_LIMIT;
814                                 if (interval > 4)
815                                         goto found;
816                                 break;
817                         }
818                 }
819         }
820
821         if (unlikely(step == 0)) {
822                 DCCP_WARN("%s, sk=%p, packet history has no data packets!\n",
823                           dccp_role(sk), sk);
824                 return ~0;
825         }
826
827         if (unlikely(interval == 0)) {
828                 DCCP_WARN("%s, sk=%p, Could not find a win_count interval > 0."
829                           "Defaulting to 1\n", dccp_role(sk), sk);
830                 interval = 1;
831         }
832 found:
833         if (!tail) {
834                 DCCP_CRIT("tail is null\n");
835                 return ~0;
836         }
837         rtt = timeval_delta(&tstamp, &tail->dccphrx_tstamp) * 4 / interval;
838         ccid3_pr_debug("%s, sk=%p, approximated RTT to %uus\n",
839                        dccp_role(sk), sk, rtt);
840
841         if (rtt == 0) {
842                 DCCP_WARN("RTT==0, setting to 1\n");
843                 rtt = 1;
844         }
845
846         dccp_timestamp(sk, &tstamp);
847         delta = timeval_delta(&tstamp, &hcrx->ccid3hcrx_tstamp_last_feedback);
848         x_recv = usecs_div(hcrx->ccid3hcrx_bytes_recv, delta);
849
850         if (x_recv == 0)
851                 x_recv = hcrx->ccid3hcrx_x_recv;
852
853         tmp1 = (u64)x_recv * (u64)rtt;
854         do_div(tmp1,10000000);
855         tmp2 = (u32)tmp1;
856
857         if (!tmp2) {
858                 DCCP_CRIT("tmp2 = 0, x_recv = %u, rtt =%u\n", x_recv, rtt);
859                 return ~0;
860         }
861
862         fval = (hcrx->ccid3hcrx_s * 100000) / tmp2;
863         /* do not alter order above or you will get overflow on 32 bit */
864         p = tfrc_calc_x_reverse_lookup(fval);
865         ccid3_pr_debug("%s, sk=%p, receive rate=%u bytes/s, implied "
866                        "loss rate=%u\n", dccp_role(sk), sk, x_recv, p);
867
868         if (p == 0)
869                 return ~0;
870         else
871                 return 1000000 / p; 
872 }
873
874 static void ccid3_hc_rx_update_li(struct sock *sk, u64 seq_loss, u8 win_loss)
875 {
876         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
877         struct dccp_li_hist_entry *head;
878         u64 seq_temp;
879
880         if (list_empty(&hcrx->ccid3hcrx_li_hist)) {
881                 if (!dccp_li_hist_interval_new(ccid3_li_hist,
882                    &hcrx->ccid3hcrx_li_hist, seq_loss, win_loss))
883                         return;
884
885                 head = list_entry(hcrx->ccid3hcrx_li_hist.next,
886                    struct dccp_li_hist_entry, dccplih_node);
887                 head->dccplih_interval = ccid3_hc_rx_calc_first_li(sk);
888         } else {
889                 struct dccp_li_hist_entry *entry;
890                 struct list_head *tail;
891
892                 head = list_entry(hcrx->ccid3hcrx_li_hist.next,
893                    struct dccp_li_hist_entry, dccplih_node);
894                 /* FIXME win count check removed as was wrong */
895                 /* should make this check with receive history */
896                 /* and compare there as per section 10.2 of RFC4342 */
897
898                 /* new loss event detected */
899                 /* calculate last interval length */
900                 seq_temp = dccp_delta_seqno(head->dccplih_seqno, seq_loss);
901                 entry = dccp_li_hist_entry_new(ccid3_li_hist, SLAB_ATOMIC);
902
903                 if (entry == NULL) {
904                         DCCP_BUG("out of memory - can not allocate entry");
905                         return;
906                 }
907
908                 list_add(&entry->dccplih_node, &hcrx->ccid3hcrx_li_hist);
909
910                 tail = hcrx->ccid3hcrx_li_hist.prev;
911                 list_del(tail);
912                 kmem_cache_free(ccid3_li_hist->dccplih_slab, tail);
913
914                 /* Create the newest interval */
915                 entry->dccplih_seqno = seq_loss;
916                 entry->dccplih_interval = seq_temp;
917                 entry->dccplih_win_count = win_loss;
918         }
919 }
920
921 static int ccid3_hc_rx_detect_loss(struct sock *sk,
922                                     struct dccp_rx_hist_entry *packet)
923 {
924         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
925         struct dccp_rx_hist_entry *rx_hist = dccp_rx_hist_head(&hcrx->ccid3hcrx_hist);
926         u64 seqno = packet->dccphrx_seqno;
927         u64 tmp_seqno;
928         int loss = 0;
929         u8 ccval;
930
931
932         tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss;
933
934         if (!rx_hist ||
935            follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) {
936                 hcrx->ccid3hcrx_seqno_nonloss = seqno;
937                 hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval;
938                 goto detect_out;
939         }
940
941
942         while (dccp_delta_seqno(hcrx->ccid3hcrx_seqno_nonloss, seqno)
943            > TFRC_RECV_NUM_LATE_LOSS) {
944                 loss = 1;
945                 ccid3_hc_rx_update_li(sk, hcrx->ccid3hcrx_seqno_nonloss,
946                    hcrx->ccid3hcrx_ccval_nonloss);
947                 tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss;
948                 dccp_inc_seqno(&tmp_seqno);
949                 hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno;
950                 dccp_inc_seqno(&tmp_seqno);
951                 while (dccp_rx_hist_find_entry(&hcrx->ccid3hcrx_hist,
952                    tmp_seqno, &ccval)) {
953                         hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno;
954                         hcrx->ccid3hcrx_ccval_nonloss = ccval;
955                         dccp_inc_seqno(&tmp_seqno);
956                 }
957         }
958
959         /* FIXME - this code could be simplified with above while */
960         /* but works at moment */
961         if (follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) {
962                 hcrx->ccid3hcrx_seqno_nonloss = seqno;
963                 hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval;
964         }
965
966 detect_out:
967         dccp_rx_hist_add_packet(ccid3_rx_hist, &hcrx->ccid3hcrx_hist,
968                    &hcrx->ccid3hcrx_li_hist, packet,
969                    hcrx->ccid3hcrx_seqno_nonloss);
970         return loss;
971 }
972
973 static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
974 {
975         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
976         const struct dccp_options_received *opt_recv;
977         struct dccp_rx_hist_entry *packet;
978         struct timeval now;
979         u32 p_prev, rtt_prev, r_sample, t_elapsed;
980         int loss, payload_size;
981
982         BUG_ON(hcrx == NULL);
983
984         opt_recv = &dccp_sk(sk)->dccps_options_received;
985
986         switch (DCCP_SKB_CB(skb)->dccpd_type) {
987         case DCCP_PKT_ACK:
988                 if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
989                         return;
990         case DCCP_PKT_DATAACK:
991                 if (opt_recv->dccpor_timestamp_echo == 0)
992                         break;
993                 rtt_prev = hcrx->ccid3hcrx_rtt;
994                 dccp_timestamp(sk, &now);
995                 timeval_sub_usecs(&now, opt_recv->dccpor_timestamp_echo * 10);
996                 r_sample = timeval_usecs(&now);
997                 t_elapsed = opt_recv->dccpor_elapsed_time * 10;
998
999                 if (unlikely(r_sample <= t_elapsed))
1000                         DCCP_WARN("r_sample=%uus, t_elapsed=%uus\n",
1001                                   r_sample, t_elapsed);
1002                 else
1003                         r_sample -= t_elapsed;
1004
1005                 if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
1006                         hcrx->ccid3hcrx_rtt = r_sample;
1007                 else
1008                         hcrx->ccid3hcrx_rtt = (hcrx->ccid3hcrx_rtt * 9) / 10 +
1009                                               r_sample / 10;
1010
1011                 if (rtt_prev != hcrx->ccid3hcrx_rtt)
1012                         ccid3_pr_debug("%s, New RTT=%uus, elapsed time=%u\n",
1013                                        dccp_role(sk), hcrx->ccid3hcrx_rtt,
1014                                        opt_recv->dccpor_elapsed_time);
1015                 break;
1016         case DCCP_PKT_DATA:
1017                 break;
1018         default: /* We're not interested in other packet types, move along */
1019                 return;
1020         }
1021
1022         packet = dccp_rx_hist_entry_new(ccid3_rx_hist, sk, opt_recv->dccpor_ndp,
1023                                         skb, SLAB_ATOMIC);
1024         if (unlikely(packet == NULL)) {
1025                 DCCP_WARN("%s, sk=%p, Not enough mem to add rx packet "
1026                           "to history, consider it lost!\n", dccp_role(sk), sk);
1027                 return;
1028         }
1029
1030         loss = ccid3_hc_rx_detect_loss(sk, packet);
1031
1032         if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK)
1033                 return;
1034
1035         payload_size = skb->len - dccp_hdr(skb)->dccph_doff * 4;
1036         ccid3_hc_rx_update_s(hcrx, payload_size);
1037
1038         switch (hcrx->ccid3hcrx_state) {
1039         case TFRC_RSTATE_NO_DATA:
1040                 ccid3_pr_debug("%s, sk=%p(%s), skb=%p, sending initial "
1041                                "feedback\n",
1042                                dccp_role(sk), sk,
1043                                dccp_state_name(sk->sk_state), skb);
1044                 ccid3_hc_rx_send_feedback(sk);
1045                 ccid3_hc_rx_set_state(sk, TFRC_RSTATE_DATA);
1046                 return;
1047         case TFRC_RSTATE_DATA:
1048                 hcrx->ccid3hcrx_bytes_recv += payload_size;
1049                 if (loss)
1050                         break;
1051
1052                 dccp_timestamp(sk, &now);
1053                 if (timeval_delta(&now, &hcrx->ccid3hcrx_tstamp_last_ack) >=
1054                     hcrx->ccid3hcrx_rtt) {
1055                         hcrx->ccid3hcrx_tstamp_last_ack = now;
1056                         ccid3_hc_rx_send_feedback(sk);
1057                 }
1058                 return;
1059         case TFRC_RSTATE_TERM:
1060                 DCCP_BUG("Illegal %s state TERM, sk=%p", dccp_role(sk), sk);
1061                 return;
1062         }
1063
1064         /* Dealing with packet loss */
1065         ccid3_pr_debug("%s, sk=%p(%s), data loss! Reacting...\n",
1066                        dccp_role(sk), sk, dccp_state_name(sk->sk_state));
1067
1068         p_prev = hcrx->ccid3hcrx_p;
1069         
1070         /* Calculate loss event rate */
1071         if (!list_empty(&hcrx->ccid3hcrx_li_hist)) {
1072                 u32 i_mean = dccp_li_hist_calc_i_mean(&hcrx->ccid3hcrx_li_hist);
1073
1074                 /* Scaling up by 1000000 as fixed decimal */
1075                 if (i_mean != 0)
1076                         hcrx->ccid3hcrx_p = 1000000 / i_mean;
1077         } else
1078                 DCCP_BUG("empty loss history");
1079
1080         if (hcrx->ccid3hcrx_p > p_prev) {
1081                 ccid3_hc_rx_send_feedback(sk);
1082                 return;
1083         }
1084 }
1085
1086 static int ccid3_hc_rx_init(struct ccid *ccid, struct sock *sk)
1087 {
1088         struct ccid3_hc_rx_sock *hcrx = ccid_priv(ccid);
1089
1090         ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk);
1091
1092         hcrx->ccid3hcrx_state = TFRC_RSTATE_NO_DATA;
1093         INIT_LIST_HEAD(&hcrx->ccid3hcrx_hist);
1094         INIT_LIST_HEAD(&hcrx->ccid3hcrx_li_hist);
1095         dccp_timestamp(sk, &hcrx->ccid3hcrx_tstamp_last_ack);
1096         hcrx->ccid3hcrx_tstamp_last_feedback = hcrx->ccid3hcrx_tstamp_last_ack;
1097         hcrx->ccid3hcrx_s   = 0;
1098         hcrx->ccid3hcrx_rtt = 5000; /* XXX 5ms for now... */
1099         return 0;
1100 }
1101
1102 static void ccid3_hc_rx_exit(struct sock *sk)
1103 {
1104         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1105
1106         BUG_ON(hcrx == NULL);
1107
1108         ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM);
1109
1110         /* Empty packet history */
1111         dccp_rx_hist_purge(ccid3_rx_hist, &hcrx->ccid3hcrx_hist);
1112
1113         /* Empty loss interval history */
1114         dccp_li_hist_purge(ccid3_li_hist, &hcrx->ccid3hcrx_li_hist);
1115 }
1116
1117 static void ccid3_hc_rx_get_info(struct sock *sk, struct tcp_info *info)
1118 {
1119         const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1120
1121         /* Listen socks doesn't have a private CCID block */
1122         if (sk->sk_state == DCCP_LISTEN)
1123                 return;
1124
1125         BUG_ON(hcrx == NULL);
1126
1127         info->tcpi_ca_state     = hcrx->ccid3hcrx_state;
1128         info->tcpi_options      |= TCPI_OPT_TIMESTAMPS;
1129         info->tcpi_rcv_rtt      = hcrx->ccid3hcrx_rtt;
1130 }
1131
1132 static void ccid3_hc_tx_get_info(struct sock *sk, struct tcp_info *info)
1133 {
1134         const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
1135
1136         /* Listen socks doesn't have a private CCID block */
1137         if (sk->sk_state == DCCP_LISTEN)
1138                 return;
1139
1140         BUG_ON(hctx == NULL);
1141
1142         info->tcpi_rto = hctx->ccid3hctx_t_rto;
1143         info->tcpi_rtt = hctx->ccid3hctx_rtt;
1144 }
1145
1146 static int ccid3_hc_rx_getsockopt(struct sock *sk, const int optname, int len,
1147                                   u32 __user *optval, int __user *optlen)
1148 {
1149         const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1150         const void *val;
1151         
1152         /* Listen socks doesn't have a private CCID block */
1153         if (sk->sk_state == DCCP_LISTEN)
1154                 return -EINVAL;
1155
1156         switch (optname) {
1157         case DCCP_SOCKOPT_CCID_RX_INFO:
1158                 if (len < sizeof(hcrx->ccid3hcrx_tfrc))
1159                         return -EINVAL;
1160                 len = sizeof(hcrx->ccid3hcrx_tfrc);
1161                 val = &hcrx->ccid3hcrx_tfrc;
1162                 break;
1163         default:
1164                 return -ENOPROTOOPT;
1165         }
1166
1167         if (put_user(len, optlen) || copy_to_user(optval, val, len))
1168                 return -EFAULT;
1169
1170         return 0;
1171 }
1172
1173 static int ccid3_hc_tx_getsockopt(struct sock *sk, const int optname, int len,
1174                                   u32 __user *optval, int __user *optlen)
1175 {
1176         const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
1177         const void *val;
1178         
1179         /* Listen socks doesn't have a private CCID block */
1180         if (sk->sk_state == DCCP_LISTEN)
1181                 return -EINVAL;
1182
1183         switch (optname) {
1184         case DCCP_SOCKOPT_CCID_TX_INFO:
1185                 if (len < sizeof(hctx->ccid3hctx_tfrc))
1186                         return -EINVAL;
1187                 len = sizeof(hctx->ccid3hctx_tfrc);
1188                 val = &hctx->ccid3hctx_tfrc;
1189                 break;
1190         default:
1191                 return -ENOPROTOOPT;
1192         }
1193
1194         if (put_user(len, optlen) || copy_to_user(optval, val, len))
1195                 return -EFAULT;
1196
1197         return 0;
1198 }
1199
1200 static struct ccid_operations ccid3 = {
1201         .ccid_id                   = DCCPC_CCID3,
1202         .ccid_name                 = "ccid3",
1203         .ccid_owner                = THIS_MODULE,
1204         .ccid_hc_tx_obj_size       = sizeof(struct ccid3_hc_tx_sock),
1205         .ccid_hc_tx_init           = ccid3_hc_tx_init,
1206         .ccid_hc_tx_exit           = ccid3_hc_tx_exit,
1207         .ccid_hc_tx_send_packet    = ccid3_hc_tx_send_packet,
1208         .ccid_hc_tx_packet_sent    = ccid3_hc_tx_packet_sent,
1209         .ccid_hc_tx_packet_recv    = ccid3_hc_tx_packet_recv,
1210         .ccid_hc_tx_insert_options = ccid3_hc_tx_insert_options,
1211         .ccid_hc_tx_parse_options  = ccid3_hc_tx_parse_options,
1212         .ccid_hc_rx_obj_size       = sizeof(struct ccid3_hc_rx_sock),
1213         .ccid_hc_rx_init           = ccid3_hc_rx_init,
1214         .ccid_hc_rx_exit           = ccid3_hc_rx_exit,
1215         .ccid_hc_rx_insert_options = ccid3_hc_rx_insert_options,
1216         .ccid_hc_rx_packet_recv    = ccid3_hc_rx_packet_recv,
1217         .ccid_hc_rx_get_info       = ccid3_hc_rx_get_info,
1218         .ccid_hc_tx_get_info       = ccid3_hc_tx_get_info,
1219         .ccid_hc_rx_getsockopt     = ccid3_hc_rx_getsockopt,
1220         .ccid_hc_tx_getsockopt     = ccid3_hc_tx_getsockopt,
1221 };
1222  
1223 #ifdef CONFIG_IP_DCCP_CCID3_DEBUG
1224 module_param(ccid3_debug, int, 0444);
1225 MODULE_PARM_DESC(ccid3_debug, "Enable debug messages");
1226 #endif
1227
1228 static __init int ccid3_module_init(void)
1229 {
1230         int rc = -ENOBUFS;
1231
1232         ccid3_rx_hist = dccp_rx_hist_new("ccid3");
1233         if (ccid3_rx_hist == NULL)
1234                 goto out;
1235
1236         ccid3_tx_hist = dccp_tx_hist_new("ccid3");
1237         if (ccid3_tx_hist == NULL)
1238                 goto out_free_rx;
1239
1240         ccid3_li_hist = dccp_li_hist_new("ccid3");
1241         if (ccid3_li_hist == NULL)
1242                 goto out_free_tx;
1243
1244         rc = ccid_register(&ccid3);
1245         if (rc != 0) 
1246                 goto out_free_loss_interval_history;
1247 out:
1248         return rc;
1249
1250 out_free_loss_interval_history:
1251         dccp_li_hist_delete(ccid3_li_hist);
1252         ccid3_li_hist = NULL;
1253 out_free_tx:
1254         dccp_tx_hist_delete(ccid3_tx_hist);
1255         ccid3_tx_hist = NULL;
1256 out_free_rx:
1257         dccp_rx_hist_delete(ccid3_rx_hist);
1258         ccid3_rx_hist = NULL;
1259         goto out;
1260 }
1261 module_init(ccid3_module_init);
1262
1263 static __exit void ccid3_module_exit(void)
1264 {
1265         ccid_unregister(&ccid3);
1266
1267         if (ccid3_tx_hist != NULL) {
1268                 dccp_tx_hist_delete(ccid3_tx_hist);
1269                 ccid3_tx_hist = NULL;
1270         }
1271         if (ccid3_rx_hist != NULL) {
1272                 dccp_rx_hist_delete(ccid3_rx_hist);
1273                 ccid3_rx_hist = NULL;
1274         }
1275         if (ccid3_li_hist != NULL) {
1276                 dccp_li_hist_delete(ccid3_li_hist);
1277                 ccid3_li_hist = NULL;
1278         }
1279 }
1280 module_exit(ccid3_module_exit);
1281
1282 MODULE_AUTHOR("Ian McDonald <ian.mcdonald@jandi.co.nz>, "
1283               "Arnaldo Carvalho de Melo <acme@ghostprotocols.net>");
1284 MODULE_DESCRIPTION("DCCP TFRC CCID3 CCID");
1285 MODULE_LICENSE("GPL");
1286 MODULE_ALIAS("net-dccp-ccid-3");