The ptnet device driver provides direct access to host netmap ports, from within a Virtual Machine (VM).
Applications running inside the VM can access the TX/RX rings and buffers of a netmap port that the
hypervisor has passed-through to the VM. Hypervisor support for ptnet is currently available for
QEMU/KVM. Any netmap(4) port can be passed-through, including physical NICs, vale(4) ports, netmap
pipes, etc.
The main use-case for netmap passthrough is Network Function Virtualization (NFV), where middlebox
applications running within VMs may want to process very high packet rates (e.g., 1-10 millions packets
per second or more). Note, however, that those applications must use the device in netmap mode in order
to achieve such rates. In addition to the general advantages of netmap, the improved performance of
ptnet when compared to hypervisor device emulation or paravirtualization (e.g., vtnet(4), vmx(4)) comes
from the hypervisor being completely bypassed in the data-path. For example, when using vtnet(4) the VM
has to convert each mbuf(9) to a VirtIO-specific packet representation and publish that to a VirtIO
queue; on the hypervisor side, the packet is extracted from the VirtIO queue and converted to a
hypervisor-specific packet representation. The overhead of format conversions (and packet copies, in
same cases) is not incured by ptnet in netmap mode, because mbufs are not used at all, and the packet
format is the one defined by netmap (e.g., structnetmap_slot) along the whole data-path. No format
conversions or copies happen.
It is also possible to use a ptnet device like a regular network interface, which interacts with the
FreeBSD network stack (i.e., not in netmap mode). However, in that case it is necessary to pay the cost
of data copies between mbufs and netmap buffers, which generally results in lower TCP/UDP performance
than vtnet(4) or other paravirtualized network devices. If the passed-through netmap port supports the
VirtIO network header, ptnet is able to use it, and support TCP/UDP checksum offload (for both transmit
and receive), TCP segmentation offload (TSO) and TCP large receive offload (LRO). Currently, vale(4)
ports support the header. Note that the VirtIO network header is generally not used in NFV use-cases,
because middleboxes are not endpoints of TCP/UDP connections.