From cef20db3c7871d7f0f83d735d680cfc327b38757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Fri, 15 Feb 2019 10:23:58 +0000 Subject: [PATCH] Correctly handle high latency paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- mud.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/mud.c b/mud.c index 6141ccf..a5fcf82 100644 --- a/mud.c +++ b/mud.c @@ -65,6 +65,7 @@ #define MUD_MSG_MARK(X) ((X) | UINT64_C(1)) #define MUD_MSG_TC (192) // CS6 #define MUD_MSG_SENT_MAX (10) +#define MUD_MSG_MIN_RTT (100 * MUD_ONE_MSEC) #define MUD_PKT_MIN_SIZE (MUD_U48_SIZE + MUD_MAC_SIZE) #define MUD_PKT_MAX_SIZE (1500U) @@ -75,7 +76,6 @@ #define MUD_TIME_BITS (48) #define MUD_TIME_MASK(X) ((X) & ((UINT64_C(1) << MUD_TIME_BITS) - 2)) -#define MUD_SEND_TIMEOUT (100 * MUD_ONE_MSEC) #define MUD_WINDOW_TIMEOUT ( 50 * MUD_ONE_MSEC) #define MUD_KEYX_TIMEOUT ( 60 * MUD_ONE_MIN) #define MUD_KEYX_RESET_TIMEOUT (200 * MUD_ONE_MSEC) @@ -1386,14 +1386,25 @@ mud_recv(struct mud *mud, void *data, size_t size) return MUD_MSG(send_time) ? 0 : ret; } +static uint64_t +mud_path_timeout(struct mud_path *path) +{ + if (!path->rtt.setup) + return MUD_MSG_MIN_RTT; + + const uint64_t rtt = (path->rtt.val + path->rtt.var) << 1; + + return rtt > MUD_MSG_MIN_RTT ? rtt : MUD_MSG_MIN_RTT; +} + static void mud_probe_mtu(struct mud *mud, struct mud_path *path, uint64_t now) { if (path->mtu.min > path->mtu.max) return; - if (path->mtu.count && path->rtt.setup && - !mud_timeout(now, path->mtu.time, path->rtt.val + 4 * path->rtt.var)) + if (path->mtu.count && + !mud_timeout(now, path->mtu.time, mud_path_timeout(path))) return; path->mtu.time = now; @@ -1455,7 +1466,7 @@ mud_update(struct mud *mud, uint64_t now) } if (mud->peer.set) { - if (mud_timeout(now, path->send.msg_time, MUD_SEND_TIMEOUT)) + if (mud_timeout(now, path->send.msg_time, mud_path_timeout(path))) mud_send_msg(mud, path, now, 0, 0, 0, 0); }