Repository navigation
fix(network-stack): ACK zero-length segments outside the receive window - #156
Open
TadahiroYamamura wants to merge 1 commit into
Open
TadahiroYamamura wants to merge 1 commit into
TadahiroYamamura wants to merge 1 commit into
Conversation
Guest keepalive probes (zero-length, seq = RCV.NXT - 1) got no reply, so the guest kernel dropped idle connections with ETIMEDOUT. Answer zero-length segments outside the receive window with an ACK. Their ack and window are still processed as before; this only adds the ACK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 6, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A1 of #155.
Problem
Gondolin does not answer guest keepalive probes (zero-length,
seq = RCV.NXT - 1), so the guest kernel drops idle connections withETIMEDOUT. Connecting throughtcp.hostswithcurl --keepalive-time 5to a server that never responds, the connection is cut after 50.6s (with--no-keepaliveit stays open).Fix
Answer zero-length segments outside the receive window with an ACK (
<SEQ=SND.NXT><ACK=RCV.NXT>). The receive window value (65535) now comes from the same constant thatsendTCPuses.Tests
Please check
RFC 9293 §3.10.7.4 says an unacceptable segment is ACKed and dropped, without processing its ack number or window. This PR keeps processing the ack number and window as before and then sends the ACK. Doing it the RFC way makes the existing test "TCP flow control pauses when tx buffer grows and resumes when drained" fail: that test sends the guest's ACKs with
seq: session.vmSeq(still the guest's ISN, one beforemyAck), so they are treated as unacceptable and their ack numbers are no longer processed. If you prefer the RFC behavior, changing that test's seq tomyAckmakes it pass. Please let us know which you prefer.Suggested CHANGELOG entry
Fix guest TCP connections being dropped after ~60s of idle time: zero-length segments outside the receive window, such as keepalive probes, are now ACKed.
🤖 AI (Claude Code) was used for the investigation and for writing the code.
Contribution Agreement
Please ensure this PR follows the guidelines in
CONTRIBUTING.md.By submitting this pull request, I confirm the following:
I understand that the entity Earendil Inc. (incorporated in the state of Delaware in 2025) needs some rights from me in order to utilize my contributions in this PR. As a contributor I retain all rights, title and interest in and to my contributions, and by keeping this boilerplate intact I confirm that Earendil Inc. can use, modify, copy, and redistribute my contributions, under Earendil Inc.'s choice of terms.