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