Struct etherparse::SlicedPacket
source · pub struct SlicedPacket<'a> {
pub link: Option<LinkSlice<'a>>,
pub vlan: Option<VlanSlice<'a>>,
pub ip: Option<InternetSlice<'a>>,
pub transport: Option<TransportSlice<'a>>,
pub payload: &'a [u8],
}
Expand description
Packet slice split into multiple slices containing the different headers & payload.
Everything that could not be parsed is stored in a slice in the field “payload”.
You can use
depending on your starting header to slice a packet.
Examples
Basic usage:
match SlicedPacket::from_ethernet(&packet) {
Err(value) => println!("Err {:?}", value),
Ok(value) => {
println!("link: {:?}", value.link);
println!("vlan: {:?}", value.vlan);
println!("ip: {:?}", value.ip);
println!("transport: {:?}", value.transport);
}
}
Fields§
§link: Option<LinkSlice<'a>>
Ethernet II header if present.
vlan: Option<VlanSlice<'a>>
Single or double vlan headers if present.
ip: Option<InternetSlice<'a>>
IPv4 or IPv6 header and IP extension headers if present.
transport: Option<TransportSlice<'a>>
TCP or UDP header if present.
payload: &'a [u8]
The payload field points to the rest of the packet that could not be parsed by etherparse.
Depending on what other fields contain a “Some” values the payload contains the corresponding payload.
For example if transport field contains Some(Udp(_)) then the payload field points to the udp payload. On the other hand if the transport field contains None then the payload contains the payload of next field containing a Some value (in order of transport, ip, vlan, link).
Implementations§
source§impl<'a> SlicedPacket<'a>
impl<'a> SlicedPacket<'a>
sourcepub fn from_ethernet(data: &'a [u8]) -> Result<SlicedPacket<'_>, ReadError>
pub fn from_ethernet(data: &'a [u8]) -> Result<SlicedPacket<'_>, ReadError>
Seperates a network packet slice into different slices containing the headers from the ethernet header downwards.
The result is returned as a SlicedPacket
struct. This function assumes the given data starts
with an ethernet II header.
Examples
Basic usage:
match SlicedPacket::from_ethernet(&packet) {
Err(value) => println!("Err {:?}", value),
Ok(value) => {
println!("link: {:?}", value.link);
println!("vlan: {:?}", value.vlan);
println!("ip: {:?}", value.ip);
println!("transport: {:?}", value.transport);
}
}
sourcepub fn from_ether_type(
ether_type: u16,
data: &'a [u8]
) -> Result<SlicedPacket<'_>, ReadError>
pub fn from_ether_type(
ether_type: u16,
data: &'a [u8]
) -> Result<SlicedPacket<'_>, ReadError>
Seperates a network packet slice into different slices containing the headers using
the given ether_type
number to identify the first header.
The result is returned as a SlicedPacket
struct. Currently supported
ether type numbers are:
ether_type::IPV4
ether_type::IPV6
ether_type::VLAN_TAGGED_FRAME
ether_type::PROVIDER_BRIDGING
ether_type::VLAN_DOUBLE_TAGGED_FRAME
If an unsupported ether type is given the given slice will be set as payload
and all other fields will be set to None
.
Example
Basic usage:
use etherparse::{ether_type, SlicedPacket};
match SlicedPacket::from_ether_type(ether_type::IPV4, packet) {
Err(value) => println!("Err {:?}", value),
Ok(value) => {
println!("link: {:?}", value.link);
println!("vlan: {:?}", value.vlan);
println!("ip: {:?}", value.ip);
println!("transport: {:?}", value.transport);
}
}
sourcepub fn from_ip(data: &'a [u8]) -> Result<SlicedPacket<'_>, ReadError>
pub fn from_ip(data: &'a [u8]) -> Result<SlicedPacket<'_>, ReadError>
Seperates a network packet slice into different slices containing the headers from the ip header downwards.
The result is returned as a SlicedPacket
struct. This function assumes the given data starts
with an IPv4 or IPv6 header.
Examples
Basic usage:
match SlicedPacket::from_ip(&packet) {
Err(value) => println!("Err {:?}", value),
Ok(value) => {
//link & vlan fields are empty when parsing from ip downwards
assert_eq!(None, value.link);
assert_eq!(None, value.vlan);
//ip & transport (udp or tcp)
println!("ip: {:?}", value.ip);
println!("transport: {:?}", value.transport);
}
}
sourcepub fn payload_ether_type(&self) -> Option<u16>
pub fn payload_ether_type(&self) -> Option<u16>
If the slice in the payload
field contains an ethernet payload
this method returns the ether type number describing the payload type.
The ether type number can come from an ethernet II header or a VLAN header depending on which headers are present.
In case that ip
and/or transport
fields are the filled None
is returned, as the payload contents then are defined by a
lower layer protocol described in these fields.
Trait Implementations§
source§impl<'a> Clone for SlicedPacket<'a>
impl<'a> Clone for SlicedPacket<'a>
source§fn clone(&self) -> SlicedPacket<'a>
fn clone(&self) -> SlicedPacket<'a>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more