Properly ACK duplicate segments

This commit is contained in:
Sergio R. Caprile committed 2026-09-07 13:48:33 -03:00
1 parent 830acc19ee
commit c857ddae57
3 files changed
+8 -6

No files matched your search

+2 -2
View File
@@ -9761,9 +9761,9 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) {
MG_VERBOSE(("ignoring duplicate pkt")); MG_VERBOSE(("ignoring duplicate pkt"));
} else { } else {
MG_VERBOSE(("SEQ != ACK: %x %x %x", seq, s->ack, ack)); 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 return; // drop it, RFC-9293 3.10.7.4: ignore ACKno
} }
// Now process the segment for ACK and payload // Now process the segment for ACK and payload
+2 -2
View File
@@ -1503,9 +1503,9 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) {
MG_VERBOSE(("ignoring duplicate pkt")); MG_VERBOSE(("ignoring duplicate pkt"));
} else { } else {
MG_VERBOSE(("SEQ != ACK: %x %x %x", seq, s->ack, ack)); 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 return; // drop it, RFC-9293 3.10.7.4: ignore ACKno
} }
// Now process the segment for ACK and payload // Now process the segment for ACK and payload
+4 -2
View File
@@ -906,11 +906,13 @@ static void test_tcp_retransmit(void) {
now = mg_millis() - start; now = mg_millis() - start;
// we wait enough time for a reply // we wait enough time for a reply
if (now > 2 * MG_TCPIP_ACK_MS) { if (now > 2 * MG_TCPIP_ACK_MS) {
response_recv = false; response_recv = false; // response should have been received by now
break; 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 // packet with seq_no = 1003 got lost/delayed, send seq_no = 1005
create_tcp_simpleseg(&e, &ipp, 1005, 2, TH_PUSH | TH_ACK, 2); create_tcp_simpleseg(&e, &ipp, 1005, 2, TH_PUSH | TH_ACK, 2);