tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kernel level multilink PPP and maybe (re)porting FreeBSD netgraph

I need advanced kernel-level multilink PPP (MLPPP) support, including
the ability to create bundle links via UDP (and maybe TCP) over IP.

We currently don't have a direct need for PPPoE or tunnelling via PPTP,
L2TP, or direct use of async and sync devices, but of course such
features would likely be needed by others, and some may eventually be
needed for the project I'm working on.

The only open-source software set that seems to even come close to
offering these features today is MPD running on FreeBSD with Netgraph.
We use this combination today with great success.

(MPD is at

However with a future of ever smaller, more diverse, and of course lower
cost, embedded devices I'm very much favouring a switch to NetBSD (even
though FreeBSD-current has much better support for one of the MIPS-based
boards we're initially considering using).

For the past week I've been mucking about with the old Netgraph port to
NetBSD 1.5V done by Barnim Dzwillo:

However it is based on a very old version of Netgraph, and of course
also a rather old version of NetBSD as well.

It's not going to work easily though in a modern NetBSD, and it does not
support MP (multi-core embedded SoC designs are already available and
will no doubt be ubiquitous in higher-end devices in the future).  I
thought briefly of merging it with my old 1.6 tree just to get it
working and to see what limitations it has in NetBSD, but given the age
of the Netgraph sources in the first place I realized this would be a
pointless waste of time.  Reviewing Julian Elischer's BAFUG talk from
November of 2006 shows some of the vast improvements to the Netgraph
code since that original post and these will be pretty much mandatory to
acquire in NetBSD anyway.

Yesterday I briefly looked at the current Netgraph code in FreeBSD, but
bringing it over to NetBSD will be an even bigger effort due to the ever
wider differences between NetBSD and FreeBSD.

So, before I consider further work down this path I wanted to query
the wider NetBSD community for ideas.

First off, Netgraph and my bias.  I've wanted my favourite open-source
system (no matter which it ended up being) to have something like
Netgraph ever since I turned off my last old AT&T Unix System V machine
with its STREAMS-based network stack and device drivers.

However Netgraph as it appears in FreeBSD is still very much an optional
toy that's bolted on the side of a BSD kernel, not a core piece of
technology that everyone loves and uses.  Some of the diagrams that
Julian has produced to show how it is bolted on show just how ugly this
gets, revealing all the warts in how this messes with the desired order
of operations in a BSD based network stack and all the many existing
hooks and call-outs.  In my vision a true Netgraph based system should
have all the old network stack ripped right out and removed entirely, to
be replaced entirely by Netgraph, which would then require a few new
(i.e. as-yet unwritten) ng_* modules, including of course ng_ip, ng_tcp,
ng_udp, etc.  If Netgraph is to forever remain more of an afterthought
than _the_ core networking and device driver technology, is it really
worth using?

Meanwhile to get the kind of full-featured support for a versatile
MLPPP implementation such as what MPD offers, Netgraph provides
_huge_ and massive advantages, even if it is still just bolted on the
side of a traditional BSD networking stack.

In fact I can't even begin to think of any better way to implement the
kind of MLPPP support I need.  Perhaps I've just been blinded to other
mechanisms by my earlier exposure to graph and node based networking
stacks.  Something conceptually like bridge(4) might work, but given the
flexibility I need with many different devices and other hooks into the
network stack, the changes to support something like that would be just
as extensive as would be needed to add all of Netgraph in the first
place, so why not go with Netgraph, even if only for MLPPP?

Going with the current Netgraph code also requires making some decisions
to deal with some other aspects of FreeBSD.  For one there's the "vnet"
or virtualized network stacks feature.  Current Netgraph code integrates
fairly tightly with it and my brief look at the new Netgraph code
yesterday suggested it might be easier to bring along vnet than to
untangle it from Netgraph.  (Conceptually though vnet seems kinda silly
compared to a wholly Netgraph-based system which could offer such a
feature basically for "free".)

I think I have the resources to do a Netgraph to NetBSD port, but the
result would be something I would want the community to maintain,
i.e. continually improve and re-port as FreeBSD advances the base code.
I'm going to talk to Julian and possibly some other FreeBSD (and
DragonFly) and developers see if there's room to consider adding and
keeping "portability" in mind in the design and implementation of
Netgraph too.

I encourage anyone who's read this far, but who doesn't yet know so much
about Netgraph, to have a look at Archie Cobbs' DaemonNews article and
Julian's slides describing what's been worked on in Netgraph more

(BTW, Kohler's "Click Modular Router" is another interesting project!)

                                                Greg A. Woods
                                                Planix, Inc.

<>       +1 416 218 0099

Attachment: pgpbVOBCwDkRk.pgp
Description: PGP signature

Home | Main Index | Thread Index | Old Index