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: SplitByteSliceMut> TcpSegmentRaw<B>
impl<B: SplitByteSliceMut> TcpSegmentRaw<B>
Sourcepub fn set_src_port(&mut self, new: NonZeroU16)
pub fn set_src_port(&mut self, new: NonZeroU16)
Set the source port of the TCP packet.
Sourcepub fn set_dst_port(&mut self, new: NonZeroU16)
pub fn set_dst_port(&mut self, new: NonZeroU16)
Set the destination port of the TCP packet.
Sourcepub fn update_checksum_pseudo_header_address<A: IpAddress>(
&mut self,
old: A,
new: A,
)
pub fn update_checksum_pseudo_header_address<A: IpAddress>( &mut self, old: A, new: A, )
Update the checksum to reflect an updated address in the pseudo header.
Source§impl<B: SplitByteSlice> TcpSegmentRaw<B>
impl<B: SplitByteSlice> TcpSegmentRaw<B>
Sourcepub fn flow_header(&self) -> TcpFlowHeader
pub fn flow_header(&self) -> TcpFlowHeader
Gets the flow header from this packet.
Sourcepub fn builder<A: IpAddress>(
&self,
src_ip: A,
dst_ip: A,
) -> Option<TcpSegmentBuilderWithOptions<A, ArrayVec<u8, MAX_OPTIONS_LEN>>>
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.
Sourcepub fn into_builder_options<A: IpAddress>(
self,
src_ip: A,
dst_ip: A,
) -> Option<(TcpSegmentBuilder<A>, Records<B, TcpOptionsImpl>, B)>
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.
Sourcepub fn into_serializer<'a, A: IpAddress>(
self,
src_ip: A,
dst_ip: A,
) -> Option<impl Serializer<Buffer = EmptyBuf> + 'a>where
B: 'a,
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>
impl<B: SplitByteSlice, A: IpAddress> FromRaw<TcpSegmentRaw<B>, TcpParseArgs<A>> for TcpSegment<B>
Source§type Error = ParseError
type Error = ParseError
Source§fn try_from_raw_with(
raw: TcpSegmentRaw<B>,
args: TcpParseArgs<A>,
) -> Result<Self, Self::Error>
fn try_from_raw_with( raw: TcpSegmentRaw<B>, args: TcpParseArgs<A>, ) -> Result<Self, Self::Error>
Self from the raw form in raw with args.Source§impl<B> ParsablePacket<B, ()> for TcpSegmentRaw<B>where
B: SplitByteSlice,
impl<B> ParsablePacket<B, ()> for TcpSegmentRaw<B>where
B: SplitByteSlice,
Source§fn parse_metadata(&self) -> ParseMetadata
fn parse_metadata(&self) -> ParseMetadata
GrowBuffer::undo_parse. Read moreSource§fn parse<BV: BufferView<B>>(buffer: BV, _args: ()) -> ParseResult<Self>
fn parse<BV: BufferView<B>>(buffer: BV, _args: ()) -> ParseResult<Self>
Source§fn parse_mut<BV>(buffer: BV, args: ParseArgs) -> Result<Self, Self::Error>where
BV: BufferViewMut<B>,
B: SplitByteSliceMut,
fn parse_mut<BV>(buffer: BV, args: ParseArgs) -> Result<Self, Self::Error>where
BV: BufferViewMut<B>,
B: SplitByteSliceMut,
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more