[CCID3]: Remove redundant `len' test
[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 #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         hctx->ccid3hctx_s = hctx->ccid3hctx_s == 0 ? len :
153                             (9 * hctx->ccid3hctx_s + len) / 10;
154         /*
155          * Note: We could do a potential optimisation here - when `s' changes,
156          *       recalculate sending rate and consequently t_ipi, t_delta, and
157          *       t_now. This is however non-standard, and the benefits are not
158          *       clear, so it is currently left out.
159          */
160 }
161
162 /*
163  *      Update Window Counter using the algorithm from [RFC 4342, 8.1].
164  *      The algorithm is not applicable if RTT < 4 microseconds.
165  */
166 static inline void ccid3_hc_tx_update_win_count(struct ccid3_hc_tx_sock *hctx,
167                                                 struct timeval *now)
168 {
169         suseconds_t delta;
170         u32 quarter_rtts;
171
172         if (unlikely(hctx->ccid3hctx_rtt < 4))  /* avoid divide-by-zero */
173                 return;
174
175         delta = timeval_delta(now, &hctx->ccid3hctx_t_last_win_count);
176         DCCP_BUG_ON(delta < 0);
177
178         quarter_rtts = (u32)delta / (hctx->ccid3hctx_rtt / 4);
179
180         if (quarter_rtts > 0) {
181                 hctx->ccid3hctx_t_last_win_count = *now;
182                 hctx->ccid3hctx_last_win_count  += min_t(u32, quarter_rtts, 5);
183                 hctx->ccid3hctx_last_win_count  &= 0xF;         /* mod 16 */
184
185                 ccid3_pr_debug("now at %#X\n", hctx->ccid3hctx_last_win_count);
186         }
187 }
188
189 static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
190 {
191         struct sock *sk = (struct sock *)data;
192         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
193         unsigned long t_nfb = USEC_PER_SEC / 5;
194
195         bh_lock_sock(sk);
196         if (sock_owned_by_user(sk)) {
197                 /* Try again later. */
198                 /* XXX: set some sensible MIB */
199                 goto restart_timer;
200         }
201
202         ccid3_pr_debug("%s(%p, state=%s) - entry \n", dccp_role(sk), sk,
203                        ccid3_tx_state_name(hctx->ccid3hctx_state));
204
205         switch (hctx->ccid3hctx_state) {
206         case TFRC_SSTATE_NO_FBACK:
207                 /* RFC 3448, 4.4: Halve send rate directly */
208                 hctx->ccid3hctx_x = max(hctx->ccid3hctx_x / 2,
209                                         (((__u64)hctx->ccid3hctx_s) << 6) /
210                                                                     TFRC_T_MBI);
211
212                 ccid3_pr_debug("%s(%p, state=%s), updated tx rate to %u "
213                                "bytes/s\n", dccp_role(sk), sk,
214                                ccid3_tx_state_name(hctx->ccid3hctx_state),
215                                (unsigned)(hctx->ccid3hctx_x >> 6));
216                 /* The value of R is still undefined and so we can not recompute
217                  * the timout value. Keep initial value as per [RFC 4342, 5]. */
218                 t_nfb = TFRC_INITIAL_TIMEOUT;
219                 ccid3_update_send_time(hctx);
220                 break;
221         case TFRC_SSTATE_FBACK:
222                 /*
223                  * Check if IDLE since last timeout and recv rate is less than
224                  * 4 packets (in units of 64*bytes/sec) per RTT
225                  */
226                 if (!hctx->ccid3hctx_idle ||
227                     (hctx->ccid3hctx_x_recv >= 4 *
228                      scaled_div(((__u64)hctx->ccid3hctx_s) << 6,
229                                 hctx->ccid3hctx_rtt))) {
230                         struct timeval now;
231
232                         ccid3_pr_debug("%s(%p, state=%s), not idle\n",
233                                        dccp_role(sk), sk,
234                                    ccid3_tx_state_name(hctx->ccid3hctx_state));
235
236                         /*
237                          *  Modify the cached value of X_recv [RFC 3448, 4.4]
238                          *
239                          *  If (p == 0 || X_calc > 2 * X_recv)
240                          *    X_recv = max(X_recv / 2, s / (2 * t_mbi));
241                          *  Else
242                          *    X_recv = X_calc / 4;
243                          *
244                          *  Note that X_recv is scaled by 2^6 while X_calc is not
245                          */
246                         BUG_ON(hctx->ccid3hctx_p && !hctx->ccid3hctx_x_calc);
247
248                         if (hctx->ccid3hctx_p  == 0 ||
249                             (hctx->ccid3hctx_x_calc >
250                              (hctx->ccid3hctx_x_recv >> 5))) {
251
252                                 hctx->ccid3hctx_x_recv =
253                                         max(hctx->ccid3hctx_x_recv / 2,
254                                             (((__u64)hctx->ccid3hctx_s) << 6) /
255                                                           (2 * TFRC_T_MBI));
256
257                                 if (hctx->ccid3hctx_p == 0)
258                                         dccp_timestamp(sk, &now);
259                         } else {
260                                 hctx->ccid3hctx_x_recv = hctx->ccid3hctx_x_calc;
261                                 hctx->ccid3hctx_x_recv <<= 4;
262                         }
263                         /* Now recalculate X [RFC 3448, 4.3, step (4)] */
264                         ccid3_hc_tx_update_x(sk, &now);
265                 }
266                 /*
267                  * Schedule no feedback timer to expire in
268                  * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
269                  * See comments in packet_recv() regarding the value of t_RTO.
270                  */
271                 t_nfb = max(hctx->ccid3hctx_t_rto, 2 * hctx->ccid3hctx_t_ipi);
272                 break;
273         case TFRC_SSTATE_NO_SENT:
274                 DCCP_BUG("%s(%p) - Illegal state NO_SENT", dccp_role(sk), sk);
275                 /* fall through */
276         case TFRC_SSTATE_TERM:
277                 goto out;
278         }
279
280         hctx->ccid3hctx_idle = 1;
281
282 restart_timer:
283         sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
284                            jiffies + usecs_to_jiffies(t_nfb));
285 out:
286         bh_unlock_sock(sk);
287         sock_put(sk);
288 }
289
290 /*
291  * returns
292  *   > 0: delay (in msecs) that should pass before actually sending
293  *   = 0: can send immediately
294  *   < 0: error condition; do not send packet
295  */
296 static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
297 {
298         struct dccp_sock *dp = dccp_sk(sk);
299         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
300         struct timeval now;
301         suseconds_t delay;
302
303         BUG_ON(hctx == NULL);
304
305         /*
306          * This function is called only for Data and DataAck packets. Sending
307          * zero-sized Data(Ack)s is theoretically possible, but for congestion
308          * control this case is pathological - ignore it.
309          */
310         if (unlikely(skb->len == 0))
311                 return -EBADMSG;
312
313         dccp_timestamp(sk, &now);
314
315         switch (hctx->ccid3hctx_state) {
316         case TFRC_SSTATE_NO_SENT:
317                 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
318                                (jiffies +
319                                 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,
369                                     unsigned int len)
370 {
371         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
372         struct timeval now;
373         struct dccp_tx_hist_entry *packet;
374
375         BUG_ON(hctx == NULL);
376
377         ccid3_hc_tx_update_s(hctx, len);
378
379         packet = dccp_tx_hist_entry_new(ccid3_tx_hist, GFP_ATOMIC);
380         if (unlikely(packet == NULL)) {
381                 DCCP_CRIT("packet history - out of memory!");
382                 return;
383         }
384         dccp_tx_hist_add_entry(&hctx->ccid3hctx_hist, packet);
385
386         dccp_timestamp(sk, &now);
387         packet->dccphtx_tstamp = now;
388         packet->dccphtx_seqno  = dccp_sk(sk)->dccps_gss;
389         packet->dccphtx_rtt    = hctx->ccid3hctx_rtt;
390         packet->dccphtx_sent   = 1;
391         hctx->ccid3hctx_idle   = 0;
392 }
393
394 static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
395 {
396         const struct dccp_sock *dp = dccp_sk(sk);
397         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
398         struct ccid3_options_received *opt_recv;
399         struct dccp_tx_hist_entry *packet;
400         struct timeval now;
401         unsigned long t_nfb;
402         u32 pinv;
403         suseconds_t r_sample, t_elapsed;
404
405         BUG_ON(hctx == NULL);
406
407         /* we are only interested in ACKs */
408         if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK ||
409               DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_DATAACK))
410                 return;
411
412         opt_recv = &hctx->ccid3hctx_options_received;
413
414         switch (hctx->ccid3hctx_state) {
415         case TFRC_SSTATE_NO_FBACK:
416         case TFRC_SSTATE_FBACK:
417                 /* get packet from history to look up t_recvdata */
418                 packet = dccp_tx_hist_find_entry(&hctx->ccid3hctx_hist,
419                                               DCCP_SKB_CB(skb)->dccpd_ack_seq);
420                 if (unlikely(packet == NULL)) {
421                         DCCP_WARN("%s(%p), seqno %llu(%s) doesn't exist "
422                                   "in history!\n",  dccp_role(sk), sk,
423                             (unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq,
424                                 dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type));
425                         return;
426                 }
427
428                 /* Update receive rate in units of 64 * bytes/second */
429                 hctx->ccid3hctx_x_recv = opt_recv->ccid3or_receive_rate;
430                 hctx->ccid3hctx_x_recv <<= 6;
431
432                 /* Update loss event rate */
433                 pinv = opt_recv->ccid3or_loss_event_rate;
434                 if (pinv == ~0U || pinv == 0)          /* see RFC 4342, 8.5   */
435                         hctx->ccid3hctx_p = 0;
436                 else                                   /* can not exceed 100% */
437                         hctx->ccid3hctx_p = 1000000 / pinv;
438
439                 dccp_timestamp(sk, &now);
440
441                 /*
442                  * Calculate new round trip sample as per [RFC 3448, 4.3] by
443                  *      R_sample  =  (now - t_recvdata) - t_elapsed
444                  */
445                 r_sample  = timeval_delta(&now, &packet->dccphtx_tstamp);
446                 t_elapsed = dp->dccps_options_received.dccpor_elapsed_time * 10;
447
448                 DCCP_BUG_ON(r_sample < 0);
449                 if (unlikely(r_sample <= t_elapsed))
450                         DCCP_WARN("WARNING: r_sample=%dus <= t_elapsed=%dus\n",
451                                   (int)r_sample, (int)t_elapsed);
452                 else
453                         r_sample -= t_elapsed;
454                 CCID3_RTT_SANITY_CHECK(r_sample);
455
456                 /* Update RTT estimate by
457                  * If (No feedback recv)
458                  *    R = R_sample;
459                  * Else
460                  *    R = q * R + (1 - q) * R_sample;
461                  *
462                  * q is a constant, RFC 3448 recomments 0.9
463                  */
464                 if (hctx->ccid3hctx_state == TFRC_SSTATE_NO_FBACK) {
465                         /*
466                          * Larger Initial Windows [RFC 4342, sec. 5]
467                          * We deviate in that we use `s' instead of `MSS'.
468                          */
469                         __u64 w_init = min(4 * hctx->ccid3hctx_s,
470                                            max(2 * hctx->ccid3hctx_s, 4380));
471                         hctx->ccid3hctx_rtt  = r_sample;
472                         hctx->ccid3hctx_x    = scaled_div(w_init << 6, r_sample);
473                         hctx->ccid3hctx_t_ld = now;
474
475                         ccid3_update_send_time(hctx);
476
477                         ccid3_pr_debug("%s(%p), s=%u, w_init=%llu, "
478                                        "R_sample=%dus, X=%u\n", dccp_role(sk),
479                                        sk, hctx->ccid3hctx_s,
480                                        (unsigned long long)w_init,
481                                        (int)r_sample,
482                                        (unsigned)(hctx->ccid3hctx_x >> 6));
483
484                         ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK);
485                 } else {
486                         hctx->ccid3hctx_rtt = (9 * hctx->ccid3hctx_rtt +
487                                                    (u32)r_sample) / 10;
488
489                         /* Update sending rate (step 4 of [RFC 3448, 4.3]) */
490                         if (hctx->ccid3hctx_p > 0)
491                                 hctx->ccid3hctx_x_calc =
492                                         tfrc_calc_x(hctx->ccid3hctx_s,
493                                                     hctx->ccid3hctx_rtt,
494                                                     hctx->ccid3hctx_p);
495                         ccid3_hc_tx_update_x(sk, &now);
496
497                         ccid3_pr_debug("%s(%p), RTT=%uus (sample=%dus), s=%u, "
498                                        "p=%u, X_calc=%u, X_recv=%u, X=%u\n",
499                                        dccp_role(sk),
500                                        sk, hctx->ccid3hctx_rtt, (int)r_sample,
501                                        hctx->ccid3hctx_s, hctx->ccid3hctx_p,
502                                        hctx->ccid3hctx_x_calc,
503                                        (unsigned)(hctx->ccid3hctx_x_recv >> 6),
504                                        (unsigned)(hctx->ccid3hctx_x >> 6));
505                 }
506
507                 /* unschedule no feedback timer */
508                 sk_stop_timer(sk, &hctx->ccid3hctx_no_feedback_timer);
509
510                 /* remove all packets older than the one acked from history */
511                 dccp_tx_hist_purge_older(ccid3_tx_hist,
512                                          &hctx->ccid3hctx_hist, packet);
513                 /*
514                  * As we have calculated new ipi, delta, t_nom it is possible
515                  * that we now can send a packet, so wake up dccp_wait_for_ccid
516                  */
517                 sk->sk_write_space(sk);
518
519                 /*
520                  * Update timeout interval for the nofeedback timer.
521                  * We use a configuration option to increase the lower bound.
522                  * This can help avoid triggering the nofeedback timer too
523                  * often ('spinning') on LANs with small RTTs.
524                  */
525                 hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
526                                                    CONFIG_IP_DCCP_CCID3_RTO *
527                                                    (USEC_PER_SEC/1000));
528                 /*
529                  * Schedule no feedback timer to expire in
530                  * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
531                  */
532                 t_nfb = max(hctx->ccid3hctx_t_rto, 2 * hctx->ccid3hctx_t_ipi);
533
534                 ccid3_pr_debug("%s(%p), Scheduled no feedback timer to "
535                                "expire in %lu jiffies (%luus)\n",
536                                dccp_role(sk),
537                                sk, usecs_to_jiffies(t_nfb), t_nfb);
538
539                 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
540                                    jiffies + usecs_to_jiffies(t_nfb));
541
542                 /* set idle flag */
543                 hctx->ccid3hctx_idle = 1;
544                 break;
545         case TFRC_SSTATE_NO_SENT:       /* fall through */
546         case TFRC_SSTATE_TERM:          /* ignore feedback when closing */
547                 break;
548         }
549 }
550
551 static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
552                                      unsigned char len, u16 idx,
553                                      unsigned char *value)
554 {
555         int rc = 0;
556         const struct dccp_sock *dp = dccp_sk(sk);
557         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
558         struct ccid3_options_received *opt_recv;
559
560         BUG_ON(hctx == NULL);
561
562         opt_recv = &hctx->ccid3hctx_options_received;
563
564         if (opt_recv->ccid3or_seqno != dp->dccps_gsr) {
565                 opt_recv->ccid3or_seqno              = dp->dccps_gsr;
566                 opt_recv->ccid3or_loss_event_rate    = ~0;
567                 opt_recv->ccid3or_loss_intervals_idx = 0;
568                 opt_recv->ccid3or_loss_intervals_len = 0;
569                 opt_recv->ccid3or_receive_rate       = 0;
570         }
571
572         switch (option) {
573         case TFRC_OPT_LOSS_EVENT_RATE:
574                 if (unlikely(len != 4)) {
575                         DCCP_WARN("%s(%p), invalid len %d "
576                                   "for TFRC_OPT_LOSS_EVENT_RATE\n",
577                                   dccp_role(sk), sk, len);
578                         rc = -EINVAL;
579                 } else {
580                         opt_recv->ccid3or_loss_event_rate =
581                                                 ntohl(*(__be32 *)value);
582                         ccid3_pr_debug("%s(%p), LOSS_EVENT_RATE=%u\n",
583                                        dccp_role(sk), sk,
584                                        opt_recv->ccid3or_loss_event_rate);
585                 }
586                 break;
587         case TFRC_OPT_LOSS_INTERVALS:
588                 opt_recv->ccid3or_loss_intervals_idx = idx;
589                 opt_recv->ccid3or_loss_intervals_len = len;
590                 ccid3_pr_debug("%s(%p), LOSS_INTERVALS=(%u, %u)\n",
591                                dccp_role(sk), sk,
592                                opt_recv->ccid3or_loss_intervals_idx,
593                                opt_recv->ccid3or_loss_intervals_len);
594                 break;
595         case TFRC_OPT_RECEIVE_RATE:
596                 if (unlikely(len != 4)) {
597                         DCCP_WARN("%s(%p), invalid len %d "
598                                   "for TFRC_OPT_RECEIVE_RATE\n",
599                                   dccp_role(sk), sk, len);
600                         rc = -EINVAL;
601                 } else {
602                         opt_recv->ccid3or_receive_rate =
603                                                 ntohl(*(__be32 *)value);
604                         ccid3_pr_debug("%s(%p), RECEIVE_RATE=%u\n",
605                                        dccp_role(sk), sk,
606                                        opt_recv->ccid3or_receive_rate);
607                 }
608                 break;
609         }
610
611         return rc;
612 }
613
614 static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
615 {
616         struct ccid3_hc_tx_sock *hctx = ccid_priv(ccid);
617
618         hctx->ccid3hctx_s     = 0;
619         hctx->ccid3hctx_rtt   = 0;
620         hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
621         INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
622
623         hctx->ccid3hctx_no_feedback_timer.function =
624                                 ccid3_hc_tx_no_feedback_timer;
625         hctx->ccid3hctx_no_feedback_timer.data     = (unsigned long)sk;
626         init_timer(&hctx->ccid3hctx_no_feedback_timer);
627
628         return 0;
629 }
630
631 static void ccid3_hc_tx_exit(struct sock *sk)
632 {
633         struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
634
635         BUG_ON(hctx == NULL);
636
637         ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM);
638         sk_stop_timer(sk, &hctx->ccid3hctx_no_feedback_timer);
639
640         /* Empty packet history */
641         dccp_tx_hist_purge(ccid3_tx_hist, &hctx->ccid3hctx_hist);
642 }
643
644 /*
645  * RX Half Connection methods
646  */
647
648 #ifdef CONFIG_IP_DCCP_CCID3_DEBUG
649 static const char *ccid3_rx_state_name(enum ccid3_hc_rx_states state)
650 {
651         static char *ccid3_rx_state_names[] = {
652         [TFRC_RSTATE_NO_DATA] = "NO_DATA",
653         [TFRC_RSTATE_DATA]    = "DATA",
654         [TFRC_RSTATE_TERM]    = "TERM",
655         };
656
657         return ccid3_rx_state_names[state];
658 }
659 #endif
660
661 static void ccid3_hc_rx_set_state(struct sock *sk,
662                                   enum ccid3_hc_rx_states state)
663 {
664         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
665         enum ccid3_hc_rx_states oldstate = hcrx->ccid3hcrx_state;
666
667         ccid3_pr_debug("%s(%p) %-8.8s -> %s\n",
668                        dccp_role(sk), sk, ccid3_rx_state_name(oldstate),
669                        ccid3_rx_state_name(state));
670         WARN_ON(state == oldstate);
671         hcrx->ccid3hcrx_state = state;
672 }
673
674 static inline void ccid3_hc_rx_update_s(struct ccid3_hc_rx_sock *hcrx, int len)
675 {
676         if (unlikely(len == 0)) /* don't update on empty packets (e.g. ACKs) */
677                 ccid3_pr_debug("Packet payload length is 0 - not updating\n");
678         else
679                 hcrx->ccid3hcrx_s = hcrx->ccid3hcrx_s == 0 ? len :
680                                     (9 * hcrx->ccid3hcrx_s + len) / 10;
681 }
682
683 static void ccid3_hc_rx_send_feedback(struct sock *sk)
684 {
685         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
686         struct dccp_sock *dp = dccp_sk(sk);
687         struct dccp_rx_hist_entry *packet;
688         struct timeval now;
689         suseconds_t delta;
690
691         ccid3_pr_debug("%s(%p) - entry \n", dccp_role(sk), sk);
692
693         dccp_timestamp(sk, &now);
694
695         switch (hcrx->ccid3hcrx_state) {
696         case TFRC_RSTATE_NO_DATA:
697                 hcrx->ccid3hcrx_x_recv = 0;
698                 break;
699         case TFRC_RSTATE_DATA:
700                 delta = timeval_delta(&now,
701                                       &hcrx->ccid3hcrx_tstamp_last_feedback);
702                 DCCP_BUG_ON(delta < 0);
703                 hcrx->ccid3hcrx_x_recv =
704                         scaled_div32(hcrx->ccid3hcrx_bytes_recv, delta);
705                 break;
706         case TFRC_RSTATE_TERM:
707                 DCCP_BUG("%s(%p) - Illegal state TERM", dccp_role(sk), sk);
708                 return;
709         }
710
711         packet = dccp_rx_hist_find_data_packet(&hcrx->ccid3hcrx_hist);
712         if (unlikely(packet == NULL)) {
713                 DCCP_WARN("%s(%p), no data packet in history!\n",
714                           dccp_role(sk), sk);
715                 return;
716         }
717
718         hcrx->ccid3hcrx_tstamp_last_feedback = now;
719         hcrx->ccid3hcrx_ccval_last_counter   = packet->dccphrx_ccval;
720         hcrx->ccid3hcrx_bytes_recv           = 0;
721
722         /* Elapsed time information [RFC 4340, 13.2] in units of 10 * usecs */
723         delta = timeval_delta(&now, &packet->dccphrx_tstamp);
724         DCCP_BUG_ON(delta < 0);
725         hcrx->ccid3hcrx_elapsed_time = delta / 10;
726
727         if (hcrx->ccid3hcrx_p == 0)
728                 hcrx->ccid3hcrx_pinv = ~0U;     /* see RFC 4342, 8.5 */
729         else if (hcrx->ccid3hcrx_p > 1000000) {
730                 DCCP_WARN("p (%u) > 100%%\n", hcrx->ccid3hcrx_p);
731                 hcrx->ccid3hcrx_pinv = 1;       /* use 100% in this case */
732         } else
733                 hcrx->ccid3hcrx_pinv = 1000000 / hcrx->ccid3hcrx_p;
734
735         dp->dccps_hc_rx_insert_options = 1;
736         dccp_send_ack(sk);
737 }
738
739 static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
740 {
741         const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
742         __be32 x_recv, pinv;
743
744         BUG_ON(hcrx == NULL);
745
746         if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN))
747                 return 0;
748
749         DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_ccval_last_counter;
750
751         if (dccp_packet_without_ack(skb))
752                 return 0;
753
754         x_recv = htonl(hcrx->ccid3hcrx_x_recv);
755         pinv   = htonl(hcrx->ccid3hcrx_pinv);
756
757         if ((hcrx->ccid3hcrx_elapsed_time != 0 &&
758              dccp_insert_option_elapsed_time(sk, skb,
759                                              hcrx->ccid3hcrx_elapsed_time)) ||
760             dccp_insert_option_timestamp(sk, skb) ||
761             dccp_insert_option(sk, skb, TFRC_OPT_LOSS_EVENT_RATE,
762                                &pinv, sizeof(pinv)) ||
763             dccp_insert_option(sk, skb, TFRC_OPT_RECEIVE_RATE,
764                                &x_recv, sizeof(x_recv)))
765                 return -1;
766
767         return 0;
768 }
769
770 /* calculate first loss interval
771  *
772  * returns estimated loss interval in usecs */
773
774 static u32 ccid3_hc_rx_calc_first_li(struct sock *sk)
775 {
776         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
777         struct dccp_rx_hist_entry *entry, *next, *tail = NULL;
778         u32 x_recv, p;
779         suseconds_t rtt, delta;
780         struct timeval tstamp = { 0, };
781         int interval = 0;
782         int win_count = 0;
783         int step = 0;
784         u64 fval;
785
786         list_for_each_entry_safe(entry, next, &hcrx->ccid3hcrx_hist,
787                                  dccphrx_node) {
788                 if (dccp_rx_hist_entry_data_packet(entry)) {
789                         tail = entry;
790
791                         switch (step) {
792                         case 0:
793                                 tstamp    = entry->dccphrx_tstamp;
794                                 win_count = entry->dccphrx_ccval;
795                                 step = 1;
796                                 break;
797                         case 1:
798                                 interval = win_count - entry->dccphrx_ccval;
799                                 if (interval < 0)
800                                         interval += TFRC_WIN_COUNT_LIMIT;
801                                 if (interval > 4)
802                                         goto found;
803                                 break;
804                         }
805                 }
806         }
807
808         if (unlikely(step == 0)) {
809                 DCCP_WARN("%s(%p), packet history has no data packets!\n",
810                           dccp_role(sk), sk);
811                 return ~0;
812         }
813
814         if (unlikely(interval == 0)) {
815                 DCCP_WARN("%s(%p), Could not find a win_count interval > 0."
816                           "Defaulting to 1\n", dccp_role(sk), sk);
817                 interval = 1;
818         }
819 found:
820         if (!tail) {
821                 DCCP_CRIT("tail is null\n");
822                 return ~0;
823         }
824
825         delta = timeval_delta(&tstamp, &tail->dccphrx_tstamp);
826         DCCP_BUG_ON(delta < 0);
827
828         rtt = delta * 4 / interval;
829         ccid3_pr_debug("%s(%p), approximated RTT to %dus\n",
830                        dccp_role(sk), sk, (int)rtt);
831
832         /*
833          * Determine the length of the first loss interval via inverse lookup.
834          * Assume that X_recv can be computed by the throughput equation
835          *                  s
836          *      X_recv = --------
837          *               R * fval
838          * Find some p such that f(p) = fval; return 1/p [RFC 3448, 6.3.1].
839          */
840         if (rtt == 0) {                 /* would result in divide-by-zero */
841                 DCCP_WARN("RTT==0\n");
842                 return ~0;
843         }
844
845         dccp_timestamp(sk, &tstamp);
846         delta = timeval_delta(&tstamp, &hcrx->ccid3hcrx_tstamp_last_feedback);
847         DCCP_BUG_ON(delta <= 0);
848
849         x_recv = scaled_div32(hcrx->ccid3hcrx_bytes_recv, delta);
850         if (x_recv == 0) {              /* would also trigger divide-by-zero */
851                 DCCP_WARN("X_recv==0\n");
852                 if ((x_recv = hcrx->ccid3hcrx_x_recv) == 0) {
853                         DCCP_BUG("stored value of X_recv is zero");
854                         return ~0;
855                 }
856         }
857
858         fval = scaled_div(hcrx->ccid3hcrx_s, rtt);
859         fval = scaled_div32(fval, x_recv);
860         p = tfrc_calc_x_reverse_lookup(fval);
861
862         ccid3_pr_debug("%s(%p), receive rate=%u bytes/s, implied "
863                        "loss rate=%u\n", dccp_role(sk), sk, x_recv, p);
864
865         if (p == 0)
866                 return ~0;
867         else
868                 return 1000000 / p;
869 }
870
871 static void ccid3_hc_rx_update_li(struct sock *sk, u64 seq_loss, u8 win_loss)
872 {
873         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
874         struct dccp_li_hist_entry *head;
875         u64 seq_temp;
876
877         if (list_empty(&hcrx->ccid3hcrx_li_hist)) {
878                 if (!dccp_li_hist_interval_new(ccid3_li_hist,
879                    &hcrx->ccid3hcrx_li_hist, seq_loss, win_loss))
880                         return;
881
882                 head = list_entry(hcrx->ccid3hcrx_li_hist.next,
883                    struct dccp_li_hist_entry, dccplih_node);
884                 head->dccplih_interval = ccid3_hc_rx_calc_first_li(sk);
885         } else {
886                 struct dccp_li_hist_entry *entry;
887                 struct list_head *tail;
888
889                 head = list_entry(hcrx->ccid3hcrx_li_hist.next,
890                    struct dccp_li_hist_entry, dccplih_node);
891                 /* FIXME win count check removed as was wrong */
892                 /* should make this check with receive history */
893                 /* and compare there as per section 10.2 of RFC4342 */
894
895                 /* new loss event detected */
896                 /* calculate last interval length */
897                 seq_temp = dccp_delta_seqno(head->dccplih_seqno, seq_loss);
898                 entry = dccp_li_hist_entry_new(ccid3_li_hist, GFP_ATOMIC);
899
900                 if (entry == NULL) {
901                         DCCP_BUG("out of memory - can not allocate entry");
902                         return;
903                 }
904
905                 list_add(&entry->dccplih_node, &hcrx->ccid3hcrx_li_hist);
906
907                 tail = hcrx->ccid3hcrx_li_hist.prev;
908                 list_del(tail);
909                 kmem_cache_free(ccid3_li_hist->dccplih_slab, tail);
910
911                 /* Create the newest interval */
912                 entry->dccplih_seqno = seq_loss;
913                 entry->dccplih_interval = seq_temp;
914                 entry->dccplih_win_count = win_loss;
915         }
916 }
917
918 static int ccid3_hc_rx_detect_loss(struct sock *sk,
919                                     struct dccp_rx_hist_entry *packet)
920 {
921         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
922         struct dccp_rx_hist_entry *rx_hist =
923                                 dccp_rx_hist_head(&hcrx->ccid3hcrx_hist);
924         u64 seqno = packet->dccphrx_seqno;
925         u64 tmp_seqno;
926         int loss = 0;
927         u8 ccval;
928
929
930         tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss;
931
932         if (!rx_hist ||
933            follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) {
934                 hcrx->ccid3hcrx_seqno_nonloss = seqno;
935                 hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval;
936                 goto detect_out;
937         }
938
939
940         while (dccp_delta_seqno(hcrx->ccid3hcrx_seqno_nonloss, seqno)
941            > TFRC_RECV_NUM_LATE_LOSS) {
942                 loss = 1;
943                 ccid3_hc_rx_update_li(sk, hcrx->ccid3hcrx_seqno_nonloss,
944                    hcrx->ccid3hcrx_ccval_nonloss);
945                 tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss;
946                 dccp_inc_seqno(&tmp_seqno);
947                 hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno;
948                 dccp_inc_seqno(&tmp_seqno);
949                 while (dccp_rx_hist_find_entry(&hcrx->ccid3hcrx_hist,
950                    tmp_seqno, &ccval)) {
951                         hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno;
952                         hcrx->ccid3hcrx_ccval_nonloss = ccval;
953                         dccp_inc_seqno(&tmp_seqno);
954                 }
955         }
956
957         /* FIXME - this code could be simplified with above while */
958         /* but works at moment */
959         if (follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) {
960                 hcrx->ccid3hcrx_seqno_nonloss = seqno;
961                 hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval;
962         }
963
964 detect_out:
965         dccp_rx_hist_add_packet(ccid3_rx_hist, &hcrx->ccid3hcrx_hist,
966                    &hcrx->ccid3hcrx_li_hist, packet,
967                    hcrx->ccid3hcrx_seqno_nonloss);
968         return loss;
969 }
970
971 static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
972 {
973         struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
974         const struct dccp_options_received *opt_recv;
975         struct dccp_rx_hist_entry *packet;
976         struct timeval now;
977         u32 p_prev, rtt_prev;
978         suseconds_t r_sample, t_elapsed;
979         int loss, payload_size;
980
981         BUG_ON(hcrx == NULL);
982
983         opt_recv = &dccp_sk(sk)->dccps_options_received;
984
985         switch (DCCP_SKB_CB(skb)->dccpd_type) {
986         case DCCP_PKT_ACK:
987                 if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
988                         return;
989         case DCCP_PKT_DATAACK:
990                 if (opt_recv->dccpor_timestamp_echo == 0)
991                         break;
992                 rtt_prev = hcrx->ccid3hcrx_rtt;
993                 dccp_timestamp(sk, &now);
994                 timeval_sub_usecs(&now, opt_recv->dccpor_timestamp_echo * 10);
995                 r_sample = timeval_usecs(&now);
996                 t_elapsed = opt_recv->dccpor_elapsed_time * 10;
997
998                 DCCP_BUG_ON(r_sample < 0);
999                 if (unlikely(r_sample <= t_elapsed))
1000                         DCCP_WARN("r_sample=%ldus, t_elapsed=%ldus\n",
1001                                   (long)r_sample, (long)t_elapsed);
1002                 else
1003                         r_sample -= t_elapsed;
1004                 CCID3_RTT_SANITY_CHECK(r_sample);
1005
1006                 if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
1007                         hcrx->ccid3hcrx_rtt = r_sample;
1008                 else
1009                         hcrx->ccid3hcrx_rtt = (hcrx->ccid3hcrx_rtt * 9) / 10 +
1010                                               r_sample / 10;
1011
1012                 if (rtt_prev != hcrx->ccid3hcrx_rtt)
1013                         ccid3_pr_debug("%s(%p), New RTT=%uus, elapsed time=%u\n",
1014                                        dccp_role(sk), sk, hcrx->ccid3hcrx_rtt,
1015                                        opt_recv->dccpor_elapsed_time);
1016                 break;
1017         case DCCP_PKT_DATA:
1018                 break;
1019         default: /* We're not interested in other packet types, move along */
1020                 return;
1021         }
1022
1023         packet = dccp_rx_hist_entry_new(ccid3_rx_hist, sk, opt_recv->dccpor_ndp,
1024                                         skb, GFP_ATOMIC);
1025         if (unlikely(packet == NULL)) {
1026                 DCCP_WARN("%s(%p), Not enough mem to add rx packet "
1027                           "to history, consider it lost!\n", dccp_role(sk), sk);
1028                 return;
1029         }
1030
1031         loss = ccid3_hc_rx_detect_loss(sk, packet);
1032
1033         if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK)
1034                 return;
1035
1036         payload_size = skb->len - dccp_hdr(skb)->dccph_doff * 4;
1037         ccid3_hc_rx_update_s(hcrx, payload_size);
1038
1039         switch (hcrx->ccid3hcrx_state) {
1040         case TFRC_RSTATE_NO_DATA:
1041                 ccid3_pr_debug("%s(%p, state=%s), skb=%p, sending initial "
1042                                "feedback\n", 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                      (suseconds_t)hcrx->ccid3hcrx_rtt) >= 0) {
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("%s(%p) - Illegal state TERM", dccp_role(sk), sk);
1061                 return;
1062         }
1063
1064         /* Dealing with packet loss */
1065         ccid3_pr_debug("%s(%p, state=%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("entry\n");
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 = 0;
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_parse_options  = ccid3_hc_tx_parse_options,
1211         .ccid_hc_rx_obj_size       = sizeof(struct ccid3_hc_rx_sock),
1212         .ccid_hc_rx_init           = ccid3_hc_rx_init,
1213         .ccid_hc_rx_exit           = ccid3_hc_rx_exit,
1214         .ccid_hc_rx_insert_options = ccid3_hc_rx_insert_options,
1215         .ccid_hc_rx_packet_recv    = ccid3_hc_rx_packet_recv,
1216         .ccid_hc_rx_get_info       = ccid3_hc_rx_get_info,
1217         .ccid_hc_tx_get_info       = ccid3_hc_tx_get_info,
1218         .ccid_hc_rx_getsockopt     = ccid3_hc_rx_getsockopt,
1219         .ccid_hc_tx_getsockopt     = ccid3_hc_tx_getsockopt,
1220 };
1221
1222 #ifdef CONFIG_IP_DCCP_CCID3_DEBUG
1223 module_param(ccid3_debug, int, 0444);
1224 MODULE_PARM_DESC(ccid3_debug, "Enable debug messages");
1225 #endif
1226
1227 static __init int ccid3_module_init(void)
1228 {
1229         int rc = -ENOBUFS;
1230
1231         ccid3_rx_hist = dccp_rx_hist_new("ccid3");
1232         if (ccid3_rx_hist == NULL)
1233                 goto out;
1234
1235         ccid3_tx_hist = dccp_tx_hist_new("ccid3");
1236         if (ccid3_tx_hist == NULL)
1237                 goto out_free_rx;
1238
1239         ccid3_li_hist = dccp_li_hist_new("ccid3");
1240         if (ccid3_li_hist == NULL)
1241                 goto out_free_tx;
1242
1243         rc = ccid_register(&ccid3);
1244         if (rc != 0)
1245                 goto out_free_loss_interval_history;
1246 out:
1247         return rc;
1248
1249 out_free_loss_interval_history:
1250         dccp_li_hist_delete(ccid3_li_hist);
1251         ccid3_li_hist = NULL;
1252 out_free_tx:
1253         dccp_tx_hist_delete(ccid3_tx_hist);
1254         ccid3_tx_hist = NULL;
1255 out_free_rx:
1256         dccp_rx_hist_delete(ccid3_rx_hist);
1257         ccid3_rx_hist = NULL;
1258         goto out;
1259 }
1260 module_init(ccid3_module_init);
1261
1262 static __exit void ccid3_module_exit(void)
1263 {
1264         ccid_unregister(&ccid3);
1265
1266         if (ccid3_tx_hist != NULL) {
1267                 dccp_tx_hist_delete(ccid3_tx_hist);
1268                 ccid3_tx_hist = NULL;
1269         }
1270         if (ccid3_rx_hist != NULL) {
1271                 dccp_rx_hist_delete(ccid3_rx_hist);
1272                 ccid3_rx_hist = NULL;
1273         }
1274         if (ccid3_li_hist != NULL) {
1275                 dccp_li_hist_delete(ccid3_li_hist);
1276                 ccid3_li_hist = NULL;
1277         }
1278 }
1279 module_exit(ccid3_module_exit);
1280
1281 MODULE_AUTHOR("Ian McDonald <ian.mcdonald@jandi.co.nz>, "
1282               "Arnaldo Carvalho de Melo <acme@ghostprotocols.net>");
1283 MODULE_DESCRIPTION("DCCP TFRC CCID3 CCID");
1284 MODULE_LICENSE("GPL");
1285 MODULE_ALIAS("net-dccp-ccid-3");