mirror of
https://github.com/cesanta/mongoose.git
synced 2026-11-03 13:28:44 +00:00
Properly ACK duplicate segments
This commit is contained in:
1 parent
830acc19ee
commit
c857ddae57
3 files changed
+8
-6
No files matched your search
+2
-2
@@ -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
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in new issue
Block a user