summaryrefslogtreecommitdiff
path: root/src/lib/frct.c
diff options
context:
space:
mode:
authorDimitri Staessens <[email protected]>2022-04-01 21:07:16 +0200
committerSander Vrijders <[email protected]>2022-04-03 18:01:01 +0200
commit6180aa78409627325cbba1a2e751260410cac54f (patch)
tree306ecf26fea85c80b5379b7b4eeac8de589bdb5c /src/lib/frct.c
parentccfcc0efcff8b3460a7870541df09d537bfeae8f (diff)
downloadouroboros-6180aa78409627325cbba1a2e751260410cac54f.tar.gz
ouroboros-6180aa78409627325cbba1a2e751260410cac54f.zip
lib: Add support for Linux RTT estimator
This adds the option to use the Round-Trip-Time (RTT) estimation algorithm as it is implemented in the TCP implementation in Linux. It looks like it outperforms the TCP default algorithm, so I enabled this one by default. Also adds the option to change the RTO timeout calculation to include more (or less) than 4 times the mdev (specified as a power of 2. Left the default value to 2 (so, 4 mdevs), but 3 (8 mdevs) gives better results in my tests. Signed-off-by: Dimitri Staessens <[email protected]> Signed-off-by: Sander Vrijders <[email protected]>
Diffstat (limited to 'src/lib/frct.c')
-rw-r--r--src/lib/frct.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/lib/frct.c b/src/lib/frct.c
index b823b3fa..4effad3b 100644
--- a/src/lib/frct.c
+++ b/src/lib/frct.c
@@ -773,14 +773,19 @@ static void rtt_estimator(struct frcti * frcti,
} else {
time_t delta = mrtt - srtt;
srtt += (delta >> 3);
- rttvar += (ABS(delta) - rttvar) >> 2;
+ delta = (ABS(delta) - rttvar) >> 2;
+#ifdef FRCT_LINUX_RTT_ESTIMATOR
+ if (delta < 0)
+ delta >>= 3;
+#endif
+ rttvar += delta;
}
#ifdef PROC_FLOW_STATS
frcti->n_rtt++;
#endif
frcti->srtt = MAX(1000U, srtt);
frcti->mdev = MAX(100U, rttvar);
- frcti->rto = MAX(RTO_MIN, frcti->srtt + (frcti->mdev << 3));
+ frcti->rto = MAX(RTO_MIN, frcti->srtt + (frcti->mdev << MDEV_MUL));
}
/* Always queues the next application packet on the RQ. */