From: Guus Sliepen Date: Thu, 10 Oct 2019 18:43:45 +0000 (+0200) Subject: Don't reset timers that were not set in utcp_reset_timers() and utcp_offline(). X-Git-Url: https://git.meshlink.io/?a=commitdiff_plain;h=176d0d61eca0c60738a9caa2d267a29ca23681b8;p=utcp Don't reset timers that were not set in utcp_reset_timers() and utcp_offline(). 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. --- diff --git a/utcp.c b/utcp.c index 2ed3217..4c3cbdb 100644 --- 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; } }