Re: Discuss: Future of AX25, NETROM and ROSE in the kernel ?

Dan Cross <[email protected]> Mon, 13 Apr 2026 19:31:58 -0400
Newsgroups org.kernel.vger.linux-hams
Message-ID <CAEoi9W5o_twDPYMZDqajqz+UYJm5wOvAx+hUFefXmU=vUbOgtg@mail.gmail.com>
On Sat, Apr 11, 2026 at 3:36=E2=80=AFAM Hugh Blemings <[email protected]> w=
rote:
> [snip]
> My email here seeks to see that we, as a technical community, navigate a
> potentially tricky point in the hobbies presence in the Linux kernel as
> well as possible.  I've a decent long term view of the matters at hand,
> but lack a good "current" picture[1].
>
> There's a thread[2] that kicked off, primarily in linux-hams that
> initially focused on bug fixes in the Netrom code. This has broadened
> into a discussion about the future of the AX25, NETROM and ROSE code in
> the kernel.
>
> A couple of well respected mainline kernel maintainers have noted the
> maintenance overhead of these (relatively) lightly used protocols. This
> has led to, quite reasonably I think, some discussion of whether they
> should be removed or deprecated - the perception being they're not used
> much. Note that none of this a judgement on the hobby itself or the
> utility to the broader community.
>
> There's also been some very good points raised in that thread by hams
> around whether it makes sense to move the implementation into userspace
> or to out of tree kernel code. Both can be done in such a way as to
> cause little to no impact from the actual application code that makes
> use of the protocols.
>
> My intuition is that we probably have folks here on linux-vger that have
> the requisite skills and reputation, or ability to gain them, to keep
> the in tree drivers up to date. But perhaps that's just "old" thinking
> on my part?
>
> So I figure a thread here to discuss how we go forward made some sense -
> stay with the current in kernel model, look to go oot or userspace.

I think it would help frame the discussion to present some background,
go into the various options, and present pros and cons of each. With
respect to keeping protocol implementations in the kernel and in-tree,
it further makes sense to present these from two separate
perspectives: a) hams who use the software, and b) the Linux kernel as
a project.

# Background

Linux has had implementations of AX.25, NET/ROM, and ROSE in the
kernel since the 1990s.  Though it is nowhere near as popular as it
was in the 1980s and early 90s, packet radio using these protocols is
still in use world-wide: AX.25 in particular is the basis for APRS,
and beyond that remains broadly popular for accessing packet BBSes,
exchanging mail, sending radio telegrams via the various traffic
services (e.g., NTS in the US), and so on.

