pub struct LaxIpv6Slice<'a> { /* private fields */ }
Expand description

Slice containing laxly separated IPv6 headers & payload.

Compared to the normal Ipv6Slice this slice allows the payload to 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> LaxIpv6Slice<'a>

source

pub fn from_slice( slice: &'a [u8] ) -> Result<(LaxIpv6Slice<'a>, Option<(HeaderSliceError, Layer)>), HeaderSliceError>

Seperate an IPv6 header (+ extensions) & 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 crate::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 payload_length (in the IPv6 header) has 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 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 an Err is returned. In the normal Ipv4Slice::from_slice function an Err is returned if an error is encountered in an exteions header.
  • LaxIpv4Slice::from_slice ignores inconsistent payload_length values. When the payload_length value in the IPv6 header is inconsistant the length of the given slice is used as a substitute.

You can check if the slice length was used as a substitude by checking if the len_source value in the returned IpPayloadSlice is set to LenSource::Slice. If a substitution was not needed len_source is set to LenSource::Ipv6HeaderPayloadLen.

§When is the slice length used as a fallback?

The slice length is used as a fallback/substitude if the payload_length field in the IPv6 header is

  • Bigger then the given slice (payload cannot fully be seperated).
  • The value 0.
source

pub fn header(&self) -> Ipv6HeaderSlice<'a>

Returns a slice containing the IPv6 header.

source

pub fn extensions(&self) -> &Ipv6ExtensionsSlice<'a>

Returns a slice containing the IPv6 extension headers.

source

pub fn payload(&self) -> &LaxIpPayloadSlice<'a>

Returns a slice containing the data after the IPv6 header and IPv6 extensions headers.

source

pub fn is_payload_fragmented(&self) -> bool

Returns true if the payload is flagged as being fragmented.

Trait Implementations§

source§

impl<'a> Clone for LaxIpv6Slice<'a>

source§

fn clone(&self) -> LaxIpv6Slice<'a>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a> Debug for LaxIpv6Slice<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'a> From<LaxIpv6Slice<'a>> for LaxIpSlice<'a>

source§

fn from(value: LaxIpv6Slice<'a>) -> Self

Converts to this type from the input type.
source§

impl<'a> From<LaxIpv6Slice<'a>> for LaxNetSlice<'a>

source§

fn from(value: LaxIpv6Slice<'a>) -> LaxNetSlice<'a>

Converts to this type from the input type.
source§

impl<'a> PartialEq for LaxIpv6Slice<'a>

source§

fn eq(&self, other: &LaxIpv6Slice<'a>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a> Eq for LaxIpv6Slice<'a>

source§

impl<'a> StructuralPartialEq for LaxIpv6Slice<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for LaxIpv6Slice<'a>

§

impl<'a> RefUnwindSafe for LaxIpv6Slice<'a>

§

impl<'a> Send for LaxIpv6Slice<'a>

§

impl<'a> Sync for LaxIpv6Slice<'a>

§

impl<'a> Unpin for LaxIpv6Slice<'a>

§

impl<'a> UnwindSafe for LaxIpv6Slice<'a>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.