]> err.no Git - linux-2.6/blob - net/dccp/ccids/ccid2.c
5114a2d30bfd0cb277a2ed4f67cae9fc12ffae10
[linux-2.6] / 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, u32 val)
183 {
184         /* XXX do we need to change ack ratio? */
185         hctx->ccid2hctx_cwnd = val? : 1;
186         ccid2_pr_debug("changed cwnd to %u\n", hctx->ccid2hctx_cwnd);
187 }
188
189 static void ccid2_change_srtt(struct ccid2_hc_tx_sock *hctx, long val)
190 {
191         ccid2_pr_debug("change SRTT to %ld\n", val);
192         hctx->ccid2hctx_srtt = val;
193 }
194
195 static void ccid2_change_pipe(struct ccid2_hc_tx_sock *hctx, long val)
196 {
197         hctx->ccid2hctx_pipe = val;
198 }
199
200 static void ccid2_start_rto_timer(struct sock *sk);
201
202 static void ccid2_hc_tx_rto_expire(unsigned long data)
203 {
204         struct sock *sk = (struct sock *)data;
205         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
206         long s;
207
208         bh_lock_sock(sk);
209         if (sock_owned_by_user(sk)) {
210                 sk_reset_timer(sk, &hctx->ccid2hctx_rtotimer,
211                                jiffies + HZ / 5);
212                 goto out;
213         }
214
215         ccid2_pr_debug("RTO_EXPIRE\n");
216
217         ccid2_hc_tx_check_sanity(hctx);
218
219         /* back-off timer */
220         hctx->ccid2hctx_rto <<= 1;
221
222         s = hctx->ccid2hctx_rto / HZ;
223         if (s > 60)
224                 hctx->ccid2hctx_rto = 60 * HZ;
225
226         ccid2_start_rto_timer(sk);
227
228         /* adjust pipe, cwnd etc */
229         ccid2_change_pipe(hctx, 0);
230         hctx->ccid2hctx_ssthresh = hctx->ccid2hctx_cwnd >> 1;
231         if (hctx->ccid2hctx_ssthresh < 2)
232                 hctx->ccid2hctx_ssthresh = 2;
233         ccid2_change_cwnd(hctx, 1);
234
235         /* clear state about stuff we sent */
236         hctx->ccid2hctx_seqt    = hctx->ccid2hctx_seqh;
237         hctx->ccid2hctx_ssacks  = 0;
238         hctx->ccid2hctx_acks    = 0;
239         hctx->ccid2hctx_sent    = 0;
240
241         /* clear ack ratio state. */
242         hctx->ccid2hctx_arsent   = 0;
243         hctx->ccid2hctx_ackloss  = 0;
244         hctx->ccid2hctx_rpseq    = 0;
245         hctx->ccid2hctx_rpdupack = -1;
246         ccid2_change_l_ack_ratio(sk, 1);
247         ccid2_hc_tx_check_sanity(hctx);
248 out:
249         bh_unlock_sock(sk);
250         sock_put(sk);
251 }
252
253 static void ccid2_start_rto_timer(struct sock *sk)
254 {
255         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
256
257         ccid2_pr_debug("setting RTO timeout=%ld\n", hctx->ccid2hctx_rto);
258
259         BUG_ON(timer_pending(&hctx->ccid2hctx_rtotimer));
260         sk_reset_timer(sk, &hctx->ccid2hctx_rtotimer,
261                        jiffies + hctx->ccid2hctx_rto);
262 }
263
264 static void ccid2_hc_tx_packet_sent(struct sock *sk, int more, unsigned int len)
265 {
266         struct dccp_sock *dp = dccp_sk(sk);
267         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
268         struct ccid2_seq *next;
269         u64 seq;
270
271         ccid2_hc_tx_check_sanity(hctx);
272
273         BUG_ON(!hctx->ccid2hctx_sendwait);
274         hctx->ccid2hctx_sendwait = 0;
275         ccid2_change_pipe(hctx, hctx->ccid2hctx_pipe + 1);
276         BUG_ON(hctx->ccid2hctx_pipe < 0);
277
278         /* There is an issue.  What if another packet is sent between
279          * packet_send() and packet_sent().  Then the sequence number would be
280          * wrong.
281          * -sorbo.
282          */
283         seq = dp->dccps_gss;
284
285         hctx->ccid2hctx_seqh->ccid2s_seq   = seq;
286         hctx->ccid2hctx_seqh->ccid2s_acked = 0;
287         hctx->ccid2hctx_seqh->ccid2s_sent  = jiffies;
288
289         next = hctx->ccid2hctx_seqh->ccid2s_next;
290         /* check if we need to alloc more space */
291         if (next == hctx->ccid2hctx_seqt) {
292                 if (ccid2_hc_tx_alloc_seq(hctx)) {
293                         DCCP_CRIT("packet history - out of memory!");
294                         /* FIXME: find a more graceful way to bail out */
295                         return;
296                 }
297                 next = hctx->ccid2hctx_seqh->ccid2s_next;
298                 BUG_ON(next == hctx->ccid2hctx_seqt);
299         }
300         hctx->ccid2hctx_seqh = next;
301
302         ccid2_pr_debug("cwnd=%d pipe=%d\n", hctx->ccid2hctx_cwnd,
303                        hctx->ccid2hctx_pipe);
304
305         hctx->ccid2hctx_sent++;
306
307         /* Ack Ratio.  Need to maintain a concept of how many windows we sent */
308         hctx->ccid2hctx_arsent++;
309         /* We had an ack loss in this window... */
310         if (hctx->ccid2hctx_ackloss) {
311                 if (hctx->ccid2hctx_arsent >= hctx->ccid2hctx_cwnd) {
312                         hctx->ccid2hctx_arsent  = 0;
313                         hctx->ccid2hctx_ackloss = 0;
314                 }
315         } else {
316                 /* No acks lost up to now... */
317                 /* decrease ack ratio if enough packets were sent */
318                 if (dp->dccps_l_ack_ratio > 1) {
319                         /* XXX don't calculate denominator each time */
320                         int denom = dp->dccps_l_ack_ratio * dp->dccps_l_ack_ratio -
321                                     dp->dccps_l_ack_ratio;
322
323                         denom = hctx->ccid2hctx_cwnd * hctx->ccid2hctx_cwnd / denom;
324
325                         if (hctx->ccid2hctx_arsent >= denom) {
326                                 ccid2_change_l_ack_ratio(sk, dp->dccps_l_ack_ratio - 1);
327                                 hctx->ccid2hctx_arsent = 0;
328                         }
329                 } else {
330                         /* we can't increase ack ratio further [1] */
331                         hctx->ccid2hctx_arsent = 0; /* or maybe set it to cwnd*/
332                 }
333         }
334
335         /* setup RTO timer */
336         if (!timer_pending(&hctx->ccid2hctx_rtotimer))
337                 ccid2_start_rto_timer(sk);
338
339 #ifdef CONFIG_IP_DCCP_CCID2_DEBUG
340         ccid2_pr_debug("pipe=%d\n", hctx->ccid2hctx_pipe);
341         ccid2_pr_debug("Sent: seq=%llu\n", (unsigned long long)seq);
342         do {
343                 struct ccid2_seq *seqp = hctx->ccid2hctx_seqt;
344
345                 while (seqp != hctx->ccid2hctx_seqh) {
346                         ccid2_pr_debug("out seq=%llu acked=%d time=%lu\n",
347                                        (unsigned long long)seqp->ccid2s_seq,
348                                        seqp->ccid2s_acked, seqp->ccid2s_sent);
349                         seqp = seqp->ccid2s_next;
350                 }
351         } while (0);
352         ccid2_pr_debug("=========\n");
353         ccid2_hc_tx_check_sanity(hctx);
354 #endif
355 }
356
357 /* XXX Lame code duplication!
358  * returns -1 if none was found.
359  * else returns the next offset to use in the function call.
360  */
361 static int ccid2_ackvector(struct sock *sk, struct sk_buff *skb, int offset,
362                            unsigned char **vec, unsigned char *veclen)
363 {
364         const struct dccp_hdr *dh = dccp_hdr(skb);
365         unsigned char *options = (unsigned char *)dh + dccp_hdr_len(skb);
366         unsigned char *opt_ptr;
367         const unsigned char *opt_end = (unsigned char *)dh +
368                                         (dh->dccph_doff * 4);
369         unsigned char opt, len;
370         unsigned char *value;
371
372         BUG_ON(offset < 0);
373         options += offset;
374         opt_ptr = options;
375         if (opt_ptr >= opt_end)
376                 return -1;
377
378         while (opt_ptr != opt_end) {
379                 opt   = *opt_ptr++;
380                 len   = 0;
381                 value = NULL;
382
383                 /* Check if this isn't a single byte option */
384                 if (opt > DCCPO_MAX_RESERVED) {
385                         if (opt_ptr == opt_end)
386                                 goto out_invalid_option;
387
388                         len = *opt_ptr++;
389                         if (len < 3)
390                                 goto out_invalid_option;
391                         /*
392                          * Remove the type and len fields, leaving
393                          * just the value size
394                          */
395                         len     -= 2;
396                         value   = opt_ptr;
397                         opt_ptr += len;
398
399                         if (opt_ptr > opt_end)
400                                 goto out_invalid_option;
401                 }
402
403                 switch (opt) {
404                 case DCCPO_ACK_VECTOR_0:
405                 case DCCPO_ACK_VECTOR_1:
406                         *vec    = value;
407                         *veclen = len;
408                         return offset + (opt_ptr - options);
409                 }
410         }
411
412         return -1;
413
414 out_invalid_option:
415         DCCP_BUG("Invalid option - this should not happen (previous parsing)!");
416         return -1;
417 }
418
419 static void ccid2_hc_tx_kill_rto_timer(struct sock *sk)
420 {
421         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
422
423         sk_stop_timer(sk, &hctx->ccid2hctx_rtotimer);
424         ccid2_pr_debug("deleted RTO timer\n");
425 }
426
427 static inline void ccid2_new_ack(struct sock *sk,
428                                  struct ccid2_seq *seqp,
429                                  unsigned int *maxincr)
430 {
431         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
432
433         /* slow start */
434         if (hctx->ccid2hctx_cwnd < hctx->ccid2hctx_ssthresh) {
435                 hctx->ccid2hctx_acks = 0;
436
437                 /* We can increase cwnd at most maxincr [ack_ratio/2] */
438                 if (*maxincr) {
439                         /* increase every 2 acks */
440                         hctx->ccid2hctx_ssacks++;
441                         if (hctx->ccid2hctx_ssacks == 2) {
442                                 ccid2_change_cwnd(hctx, hctx->ccid2hctx_cwnd+1);
443                                 hctx->ccid2hctx_ssacks = 0;
444                                 *maxincr = *maxincr - 1;
445                         }
446                 } else {
447                         /* increased cwnd enough for this single ack */
448                         hctx->ccid2hctx_ssacks = 0;
449                 }
450         } else {
451                 hctx->ccid2hctx_ssacks = 0;
452                 hctx->ccid2hctx_acks++;
453
454                 if (hctx->ccid2hctx_acks >= hctx->ccid2hctx_cwnd) {
455                         ccid2_change_cwnd(hctx, hctx->ccid2hctx_cwnd + 1);
456                         hctx->ccid2hctx_acks = 0;
457                 }
458         }
459
460         /* update RTO */
461         if (hctx->ccid2hctx_srtt == -1 ||
462             time_after(jiffies, hctx->ccid2hctx_lastrtt + hctx->ccid2hctx_srtt)) {
463                 unsigned long r = (long)jiffies - (long)seqp->ccid2s_sent;
464                 int s;
465
466                 /* first measurement */
467                 if (hctx->ccid2hctx_srtt == -1) {
468                         ccid2_pr_debug("R: %lu Time=%lu seq=%llu\n",
469                                        r, jiffies,
470                                        (unsigned long long)seqp->ccid2s_seq);
471                         ccid2_change_srtt(hctx, r);
472                         hctx->ccid2hctx_rttvar = r >> 1;
473                 } else {
474                         /* RTTVAR */
475                         long tmp = hctx->ccid2hctx_srtt - r;
476                         long srtt;
477
478                         if (tmp < 0)
479                                 tmp *= -1;
480
481                         tmp >>= 2;
482                         hctx->ccid2hctx_rttvar *= 3;
483                         hctx->ccid2hctx_rttvar >>= 2;
484                         hctx->ccid2hctx_rttvar += tmp;
485
486                         /* SRTT */
487                         srtt = hctx->ccid2hctx_srtt;
488                         srtt *= 7;
489                         srtt >>= 3;
490                         tmp = r >> 3;
491                         srtt += tmp;
492                         ccid2_change_srtt(hctx, srtt);
493                 }
494                 s = hctx->ccid2hctx_rttvar << 2;
495                 /* clock granularity is 1 when based on jiffies */
496                 if (!s)
497                         s = 1;
498                 hctx->ccid2hctx_rto = hctx->ccid2hctx_srtt + s;
499
500                 /* must be at least a second */
501                 s = hctx->ccid2hctx_rto / HZ;
502                 /* DCCP doesn't require this [but I like it cuz my code sux] */
503 #if 1
504                 if (s < 1)
505                         hctx->ccid2hctx_rto = HZ;
506 #endif
507                 /* max 60 seconds */
508                 if (s > 60)
509                         hctx->ccid2hctx_rto = HZ * 60;
510
511                 hctx->ccid2hctx_lastrtt = jiffies;
512
513                 ccid2_pr_debug("srtt: %ld rttvar: %ld rto: %ld (HZ=%d) R=%lu\n",
514                                hctx->ccid2hctx_srtt, hctx->ccid2hctx_rttvar,
515                                hctx->ccid2hctx_rto, HZ, r);
516                 hctx->ccid2hctx_sent = 0;
517         }
518
519         /* we got a new ack, so re-start RTO timer */
520         ccid2_hc_tx_kill_rto_timer(sk);
521         ccid2_start_rto_timer(sk);
522 }
523
524 static void ccid2_hc_tx_dec_pipe(struct sock *sk)
525 {
526         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
527
528         ccid2_change_pipe(hctx, hctx->ccid2hctx_pipe-1);
529         BUG_ON(hctx->ccid2hctx_pipe < 0);
530
531         if (hctx->ccid2hctx_pipe == 0)
532                 ccid2_hc_tx_kill_rto_timer(sk);
533 }
534
535 static void ccid2_congestion_event(struct ccid2_hc_tx_sock *hctx,
536                                    struct ccid2_seq *seqp)
537 {
538         if (time_before(seqp->ccid2s_sent, hctx->ccid2hctx_last_cong)) {
539                 ccid2_pr_debug("Multiple losses in an RTT---treating as one\n");
540                 return;
541         }
542
543         hctx->ccid2hctx_last_cong = jiffies;
544
545         ccid2_change_cwnd(hctx, hctx->ccid2hctx_cwnd >> 1);
546         hctx->ccid2hctx_ssthresh = hctx->ccid2hctx_cwnd;
547         if (hctx->ccid2hctx_ssthresh < 2)
548                 hctx->ccid2hctx_ssthresh = 2;
549 }
550
551 static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
552 {
553         struct dccp_sock *dp = dccp_sk(sk);
554         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
555         u64 ackno, seqno;
556         struct ccid2_seq *seqp;
557         unsigned char *vector;
558         unsigned char veclen;
559         int offset = 0;
560         int done = 0;
561         unsigned int maxincr = 0;
562
563         ccid2_hc_tx_check_sanity(hctx);
564         /* check reverse path congestion */
565         seqno = DCCP_SKB_CB(skb)->dccpd_seq;
566
567         /* XXX this whole "algorithm" is broken.  Need to fix it to keep track
568          * of the seqnos of the dupacks so that rpseq and rpdupack are correct
569          * -sorbo.
570          */
571         /* need to bootstrap */
572         if (hctx->ccid2hctx_rpdupack == -1) {
573                 hctx->ccid2hctx_rpdupack = 0;
574                 hctx->ccid2hctx_rpseq = seqno;
575         } else {
576                 /* check if packet is consecutive */
577                 if ((hctx->ccid2hctx_rpseq + 1) == seqno)
578                         hctx->ccid2hctx_rpseq++;
579                 /* it's a later packet */
580                 else if (after48(seqno, hctx->ccid2hctx_rpseq)) {
581                         hctx->ccid2hctx_rpdupack++;
582
583                         /* check if we got enough dupacks */
584                         if (hctx->ccid2hctx_rpdupack >=
585                             hctx->ccid2hctx_numdupack) {
586                                 hctx->ccid2hctx_rpdupack = -1; /* XXX lame */
587                                 hctx->ccid2hctx_rpseq = 0;
588
589                                 ccid2_change_l_ack_ratio(sk, dp->dccps_l_ack_ratio << 1);
590                         }
591                 }
592         }
593
594         /* check forward path congestion */
595         /* still didn't send out new data packets */
596         if (hctx->ccid2hctx_seqh == hctx->ccid2hctx_seqt)
597                 return;
598
599         switch (DCCP_SKB_CB(skb)->dccpd_type) {
600         case DCCP_PKT_ACK:
601         case DCCP_PKT_DATAACK:
602                 break;
603         default:
604                 return;
605         }
606
607         ackno = DCCP_SKB_CB(skb)->dccpd_ack_seq;
608         if (after48(ackno, hctx->ccid2hctx_high_ack))
609                 hctx->ccid2hctx_high_ack = ackno;
610
611         seqp = hctx->ccid2hctx_seqt;
612         while (before48(seqp->ccid2s_seq, ackno)) {
613                 seqp = seqp->ccid2s_next;
614                 if (seqp == hctx->ccid2hctx_seqh) {
615                         seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
616                         break;
617                 }
618         }
619
620         /* If in slow-start, cwnd can increase at most Ack Ratio / 2 packets for
621          * this single ack.  I round up.
622          * -sorbo.
623          */
624         maxincr = dp->dccps_l_ack_ratio >> 1;
625         maxincr++;
626
627         /* go through all ack vectors */
628         while ((offset = ccid2_ackvector(sk, skb, offset,
629                                          &vector, &veclen)) != -1) {
630                 /* go through this ack vector */
631                 while (veclen--) {
632                         const u8 rl = *vector & DCCP_ACKVEC_LEN_MASK;
633                         u64 ackno_end_rl;
634
635                         dccp_set_seqno(&ackno_end_rl, ackno - rl);
636                         ccid2_pr_debug("ackvec start:%llu end:%llu\n",
637                                        (unsigned long long)ackno,
638                                        (unsigned long long)ackno_end_rl);
639                         /* if the seqno we are analyzing is larger than the
640                          * current ackno, then move towards the tail of our
641                          * seqnos.
642                          */
643                         while (after48(seqp->ccid2s_seq, ackno)) {
644                                 if (seqp == hctx->ccid2hctx_seqt) {
645                                         done = 1;
646                                         break;
647                                 }
648                                 seqp = seqp->ccid2s_prev;
649                         }
650                         if (done)
651                                 break;
652
653                         /* check all seqnos in the range of the vector
654                          * run length
655                          */
656                         while (between48(seqp->ccid2s_seq,ackno_end_rl,ackno)) {
657                                 const u8 state = *vector &
658                                                  DCCP_ACKVEC_STATE_MASK;
659
660                                 /* new packet received or marked */
661                                 if (state != DCCP_ACKVEC_STATE_NOT_RECEIVED &&
662                                     !seqp->ccid2s_acked) {
663                                         if (state ==
664                                             DCCP_ACKVEC_STATE_ECN_MARKED) {
665                                                 ccid2_congestion_event(hctx,
666                                                                        seqp);
667                                         } else
668                                                 ccid2_new_ack(sk, seqp,
669                                                               &maxincr);
670
671                                         seqp->ccid2s_acked = 1;
672                                         ccid2_pr_debug("Got ack for %llu\n",
673                                                        (unsigned long long)seqp->ccid2s_seq);
674                                         ccid2_hc_tx_dec_pipe(sk);
675                                 }
676                                 if (seqp == hctx->ccid2hctx_seqt) {
677                                         done = 1;
678                                         break;
679                                 }
680                                 seqp = seqp->ccid2s_next;
681                         }
682                         if (done)
683                                 break;
684
685
686                         dccp_set_seqno(&ackno, ackno_end_rl - 1);
687                         vector++;
688                 }
689                 if (done)
690                         break;
691         }
692
693         /* The state about what is acked should be correct now
694          * Check for NUMDUPACK
695          */
696         seqp = hctx->ccid2hctx_seqt;
697         while (before48(seqp->ccid2s_seq, hctx->ccid2hctx_high_ack)) {
698                 seqp = seqp->ccid2s_next;
699                 if (seqp == hctx->ccid2hctx_seqh) {
700                         seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
701                         break;
702                 }
703         }
704         done = 0;
705         while (1) {
706                 if (seqp->ccid2s_acked) {
707                         done++;
708                         if (done == hctx->ccid2hctx_numdupack)
709                                 break;
710                 }
711                 if (seqp == hctx->ccid2hctx_seqt)
712                         break;
713                 seqp = seqp->ccid2s_prev;
714         }
715
716         /* If there are at least 3 acknowledgements, anything unacknowledged
717          * below the last sequence number is considered lost
718          */
719         if (done == hctx->ccid2hctx_numdupack) {
720                 struct ccid2_seq *last_acked = seqp;
721
722                 /* check for lost packets */
723                 while (1) {
724                         if (!seqp->ccid2s_acked) {
725                                 ccid2_pr_debug("Packet lost: %llu\n",
726                                                (unsigned long long)seqp->ccid2s_seq);
727                                 /* XXX need to traverse from tail -> head in
728                                  * order to detect multiple congestion events in
729                                  * one ack vector.
730                                  */
731                                 ccid2_congestion_event(hctx, seqp);
732                                 ccid2_hc_tx_dec_pipe(sk);
733                         }
734                         if (seqp == hctx->ccid2hctx_seqt)
735                                 break;
736                         seqp = seqp->ccid2s_prev;
737                 }
738
739                 hctx->ccid2hctx_seqt = last_acked;
740         }
741
742         /* trim acked packets in tail */
743         while (hctx->ccid2hctx_seqt != hctx->ccid2hctx_seqh) {
744                 if (!hctx->ccid2hctx_seqt->ccid2s_acked)
745                         break;
746
747                 hctx->ccid2hctx_seqt = hctx->ccid2hctx_seqt->ccid2s_next;
748         }
749
750         ccid2_hc_tx_check_sanity(hctx);
751 }
752
753 static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
754 {
755         struct ccid2_hc_tx_sock *hctx = ccid_priv(ccid);
756
757         ccid2_change_cwnd(hctx, 1);
758         /* Initialize ssthresh to infinity.  This means that we will exit the
759          * initial slow-start after the first packet loss.  This is what we
760          * want.
761          */
762         hctx->ccid2hctx_ssthresh  = ~0;
763         hctx->ccid2hctx_numdupack = 3;
764         hctx->ccid2hctx_seqbufc   = 0;
765
766         /* XXX init ~ to window size... */
767         if (ccid2_hc_tx_alloc_seq(hctx))
768                 return -ENOMEM;
769
770         hctx->ccid2hctx_sent     = 0;
771         hctx->ccid2hctx_rto      = 3 * HZ;
772         ccid2_change_srtt(hctx, -1);
773         hctx->ccid2hctx_rttvar   = -1;
774         hctx->ccid2hctx_lastrtt  = 0;
775         hctx->ccid2hctx_rpdupack = -1;
776         hctx->ccid2hctx_last_cong = jiffies;
777         hctx->ccid2hctx_high_ack = 0;
778
779         hctx->ccid2hctx_rtotimer.function = &ccid2_hc_tx_rto_expire;
780         hctx->ccid2hctx_rtotimer.data     = (unsigned long)sk;
781         init_timer(&hctx->ccid2hctx_rtotimer);
782
783         ccid2_hc_tx_check_sanity(hctx);
784         return 0;
785 }
786
787 static void ccid2_hc_tx_exit(struct sock *sk)
788 {
789         struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
790         int i;
791
792         ccid2_hc_tx_kill_rto_timer(sk);
793
794         for (i = 0; i < hctx->ccid2hctx_seqbufc; i++)
795                 kfree(hctx->ccid2hctx_seqbuf[i]);
796         hctx->ccid2hctx_seqbufc = 0;
797 }
798
799 static void ccid2_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
800 {
801         const struct dccp_sock *dp = dccp_sk(sk);
802         struct ccid2_hc_rx_sock *hcrx = ccid2_hc_rx_sk(sk);
803
804         switch (DCCP_SKB_CB(skb)->dccpd_type) {
805         case DCCP_PKT_DATA:
806         case DCCP_PKT_DATAACK:
807                 hcrx->ccid2hcrx_data++;
808                 if (hcrx->ccid2hcrx_data >= dp->dccps_r_ack_ratio) {
809                         dccp_send_ack(sk);
810                         hcrx->ccid2hcrx_data = 0;
811                 }
812                 break;
813         }
814 }
815
816 static struct ccid_operations ccid2 = {
817         .ccid_id                = DCCPC_CCID2,
818         .ccid_name              = "ccid2",
819         .ccid_owner             = THIS_MODULE,
820         .ccid_hc_tx_obj_size    = sizeof(struct ccid2_hc_tx_sock),
821         .ccid_hc_tx_init        = ccid2_hc_tx_init,
822         .ccid_hc_tx_exit        = ccid2_hc_tx_exit,
823         .ccid_hc_tx_send_packet = ccid2_hc_tx_send_packet,
824         .ccid_hc_tx_packet_sent = ccid2_hc_tx_packet_sent,
825         .ccid_hc_tx_packet_recv = ccid2_hc_tx_packet_recv,
826         .ccid_hc_rx_obj_size    = sizeof(struct ccid2_hc_rx_sock),
827         .ccid_hc_rx_packet_recv = ccid2_hc_rx_packet_recv,
828 };
829
830 #ifdef CONFIG_IP_DCCP_CCID2_DEBUG
831 module_param(ccid2_debug, bool, 0444);
832 MODULE_PARM_DESC(ccid2_debug, "Enable debug messages");
833 #endif
834
835 static __init int ccid2_module_init(void)
836 {
837         return ccid_register(&ccid2);
838 }
839 module_init(ccid2_module_init);
840
841 static __exit void ccid2_module_exit(void)
842 {
843         ccid_unregister(&ccid2);
844 }
845 module_exit(ccid2_module_exit);
846
847 MODULE_AUTHOR("Andrea Bittau <a.bittau@cs.ucl.ac.uk>");
848 MODULE_DESCRIPTION("DCCP TCP-Like (CCID2) CCID");
849 MODULE_LICENSE("GPL");
850 MODULE_ALIAS("net-dccp-ccid-2");