From 0c29e6bb0a943f9d06067628f894495dcc01c5ba Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sun, 18 Oct 2015 20:30:48 +0200 Subject: [PATCH] Fix the logic for determining whether a packets has an acceptable ack seqno. snd.last accurately tracks the last possible seqno that can be acked, so use it. This fixes a case where retransmitted ACKs of a FIN were not handled correctly. --- utcp.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/utcp.c b/utcp.c index fceffbd..1b498a2 100644 --- a/utcp.c +++ b/utcp.c @@ -879,10 +879,7 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) { // ackno should not roll back, and it should also not be bigger than what we ever could have sent // (= snd.una + c->sndbuf.used). - if(hdr.ctl & ACK && - ((seqdiff(hdr.ack, c->snd.una + c->sndbuf.used) > 0 && - seqdiff(hdr.ack, c->snd.nxt) > 0) // TODO: simplify this if - || seqdiff(hdr.ack, c->snd.una) < 0)) { + if(hdr.ctl & ACK && (seqdiff(hdr.ack, c->snd.last) > 0 || seqdiff(hdr.ack, c->snd.una) < 0)) { debug("Packet ack seqno out of range, %u <= %u < %u\n", c->snd.una, hdr.ack, c->snd.una + c->sndbuf.used); // Ignore unacceptable RST packets. if(hdr.ctl & RST) -- 2.39.2