packet_formats::tcp

Struct TcpSegmentRaw

Source
pub struct TcpSegmentRaw<B: SplitByteSlice> { /* private fields */ }
Expand description

A partially-parsed and not yet validated TCP segment.

A TcpSegmentRaw shares its underlying memory with the byte slice it was parsed from or serialized to, meaning that no copying or extra allocation is necessary.

Parsing a TcpSegmentRaw from raw data will succeed as long as at least 4 bytes are available, which will be extracted as a TcpFlowHeader that contains the TCP source and destination ports. A TcpSegmentRaw is, then, guaranteed to always have at least that minimal information available.

TcpSegment provides a [FromRaw] implementation that can be used to validate a TcpSegmentRaw.

Implementations§

Source§

impl<B: SplitByteSlice> TcpSegmentRaw<B>

Source

pub fn flow_header(&self) -> TcpFlowHeader

Gets the flow header from this packet.

Source

pub fn builder<A: IpAddress>( &self, src_ip: A, dst_ip: A, ) -> Option<TcpSegmentBuilderWithOptions<A, ArrayVec<u8, MAX_OPTIONS_LEN>>>

Constructs a builder with the same contents as this packet.

Returns None if an entire TCP header was not successfully parsed.

Note that, since TcpSegmentRaw does not validate its header fields, it’s possible for builder to produce a TcpSegmentBuilder which describes an invalid TCP segment, or one which this module is not capable of building from scratch. In particular:

  • The source or destination ports may be zero, which is illegal (these ports are reserved in IANA’s Service Name and Transport Protocol Port Number Registry).
  • The ACK number may be nonzero even though the ACK flag is not set. This is not illegal according to RFC 793, but it’s possible that some implementations expect it not to happen.
  • Some of the reserved zero bits between the Data Offset and Flags fields may be set. This may be due to a noncompliant implementation or a future change to TCP which makes use of these bits.
Source

pub fn into_builder_options<A: IpAddress>( self, src_ip: A, dst_ip: A, ) -> Option<(TcpSegmentBuilder<A>, Records<B, TcpOptionsImpl>, B)>

Transform this TcpSegmentRaw into the equivalent builder, parsed options, and body.

Source

pub fn into_serializer<'a, A: IpAddress>( self, src_ip: A, dst_ip: A, ) -> Option<impl Serializer<Buffer = EmptyBuf> + 'a>
where B: 'a,

Consumes this segment and constructs a [Serializer] with the same contents.

Returns None if an entire TCP header was not successfully parsed.

This method has the same validity caveats as builder.

The returned Serializer has the Buffer type [EmptyBuf], which means it is not able to reuse the buffer backing this TcpSegmentRaw when serializing, and will always need to allocate a new buffer.

By consuming self instead of taking it by-reference, into_serializer is able to return a Serializer whose lifetime is restricted by the lifetime of the buffer from which this TcpSegmentRaw was parsed rather than by the lifetime on &self, which may be more restricted.

Trait Implementations§

Source§

impl<B: SplitByteSlice, A: IpAddress> FromRaw<TcpSegmentRaw<B>, TcpParseArgs<A>> for TcpSegment<B>

Source§

type Error = ParseError

The type of error that may happen during validation.
Source§

fn try_from_raw_with( raw: TcpSegmentRaw<B>, args: TcpParseArgs<A>, ) -> Result<Self, Self::Error>

Attempts to create Self from the raw form in raw with args.
Source§

impl<B> ParsablePacket<B, ()> for TcpSegmentRaw<B>
where B: SplitByteSlice,

Source§

type Error = ParseError

The type of errors returned from parse and parse_mut.
Source§

fn parse_metadata(&self) -> ParseMetadata

Gets metadata about this packet required by [GrowBuffer::undo_parse]. Read more
Source§

fn parse<BV: BufferView<B>>(buffer: BV, _args: ()) -> ParseResult<Self>

Parses a packet from a buffer. Read more
§

fn parse_mut<BV>(buffer: BV, args: ParseArgs) -> Result<Self, Self::Error>
where BV: BufferViewMut<B>, B: SplitByteSliceMut,

Parses a packet from a mutable buffer. Read more

Auto Trait Implementations§

§

impl<B> Freeze for TcpSegmentRaw<B>
where B: Freeze,

§

impl<B> RefUnwindSafe for TcpSegmentRaw<B>
where B: RefUnwindSafe,

§

impl<B> Send for TcpSegmentRaw<B>
where B: Send,

§

impl<B> Sync for TcpSegmentRaw<B>
where B: Sync,

§

impl<B> Unpin for TcpSegmentRaw<B>
where B: Unpin,

§

impl<B> UnwindSafe for TcpSegmentRaw<B>
where B: UnwindSafe,

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

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>,

Source§

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.