Packet.NetRom
0.35.0
See the version list below for details.
dotnet add package Packet.NetRom --version 0.35.0
NuGet\Install-Package Packet.NetRom -Version 0.35.0
<PackageReference Include="Packet.NetRom" Version="0.35.0" />
<PackageVersion Include="Packet.NetRom" Version="0.35.0" />
<PackageReference Include="Packet.NetRom" />
paket add Packet.NetRom --version 0.35.0
#r "nuget: Packet.NetRom, 0.35.0"
#:package Packet.NetRom@0.35.0
#addin nuget:?package=Packet.NetRom&version=0.35.0
#tool nuget:?package=Packet.NetRom&version=0.35.0
Packet.NetRom
NET/ROM L3 routing, L4 circuits, and the INP3 time-routing overlay for the Packet.NET stack.
Packet.NetRom is the NET/ROM networking layer: the L3 routing table (NODES broadcasts + the multiplicative per-hop quality model), the L4 virtual-circuit state machine (CircuitManager / NetRomCircuit), the L3 forwarding decision for transit nodes, and the INP3 time-routing overlay (L3RTT link timing, RIF/RIP). It runs above an AX.25 interlink - the wire types are codecs over NetRomPacket, and the routing/transport types are host-free (no AX.25 or node-host dependency), so you wire them to a transport yourself. Part of Packet.NET, a .NET amateur-radio / AX.25 packet stack, built on Packet.Core and Packet.Ax25.
Install
dotnet add package Packet.NetRom
Quick start
Parse a NODES broadcast you heard from a neighbour and learn its routes into a routing table - the read-only ingest path a node uses to build its view of the network:
using Packet.Core;
using Packet.NetRom.Routing;
using Packet.NetRom.Wire;
var me = new Callsign("Q0PDN"); // our own node callsign
var nbr = new Callsign("N0CALL"); // the neighbour whose broadcast we heard
// Build a node's own NODES broadcast, then parse it (here we round-trip the builder;
// in production you'd parse the info field of a received PID-0xCF UI frame).
byte[][] frames = NodesBroadcastBuilder.Build(
senderAlias: "NODE",
entries: [ new(new Callsign("AA1AA"), "BBS", new Callsign("AA1AA"), Quality: 200) ]);
if (NodesBroadcast.TryParse(frames[0], out var broadcast))
{
var table = new NetRomRoutingTable();
table.Ingest(originator: nbr, myCall: me, portId: "vhf", broadcast: broadcast);
NetRomRoutingSnapshot view = table.Snapshot();
foreach (var dest in view.Destinations)
Console.WriteLine($"{dest.Alias} ({dest.Destination}) via {dest.BestRoute?.Neighbour} q={dest.BestRoute?.Quality}");
}
Call table.Sweep() at the broadcast interval to age routes out, BuildAdvertisement(obsoleteMinimum) to originate your own NODES, and MarkNeighbourDown(new NeighbourKey(portId, neighbour)) for immediate link-down failover (or MarkPortDown(portId) when a whole port goes away). For L4 circuits, mint one with CircuitManager.OpenCircuit(remoteNode), wire its SendPacket sink to your interlink, then Connect / Send / Disconnect.
Key types
NetRomRoutingTable- the learned L3 routing table: ingests NODES broadcasts, derives per-hop qualities, keeps best routes per destination with obsolescence decay, hands out immutable snapshots.NetRomRoutingSnapshot/NetRomDestination/NetRomRoute- the immutable read-only routing view (withResolveDestinationforconnect <alias>).NeighbourKey- a neighbour is the (port, callsign) pair, not the callsign: one station audible on two ports is two adjacencies, each with its own path quality, its own routes and its own link.NetRomRoutecarries the port;NetRomRoutingSnapshotgives youNeighbourFor(key),NeighboursOf(callsign)andBestNeighbourFor(callsign). Seedocs/netrom-multiport-neighbours.md.CircuitManager- owns the L4 circuit table: mints circuits, demultiplexes inbound datagrams, accepts/refuses inbound connects, drives retransmit timers.NetRomCircuit- one end of an L4 virtual circuit: sliding-window transport with negotiated window, choke flow control, NAK retransmit, and 236-byte fragment/reassembly.NetRomForwarding- the pure L3 forwarding decision for a transit node (TTL decrement, loop guard, best/per-flow next-hop selection).Inp3Engine- the host-free INP3 link-timing engine: L3RTT probing, SNTT smoothing, neighbour-down detection.NetRomPacket/NodesBroadcast/Inp3Rif- the wire codecs (total parsing - malformed bytes returnfalse, never throw).
See also
- Source & issues
- Packet.Ax25 - the AX.25 interlink NET/ROM datagrams ride over (PID 0xCF)
- Packet.Core -
Callsignand the shared primitives
AGPL-3.0-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
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.11)
- Packet.Ax25 (>= 0.35.0)
- Packet.Ax25.Sdl (>= 0.10.2)
- Packet.Core (>= 0.35.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.37.0 | 0 | 9/10/2026 |
| 0.36.0 | 50 | 9/7/2026 |
| 0.35.0 | 55 | 9/6/2026 |
| 0.34.0 | 54 | 9/5/2026 |
| 0.33.0 | 72 | 9/3/2026 |
| 0.32.0 | 70 | 9/3/2026 |
| 0.31.0 | 87 | 9/2/2026 |
| 0.30.0 | 91 | 8/23/2026 |
| 0.29.0 | 90 | 8/22/2026 |
| 0.28.0 | 90 | 8/22/2026 |
| 0.27.0 | 100 | 8/17/2026 |
| 0.26.0 | 103 | 8/17/2026 |
| 0.25.0 | 119 | 8/3/2026 |
| 0.24.0 | 112 | 7/20/2026 |
| 0.23.0 | 106 | 7/14/2026 |
| 0.22.0 | 108 | 7/14/2026 |
| 0.21.0 | 118 | 7/9/2026 |
| 0.20.0 | 107 | 7/5/2026 |
| 0.19.0 | 106 | 7/5/2026 |
| 0.18.0 | 109 | 7/5/2026 |