]> git.meshlink.io Git - utcp/commitdiff
Send ACKs without a payload upon receiving an out-of-order packet.
authorGuus Sliepen <guus@meshlink.io>
Fri, 5 Dec 2014 21:10:37 +0000 (22:10 +0100)
committerGuus Sliepen <guus@meshlink.io>
Fri, 5 Dec 2014 21:10:37 +0000 (22:10 +0100)
This is necessary so the peer can detect "triplicate ACKs", which signal dropped packets, and at the
same time keeps the TCP self-clocking active.

utcp.c

diff --git a/utcp.c b/utcp.c
index 2ef56ea76a451558d19d6963679f1d9c5a7e8b6c..db775a9e8a5b37cc3e15c2ff06bf8cc4236c4260 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -587,12 +587,13 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) {
 #endif
 
        if(!acceptable) {
-               debug("Packet not acceptable, %u  <= %u + %zu < %u\n", c->rcv.nxt, hdr.seq, len, c->rcv.nxt + c->rcv.wnd);
+               debug("Packet not acceptable, %u <= %u + %zu < %u\n", c->rcv.nxt, hdr.seq, len, c->rcv.nxt + c->rcv.wnd);
                // Ignore unacceptable RST packets.
                if(hdr.ctl & RST)
                        return 0;
                // Otherwise, send an ACK back in the hope things improve.
-               goto ack;
+               ack(c, true);
+               return 0;
        }
 
        c->snd.wnd = hdr.wnd; // TODO: move below