Skip to content

oxidecomputer/ingot

Repository files navigation

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 IPv6 struct.
  • 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 have payload fields.
  • 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:

[profile.release]
debug = 2
lto = true

Current limitations

  • Packet bitfields cannot currently be specified with little-endian integers.
  • Ingot does not yet support no-alloc use.
  • To locally define packets through the Ingot macro, you must import the zerocopy crate into your own project.

About

Bare-metal, zero-copy packet manipulation

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages