tncd

Changelog

Home Documentation Blog GitHub Releases

v1.0

May 2026 release

First stable release. tncd is no longer beta — the AGWPE bridge, AX.25 v2.0 connected-mode state machine, UI-frame passthrough, multi-port operation, Bluetooth SPP, and security hardening from the 0.11.x series are all considered feature-complete and field-tested.

Tested

  • Kantronics KPC+ family (KPC-3+ / KPC-9612+) — OTA-verified at 1200 baud serial; programmatic KISS init via INTFACE KISS\r\nRESET\r with init_delay = 2.0

v0.11.1-BETA

May 2026 release

Security Hardening

  • Default listen_host changed from 0.0.0.0 to 127.0.0.1 — prevents unauthenticated remote access to the AGWPE server. Set to 0.0.0.0 in config if remote access is needed.
  • Maximum AGWPE payload size limit (64 KB) — disconnects clients sending oversized frames to prevent memory exhaustion
  • Maximum concurrent AX.25 connections limit (64) — prevents unbounded connection state accumulation
  • Outbound queue cap (512 entries per connection) — prevents memory exhaustion from rapid D frame sends

Bug Fixes

  • Fix incoming SABM handling at connection limit: send DM (reject) instead of UA followed by DM, per AX.25 §2.3.4

v0.9-BETA

May 2026 release

New Features

  • Native Bluetooth SPP via BlueZ D-Bus Profile API — connects directly to Bluetooth TNCs without rfcomm or tncd-rfcomm
  • New type = bluetooth connection type in [client] config
  • Auto-reconnect with exponential backoff for Bluetooth connections (configurable via reconnect, reconnect_delay, reconnect_max_delay)
  • RFCOMM channel auto-detection via SDP — no manual channel configuration needed
  • SABM retransmission via T1 timer during connection setup (AX.25 6.3.1)

Bug Fixes

  • Disconnect existing BLE auto-connection before SPP connect to prevent br-connection-page-timeout on dual-mode devices (e.g. Mobilinkd TNC3)
  • Run ConnectProfile in a background thread to avoid blocking asyncio on the expected D-Bus NoReply
  • Fix blocking_start() serial port guard: only access transport.serial for type = serial connections

Packaging

  • Nix: bluetoothSupport option on package, auto-enabled by NixOS module when bluetooth.enable = true
  • Arch PKGBUILD updated with python-dbus and python-gobject dependencies
  • Deprecated tncd-rfcomm helper (still included, will be removed in a future release)

Tested

  • Full Winlink CMS round-trip with 10KB binary attachment over Mobilinkd TNC3 Bluetooth SPP via KU0HN-10 gateway at 1200 baud

v0.8.1-BETA

May 2026 release

Bug Fixes

  • Fix init_string serial probe: pause asyncio reader during KISS mode entry to avoid consuming the TNC's response
  • Fix init_string to use the same serial connection (no re-open) and probe for command mode before sending
  • Fix HUPCL termios flag: prevent DTR reset on serial port close, which was kicking TNCs out of KISS mode

Tested

  • Kenwood TS-2000 built-in TNC: full OTA Winlink session at 1200 baud via init_string
  • Kenwood TH-D7A: OTA PASS with init_string probe

v0.8-BETA

April 2026 release

New Features

  • AX.25 spec compliance: RNR (Receive Not Ready) flow control, FRMR (Frame Reject) handling, N2 retry limit with automatic disconnect
  • Raw KISS serial spy for debugging TNC communication
  • Implicit connect on lost UA: if remote sends I-frames during CONNECTING state, promote to CONNECTED (the UA was lost OTA)

Bug Fixes

  • T1 poll-then-retransmit: first expiry sends RR poll only, second consecutive expiry also retransmits unacked I-frames (avoids flooding slow TNC buffers)

Tested

  • Mobilinkd TNC4: full OTA Winlink session via USB at 1200 baud

v0.7.1-Beta

March 2026 release

Bug Fixes

  • Fix download stall in AX.25 connected mode caused by duplicate RR responses flooding the half-duplex TX buffer
  • _send_rr_guarded() suppresses duplicate RR F=1 with same N(R) within 3s
  • Defer poll response via call_soon to let queued I-frames advance recv_seqno first
  • I-frame coalescing in _drain_outbound merges adjacent small payloads up to 256 bytes
  • Y-frame reports unacked + queued (matches Direwolf, fixes PAT flow control)
  • Guard against backwards N(R) from retransmitted frames
  • Send DM for I-frames to unknown connections (clears stale sessions after restart)

v0.7-Beta

March 2026 release

Bug Fixes

  • Retransmit unacked I-frames when remote polls with RR P=1
  • Fix tncd-rfcomm service PATH to include bluez binaries

Packaging

  • NixOS module imported from nix-ham-packages
  • Switched to nix-ham-packages overlay (removed local nix/overlay.nix)
  • Removed stale OBS packaging (releases now use Cloudflare Pages)

v0.6-Beta

February 2026 release

New Features

  • Dynamic T1/T2 timers calculated from over-the-air baud rate (ota_baudrate config option)
  • Piggybacked N(R) acknowledgement fix for connected mode
  • Direwolf compatibility verified (KISS-over-TCP and PTY modes)

Tested

  • First successful OTA Winlink session at 1200 baud

v0.5-Beta

January 2026 release

Bug Fixes

  • Fix incoming connected mode: SABME rejection (mod-128 not supported), owner assignment from registered callsigns, correct AGWPE notification format

Other

  • Added user-focused documentation website
  • Tabbed install section with NixOS, macOS, and Windows instructions

v0.3-Alpha

December 2025 release

New Features

  • AX.25 connected mode: window flow control, immediate RR, T1 retransmit timer
  • End-to-end test suite with PipeWire audio cross-linking, Direwolf pairs, PAT P2P messaging, and KISS PTY mode

v0.2-Alpha

November 2025 release

Other

  • Cloudflare Pages deployment for package repository and website
  • Cross-compiled .deb and .rpm packages for amd64, i386, armhf, arm64, riscv64

v0.1-Alpha

October 2025 release

Initial Release

  • AGWPE-to-KISS bridge with serial and TCP KISS support
  • AX.25 UI (unproto) frame forwarding
  • Multiple simultaneous AGWPE client support
  • Bluetooth RFCOMM helper (tncd-rfcomm)