Crates.io | mutnet |
lib.rs | mutnet |
version | 0.7.0 |
source | src |
created_at | 2023-09-19 12:31:07.257667 |
updated_at | 2024-09-15 19:03:13.917998 |
description | Unsafe-free and allocation-free, no-std network protocol parsing and in-place manipulation library. |
homepage | |
repository | https://github.com/arctic-alpaca/mutnet |
max_upload_size | |
id | 976803 |
size | 837,971 |
mutnet is an unsafe-free and allocation-free, zero-dependency, no-std network protocol parsing and in-place manipulation library.
mutnet makes use of #[forbid(unsafe_code)]
to ensure the absence of unsafe code.
The absence of panics for all parsing, lookup and manipulation methods is checked via the Kani verifier.
You can either use the provided parse_network_data(...)
method or create your own parser by chaining
protocol parsing steps as required.
Data access and manipulation methods for every layer are implemented in traits. Please see docs.rs for a list of all available method traits.
To prevent "endless" parsing of IPv6 extension headers, any method parsing IPv6 extensions requires a const generic parameter limiting the amount of extension that will be parsed.
When a new layer is parsed (new(...)
& new_from_lower(...
), the underlying data buffer is moved to a new
type/struct.
This move leads to a full copy of the data if an array is used as the parameter to the initial new(...)
call.
To prevent this, use a (mutable) reference to a smart pointer (like a Vector).
To change the length of a protocol (e.g. add options to IPv4), the header needs to grow or shrink. Typically, moving the header data before the payload leads to less data that needs to be moved (copied). To move the header data, some empty space before the start of the network data is required. This space is called headroom. mutnet expects the user to supply properly structured data if length modifying methods will be used.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Headroom | Network Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
fn print_eth_source(data: &[u8]) {
let eth = DataBuffer::<_, Eth>::new(data, 0).unwrap();
println!("Eth source: {:?}", eth.ethernet_source());
}
For more see parse_from_iface.rs.
Any layer may only occur once per parsed data buffer.
Design lists some details about the design of this crate.
error_trait
: use unstable core::error:Error
, only available in nightlystd
: use std (enabled by default)mutnet is licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.