X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=utcp.c;h=ac162fe708a0d657abffb4cb62ecd4881a7fc79a;hb=ae9033c7c9211f6e9dfa3d6b3dfeebd6e1d9ba00;hp=d0e56d2c41e6dd278d1791828ff59375fc5b6391;hpb=eb0a013a9b6c957aee0aecebc7d451dfd6851661;p=utcp diff --git a/utcp.c b/utcp.c index d0e56d2..ac162fe 100644 --- a/utcp.c +++ b/utcp.c @@ -1011,7 +1011,7 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) { ptr += 2; } - bool has_data = len; + bool has_data = len || (hdr.ctl & (SYN | FIN)); // Try to match the packet to an existing connection @@ -1346,7 +1346,7 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) { case CLOSING: if(c->snd.una == c->snd.last) { gettimeofday(&c->conn_timeout, NULL); - c->conn_timeout.tv_sec += 60; + c->conn_timeout.tv_sec += utcp->timeout; set_state(c, TIME_WAIT); } @@ -1505,7 +1505,7 @@ skip_ack: case FIN_WAIT_2: gettimeofday(&c->conn_timeout, NULL); - c->conn_timeout.tv_sec += 60; + c->conn_timeout.tv_sec += utcp->timeout; set_state(c, TIME_WAIT); break; @@ -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; } }