]> git.meshlink.io Git - utcp/commitdiff
Don't reset timers that were not set in utcp_reset_timers() and utcp_offline().
authorGuus Sliepen <guus@sliepen.org>
Thu, 10 Oct 2019 18:43:45 +0000 (20:43 +0200)
committerGuus Sliepen <guus@sliepen.org>
Thu, 10 Oct 2019 18:43:45 +0000 (20:43 +0200)
In utcp_reset_timers(), we were actually setting the connection timer even
if it was not set before, therefore causing spurious channel closures on
channels that did not have any unACKed data.

In utcp_offline(), we were setting the retransmission timer even if there
was nothing to retransmit.

utcp.c

diff --git a/utcp.c b/utcp.c
index 2ed32175dc0f98c9b2bc045f7a62fb43caeb5089..4c3cbdb36fc46bb43c36c7fdd5e4cc6cbac3c964 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -1918,8 +1918,14 @@ void utcp_reset_timers(struct utcp *utcp) {
                        continue;
                }
 
-               c->rtrx_timeout = now;
-               c->conn_timeout = then;
+               if(timerisset(&c->rtrx_timeout)) {
+                       c->rtrx_timeout = now;
+               }
+
+               if(timerisset(&c->conn_timeout)) {
+                       c->conn_timeout = then;
+               }
+
                c->rtt_start.tv_sec = 0;
        }
 
@@ -2070,19 +2076,24 @@ void utcp_expect_data(struct utcp_connection *c, bool expect) {
 }
 
 void utcp_offline(struct utcp *utcp, bool offline) {
+       struct timeval now;
+       gettimeofday(&now, NULL);
+
        for(int i = 0; i < utcp->nconnections; i++) {
                struct utcp_connection *c = utcp->connections[i];
 
-               if(!c->reapable) {
-                       utcp_expect_data(c, offline);
-
-                       // If we are online again, reset the retransmission timers, but keep the connection timeout as it is,
-                       // to prevent peers toggling online/offline state frequently from keeping connections alive
-                       // if there is no progress in sending actual data.
-                       if(!offline) {
-                               gettimeofday(&utcp->connections[i]->rtrx_timeout, NULL);
-                               utcp->connections[i]->rtt_start.tv_sec = 0;
+               if(c->reapable) {
+                       continue;
+               }
+
+               utcp_expect_data(c, offline);
+
+               if(!offline) {
+                       if(timerisset(&c->rtrx_timeout)) {
+                               c->rtrx_timeout = now;
                        }
+
+                       utcp->connections[i]->rtt_start.tv_sec = 0;
                }
        }