[Patch 1/1] dccp: CCID2 increment cwnd correctly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch fixes an issue where CCID2 will not to increase the
congestion window for numerous RTTs after an idle period, application
limited period, or a loss once the algorithm is in congestion avoidance.

What happens is that when CCID2 is in congestion avoidance mode it will
increase hc->tx_packets_acked by one for every packet and will increment
cwnd every cwnd packets. However, if there is now an idle period in the
connection, cwnd will be reduced, possibly below the slow start
threshold. This will cause the connection to go into slow start.
However, in slow start CCID2 performs this test to increment cwnd every
second ack:
++hc->tx_packets_acked == 2
Unfortunately, this will be incorrect, if cwnd previous to the idle
period was larger than 2 and if tx_packets_acked was close to cwnd. For
example: cwnd=50 and tx_packets_acked=45.

In this case, the current code, will increment tx_packets_acked until it
equals two, which will only be once tx_packets_acked (an unsigned 32bit
int) overflows.

My fix is simply to change that test for tx_packets_acked greater than
or equal to two in slow start.


---
Signed-off-by: Samuel Jero
diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c
--- a/net/dccp/ccids/ccid2.c
+++ b/net/dccp/ccids/ccid2.c
@@ -440,7 +480,7 @@ static void ccid2_new_ack(struct sock *sk, struct ccid2_seq *seqp,
 	if (hc->tx_cwnd < dp->dccps_l_seq_win &&
 	    r_seq_used < dp->dccps_r_seq_win) {
 		if (hc->tx_cwnd < hc->tx_ssthresh) {
-			if (*maxincr > 0 && ++hc->tx_packets_acked == 2) {
+			if (*maxincr > 0 && ++hc->tx_packets_acked >= 2) {
 				hc->tx_cwnd += 1;
 				*maxincr    -= 1;
 				hc->tx_packets_acked = 0;

Attachment: signature.asc
Description: This is a digitally signed message part


[Index of Archives]     [Linux Kernel]     [IETF DCCP]     [Linux Networking]     [Git]     [Security]     [Linux Assembly]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux