Skip to content

Support KISS ACKMODE end to end; pin samoyed to the ACKMODE build - #16

Merged
M0LTE merged 1 commit into
mainfrom
feat/ackmode-support
Jun 11, 2026
Merged

Support KISS ACKMODE end to end; pin samoyed to the ACKMODE build#16
M0LTE merged 1 commit into
mainfrom
feat/ackmode-support

Conversation

@M0LTE

@M0LTE M0LTE commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

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

  • Pin samoyed to the ACKMODE build. New SAMOYED_REPO + SAMOYED_REF build args in the Dockerfile, defaulted (with matching install.sh defaults) to M0LTE/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 samoyed main HEAD — 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 nibble 0x0C. 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 with SAMOYED_BIN (the release build, or make -C samoyed cmds).
  • README — ACKMODE moves from "Known limitations" to supported; the install env-var table documents the SAMOYED_REPO/SAMOYED_REF pin.

Verification

  • make test (vet + go test ./...) green; the integration test skips without a binary.
  • With the pinned samoyed binary, the integration test passes: samoyed accepts the frame, logs [0L] Q1TEST>Q2TEST:ackmode round-trip, and the ack returns to the originating client with nibble 0x0C and the right id bytes.

Once this merges, tagging v0.1.0 produces the first published ghcr.io/packethacking/net-sim release image with ACKMODE available.

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
M0LTE force-pushed the feat/ackmode-support branch from ea4232b to 12f57a6 Compare June 11, 2026 21:06
@M0LTE
M0LTE merged commit 5ff8830 into main Jun 11, 2026
1 check passed
@M0LTE
M0LTE deleted the feat/ackmode-support branch June 11, 2026 21:07
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.

1 participant