Ingot -- bare metal packets
Ingot is a framework for writing network packet and header parsers, designed to support hybrid zero-copy and owned packet representations.
The library is built on top of zerocopy.
Ingot takes heavy inspiration from libpnet, with some key differences to support OPTE:
- First-class support for chaining headers and selecting over next-header values to parse packets.
- Packet views and representations generate common read and write traits (
UdpRef,UdpMut). Setting and getting fields from present or pushed headers is consistent and easy. - Support for nested parsing of headers -- e.g., IPv6 extensions within a parent
IPv6struct. - Ingot allows packet parsing over split buffers (so long as each header is contiguous), e.g., in illumos
mblk_ts. Accordingly, individual headers do not havepayloadfields. - Variable-width packet segments (options, extensions) can be replaced with their owned representation, even when their parent is a zero-copy view. This makes it easier to alter options in place, if needed.
Performance
Because ingot is based upon the third-party library zerocopy, compiling your binaries with LTO enabled is crucial for maximising performance. To do so, include the following in your Cargo.toml:
[]
= 2
= true
Current limitations
- Packet bitfields cannot currently be specified with little-endian integers.
- Ingot does not yet support no-
allocuse. - To locally define packets through the
Ingotmacro, you must import thezerocopycrate into your own project.
License
This project is available under the terms of the MPL 2.0 license.