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