Overview

The main part of the QNX Neutrino networking stack is the io-pkt
manager.
We provide several variants of it with different capabilities:

io-pkt-v4

IPv4 version of the stack with no encryption or Wi-Fi capability built in.
This is a "reduced footprint" version of the stack that
doesn't support the following:

IPv6

Crypto / IPSec

802.11 a/b/g Wi-Fi

Bridging

GRE / GRF

Multicast routing

Multipoint PPP

io-pkt-v4-hc

IPv4 version of the stack that has full encryption and Wi-Fi capability
built in and includes hardware-accelerated cryptography capability
(Fast IPsec).

io-pkt-v6-hc

IPv6 version of the stack (includes IPv4 as part of v6) that has full
encryption and Wi-Fi capability, also with hardware-accelerated cryptography.

Note:
In this guide, we use "io-pkt" to refer to all the stack variants.
When you start the stack, use the appropriate variant (io-pkt
isn't a symbolic link to any of them).

We've designed io-pkt to follow as
closely as possible the NetBSD networking stack code base and architecture.
This provides an optimal path between the IP protocol and drivers,
tightly integrating the IP layer with the rest of the stack.

The io-pkt implementation
replaces the previous generation of the stack, io-net,
and makes significant changes to the
QNX Neutrino stack architecture, including the following:

mount and umount capabilities:

Only io-net drivers may be both mounted and unmounted.
Other drivers may allow you to detach the driver from the stack, by
using the ifconfigifacedestroy command
(if the driver supports it).

The driver API and behavior have been changed to closely match those
of the NetBSD stack, allowing NetBSD drivers to be ported to
io-pkt.

A shim layer, devnp-shim.so, is provided that lets
you use an io-net driver as-is.

By default, driver interfaces are no longer sequentially numbered with
enx designations;
they're named according to driver type (e.g., fxp0 is the
interface for an Intel 10/100 driver).
You can use the name= driver option (processed by
io-pkt) to specify the interface name.

Drivers no longer present entries in the name space to be directly
opened and accessed with a devctl() command (e.g.,
open(/dev/io-net/en0)).
Instead, a socket file descriptor is opened and queried for
interface information.
The ioctl() command is then sent to the stack using this device
information.