blob: c6e721df4ae7f5030e52a325784d8df4afe6a889 (
plain) (
tree)
|
|
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;
}
|