]> git.meshlink.io Git - utcp/commitdiff
Fix retransmission timeout calculation.
authorGuus Sliepen <guus@sliepen.org>
Mon, 14 Oct 2019 20:32:35 +0000 (22:32 +0200)
committerGuus Sliepen <guus@sliepen.org>
Mon, 14 Oct 2019 20:32:35 +0000 (22:32 +0200)
The RTO calculation was missing a factor 4 multiplication of the
RTT variance, which caused it to set the RTO to a much lower value than
specified by RFC 6298. This would result in more retranmissions and a
lower throughput.

utcp.c

diff --git a/utcp.c b/utcp.c
index f35f96560af29eaafcf67a95030884414d8e3cfd..802d95a2ba87ea3de46d9235176f5273361e6ca7 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -415,13 +415,13 @@ static void update_rtt(struct utcp_connection *c, uint32_t rtt) {
        if(!utcp->srtt) {
                utcp->srtt = rtt;
                utcp->rttvar = rtt / 2;
-               utcp->rto = rtt + max(2 * rtt, CLOCK_GRANULARITY);
        } else {
                utcp->rttvar = (utcp->rttvar * 3 + absdiff(utcp->srtt, rtt)) / 4;
                utcp->srtt = (utcp->srtt * 7 + rtt) / 8;
-               utcp->rto = utcp->srtt + max(utcp->rttvar, CLOCK_GRANULARITY);
        }
 
+       utcp->rto = utcp->srtt + max(4 * utcp->rttvar, CLOCK_GRANULARITY);
+
        if(utcp->rto > MAX_RTO) {
                utcp->rto = MAX_RTO;
        }