Struct etherparse::LaxIpv4Slice
source · pub struct LaxIpv4Slice<'a> { /* private fields */ }
Expand description
Slice containing laxly separated IPv4 headers & payload.
Compared to the normal Ipv4Slice
this slice allows the
payload to be incomplete/cut off and errors to be present in
the IpPayload.
The main usecases for “laxly” parsed slices are are:
- Parsing packets that have been cut off. This is, for example, useful to parse packets returned via ICMP as these usually only contain the start.
- Parsing packets where the
total_len
(for IPv4) have not yet been set. This can be useful when parsing packets which have been recorded in a layer before the length field was set (e.g. before the operating system set the length fields).
Implementations§
source§impl<'a> LaxIpv4Slice<'a>
impl<'a> LaxIpv4Slice<'a>
sourcepub fn from_slice(
slice: &[u8]
) -> Result<(LaxIpv4Slice<'_>, Option<HeaderSliceError>), HeaderSliceError>
pub fn from_slice( slice: &[u8] ) -> Result<(LaxIpv4Slice<'_>, Option<HeaderSliceError>), HeaderSliceError>
Separates and validates IPv4 headers (including extension headers) & the payload from the given slice with less strict length checks (useful for cut off packet or for packets with unset length fields).
If you want to only receive correct IpPayloads use Ipv4Slice::from_slice
instead.
The main usecases for this functions are:
- Parsing packets that have been cut off. This is, for example, useful to parse packets returned via ICMP as these usually only contain the start.
- Parsing packets where the
total_len
(for IPv4) have not yet been set. This can be useful when parsing packets which have been recorded in a layer before the length field was set (e.g. before the operating system set the length fields).
§Differences to Ipv4Slice::from_slice
:
There are two main differences:
- Errors in the expansion headers will only stop the parsing and return an
Ok
with the successfully parsed parts and the error as optional. Only if an unrecoverable error is encountered in the IP header itself anErr
is returned. In the normalIpv4Slice::from_slice
function anErr
is returned if an error is encountered in an exteions header. LaxIpv4Slice::from_slice
ignores inconsistenttotal_len
values. When thetotal_len
value in the IPv4 header are inconsistant the length of the given slice is used as a substitute.
§What happens in the total_len
value is inconsistent?
When the total_length value in the IPv4 header is inconsistent the
length of the given slice is used as a substitute. This can happen
if the total_length
field in the IPv4 header is:
- Bigger then the given slice (payload cannot fully be seperated).
- Too small to contain at least the IPv4 header.
Additionally you can check if more data was expected based on the
total_len
but the given slice was too small by checking if incomplete
is set to true
in the returned LaxIpPayloadSlice
.
You can check if the slice length was used as a substitude by checking
if the len_source
value in the returned LaxIpPayloadSlice
is set to
LenSource::Slice
. If a substitution was not needed len_source
is set to LenSource::Ipv4HeaderTotalLen
.
sourcepub fn header(&self) -> Ipv4HeaderSlice<'_>
pub fn header(&self) -> Ipv4HeaderSlice<'_>
Returns a slice containing the IPv4 header.
sourcepub fn extensions(&self) -> Ipv4ExtensionsSlice<'_>
pub fn extensions(&self) -> Ipv4ExtensionsSlice<'_>
Returns a slice containing the IPv4 extension headers.
sourcepub fn payload(&self) -> &LaxIpPayloadSlice<'a>
pub fn payload(&self) -> &LaxIpPayloadSlice<'a>
Returns a slice containing the data after the IPv4 header and IPv4 extensions headers.
sourcepub fn payload_ip_number(&self) -> IpNumber
pub fn payload_ip_number(&self) -> IpNumber
Returns the ip number the type of payload of the IPv4 packet.
This function returns the ip number stored in the last IPv4 header or extension header.
sourcepub fn is_payload_fragmented(&self) -> bool
pub fn is_payload_fragmented(&self) -> bool
Returns true if the payload is flagged as being fragmented.
Trait Implementations§
source§impl<'a> Clone for LaxIpv4Slice<'a>
impl<'a> Clone for LaxIpv4Slice<'a>
source§fn clone(&self) -> LaxIpv4Slice<'a>
fn clone(&self) -> LaxIpv4Slice<'a>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<'a> Debug for LaxIpv4Slice<'a>
impl<'a> Debug for LaxIpv4Slice<'a>
source§impl<'a> From<LaxIpv4Slice<'a>> for LaxIpSlice<'a>
impl<'a> From<LaxIpv4Slice<'a>> for LaxIpSlice<'a>
source§fn from(value: LaxIpv4Slice<'a>) -> Self
fn from(value: LaxIpv4Slice<'a>) -> Self
source§impl<'a> From<LaxIpv4Slice<'a>> for LaxNetSlice<'a>
impl<'a> From<LaxIpv4Slice<'a>> for LaxNetSlice<'a>
source§fn from(value: LaxIpv4Slice<'a>) -> LaxNetSlice<'a>
fn from(value: LaxIpv4Slice<'a>) -> LaxNetSlice<'a>
source§impl<'a> PartialEq for LaxIpv4Slice<'a>
impl<'a> PartialEq for LaxIpv4Slice<'a>
source§fn eq(&self, other: &LaxIpv4Slice<'a>) -> bool
fn eq(&self, other: &LaxIpv4Slice<'a>) -> bool
self
and other
values to be equal, and is used
by ==
.