AX.25 is a bit of an odd duck by modern standards; if fits into
neither the IP/TCP nor ISO/OSI models neatly, and in OSI terms,
provides functionality spanning layers 2-4; details may be found in
the relevant specification documents.  Note that Linux implements
version 2.0 of the protocol
(http://bitsavers.informatik.uni-stuttgart.de/communications/arrl/AX.25_Lin=
k-Layer_Protocol_Ver_2.0_198410.pdf),
while the current version is 2.2
(http://www.ax25.net/AX25.2.2-Jul%2098-2.pdf), with updates in 2017
(https://tarpn.net/t/faq/files/AX25.2.2-Sep%2017-1-10Sep17.pdf).

NET/ROM adds multi-hop routing on top of AX.25 with dynamic routing,
and provides a facility to address nodes using an alias (e.g., "CHAT"
resolving to "G8BPQ-6" or similar).  As far as I know, the
specification is rather less formal than those for AX.25, and the
protocol was original specified as a chapter in the manual for the
original software.  This has been extracted a few times, such as
https://packet-radio.net/wp-content/uploads/2017/04/netrom1.pdf

ROSE is basically an implementation of the CCITT X.25 network layer
with some elements of AX.25 mixed in. Stations are addressed using a
10-digit "telephone numbers".  It is statically routed.  Its
documentation describes it as, "The ROSE X.25 Packet Switch", e.g.:
https://web.tapr.org/meetings/CNC_1989/CNC1989-ROSE-PacketSwitch-W2VY.pdf

Of these, surely AX.25 is the most widely used (after all, it forms
the basis for the others), with NET/ROM next and ROSE last.  It's
unclear how widely used ROSE is at this point; lack of
interoperability with other packages that just don't implement it is
probably a limiting factor here.

A folks have run TCP/IP over packet radio by embedded IP datagrams (or
their fragments) inside of AX.25 frames that are then sent over the
air using the in-kernel stack.

## Recent Activity Outside of the Linux Kernel

Newer developments in the amateur packet radio world have focused on:

* Improving the implementation of AX.25 to increase robustness and
throughput.  For example, adaptations of Jacobson/Karels congestion
control have been incorporated into some AX.25 implementations, as
have adaptively pausing protocol timers if the link is detected to be
in use.  Also, adding forward error correcting codes at layer 2 to
help with transit over marginal RF links e.g. FX.25
(https://web.archive.org/web/20110718212817/http://www.stensat.org/Docs/FX-=
25_01_06.pdf).
* Newer protocols to try and work around some of the deficiencies of
AX.25: IL2P ("Improved layer 2 Protocol":
https://packet-radio.net/wp-content/uploads/2020/10/il2p-specification0-4.p=
df),
and ARNGLL (https://github.com/arngll/arngll-spec/blob/main/n6drc-arngll.md=
)
are examples here.
* The European amateur radio community noted problems with NET/ROM
some time ago and proposed FlexNET as an alternative
(https://www.qsl.net/ww2bsa/index_htm_files/DCC1995-FlexNet-DK7WJ-N2IRZ.pdf=
),
but details on the protocol itself are scant. Similar problems were
noted by others, and by all accounts, the best ideas of NET/ROM and
FlexNET were synthesized into the INP3 protocol
(https://wiki.oarc.uk/_media/packet:internodeprotocolnp.pdf).

Not much, if any, of this work has been picked up by Linux writ large.
Some doesn't make a lot of sense from a kernel perspective: FX.25, for
instance, is more of a physical layer thing.  However, while there
have been patches proposed at various times (e.g., there was an
implementation of INP3 done as a delta on top of the in-kernel NET/ROM
code), little of it seems to have been integrated: I didn't see
evidence that INP3 support was incorporated when I looked earlier this
morning.

## Problems With the Kernel Implementations

Put bluntly, the kernel implementations are showing their age.
Although it has incorporated some enhancements (7-bit sequence
numbers, for example) the AX.25 protocol implementation remains at
version 2.0.

Thomas Habets has noted a number of problems in a blog post:
https://blog.habets.se/2021/11/AX25-user-space.html Some of these are
purely quality of implementation issues ("setting CRC mode resets all
other settings") but others seem rather more fundamental: e.g., the
"10 REJs in a row" problem: this suggests that the kernel does not
iterate over frames in the outbound window or examine the outbound
queue when processing inbound supervisor frames.

Problems including data corruption, leaked references, deadlocks,
panics, etc, occur distressingly regularly.  E.g.,
https://lore.kernel.org/linux-hams/CAEoi9W4FGoEv+2FUKs7zc=3DXoLuwhhLY8f8t_x=
[email protected]/
and https://lore.kernel.org/linux-hams/my4l7ljo35dnwxl33maqhyvw7666dmuwtduw=
tyhnzdlb6bbf5m@5sbp4tvg246f/
for recent-ish examples.

A search of the `linux-hams` archive turns up a lot of problem
reports, some of which are unaddressed for significant chunks of time.
As Habets put it, if the current implementations were proposed for
incorporation into the kernel today, they probably wouldn't be
accepted, as they would not meet the required quality bar.  Note
that's not a comment on the original authors or their work, but
rather, just an acknowledgement of the current state of affairs and
how things have changed since these were first introduced.  As the man
page for ax25(4) puts it, "BUGS: Too numerous to list in full
currently."

# The Various Options

It seems that there's consensus that the current situation is
untenable, and something should be done.  As I see it, there are
essentially three paths, with some variations on each:

1. Keep AX.25, NET/ROM, and ROSE in the kernel and in-tree
2. Move the protocols to an out-of-tree module (so they still run in
the kernel, but are not maintained in-tree)
3. Move the protocols into a userspace implementation, and provide
backwards compatibility with a shim library that exposes the existing
API, but implements it in terms of a new implementation

## Staying in-kernel, in-tree.

This is the current state of affairs. Right now, the code receives
token maintenance, and there are two paths forward:

1. Status quo, in which no maintainer(s) step up, and the code remains
in a state of perpetual gloom, hovering between mostly working and
mostly broken.  It works _well enough_ for those who invest time in
getting it up and running that it's not critical to change, but system
updates are risky.  As time goes forward, and more people are scouring
the kernel looking for zero-day security exploits and DOS
opportunities, it becomes an obvious attack vector.  This is obviously
not ideal.
2. One or more maintainers actively begin active work to modernize and
clean up the implementations. It's a fairly large task, and requires
coordination with a much larger effort (that is, the rest of the
kernel).  There are obviously folks who are skilled at working in the
Linux kernel, well integrated into the community, and thus positioned
to provide maintenance going forward.  There are also folks who are
interested in keeping this code in-tree.  The question is whether the
intersection of these two sets is large enough to be sustainable.

Then there's the question of a larger roadmap: if the code stays
in-tree, does it gain new functionality (e.g., implementing the latest
version of AX.25) or is this just to keep what's there working well?

### Pros and Cons of Staying in the Kernel (for hams)

Pros:
* No need to change anything.  Those with working AX.25/NETROM/ROSE
configurations can keep using them as-is.  There is no additional
software to install, no additional services to set up, configure or
monitor, nothing else to keep up to date, etc.  Installation is de
facto handled by the distribution.
* Compatibility with existing software.  Programs written to use the
sockets API and these protocol families (e.g., `socket(AF_AX25,
...);`) work unchanged.
* Likely some amount of prestige is attached to having a working
implementation in a project as important as the Linux kernel.

Cons:
* Inaccessibility to most developers.  The number of people who can
write reasonable software in a higher-level language is pretty large
at this point; the number who can do so in C is much smaller.  The
number who can competently write software in the Linux kernel and
shepherd it through the review and integration process is a tiny
fraction of that.
* Slow rate of change. Updates goes through upstream and are generally
filtered down through distros and vendors; this can take quite some
time. Of course, users can compile and install their own kernels, but
many do not.
* A bug in the stack often manifests as a system `panic`, taking down
the entire machine, not just the AX.25, NET/ROM, or ROSE software.
* Shifting to active maintenance requires long-term investment.  The
intersection of people using this code and capable of working on it is
small; unlike (say) TCP/IP, or process scheduling, memory management,
or filesystems and management of storage devices, the number of people
who are concerned about the health of this code at more than an
abstract level is tiny, which means incentive to keep it up-to-date
and well-maintained is inherently lower than other areas of the
kernel.
* Documentation is poor, in the sense that it hasn't been kept up to
date as things have changed.  The TLDP pages have good information,
but their age shows, and the necessary formulae for figuring all of
this out in 2026 is scattered across web pages, blogs, video
tutorials, and mailing list archives in a way that can be bewildering
to newcomers.  I tried to document my own setup at https://kz2x.radio,
but that just underscores the point.

### Pros and Cons of Staying in the Kernel (for Linux)

Pros:
* It keeps the kernel honest.  Having a protocol that doesn't match
the usual pattern of TCP/IP in-tree is a forcing function for
exercising the common networking code (e.g., sockets etc) in useful
ways to keep it flexible.  Doing so makes it easier to incorporate
future protocols that follow different models.
* Goodwill with the ham community.

Cons:
* It is a maintenance drag.  The state of this code is not great, it
has many known bugs, and the amount of effort required to bring it up
to current quality standards, not to mention incorporate e.g. the new
versioner version of AX.25 or anything else, is substantial.  A single
motivated maintainer with kernel experience can likely stop the
bleeding, but doing much more in a reasonable timeframe is going to
need more folks who are invested and have the time to devote to it.
* A bug in AX.25 usually kills the kernel.  This isn't just a problem
for hams, its a problem for the rest of the kernel, as well.
* Related, if folks really started looking into it, it would probably
turn into a security quagmire.  Running in-kernel, with complete
privileges over the entire machine, is the antithesis of a modern
security posture, for that a tiny fraction of the overall Linux
installed base would use.  And as Habets pointed out, what _should_
the semantics be for e.g. network ACLs and AX.25?

### Discussion

The most likely course of action is some middle path between status
quo and active maintenance; my suspicion is that we can probably
muster up a couple of folks who will improve the code to a point that
it's substantially less buggy, leaky, and crash-prone as it is
currently.  That would certainly be an improvement; but will we be
able to attract the combination of folks with the time, motivation,
and familiarity required to, say, update the AX.25 v2.2?

The central question I come back to is, what advantage is conferred by
keeping these protocols in the kernel?  Put another way, what is it
about having them in the kernel that cannot be replicated by moving
them out of the kernel and running them elsewhere?

## Moving to an Out-of-Tree Kernel Module

An alternative that keeps the stack in the kernel, thus retaining the
ham-perspective compatibility "Pro" listed above, is to move the
implementations out-of-tree, so that they are still loaded as kernel
modules, but no longer maintained in the kernel tree proper.

### Pros and Cons of an Out-of-Tree Kernel Module

Pros:
* As with an in-tree kernel module, compatibility with existing
software is preserved.
* Similarly, a working setup is mostly unchanged, caveat that the
out-of-tree modules must be installed as an additional, explicit step.
* Most kernel developers are freed from any sort of maintenance
burden.  The AX.25, NET/ROM, and ROSE code is not a priori a vector
for security exploits, nor a magnet for sloppy LLM-generated patches
or syzkaller fuzzing reports.

Cons:
* Maintenance is now squarely on the amateur radio community (which is
not necessarily a bad thing)
* Installing the modules for AX.25, NET/ROM, and ROSE would require
additional steps, though would hopefully be facilitated by distros and
package managers.  Note that the userspace programs used with these
protocols already require an additional step to install; this would
just be adding a handful of other packages to the mix.
* It is likely to be seen as a demotion by the ham community.  No
matter how much you explain it to folks, there will be some who view
removal from the main kernel tree as a step down.
* Inevitably, there will be impedance mismatches as kernel interfaces
change.  Whereas now these are mostly taken care of since the code
is-tree along with the interfaces that are changing, out-of-tree
modules will lag the kernel. Moreover, there is a versioning burden
that does not exist right now: one must ensure one has the correct
module version of their kernel, etc.
* This code as a forcing function of an unusual protocol family to
prevent the kernel's network stack from becoming too IP-centric is
significantly lessened; it would still need to be accommodated, since
it would run in the context of the kernel, but since it was not in the
kernel by default, it wouldn't exert as much pressure on design.
* It doesn't do much, if anything, for the documentation problem.
* It doesn't do much to address the accessibility issue for most developers=
.

### Discussion

Some more details are needed here, in particular around infrastructure
to support this (where does it live? How is it tested?) and
interaction with the kernel proper (how are breaking changes detected
and mitigated?).

## Moving to a Userspace Implementation

The final option on the list of viable alternatives is to excise the
protocols from the kernel entirely, and run them in a userspace
program.  This is predicated on the observation that each of the three
is run over relatively low-speed links: 1200 BAUD to 9600.  In that
case, there the performance penalty for crossing the
userspace<->kernel boundary is insignificant.

There is significant precedence for this: among extant AX.25
implementations, JNOS2, LinBPQ, Direwolf, Sailer's SoundModem (and
probably others I'm unaware of), are all userspace implementation.

### Pros and Cons of a Userspace Implementation

Pros:
* The protocol code could be made completely independent of the
kernel, and thus both are free to change at their own rate; the
interface boundaries would be the usual system call interfaces.
* A bug or failure merely crashes a program (which could be
restarted); it does not take down the entire machine.
* It could be reimplemented in whatever language one likes, or
accessed via FFI; it not be constrained to C (or Rust).  Libraries
implementing the protocols could be incorporated into larger systems
that use open monitoring systems, are managed by e.g. systemd, and so
forth.
* A suitable userspace implementation may already exist: LinBPQ and/or
JNOS2, for example.  LinFBB was brought up as a use case, and at a
glance it appears that it may be possible to make LinFBB use LinBPQ
directly.
* Userspace code is arguably easier to develop and iterate on:
portions can be unit-tested, it can be put into artificial test
scaffolds and exercised, and so forth.  The edit/compile/test cycle is
fast and can be made fairly easy.  Sanitizers, fuzzing, and other
tooling can be easily brought to bear to flush out bugs and increase
robustness.  While much of this can likely be done in the kernel, as
well, it requires considerably more expertise to do that well.
* Userspace implementations of these protocols are not constrained by
e.g., the sockets API that the existing kernel implementation exposes
to client programs.  They can provide whatever interface to clients
that makes sense, specifically tailored to amateur radio use.
* This could lead to further simplifications inside of the kernel: for
example, special cases for routing IP over AX.25 and/or NET/ROM (if
these exist) could be removed; TAP/TUN could handle that use case
instead.
* A userspace implementation is more portable.  Perhaps Linux hams
don't particularly care so much, but with some care, the
implementation could be made to run on e.g. a microcontroller or
another OS.

Cons:
* Compatibility with existing software requires more work.  In
particular, to use existing software that expects the sockets API
unmodified, we would have provide a shim library that implements that
interface, and then inject that into existing software: for
dynamically linked executables, this can be done using `LD_PRELOAD`
tricks; statically linked binaries would be out of luck.
* Just emulating the sockets API doesn't give exact fidelity for other
functionality.  Files tied to AX.25 and synthesized by the kernel,
such as those under /sys, are not easily provided (unless we overload
`open` in addition to the socket APIs).  Tools like `netstat` would no
longer display information about amateur radio protocol state; to be
fair, the `ip` and `ss` tools are already pretty anemic for these
protocols, but the point is that some amount of retooling would be
necessary.
* Messaging would ideally be handled with thoughtfulness, care, and
attention.  I would anticipate that some members of the amateur radio
community would have a hard time not misinterpreting removal from the
kernel as "Linux kicking out hams!"  Of course that wouldn't be the
case; a significant factor of the motivation for proposing a userspace
implementation is getting a much _better_ implementation for hams.

### Discussion

Again, I would ask why people want AX.25, NET/ROM, and ROSE in the
kernel, specifically.  To my mind, the important part is being able to
use these protocols from a stable platform; whether they are
implemented in or out of the kernel is an implementation detail, and
mostly irrelevant.

To that end, the userspace route seems like the best, long-term,
provided it is messaged and socialized properly, and folks step up who
are committed to providing the necessary compatibility shim libraries.

> If the consensus is that trying to keep the drivers in thee tree up to
> date is the way ahead I'm happy to put my hand up to do this if no one
> else is so inclined - I've a couple friends I can bug to help me get
> back up to speed.
>
> But I'm also mindful there are other hams that have been more recently
> involved in kernel work, so am going to give them a gentle nudge offline
> too :)

The above are my two cents.  I'd be interested in other perspectives.

        - Dan C.
          (KZ2X)

> Cheers/73,
> Hugh
> VK3YYZ/AD5RV
>
>
> [0] First licensed in the late 80's and can even remember the smell and
> sound of a Model 33 teletype connected to a TNC :)
>
> [1] Installed Slackware in the early 90's and never fully recovered,
> some of my code still in the kernel to this day :)
>
> [2]
> https://lore.kernel.org/linux-hams/761f83cc-58eb-4b4a-ba91-d11412e7b2a6@g=
mail.com/T/#t
>
>
>
> --
> I am slowly moving [email protected] as my main email address.
> If you're [email protected] please update your address book accordin=
gly.
> Thank you :)
>
>