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; }