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 use cases 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 use cases 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 extension header. LaxIpv4Slice::from_slice
ignores inconsistenttotal_len
values. When thetotal_len
value in the IPv4 header are inconsistent 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 separated).
- 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 substitute 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 more