From a87a277701cc51517b7ddacb062fa15208652eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Thu, 2 Jan 2020 15:04:40 +0000 Subject: [PATCH] Cleanup path after a 1min silence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- mud.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/mud.c b/mud.c index 264a50e..91e7945 100644 --- a/mud.c +++ b/mud.c @@ -571,13 +571,6 @@ mud_reset_path(struct mud_path *path) path->mtu.probe = 0; } -static void -mud_remove_path(struct mud_path *path) -{ - memset(path, 0, sizeof(struct mud_path)); - path->state = MUD_EMPTY; -} - static struct mud_path * mud_get_path(struct mud *mud, struct sockaddr_storage *local_addr, struct sockaddr_storage *addr, int create) @@ -1397,6 +1390,23 @@ mud_recv(struct mud *mud, void *data, size_t size) return MUD_MSG(sent_time) ? 0 : ret; } +static int +mud_cleanup_path(struct mud *mud, uint64_t now, struct mud_path *path) +{ + if (path->state < MUD_DOWN) + return 1; + + if (mud->peer.set && path->state > MUD_DOWN) + return 0; + + if (mud_timeout(now, path->rx.time, MUD_ONE_MIN)) { + memset(path, 0, sizeof(struct mud_path)); + path->state = MUD_EMPTY; + } + + return path->state <= MUD_DOWN; +} + static int mud_update(struct mud *mud) { @@ -1413,16 +1423,7 @@ mud_update(struct mud *mud) for (unsigned i = 0; i < mud->count; i++) { struct mud_path *path = &mud->paths[i]; - if (path->state < MUD_DOWN) - continue; - - if ((path->state == MUD_DOWN || !mud->peer.set) && - (mud_timeout(now, path->rx.time, 10 * MUD_ONE_SEC))) { - mud_remove_path(path); - continue; - } - - if (path->state <= MUD_DOWN) + if (mud_cleanup_path(mud, now, path)) continue; path->ok = 0;