summaryrefslogtreecommitdiffstats
path: root/3rdparty/openpgm-svn-r1135-0003-fix-rdata-congestion-control.patch
blob: c6e721df4ae7f5030e52a325784d8df4afe6a889 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Problem: When enough lost data accumulates, RDATA packets are sent at
	 a massively reduced rate and block the congestion control
	 window for subsequent RDATA packets. This results in a
	 transmission rate of close to zero for up to 15 seconds in
	 experiments.
Solution: Allow sending of RDATA packets even when congestion control
	  would normally disallow it, but still consume a token if
	  there is one left.

diff -Naur openpgm-r1135-pristine/pgm/source.c openpgm-svn-r1135/pgm/source.c
--- openpgm-r1135-pristine/pgm/source.c	2010-09-09 03:24:47.000000000 +0200
+++ openpgm-svn-r1135/pgm/source.c	2010-09-24 17:40:12.000000000 +0200
@@ -2299,13 +2299,13 @@
 	header->pgm_checksum		= pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len));
 
 /* congestion control */
-	if (sock->use_pgmcc &&
-	    sock->tokens < pgm_fp8 (1))
-	{
+//	if (sock->use_pgmcc &&
+//	    sock->tokens < pgm_fp8 (1))
+//	{
 //		pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Token limit reached."));
-		sock->blocklen = tpdu_length;
-		return FALSE;
-	}
+//		sock->blocklen = tpdu_length;
+//		return FALSE;
+//	}
 
 	const ssize_t sent = pgm_sendto (sock,
 					 sock->is_controlled_rdata,	/* rate limited */
@@ -2323,7 +2323,8 @@
 	const pgm_time_t now = pgm_time_update_now();
 
 	if (sock->use_pgmcc) {
-		sock->tokens -= pgm_fp8 (1);
+		if (sock->tokens >= pgm_fp8 (1))
+			sock->tokens -= pgm_fp8 (1);
 		sock->ack_expiry = now + sock->ack_expiry_ivl;
 	}