Packet.Ax25
0.21.0
See the version list below for details.
dotnet add package Packet.Ax25 --version 0.21.0
NuGet\Install-Package Packet.Ax25 -Version 0.21.0
<PackageReference Include="Packet.Ax25" Version="0.21.0" />
<PackageVersion Include="Packet.Ax25" Version="0.21.0" />
<PackageReference Include="Packet.Ax25" />
paket add Packet.Ax25 --version 0.21.0
#r "nuget: Packet.Ax25, 0.21.0"
#:package Packet.Ax25@0.21.0
#addin nuget:?package=Packet.Ax25&version=0.21.0
#tool nuget:?package=Packet.Ax25&version=0.21.0
Packet.Ax25
AX.25 v2.2 frame codec + connected-mode session runtime + inbound-connection listener.
The core AX.25 protocol library: a U/S/I frame codec, an SDL-driven connected-mode link-layer state machine, and Ax25Listener — a node-style coordinator that accepts inbound connections, originates outbound ones, and caches a session per peer. It deals in raw AX.25 frame bytes over an IAx25Transport, so it is transport-neutral (KISS, AXUDP, KISS-over-TCP — your choice). Part of Packet.NET, a .NET amateur-radio / AX.25 packet stack.
Install
dotnet add package Packet.Ax25
Quick start
Run a station that answers inbound connections, echoes received data back to the peer, and can also originate outbound links. Ax25Listener takes any IAx25Transport (from Packet.Kiss, Packet.Axudp, etc.):
using Packet.Ax25;
using Packet.Ax25.Session;
using Packet.Ax25.Transport;
using Packet.Core;
// IAx25Transport comes from a transport package (Packet.Kiss, Packet.Axudp, ...).
IAx25Transport transport = /* e.g. a KISS or AXUDP transport */;
await using var listener = new Ax25Listener(transport, new Ax25ListenerOptions
{
MyCall = new Callsign("N0CALL", 0),
});
// A peer connected to us — wire up its inbound-data stream.
listener.SessionAccepted += (_, e) =>
{
var session = e.Session;
session.DataLinkSignalEmitted += (_, signal) =>
{
if (signal is DataLinkDataIndication data)
{
// Echo whatever the peer sent straight back.
listener.SendData(session, data.Info);
}
};
};
await listener.StartAsync();
// Originate an outbound connection, then send some data on it.
var outbound = await listener.ConnectAsync(new Callsign("Q0PDN", 0));
listener.SendData(outbound, "hello over AX.25"u8.ToArray());
Need just the codec? Build and parse frames directly, no session machinery:
using Packet.Ax25;
using Packet.Core;
// Build a connectionless UI (unproto) frame.
var ui = Ax25Frame.Ui(
destination: new Callsign("AA1AA", 0),
source: new Callsign("N0CALL", 0),
info: "73"u8,
pid: Ax25Frame.PidNoLayer3);
byte[] kissBytes = ui.ToBytes(); // body only — a KISS TNC adds the FCS
byte[] axudpBytes = ui.ToBytesWithFcs(); // body + CRC-16-CCITT, for AXUDP / AXIP
// Parse a frame back from its on-the-wire (KISS-form) bytes.
if (Ax25Frame.TryParse(kissBytes, out var frame) && frame.IsUi)
{
Console.WriteLine($"{frame.Source.Callsign} -> {frame.Destination.Callsign}");
}
Key types
Ax25Frame— one AX.25 frame; codec for U/S/I/UI frames (mod-8 and extended mod-128),TryParse/ToBytes/ToBytesWithFcs, plus static factories (Ui,Sabm,Sabme,Disc,Ua,Dm,Rr,Rej,Srej,I,Xid,Test, …).Ax25Listener— owns oneIAx25Transport; accepts inbound SABM, originatesConnectAsync, caches a session per peer (LRU), and exposesSessionAccepted/FrameTracedevents. The node-style entry point.Ax25ListenerOptions— listener config:MyCall, timer overrides (T1V/T2/T3/N2/K),MaxCachedPeers,ParseOptions,Quirks, extended-mode preference.Ax25Session— one connected-mode link's state machine; exposesCurrentState,Context, and theDataLinkSignalEmittedupward-signal stream.DataLinkSignal— the upward signal record hierarchy (DataLinkConnectIndication,DataLinkDataIndication,DataLinkDisconnectIndication,DataLinkErrorIndication, …).Ax25ParseOptions— strict-vs-lenient parser knobs (named flags for real-world-peer leniencies);Ax25SessionQuirks— named per-session deviations matching buggy reference implementations.Ax25Adapter— lower-level glue wiring anAx25Session+ dispatcher to a byte sink, for callers who don't want the full listener.
See also
- Source & issues
- Packet.Ax25.Transport.Abstractions — the
IAx25Transportseam the listener consumes - Packet.Kiss — a KISS-TNC
IAx25Transport - Packet.Axudp — an AXUDP
IAx25Transport - Packet.NetRom — NET/ROM Layer 3/4 on top of AX.25
MIT-licensed. Part of the Packet.NET stack.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Packet.Ax25.Sdl (>= 0.10.0)
- Packet.Ax25.Transport.Abstractions (>= 0.21.0)
- Packet.Core (>= 0.21.0)
NuGet packages (5)
Showing the top 5 NuGet packages that depend on Packet.Ax25:
| Package | Downloads |
|---|---|
|
Packet.Kiss
KISS (Keep It Simple, Stupid) framing encoder/decoder, ACKMODE handling, multi-drop port support, and TCP transport. Decodes KISS-Data payloads into typed Ax25Frame events. Pair with Packet.Ax25 for connected-mode sessions. Source: github.com/packet-net/packet.net. |
|
|
Packet.Kiss.NinoTnc
NinoTNC-specific KISS extensions for the Packet.NET stack — ACKMODE TX-completion correlation, SETHW mode switching, TX-Test frame classification, USB port discovery. Built on Packet.Kiss.Serial for generic serial-port plumbing. Source: github.com/packet-net/packet.net. |
|
|
Packet.Axudp
AXUDP transport for the Packet.NET stack: AxudpSocket, a bidirectional AX.25-over-IP (RFC 1226) endpoint that UDP-encapsulates AX.25 frames. It unconditionally appends + validates the 2-octet AX.25 FCS (CRC-16-CCITT) exactly as every real AXIP/AXUDP peer does (ax25ipd, LinBPQ BPQAXIP, XRouter), with a raw escape hatch for replaying captures. Source: github.com/packet-net/packet.net. |
|
|
Packet.NetRom
NET/ROM networking for the Packet.NET stack: the L3 routing layer (NODES broadcasts, routing table + quality model), the L4 circuit state machine (CircuitManager / NetRomCircuit), and the INP3 time-routing overlay (L3RTT, RIF/RIP) — with BPQ / XRouter / Strict / Lenient quirk profiles pinned to real on-air behaviour. Build a .NET NET/ROM node or router on top of Packet.Ax25. Source: github.com/packet-net/packet.net. |
|
|
Packet.Tune.Core
Coordination primitives for tuning a NinoTNC + radio pair with the two ends apart: the tuning-telegram protocol (ITuningLink), an SDM flavour riding the radio's own side channel (Packet.Radio.IRadioSideChannel; Tait CCDI short data messages — radio-native FFSK, independent of the TNC mode/pot under tune), a WebSocket flavour with a PIN-rendezvous relay, the shared meter/tuned assistant loop, a mode-coordination protocol (propose/confirm/commit a TNC mode + radio channel switch, probe-verify, revert-to-home on failure), and a capability doctor for the whole TNC↔radio stack. Source: github.com/packet-net/packet.net. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.24.0 | 51 | 7/20/2026 |
| 0.23.0 | 158 | 7/14/2026 |
| 0.22.0 | 163 | 7/14/2026 |
| 0.21.0 | 170 | 7/9/2026 |
| 0.20.0 | 164 | 7/5/2026 |
| 0.19.0 | 171 | 7/5/2026 |
| 0.18.0 | 163 | 7/5/2026 |
| 0.17.0 | 163 | 6/23/2026 |
| 0.16.0 | 165 | 6/23/2026 |
| 0.15.0 | 160 | 6/23/2026 |
| 0.14.0 | 148 | 6/22/2026 |
| 0.13.0 | 138 | 6/22/2026 |
| 0.12.0 | 134 | 6/21/2026 |
| 0.11.0 | 152 | 6/18/2026 |
| 0.10.0 | 134 | 6/17/2026 |
| 0.9.0 | 246 | 6/17/2026 |
| 0.8.0 | 144 | 6/12/2026 |
| 0.7.0 | 136 | 6/10/2026 |
| 0.6.1 | 138 | 6/7/2026 |
| 0.6.0 | 138 | 6/5/2026 |