[CCID2]: Simplify interface
[linux-2.6.git] / net / dccp / ccids / ccid2.c
1 /*
2  *  net/dccp/ccids/ccid2.c
3  *
4  *  Copyright (c) 2005, 2006 Andrea Bittau <a.bittau@cs.ucl.ac.uk>
5  *
6  *  Changes to meet Linux coding standards, and DCCP infrastructure fixes.
7  *
8  *  Copyright (c) 2006 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24
25 /*
26  * This implementation should follow RFC 4341
27  *
28  * BUGS:
29  * - sequence number wrapping
30  */
31
32 #include "../ccid.h"
33 #include "../dccp.h"
34 #include "ccid2.h"
35
36
37 #ifdef CONFIG_IP_DCCP_CCID2_DEBUG
38 static int ccid2_debug;
39 #define ccid2_pr_debug(format, a...)    DCCP_PR_DEBUG(ccid2_debug, format, ##a)
40
41 static void ccid2_hc_tx_check_sanity(const struct ccid2_hc_tx_sock *hctx)
42 {
43         int len = 0;
44         int pipe = 0;
45         struct ccid2_seq *seqp = hctx->ccid2hctx_seqh;
46
47         /* there is data in the chain */
48         if (seqp != hctx->ccid2hctx_seqt) {
49                 seqp = seqp->ccid2s_prev;
50                 len++;
51                 if (!seqp->ccid2s_acked)
52                         pipe++;
53
54                 while (seqp != hctx->ccid2hctx_seqt) {
55                         struct ccid2_seq *prev = seqp->ccid2s_prev;
56
57                         len++;
58                         if (!prev->ccid2s_acked)
59                                 pipe++;
60
61                         /* packets are sent sequentially */
62                         BUG_ON(seqp->ccid2s_seq <= prev->ccid2s_seq);
63                         BUG_ON(time_before(seqp->ccid2s_sent,
64                                            prev->ccid2s_sent));
65
66                         seqp = prev;
67                 }
68         }
69
70         BUG_ON(pipe != hctx->ccid2hctx_pipe);
71         ccid2_pr_debug("len of chain=%d\n", len);
72
73         do {
74                 seqp = seqp->ccid2s_prev;
75                 len++;
76         } while (seqp != hctx->ccid2hctx_seqh);
77
78         ccid2_pr_debug("total len=%d\n", len);
79         BUG_ON(len != hctx->ccid2hctx_seqbufc * CCID2_SEQBUF_LEN);
80 }
81 #else
82 #define ccid2_pr_debug(format, a...)
83 #define ccid2_hc_tx_check_sanity(hctx)
84 #endif
85
86 static int ccid2_hc_tx_alloc_seq(struct ccid2_hc_tx_sock *hctx)
87 {
88         struct ccid2_seq *seqp;
89         int i;
90
91         /* check if we have space to preserve the pointer to the buffer */
92         if (hctx->ccid2hctx_seqbufc >= (sizeof(hctx->ccid2hctx_seqbuf) /
93                                         sizeof(struct ccid2_seq*)))
94                 return -ENOMEM;
95
96         /* allocate buffer and initialize linked list */
97         seqp = kmalloc(CCID2_SEQBUF_LEN * sizeof(struct ccid2_seq), gfp_any());
98         if (seqp == NULL)
99                 return -ENOMEM;
100
101         for (i = 0; i < (CCID2_SEQBUF_LEN - 1); i++) {
102                 seqp[i].ccid2s_next = &seqp[i + 1];
103                 seqp[i + 1].ccid2s_prev = &seqp[i];
104         }
105         seqp[CCID2_SEQBUF_LEN - 1].ccid2s_next = seqp;
106         seqp->ccid2s_prev = &seqp[CCID2_SEQBUF_LEN - 1];
107
108         /* This is the first allocation.  Initiate the head and tail.  */
109         if (hctx->ccid2hctx_seqbufc == 0)
110                 hctx->ccid2hctx_seqh = hctx->ccid2hctx_seqt = seqp;
111         else {
112                 /* link the existing list with the one we just created */
113                 hctx->ccid2hctx_seqh->ccid2s_next = seqp;
114                 seqp->ccid2s_prev = hctx->ccid2hctx_seqh;
115
116                 hctx->ccid2hctx_seqt->ccid2s_prev = &seqp[CCID2_SEQBUF_LEN - 1];
117                 seqp[CCID2_SEQBUF_LEN - 1].ccid2s_next = hctx->ccid2hctx_seqt;
118         }
119
120         /* store the original pointer to the buffer so we can free it */
121         hctx->ccid2hctx_seqbuf[hctx->ccid2hctx_seqbufc] = seqp;
122         hctx->ccid2hctx_seqbufc++;
123
124         return 0;
125 }
126
127 static int ccid2_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
128 {
129         struct ccid2_hc_tx_sock *hctx;
130
131         switch (DCCP_SKB_CB(skb)->dccpd_type) {
132         case 0: /* XXX data packets from userland come through like this */
133         case DCCP_PKT_DATA:
134         case DCCP_PKT_DATAACK:
135                 break;
136         /* No congestion control on other packets */
137         default:
138                 return 0;
139         }
140
141         hctx = ccid2_hc_tx_sk(sk);
142
143         ccid2_pr_debug("pipe=%d cwnd=%d\n", hctx->ccid2hctx_pipe,
144                        hctx->ccid2hctx_cwnd);
145
146         if (hctx->ccid2hctx_pipe < hctx->ccid2hctx_cwnd) {
147                 /* OK we can send... make sure previous packet was sent off */
148                 if (!hctx->ccid2hctx_sendwait) {
149                         hctx->ccid2hctx_sendwait = 1;
150                         return 0;
151                 }
152         }
153
154         return 1; /* XXX CCID should dequeue when ready instead of polling */
155 }
156
157 static void ccid2_change_l_ack_ratio(struct sock *sk, int val)
158 {
159         struct dccp_sock *dp = dccp_sk(sk);
160         /*
161          * XXX I don't really agree with val != 2.  If cwnd is 1, ack ratio
162          * should be 1... it shouldn't be allowed to become 2.
163          * -sorbo.
164          */
165         if (val != 2) {
166                 const struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
167                 int max = hctx->ccid2hctx_cwnd / 2;
168
169                 /* round up */
170                 if (hctx->ccid2hctx_cwnd & 1)
171                         max++;
172
173                 if (val > max)
174                         val = max;
175         }
176
177         ccid2_pr_debug("changing local ack ratio to %d\n", val);
178         WARN_ON(val <= 0);
179         dp->dccps_l_ack_ratio = val;
180 }
181
182 static void ccid2_change_cwnd(struct ccid2_hc_tx_sock *hctx, int val)
183 {
184         if (val == 0)
185                 val = 1;
186
187         /* XXX do we need to change ack ratio? */
188         ccid2_pr_debug("change cwnd to %d\n", val);
189
190         BUG_ON(val < 1);
191         hctx->ccid2hctx_cwnd = val;
192 }
193
194 static void ccid2_change_srtt(struct ccid2_hc_tx_sock *hctx, long val)
195 {
196         ccid2_pr_debug("change SRTT to %ld\n", val);
197         hctx->ccid2hctx_srtt = val;
198 }
199
200 static void ccid2_change_pipe(struct ccid2_hc_tx_sock *hctx, long val)
201 {
202         hctx->ccid2hctx_pipe = val;
203 }
204
205 static void ccid2_start_rto_timer(struct sock *sk);
206
207 static void ccid2_hc_tx_rto_expire(unsigned long data)
208 {
209         struct sock *sk = (struct sock *)data;
210         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
211         long s;
212
213         bh_lock_sock(sk);
214         if (sock_owned_by_user(sk)) {
215                 sk_reset_timer(sk, &hctx->ccid2hctx_rtotimer,
216                                jiffies + HZ / 5);
217                 goto out;
218         }
219
220         ccid2_pr_debug("RTO_EXPIRE\n");
221
222         ccid2_hc_tx_check_sanity(hctx);
223
224         /* back-off timer */
225         hctx->ccid2hctx_rto <<= 1;
226
227         s = hctx->ccid2hctx_rto / HZ;
228         if (s > 60)
229                 hctx->ccid2hctx_rto = 60 * HZ;
230
231         ccid2_start_rto_timer(sk);
232
233         /* adjust pipe, cwnd etc */
234         ccid2_change_pipe(hctx, 0);
235         hctx->ccid2hctx_ssthresh = hctx->ccid2hctx_cwnd >> 1;
236         if (hctx->ccid2hctx_ssthresh < 2)
237                 hctx->ccid2hctx_ssthresh = 2;
238         ccid2_change_cwnd(hctx, 1);
239
240         /* clear state about stuff we sent */
241         hctx->ccid2hctx_seqt    = hctx->ccid2hctx_seqh;
242         hctx->ccid2hctx_ssacks  = 0;
243         hctx->ccid2hctx_acks    = 0;
244         hctx->ccid2hctx_sent    = 0;
245
246         /* clear ack ratio state. */
247         hctx->ccid2hctx_arsent   = 0;
248         hctx->ccid2hctx_ackloss  = 0;
249         hctx->ccid2hctx_rpseq    = 0;
250         hctx->ccid2hctx_rpdupack = -1;
251         ccid2_change_l_ack_ratio(sk, 1);
252         ccid2_hc_tx_check_sanity(hctx);
253 out:
254         bh_unlock_sock(sk);
255         sock_put(sk);
256 }
257
258 static void ccid2_start_rto_timer(struct sock *sk)
259 {
260         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
261
262         ccid2_pr_debug("setting RTO timeout=%ld\n", hctx->ccid2hctx_rto);
263
264         BUG_ON(timer_pending(&hctx->ccid2hctx_rtotimer));
265         sk_reset_timer(sk, &hctx->ccid2hctx_rtotimer,
266                        jiffies + hctx->ccid2hctx_rto);
267 }
268
269 static void ccid2_hc_tx_packet_sent(struct sock *sk, int more, unsigned int len)
270 {
271         struct dccp_sock *dp = dccp_sk(sk);
272         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
273         struct ccid2_seq *next;
274         u64 seq;
275
276         ccid2_hc_tx_check_sanity(hctx);
277
278         BUG_ON(!hctx->ccid2hctx_sendwait);
279         hctx->ccid2hctx_sendwait = 0;
280         ccid2_change_pipe(hctx, hctx->ccid2hctx_pipe + 1);
281         BUG_ON(hctx->ccid2hctx_pipe < 0);
282
283         /* There is an issue.  What if another packet is sent between
284          * packet_send() and packet_sent().  Then the sequence number would be
285          * wrong.
286          * -sorbo.
287          */
288         seq = dp->dccps_gss;
289
290         hctx->ccid2hctx_seqh->ccid2s_seq   = seq;
291         hctx->ccid2hctx_seqh->ccid2s_acked = 0;
292         hctx->ccid2hctx_seqh->ccid2s_sent  = jiffies;
293
294         next = hctx->ccid2hctx_seqh->ccid2s_next;
295         /* check if we need to alloc more space */
296         if (next == hctx->ccid2hctx_seqt) {
297                 int rc;
298
299                 ccid2_pr_debug("allocating more space in history\n");
300                 rc = ccid2_hc_tx_alloc_seq(hctx);
301                 BUG_ON(rc); /* XXX what do we do? */
302
303                 next = hctx->ccid2hctx_seqh->ccid2s_next;
304                 BUG_ON(next == hctx->ccid2hctx_seqt);
305         }
306         hctx->ccid2hctx_seqh = next;
307
308         ccid2_pr_debug("cwnd=%d pipe=%d\n", hctx->ccid2hctx_cwnd,
309                        hctx->ccid2hctx_pipe);
310
311         hctx->ccid2hctx_sent++;
312
313         /* Ack Ratio.  Need to maintain a concept of how many windows we sent */
314         hctx->ccid2hctx_arsent++;
315         /* We had an ack loss in this window... */
316         if (hctx->ccid2hctx_ackloss) {
317                 if (hctx->ccid2hctx_arsent >= hctx->ccid2hctx_cwnd) {
318                         hctx->ccid2hctx_arsent  = 0;
319                         hctx->ccid2hctx_ackloss = 0;
320                 }
321         } else {
322                 /* No acks lost up to now... */
323                 /* decrease ack ratio if enough packets were sent */
324                 if (dp->dccps_l_ack_ratio > 1) {
325                         /* XXX don't calculate denominator each time */
326                         int denom = dp->dccps_l_ack_ratio * dp->dccps_l_ack_ratio -
327                                     dp->dccps_l_ack_ratio;
328
329                         denom = hctx->ccid2hctx_cwnd * hctx->ccid2hctx_cwnd / denom;
330
331                         if (hctx->ccid2hctx_arsent >= denom) {
332                                 ccid2_change_l_ack_ratio(sk, dp->dccps_l_ack_ratio - 1);
333                                 hctx->ccid2hctx_arsent = 0;
334                         }
335                 } else {
336                         /* we can't increase ack ratio further [1] */
337                         hctx->ccid2hctx_arsent = 0; /* or maybe set it to cwnd*/
338                 }
339         }
340
341         /* setup RTO timer */
342         if (!timer_pending(&hctx->ccid2hctx_rtotimer))
343                 ccid2_start_rto_timer(sk);
344
345 #ifdef CONFIG_IP_DCCP_CCID2_DEBUG
346         ccid2_pr_debug("pipe=%d\n", hctx->ccid2hctx_pipe);
347         ccid2_pr_debug("Sent: seq=%llu\n", (unsigned long long)seq);
348         do {
349                 struct ccid2_seq *seqp = hctx->ccid2hctx_seqt;
350
351                 while (seqp != hctx->ccid2hctx_seqh) {
352                         ccid2_pr_debug("out seq=%llu acked=%d time=%lu\n",
353                                        (unsigned long long)seqp->ccid2s_seq,
354                                        seqp->ccid2s_acked, seqp->ccid2s_sent);
355                         seqp = seqp->ccid2s_next;
356                 }
357         } while (0);
358         ccid2_pr_debug("=========\n");
359         ccid2_hc_tx_check_sanity(hctx);
360 #endif
361 }
362
363 /* XXX Lame code duplication!
364  * returns -1 if none was found.
365  * else returns the next offset to use in the function call.
366  */
367 static int ccid2_ackvector(struct sock *sk, struct sk_buff *skb, int offset,
368                            unsigned char **vec, unsigned char *veclen)
369 {
370         const struct dccp_hdr *dh = dccp_hdr(skb);
371         unsigned char *options = (unsigned char *)dh + dccp_hdr_len(skb);
372         unsigned char *opt_ptr;
373         const unsigned char *opt_end = (unsigned char *)dh +
374                                         (dh->dccph_doff * 4);
375         unsigned char opt, len;
376         unsigned char *value;
377
378         BUG_ON(offset < 0);
379         options += offset;
380         opt_ptr = options;
381         if (opt_ptr >= opt_end)
382                 return -1;
383
384         while (opt_ptr != opt_end) {
385                 opt   = *opt_ptr++;
386                 len   = 0;
387                 value = NULL;
388
389                 /* Check if this isn't a single byte option */
390                 if (opt > DCCPO_MAX_RESERVED) {
391                         if (opt_ptr == opt_end)
392                                 goto out_invalid_option;
393
394                         len = *opt_ptr++;
395                         if (len < 3)
396                                 goto out_invalid_option;
397                         /*
398                          * Remove the type and len fields, leaving
399                          * just the value size
400                          */
401                         len     -= 2;
402                         value   = opt_ptr;
403                         opt_ptr += len;
404
405                         if (opt_ptr > opt_end)
406                                 goto out_invalid_option;
407                 }
408
409                 switch (opt) {
410                 case DCCPO_ACK_VECTOR_0:
411                 case DCCPO_ACK_VECTOR_1:
412                         *vec    = value;
413                         *veclen = len;
414                         return offset + (opt_ptr - options);
415                 }
416         }
417
418         return -1;
419
420 out_invalid_option:
421         DCCP_BUG("Invalid option - this should not happen (previous parsing)!");
422         return -1;
423 }
424
425 static void ccid2_hc_tx_kill_rto_timer(struct sock *sk)
426 {
427         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
428
429         sk_stop_timer(sk, &hctx->ccid2hctx_rtotimer);
430         ccid2_pr_debug("deleted RTO timer\n");
431 }
432
433 static inline void ccid2_new_ack(struct sock *sk,
434                                  struct ccid2_seq *seqp,
435                                  unsigned int *maxincr)
436 {
437         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
438
439         /* slow start */
440         if (hctx->ccid2hctx_cwnd < hctx->ccid2hctx_ssthresh) {
441                 hctx->ccid2hctx_acks = 0;
442
443                 /* We can increase cwnd at most maxincr [ack_ratio/2] */
444                 if (*maxincr) {
445                         /* increase every 2 acks */
446                         hctx->ccid2hctx_ssacks++;
447                         if (hctx->ccid2hctx_ssacks == 2) {
448                                 ccid2_change_cwnd(hctx, hctx->ccid2hctx_cwnd+1);
449                                 hctx->ccid2hctx_ssacks = 0;
450                                 *maxincr = *maxincr - 1;
451                         }
452                 } else {
453                         /* increased cwnd enough for this single ack */
454                         hctx->ccid2hctx_ssacks = 0;
455                 }
456         } else {
457                 hctx->ccid2hctx_ssacks = 0;
458                 hctx->ccid2hctx_acks++;
459
460                 if (hctx->ccid2hctx_acks >= hctx->ccid2hctx_cwnd) {
461                         ccid2_change_cwnd(hctx, hctx->ccid2hctx_cwnd + 1);
462                         hctx->ccid2hctx_acks = 0;
463                 }
464         }
465
466         /* update RTO */
467         if (hctx->ccid2hctx_srtt == -1 ||
468             time_after(jiffies, hctx->ccid2hctx_lastrtt + hctx->ccid2hctx_srtt)) {
469                 unsigned long r = (long)jiffies - (long)seqp->ccid2s_sent;
470                 int s;
471
472                 /* first measurement */
473                 if (hctx->ccid2hctx_srtt == -1) {
474                         ccid2_pr_debug("R: %lu Time=%lu seq=%llu\n",
475                                        r, jiffies,
476                                        (unsigned long long)seqp->ccid2s_seq);
477                         ccid2_change_srtt(hctx, r);
478                         hctx->ccid2hctx_rttvar = r >> 1;
479                 } else {
480                         /* RTTVAR */
481                         long tmp = hctx->ccid2hctx_srtt - r;
482                         long srtt;
483
484                         if (tmp < 0)
485                                 tmp *= -1;
486
487                         tmp >>= 2;
488                         hctx->ccid2hctx_rttvar *= 3;
489                         hctx->ccid2hctx_rttvar >>= 2;
490                         hctx->ccid2hctx_rttvar += tmp;
491
492                         /* SRTT */
493                         srtt = hctx->ccid2hctx_srtt;
494                         srtt *= 7;
495                         srtt >>= 3;
496                         tmp = r >> 3;
497                         srtt += tmp;
498                         ccid2_change_srtt(hctx, srtt);
499                 }
500                 s = hctx->ccid2hctx_rttvar << 2;
501                 /* clock granularity is 1 when based on jiffies */
502                 if (!s)
503                         s = 1;
504                 hctx->ccid2hctx_rto = hctx->ccid2hctx_srtt + s;
505
506                 /* must be at least a second */
507                 s = hctx->ccid2hctx_rto / HZ;
508                 /* DCCP doesn't require this [but I like it cuz my code sux] */
509 #if 1
510                 if (s < 1)
511                         hctx->ccid2hctx_rto = HZ;
512 #endif
513                 /* max 60 seconds */
514                 if (s > 60)
515                         hctx->ccid2hctx_rto = HZ * 60;
516
517                 hctx->ccid2hctx_lastrtt = jiffies;
518
519                 ccid2_pr_debug("srtt: %ld rttvar: %ld rto: %ld (HZ=%d) R=%lu\n",
520                                hctx->ccid2hctx_srtt, hctx->ccid2hctx_rttvar,
521                                hctx->ccid2hctx_rto, HZ, r);
522                 hctx->ccid2hctx_sent = 0;
523         }
524
525         /* we got a new ack, so re-start RTO timer */
526         ccid2_hc_tx_kill_rto_timer(sk);
527         ccid2_start_rto_timer(sk);
528 }
529
530 static void ccid2_hc_tx_dec_pipe(struct sock *sk)
531 {
532         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
533
534         ccid2_change_pipe(hctx, hctx->ccid2hctx_pipe-1);
535         BUG_ON(hctx->ccid2hctx_pipe < 0);
536
537         if (hctx->ccid2hctx_pipe == 0)
538                 ccid2_hc_tx_kill_rto_timer(sk);
539 }
540
541 static void ccid2_congestion_event(struct ccid2_hc_tx_sock *hctx,
542                                    struct ccid2_seq *seqp)
543 {
544         if (time_before(seqp->ccid2s_sent, hctx->ccid2hctx_last_cong)) {
545                 ccid2_pr_debug("Multiple losses in an RTT---treating as one\n");
546                 return;
547         }
548
549         hctx->ccid2hctx_last_cong = jiffies;
550
551         ccid2_change_cwnd(hctx, hctx->ccid2hctx_cwnd >> 1);
552         hctx->ccid2hctx_ssthresh = hctx->ccid2hctx_cwnd;
553         if (hctx->ccid2hctx_ssthresh < 2)
554                 hctx->ccid2hctx_ssthresh = 2;
555 }
556
557 static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
558 {
559         struct dccp_sock *dp = dccp_sk(sk);
560         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
561         u64 ackno, seqno;
562         struct ccid2_seq *seqp;
563         unsigned char *vector;
564         unsigned char veclen;
565         int offset = 0;
566         int done = 0;
567         unsigned int maxincr = 0;
568
569         ccid2_hc_tx_check_sanity(hctx);
570         /* check reverse path congestion */
571         seqno = DCCP_SKB_CB(skb)->dccpd_seq;
572
573         /* XXX this whole "algorithm" is broken.  Need to fix it to keep track
574          * of the seqnos of the dupacks so that rpseq and rpdupack are correct
575          * -sorbo.
576          */
577         /* need to bootstrap */
578         if (hctx->ccid2hctx_rpdupack == -1) {
579                 hctx->ccid2hctx_rpdupack = 0;
580                 hctx->ccid2hctx_rpseq = seqno;
581         } else {
582                 /* check if packet is consecutive */
583                 if ((hctx->ccid2hctx_rpseq + 1) == seqno)
584                         hctx->ccid2hctx_rpseq++;
585                 /* it's a later packet */
586                 else if (after48(seqno, hctx->ccid2hctx_rpseq)) {
587                         hctx->ccid2hctx_rpdupack++;
588
589                         /* check if we got enough dupacks */
590                         if (hctx->ccid2hctx_rpdupack >=
591                             hctx->ccid2hctx_numdupack) {
592                                 hctx->ccid2hctx_rpdupack = -1; /* XXX lame */
593                                 hctx->ccid2hctx_rpseq = 0;
594
595                                 ccid2_change_l_ack_ratio(sk, dp->dccps_l_ack_ratio << 1);
596                         }
597                 }
598         }
599
600         /* check forward path congestion */
601         /* still didn't send out new data packets */
602         if (hctx->ccid2hctx_seqh == hctx->ccid2hctx_seqt)
603                 return;
604
605         switch (DCCP_SKB_CB(skb)->dccpd_type) {
606         case DCCP_PKT_ACK:
607         case DCCP_PKT_DATAACK:
608                 break;
609         default:
610                 return;
611         }
612
613         ackno = DCCP_SKB_CB(skb)->dccpd_ack_seq;
614         if (after48(ackno, hctx->ccid2hctx_high_ack))
615                 hctx->ccid2hctx_high_ack = ackno;
616
617         seqp = hctx->ccid2hctx_seqt;
618         while (before48(seqp->ccid2s_seq, ackno)) {
619                 seqp = seqp->ccid2s_next;
620                 if (seqp == hctx->ccid2hctx_seqh) {
621                         seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
622                         break;
623                 }
624         }
625
626         /* If in slow-start, cwnd can increase at most Ack Ratio / 2 packets for
627          * this single ack.  I round up.
628          * -sorbo.
629          */
630         maxincr = dp->dccps_l_ack_ratio >> 1;
631         maxincr++;
632
633         /* go through all ack vectors */
634         while ((offset = ccid2_ackvector(sk, skb, offset,
635                                          &vector, &veclen)) != -1) {
636                 /* go through this ack vector */
637                 while (veclen--) {
638                         const u8 rl = *vector & DCCP_ACKVEC_LEN_MASK;
639                         u64 ackno_end_rl;
640
641                         dccp_set_seqno(&ackno_end_rl, ackno - rl);
642                         ccid2_pr_debug("ackvec start:%llu end:%llu\n",
643                                        (unsigned long long)ackno,
644                                        (unsigned long long)ackno_end_rl);
645                         /* if the seqno we are analyzing is larger than the
646                          * current ackno, then move towards the tail of our
647                          * seqnos.
648                          */
649                         while (after48(seqp->ccid2s_seq, ackno)) {
650                                 if (seqp == hctx->ccid2hctx_seqt) {
651                                         done = 1;
652                                         break;
653                                 }
654                                 seqp = seqp->ccid2s_prev;
655                         }
656                         if (done)
657                                 break;
658
659                         /* check all seqnos in the range of the vector
660                          * run length
661                          */
662                         while (between48(seqp->ccid2s_seq,ackno_end_rl,ackno)) {
663                                 const u8 state = *vector &
664                                                  DCCP_ACKVEC_STATE_MASK;
665
666                                 /* new packet received or marked */
667                                 if (state != DCCP_ACKVEC_STATE_NOT_RECEIVED &&
668                                     !seqp->ccid2s_acked) {
669                                         if (state ==
670                                             DCCP_ACKVEC_STATE_ECN_MARKED) {
671                                                 ccid2_congestion_event(hctx,
672                                                                        seqp);
673                                         } else
674                                                 ccid2_new_ack(sk, seqp,
675                                                               &maxincr);
676
677                                         seqp->ccid2s_acked = 1;
678                                         ccid2_pr_debug("Got ack for %llu\n",
679                                                        (unsigned long long)seqp->ccid2s_seq);
680                                         ccid2_hc_tx_dec_pipe(sk);
681                                 }
682                                 if (seqp == hctx->ccid2hctx_seqt) {
683                                         done = 1;
684                                         break;
685                                 }
686                                 seqp = seqp->ccid2s_next;
687                         }
688                         if (done)
689                                 break;
690
691
692                         dccp_set_seqno(&ackno, ackno_end_rl - 1);
693                         vector++;
694                 }
695                 if (done)
696                         break;
697         }
698
699         /* The state about what is acked should be correct now
700          * Check for NUMDUPACK
701          */
702         seqp = hctx->ccid2hctx_seqt;
703         while (before48(seqp->ccid2s_seq, hctx->ccid2hctx_high_ack)) {
704                 seqp = seqp->ccid2s_next;
705                 if (seqp == hctx->ccid2hctx_seqh) {
706                         seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
707                         break;
708                 }
709         }
710         done = 0;
711         while (1) {
712                 if (seqp->ccid2s_acked) {
713                         done++;
714                         if (done == hctx->ccid2hctx_numdupack)
715                                 break;
716                 }
717                 if (seqp == hctx->ccid2hctx_seqt)
718                         break;
719                 seqp = seqp->ccid2s_prev;
720         }
721
722         /* If there are at least 3 acknowledgements, anything unacknowledged
723          * below the last sequence number is considered lost
724          */
725         if (done == hctx->ccid2hctx_numdupack) {
726                 struct ccid2_seq *last_acked = seqp;
727
728                 /* check for lost packets */
729                 while (1) {
730                         if (!seqp->ccid2s_acked) {
731                                 ccid2_pr_debug("Packet lost: %llu\n",
732                                                (unsigned long long)seqp->ccid2s_seq);
733                                 /* XXX need to traverse from tail -> head in
734                                  * order to detect multiple congestion events in
735                                  * one ack vector.
736                                  */
737                                 ccid2_congestion_event(hctx, seqp);
738                                 ccid2_hc_tx_dec_pipe(sk);
739                         }
740                         if (seqp == hctx->ccid2hctx_seqt)
741                                 break;
742                         seqp = seqp->ccid2s_prev;
743                 }
744
745                 hctx->ccid2hctx_seqt = last_acked;
746         }
747
748         /* trim acked packets in tail */
749         while (hctx->ccid2hctx_seqt != hctx->ccid2hctx_seqh) {
750                 if (!hctx->ccid2hctx_seqt->ccid2s_acked)
751                         break;
752
753                 hctx->ccid2hctx_seqt = hctx->ccid2hctx_seqt->ccid2s_next;
754         }
755
756         ccid2_hc_tx_check_sanity(hctx);
757 }
758
759 static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
760 {
761         struct ccid2_hc_tx_sock *hctx = ccid_priv(ccid);
762
763         ccid2_change_cwnd(hctx, 1);
764         /* Initialize ssthresh to infinity.  This means that we will exit the
765          * initial slow-start after the first packet loss.  This is what we
766          * want.
767          */
768         hctx->ccid2hctx_ssthresh  = ~0;
769         hctx->ccid2hctx_numdupack = 3;
770         hctx->ccid2hctx_seqbufc   = 0;
771
772         /* XXX init ~ to window size... */
773         if (ccid2_hc_tx_alloc_seq(hctx))
774                 return -ENOMEM;
775
776         hctx->ccid2hctx_sent     = 0;
777         hctx->ccid2hctx_rto      = 3 * HZ;
778         ccid2_change_srtt(hctx, -1);
779         hctx->ccid2hctx_rttvar   = -1;
780         hctx->ccid2hctx_lastrtt  = 0;
781         hctx->ccid2hctx_rpdupack = -1;
782         hctx->ccid2hctx_last_cong = jiffies;
783         hctx->ccid2hctx_high_ack = 0;
784
785         hctx->ccid2hctx_rtotimer.function = &ccid2_hc_tx_rto_expire;
786         hctx->ccid2hctx_rtotimer.data     = (unsigned long)sk;
787         init_timer(&hctx->ccid2hctx_rtotimer);
788
789         ccid2_hc_tx_check_sanity(hctx);
790         return 0;
791 }
792
793 static void ccid2_hc_tx_exit(struct sock *sk)
794 {
795         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
796         int i;
797
798         ccid2_hc_tx_kill_rto_timer(sk);
799
800         for (i = 0; i < hctx->ccid2hctx_seqbufc; i++)
801                 kfree(hctx->ccid2hctx_seqbuf[i]);
802         hctx->ccid2hctx_seqbufc = 0;
803 }
804
805 static void ccid2_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
806 {
807         const struct dccp_sock *dp = dccp_sk(sk);
808         struct ccid2_hc_rx_sock *hcrx = ccid2_hc_rx_sk(sk);
809
810         switch (DCCP_SKB_CB(skb)->dccpd_type) {
811         case DCCP_PKT_DATA:
812         case DCCP_PKT_DATAACK:
813                 hcrx->ccid2hcrx_data++;
814                 if (hcrx->ccid2hcrx_data >= dp->dccps_r_ack_ratio) {
815                         dccp_send_ack(sk);
816                         hcrx->ccid2hcrx_data = 0;
817                 }
818                 break;
819         }
820 }
821
822 static struct ccid_operations ccid2 = {
823         .ccid_id                = DCCPC_CCID2,
824         .ccid_name              = "ccid2",
825         .ccid_owner             = THIS_MODULE,
826         .ccid_hc_tx_obj_size    = sizeof(struct ccid2_hc_tx_sock),
827         .ccid_hc_tx_init        = ccid2_hc_tx_init,
828         .ccid_hc_tx_exit        = ccid2_hc_tx_exit,
829         .ccid_hc_tx_send_packet = ccid2_hc_tx_send_packet,
830         .ccid_hc_tx_packet_sent = ccid2_hc_tx_packet_sent,
831         .ccid_hc_tx_packet_recv = ccid2_hc_tx_packet_recv,
832         .ccid_hc_rx_obj_size    = sizeof(struct ccid2_hc_rx_sock),
833         .ccid_hc_rx_packet_recv = ccid2_hc_rx_packet_recv,
834 };
835
836 #ifdef CONFIG_IP_DCCP_CCID2_DEBUG
837 module_param(ccid2_debug, bool, 0444);
838 MODULE_PARM_DESC(ccid2_debug, "Enable debug messages");
839 #endif
840
841 static __init int ccid2_module_init(void)
842 {
843         return ccid_register(&ccid2);
844 }
845 module_init(ccid2_module_init);
846
847 static __exit void ccid2_module_exit(void)
848 {
849         ccid_unregister(&ccid2);
850 }
851 module_exit(ccid2_module_exit);
852
853 MODULE_AUTHOR("Andrea Bittau <a.bittau@cs.ucl.ac.uk>");
854 MODULE_DESCRIPTION("DCCP TCP-Like (CCID2) CCID");
855 MODULE_LICENSE("GPL");
856 MODULE_ALIAS("net-dccp-ccid-2");