Skip to content

Send a same-flow pure ACK heading a TX glom on its own (AmiNetXDuo #89) - #15

Closed
tinic wants to merge 3 commits into
maint/beta4from
fix/89-glom-ack-head
Closed

tinic wants to merge 3 commits into
maint/beta4from
fix/89-glom-ack-head

Conversation

@tinic

@tinic tinic commented Sep 28, 2026

Copy link
Copy Markdown
Owner

Draft component of tinic/AmiNetXDuo#115 for issue #89. In gloms of three or more frames headed by two pure ACKs from the same TCP flow, send the first ACK in its own SDIO transfer and leave the remainder batched. This targets a peer-capture absence pattern (A11: 21/21 matched heads absent); it does not establish where those frames were lost.

The classifier handles IPv4/IPv6 TCP pure ACKs, including TCP options, and excludes data, SYN, FIN, RST, fragments, and different flows. Host tests pass. Offline replay changes 22/1264 A11 gloms (1.74%); a download corpus changes 306/337 gloms (91%), so integrated download and upload A/B is required before merge. This draft is not release-ready.

tinic and others added 3 commits September 28, 2026 00:06
In gloms of three or more frames headed by two pure ACKs of one TCP flow,
the head ACK never reached the air (A11: 21 of 21 missing; UDP head pairs
0 of 153).  SendGlomDataPacket now sends that head in its own transfer and
the rest as one glom, as before.  It splits at most once per glom, so a
glom costs at most one extra SDIO transfer; nothing else changes.

Pure ACK: IPv4 (not a fragment) or IPv6 with TCP as the first next header,
no TCP payload, ACK set, SYN/FIN/RST clear; TCP options such as timestamps
and SACK count as header, not payload.  Same flow: equal addresses and
ports.  The decision is wifipi_glom_head_split() in src/glomsplit.h, pure
C with no Amiga headers; tests/test_glomsplit.c runs it on the host
(33 checks).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…open

A peer capture shows the head ACK missing after CMD53; it does not show
whether the firmware or the air lost it.  Comment only, no change in
behaviour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tXDuo #89)

517615d split only once per glom, so in a run of same-flow pure ACKs the
remainder was again a glom of 3+ headed by a same-flow pair (291 of 306
changed download gloms).  SendGlomDataPacket now ends a glom after its first
two frames whenever they are same-flow pure ACKs and it would hold 3 or
more, then starts the next glom from the third frame, so no glom of 3+
leaves with such a head pair.  A run of k same-flow ACKs goes as pairs.

Two-frame gloms of such a pair lost no head ACK in the peer captures (A11
0 of 44, G2 0 of 54), unlike three or more (A11 21 of 21).  wifipi_glom_take()
gives the frames the next transfer takes; tests/test_glomsplit.c now emits
queues of 3, 4, 8 and 32 ACKs, with and without trailing data, and checks
every glom (45 checks).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@tinic tinic closed this Sep 28, 2026
@tinic
tinic deleted the fix/89-glom-ack-head branch October 2, 2026 23:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants