io-pkt-v4, io-pkt-v4-hc, io-pkt-v6-hc

Networking manager


io-pkt-variant [-d driver [driver_options]] [-i instance]
   [-P priority] [-p protocol [protocol_options]] [-t threads] [-v]

where variant is one of v4, v4-hc, or v6-hc.

Runs on:



-d driver [driver_options]
Start the specified devn-* or devnp-* driver:
  • You can specify driver without the devn- or devnp- prefix or the .so extension. For example, to start the driver, specify -d i82544. If you specify the driver this way, io-pkt* looks for a devnp- version first. If there isn't one, io-pkt* loads the legacy io-net (devn-) version, using a special "shim" layer,
  • If you want to load a specific version of a driver, specify the full path of the module (e.g. /lib/dll/

The driver_options argument is a list of driver-specific options that the stack passes to the driver.

Note: Use commas, not spaces, to separate the options.

The stack processes various driver options; for more information, see "Generic driver options," below.

-i instance
The stack instance number, which is useful if you're running multiple instances of io-pkt. The io-pkt manager will service mount requests of type io-pktX, where X is the instance number. For example:
io-pkt-v4 -i1 -ptcpip prefix=/alt
mount -Tio-pkt1 /lib/dll/
-P priority
The priority to use for io-pkt's main thread. The default is 21.
-p protocol [protocol_options]
The protocol to start, followed by a list of protocol-specific options.
Note: Use commas, not spaces, to separate the options.

The available protocols include:

Protocol Module
pf-v4 (for use with io-pkt-v4 or io-pkt-v4-hc)
pf-v6 (for use with io-pkt-v6-hc)
tcpip The stack includes TCP/IP; you need to specify this protocol only if you want to pass additional parameters (e.g. prefix=) to it. For more information about the options, see below.
Don't register a SIGSEGV handler to quiesce the hardware if a segmentation violation occurs. This can help with debugging if it isn't possible to get a backtrace to the original code that generated the SIGSEGV through the signal handler.
-t threads
The number of processing threads to create. By default, one thread is created per CPU. These threads are the packet-processing threads that operate at Layer2 and may become the stack thread. For more information, see the Overview chapter of the QNX Neutrino Core Networking User's Guide.
If any errors occur while loading drivers and protocols, io-pkt sends messages to slogger. If you specify this option, io-pkt also displays them on the console.

If you specify the -p tcpip protocol, the protocol_options list can consist of one or more of the following, separated by commas without whitespace:

If the value of the pagesize option is bigger than sysconf(_SC_PAGESIZE), it's used only for the mbuf and cluster pools unless you also specify this option, in which case the page size is used for all pools.
Disable the caching of packet buffers. This should be needed only as a debugging facility.
Monitor changes to configuration strings, in particular CS_HOSTNAME. By default, io-pkt gets the hostname once at startup.
Prevent automatic stack mapping of enXX interface names to the actual interface names. By default, the stack automatically maps the first registered interface to en0 (if a real en0 isn't present), the second interface to en1, and so on, in order to preserve backwards compatibility with io-net-style command lines.
Enable (1) or disable (0) fastforwarding path. This is useful for gateways. This option enables, and is enabled by, forward; to enable only forward, specify forward,fastforward=0.
Enable forwarding of IPv4 packets between interfaces; this enables fastforward by default. The default is off.
(io-pkt-v6-hc only) Enable forwarding of IPv6 packets between interfaces; off by default.
(io-pkt-v4-hc and io-pkt-v6-hc only) Enable IPsec support; off by default.
As mbufs are freed after use, rather than returning them to the internal pool for general consumption, up to X mbufs are cached per thread to allow quicker retrieval on the next allocation.
The mbuf cluster size. A cluster is the largest amount of contiguous memory used by an mbuf. If the MTU is larger than a cluster, multiple clusters are used to hold the packet. The default cluster size is 2 KB (to fit a standard 1500-byte Ethernet packet).

Specifying the cluster size can improve performance; for more information, see "Jumbo packets and hardware checksumming" in the Network Drivers chapter of the QNX Neutrino Core Networking User's Guide.

The smallest amount of data allocated each time for the internal memory pools. This quantum is then carved into chunks of varying size, depending on the pool.
(io-pkt-v4-hc and io-pkt-v6-hc only) Run packet filters on packets before encryption. The default is to do it after encryption.
As mbuf and cluster combinations are freed after use, rather than return them to the internal pool for general consumption, up to X mbufs and clusters are cached per thread to allow quicker retrieval on the next allocation.
Allocate packet buffers from the specified typed memory object. For example:
io-pkt -ptcpip pkt_typed_mem=ram/dma
The path to prepend to the traditional /dev/socket. The is useful when running multiple stacks. Clients can target a particular stack by using the SOCK environmental variable. For example:
io-pkt -ptcpip prefix=/alt
SOCK=/alt ifconfig -a
Use /dev/random as the source of random data. By default, io-pkt uses a builtin pseudo-random number generator.
Specify the size of the receive context buffer, in bytes. The default is 65536; the minimum is 2048.
If using the SO_REUSEPORT socket option, received unicast UDP packets are delivered to all sockets bound to the port. The default is to deliver only multicast and broadcast to all sockets.
rx_prio=X or rx_pulse_prio=X
The priority for receive threads to use (the default is 21). A driver-specific priority option (if supported by the driver) can override this priority.
Specify the value of SOMAXCONN, the maximum length of the listen queue used to accept new TCP connections. The minimum is the value in <sys/socket.h>.
Specify the size of each thread's stack, in bytes. The default is 4096.
If the supply of threads is exhausted, increment their number by this amount, up to the value of threads_max. The default is 25.
Specify the maximum number of threads. The default is 200.
Specify the minimum number of threads. The default is 15, and the minimum is 4.
The priority to use for the timer pulse. The default is 21.


The io-pkt manager provides support for Internet domain sockets, Unix domain sockets, and dynamically loaded networking modules. It comes in several stack variants:

An IPv4 memory-reduced variant that doesn't support:
  • IPv6
  • Crypto / IPSec
  • 802.11 a/b/g Wi-Fi
  • Bridging
  • GRE / GRF
  • Multicast routing
  • Multipoint PPP
IPv4 version of the stack that has full encryption and Wi-Fi capability built in and includes hardware-accelerated cryptography capability (Fast IPsec).
IPv6 version of the stack (includes IPv4 as part of v6) that has full encryption and Wi-Fi capability, also with hardware-accelerated cryptography.

After you've launched io-pkt*, you can use the mount command to start drivers or load additional modules such as or If you want to pass options to the driver, use the -o option before the name of the shared object. For example:

mount -T io-pkt -o mac=12345678
  • You can use umount to unmount legacy io-net drivers, but not io-pkt* drivers. Other drivers may allow you to detach the driver from the stack, by using ifconfig's destroy command (if the driver supports it).
  • If io-pkt runs out of threads, it sends a message to slogger, and anything that requires a thread blocks until one becomes available.
  • Native io-pkt and ported NetBSD drivers don't put entries into the /dev/io-net namespace, so a waitfor command for such an entry won't work properly in buildfiles or scripts. Use if_up -p instead; for example, instead of waitfor /dev/io-net/en0, use if_up -p en0.
  • If a TCP/IP packet is smaller than the minimum Ethernet packet size, the packet may be padded with random data, rather than zeroes.

The io-pkt manager supports TUN and TAP. To create the interfaces, use ifconfig:

ifconfig tun0 create
ifconfig tap0 create

For more information, see the NetBSD documentation:

Generic driver options

The stack processes the following generic driver options:

Override the default interface prefix used for network drivers. For example:
io-pkt-v4 -di82544 name=en

starts the driver with the io-net-style interface naming convention (enXX). You can also use this option to assign interface names based on (for example) functionality:

io-pkt-v4 -di82544 pci=0,name=wan
The interface number to use. If number is negative, it's ignored. By default, the interfaces are numbered starting at 0.
Note: These options don't work with legacy io-net legacy drivers. If you attempt to use them with a devn- driver, the driver won't be loaded, and the log will include an "unknown option" error.

The stack also processes the following driver options for all USB drivers using the NetBSD-to-QNX conversion library to let you identify a particular USB device using information obtained from running usb -v:

Device product ID.
Device vendor ID.
Device address, as reported by the usb utility.
Host controller, as reported by the usb utility

For example:

io-pkt-v4-hc -drum did=0x0020,vid=0x13b1,devno=1,busno=1


Start the v4 TCP/IP variant of io-pkt using the driver on BCM91480A eth0:

io-pkt-v4 -d /lib/dll/ \
ifconfig bcm0 10.184