hctx->ccid2hctx_pipe     = 0;
 
        /* clear state about stuff we sent */
-       hctx->ccid2hctx_seqt    = hctx->ccid2hctx_seqh;
-       hctx->ccid2hctx_ssacks  = 0;
-       hctx->ccid2hctx_acks    = 0;
+       hctx->ccid2hctx_seqt = hctx->ccid2hctx_seqh;
+       hctx->ccid2hctx_packets_acked = 0;
 
        /* clear ack ratio state. */
        hctx->ccid2hctx_rpseq    = 0;
 {
        struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
 
-       /* slow start */
        if (hctx->ccid2hctx_cwnd < hctx->ccid2hctx_ssthresh) {
-               hctx->ccid2hctx_acks = 0;
-
-               /* We can increase cwnd at most maxincr [ack_ratio/2] */
-               if (*maxincr) {
-                       /* increase every 2 acks */
-                       hctx->ccid2hctx_ssacks++;
-                       if (hctx->ccid2hctx_ssacks == 2) {
-                               hctx->ccid2hctx_cwnd++;
-                               hctx->ccid2hctx_ssacks = 0;
-                               *maxincr = *maxincr - 1;
-                       }
-               } else {
-                       /* increased cwnd enough for this single ack */
-                       hctx->ccid2hctx_ssacks = 0;
-               }
-       } else {
-               hctx->ccid2hctx_ssacks = 0;
-               hctx->ccid2hctx_acks++;
-
-               if (hctx->ccid2hctx_acks >= hctx->ccid2hctx_cwnd) {
-                       hctx->ccid2hctx_cwnd++;
-                       hctx->ccid2hctx_acks = 0;
+               if (*maxincr > 0 && ++hctx->ccid2hctx_packets_acked == 2) {
+                       hctx->ccid2hctx_cwnd += 1;
+                       *maxincr             -= 1;
+                       hctx->ccid2hctx_packets_acked = 0;
                }
+       } else if (++hctx->ccid2hctx_packets_acked >= hctx->ccid2hctx_cwnd) {
+                       hctx->ccid2hctx_cwnd += 1;
+                       hctx->ccid2hctx_packets_acked = 0;
        }
 
        /* update RTO */
                }
        }
 
-       /* If in slow-start, cwnd can increase at most Ack Ratio / 2 packets for
-        * this single ack.  I round up.
-        * -sorbo.
+       /*
+        * In slow-start, cwnd can increase up to a maximum of Ack Ratio/2
+        * packets per acknowledgement. Rounding up avoids that cwnd is not
+        * advanced when Ack Ratio is 1 and gives a slight edge otherwise.
         */
-       maxincr = dp->dccps_l_ack_ratio >> 1;
-       maxincr++;
+       if (hctx->ccid2hctx_cwnd < hctx->ccid2hctx_ssthresh)
+               maxincr = DIV_ROUND_UP(dp->dccps_l_ack_ratio, 2);
 
        /* go through all ack vectors */
        while ((offset = ccid2_ackvector(sk, skb, offset,
 
 /** struct ccid2_hc_tx_sock - CCID2 TX half connection
  *
  * @ccid2hctx_{cwnd,ssthresh,pipe}: as per RFC 4341, section 5
- * @ccid2hctx_ssacks - ACKs recv in slow start
- * @ccid2hctx_acks - ACKS recv in AI phase
+ * @ccid2hctx_packets_acked - Ack counter for deriving cwnd growth (RFC 3465)
  * @ccid2hctx_lastrtt -time RTT was last measured
  * @ccid2hctx_rpseq - last consecutive seqno
  * @ccid2hctx_rpdupack - dupacks since rpseq
        u32                     ccid2hctx_cwnd;
        u32                     ccid2hctx_ssthresh;
        u32                     ccid2hctx_pipe;
-       int                     ccid2hctx_ssacks;
-       int                     ccid2hctx_acks;
+       u32                     ccid2hctx_packets_acked;
        struct ccid2_seq        *ccid2hctx_seqbuf[CCID2_SEQBUF_MAX];
        int                     ccid2hctx_seqbufc;
        struct ccid2_seq        *ccid2hctx_seqh;