X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=utcp.c;fp=utcp.c;h=ac598ddae28667fd9a40c28ace29255b7dd22f66;hb=83f65f2eee2d5c7d58b27021770926d53f0f193e;hp=67d4be3a7a632d4cdafd004b217ad01976092caa;hpb=ec69b5870a508ec444119ee2149311ef2030cf37;p=utcp diff --git a/utcp.c b/utcp.c index 67d4be3..ac598dd 100644 --- a/utcp.c +++ b/utcp.c @@ -848,6 +848,7 @@ static void retransmit(struct utcp_connection *c) { } c->rtt_start.tv_sec = 0; // invalidate RTT timer + c->dupack = 0; // cancel any ongoing fast recovery cleanup: free(pkt); @@ -1457,7 +1458,7 @@ synack: break; } } else { - if(!len && is_reliable(c)) { + if(!len && is_reliable(c) && c->snd.una != c->snd.last) { c->dupack++; debug(c, "duplicate ACK %d\n", c->dupack); @@ -1484,6 +1485,11 @@ synack: debug_cwnd(c); } + + // We got an ACK which indicates the other side did get one of our packets. + // Reset the retransmission timer to avoid going to slow start, + // but don't touch the connection timeout. + start_retransmit_timer(c); } }