From c857ddae57dba6a7e6dfdc7e7368d2e8bc6d7c26 Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Mon, 7 Sep 2026 13:48:22 -0300 Subject: [PATCH] Properly ACK duplicate segments --- mongoose.c | 4 ++-- src/net_builtin.c | 4 ++-- test/mip_test.c | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mongoose.c b/mongoose.c index 07aa34f4..53a37123 100644 --- a/mongoose.c +++ b/mongoose.c @@ -9761,9 +9761,9 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) { MG_VERBOSE(("ignoring duplicate pkt")); } else { MG_VERBOSE(("SEQ != ACK: %x %x %x", seq, s->ack, ack)); - tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, c->dscp, TH_ACK, - mg_htonl(s->seq), mg_htonl(s->ack), "", 0); } + tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, c->dscp, TH_ACK, + mg_htonl(s->seq), mg_htonl(s->ack), "", 0); return; // drop it, RFC-9293 3.10.7.4: ignore ACKno } // Now process the segment for ACK and payload diff --git a/src/net_builtin.c b/src/net_builtin.c index 2563f37d..e2c7ea8a 100644 --- a/src/net_builtin.c +++ b/src/net_builtin.c @@ -1503,9 +1503,9 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) { MG_VERBOSE(("ignoring duplicate pkt")); } else { MG_VERBOSE(("SEQ != ACK: %x %x %x", seq, s->ack, ack)); - tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, c->dscp, TH_ACK, - mg_htonl(s->seq), mg_htonl(s->ack), "", 0); } + tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, c->dscp, TH_ACK, + mg_htonl(s->seq), mg_htonl(s->ack), "", 0); return; // drop it, RFC-9293 3.10.7.4: ignore ACKno } // Now process the segment for ACK and payload diff --git a/test/mip_test.c b/test/mip_test.c index 263f6362..d911c568 100644 --- a/test/mip_test.c +++ b/test/mip_test.c @@ -906,11 +906,13 @@ static void test_tcp_retransmit(void) { now = mg_millis() - start; // we wait enough time for a reply if (now > 2 * MG_TCPIP_ACK_MS) { - response_recv = false; + response_recv = false; // response should have been received by now break; } } - ASSERT((!response_recv)); // replies should not be sent for duplicate packets + ASSERT((response_recv)); // retransmit the lost ACK for duplicate segs + ASSERT((t->flags == TH_ACK)); + ASSERT((t->ack == mg_htonl(1003))); // dup ACK // packet with seq_no = 1003 got lost/delayed, send seq_no = 1005 create_tcp_simpleseg(&e, &ipp, 1005, 2, TH_PUSH | TH_ACK, 2);