Support KISS ACKMODE end to end; pin samoyed to the ACKMODE build - #16
Merged
Conversation
net-sim itself never parses KISS frames — the host talks KISS straight to each samoyed child — so "ackmode support" here is twofold: build a samoyed that implements ACKMODE, and prove the round trip works through a real child. - Pin the samoyed source to the ACKMODE build (M0LTE/samoyed @ 6b4f5c7, a fork branch; not yet in doismellburning/samoyed) via new SAMOYED_REPO + SAMOYED_REF build args in the Dockerfile, and matching defaults in install.sh. The pin is a fixed SHA so release images are reproducible, with a clear revert-to-upstream path for when ACKMODE lands upstream. The docker workflow no longer resolves a floating samoyed main HEAD; the Dockerfile is now the single source of truth for which samoyed gets built. - Add internal/tnc/ackmode_test.go: an end-to-end integration test that spawns a real samoyed child, connects to its KISS TCP port, sends an ACKMODE data frame (command nibble 0x0C with two id bytes and a raw AX.25 UI frame), and asserts samoyed transmits it and echoes the same two id bytes back with command nibble 0x0C. It skips (not fails) when no samoyed binary is present, so the existing suite stays green where samoyed isn't built; point it at a binary with SAMOYED_BIN to run it. - Update the README: ACKMODE moves from "Known limitations" to supported, and the install env-var table documents the SAMOYED_REPO/REF pin. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
M0LTE
force-pushed
the
feat/ackmode-support
branch
from
June 11, 2026 21:06
ea4232b to
12f57a6
Compare
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.
net-sim itself never parses KISS frames — the host talks KISS straight to each samoyed child, and the router only moves PCM audio — so "ackmode support" here is twofold: build a samoyed that implements ACKMODE, and prove the round trip works through a real child.
What ACKMODE is
The G8BPQ extended-KISS ACKMODE command (nibble
0x0C, per the Multi-Drop KISS spec): the host sends a data frame with two opaque id bytes between the command byte and the AX.25 frame (C0 xC aa bb <frame> C0); once the frame has actually been transmitted, the TNC echoes those two bytes back (C0 xC aa bb C0). This lets a host start its FRACK/retry timers from the real on-air moment, which matters on HF. Previously samoyed refused the opcode outright.Changes
SAMOYED_REPO+SAMOYED_REFbuild args in theDockerfile, defaulted (with matchinginstall.shdefaults) toM0LTE/samoyed @ 6b4f5c7— the ACKMODE work, which currently lives on a samoyed fork branch and is not yet upstreamed to doismellburning/samoyed. Pinned to a fixed SHA so release images are reproducible, with a clear revert-to-upstream path in the comments for when ACKMODE lands upstream. The docker workflow no longer resolves a floating samoyedmainHEAD — the Dockerfile is now the single source of truth for which samoyed gets built.internal/tnc/ackmode_test.go— an end-to-end integration test: it spawns a real samoyed child, dials its KISS TCP port, sends an ACKMODE data frame, and asserts samoyed transmits it and echoes the same two id bytes back with command nibble0x0C. It skips (doesn't fail) when no samoyed binary is present, so the suite stays green where samoyed isn't built; point it at one withSAMOYED_BIN(the release build, ormake -C samoyed cmds).SAMOYED_REPO/SAMOYED_REFpin.Verification
make test(vet +go test ./...) green; the integration test skips without a binary.[0L] Q1TEST>Q2TEST:ackmode round-trip, and the ack returns to the originating client with nibble0x0Cand the right id bytes.Once this merges, tagging
v0.1.0produces the first publishedghcr.io/packethacking/net-simrelease image with ACKMODE available.