pub struct TcpSegment<B> { /* private fields */ }Expand description
A TCP segment.
A TcpSegment shares its underlying memory with the byte slice it was
parsed from or serialized to, meaning that no copying or extra allocation is
necessary.
A TcpSegment - whether parsed using parse or created using
TcpSegmentBuilder - maintains the invariant that the checksum is always
valid.
Implementations§
Source§impl<B: SplitByteSlice> TcpSegment<B>
impl<B: SplitByteSlice> TcpSegment<B>
Sourcepub fn options(&self) -> &TcpOptionsRef<B>
pub fn options(&self) -> &TcpOptionsRef<B>
Returns the segment’s options.
Sourcepub fn into_body(self) -> B
pub fn into_body(self) -> B
Consumes this packet and returns the body.
Note that the returned B has the same lifetime as the buffer from
which this segment was parsed. By contrast, the body method returns
a slice with the same lifetime as the receiver.
Sourcepub fn src_port(&self) -> NonZeroU16
pub fn src_port(&self) -> NonZeroU16
The source port.
Sourcepub fn dst_port(&self) -> NonZeroU16
pub fn dst_port(&self) -> NonZeroU16
The destination port.
Sourcepub fn ack_num(&self) -> Option<u32>
pub fn ack_num(&self) -> Option<u32>
The acknowledgement number.
If the ACK flag is not set, ack_num returns None.
Sourcepub fn flags(&self) -> u8
pub fn flags(&self) -> u8
The segment’s flag bits: the six control flags and the two ECN flags.
Sourcepub fn reserved_bits(&self) -> u8
pub fn reserved_bits(&self) -> u8
The segment’s reserved bits, held in the low nibble of the returned byte.
Sourcepub fn window_size(&self) -> u16
pub fn window_size(&self) -> u16
The sender’s window size.
Sourcepub fn header_len(&self) -> usize
pub fn header_len(&self) -> usize
The length of the header prefix and options.
Sourcepub fn total_segment_len(&self) -> usize
pub fn total_segment_len(&self) -> usize
The length of the segment as calculated from the header prefix, options, and body.
Sourcepub fn recover_payload_partial_sum<I: Ip>(
&self,
src_ip: I::Addr,
dst_ip: I::Addr,
) -> Result<[u8; 2], TryFromIntError>
pub fn recover_payload_partial_sum<I: Ip>( &self, src_ip: I::Addr, dst_ip: I::Addr, ) -> Result<[u8; 2], TryFromIntError>
Recovers the 1’s complement partial sum of the TCP segment body (payload) without hashing the payload bytes.
The sender computes tcp_checksum = ~(sum(pseudo_hdr) + sum(tcp_hdr_csum_zero) + sum(payload)). In 1’s complement arithmetic
(RFC 1624), subtracting a sum S is equivalent to adding ~S.
Removing the pseudo header and the wire header prefix and options
subtracts sum(pseudo_hdr) + sum(tcp_hdr_csum_zero) + sum(tcp_checksum). Adding tcp_checksum back cancels out the checksum
field subtraction and leaves exactly ~sum(payload). Inverting that
produces the partial sum sum(payload).
Returns an error if the TCP segment exceeds the maximum length representable by the IP pseudo-header.
Sourcepub fn builder<A: IpAddress>(
&self,
src_ip: A,
dst_ip: A,
) -> TcpSegmentBuilderWithOptions<A, &TcpOptionsRef<B>>
pub fn builder<A: IpAddress>( &self, src_ip: A, dst_ip: A, ) -> TcpSegmentBuilderWithOptions<A, &TcpOptionsRef<B>>
Constructs a builder with the same contents as this packet.
Sourcepub fn into_builder<A: IpAddress>(
self,
src_ip: A,
dst_ip: A,
) -> TcpSegmentBuilderWithOptions<A, TcpOptionsRef<B>>
pub fn into_builder<A: IpAddress>( self, src_ip: A, dst_ip: A, ) -> TcpSegmentBuilderWithOptions<A, TcpOptionsRef<B>>
Consumes this segment and constructs a builder with the same contents.
Unlike TcpSegment::builder, the returned builder’s options borrow
from B rather than from self, so the builder can outlive this
TcpSegment.
Sourcepub fn into_serializer<'a, A: IpAddress>(
self,
src_ip: A,
dst_ip: A,
) -> impl Serializer<NoOpSerializationContext, Buffer = EmptyBuf> + Debug + 'awhere
B: 'a,
pub fn into_serializer<'a, A: IpAddress>(
self,
src_ip: A,
dst_ip: A,
) -> impl Serializer<NoOpSerializationContext, Buffer = EmptyBuf> + Debug + 'awhere
B: 'a,
Consumes this segment and constructs a Serializer with the same
contents.
The returned Serializer has the Buffer type EmptyBuf, which
means it is not able to reuse the buffer backing this TcpSegment 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 TcpSegment was parsed rather
than by the lifetime on &self, which may be more restricted.
Source§impl<B: SplitByteSliceMut> TcpSegment<B>
impl<B: SplitByteSliceMut> TcpSegment<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.
Trait Implementations§
Source§impl<B: SplitByteSlice + CloneableByteSlice, A: IpAddress, C: TcpParseContext> FromRaw<TcpSegmentRaw<B>, TcpParseArgs<A, C>> for TcpSegment<B>
impl<B: SplitByteSlice + CloneableByteSlice, A: IpAddress, C: TcpParseContext> FromRaw<TcpSegmentRaw<B>, TcpParseArgs<A, C>> for TcpSegment<B>
Source§type Error = ParseError
type Error = ParseError
Source§fn try_from_raw_with(
raw: TcpSegmentRaw<B>,
_: TcpParseArgs<A, C>,
) -> Result<Self, Self::Error>
fn try_from_raw_with( raw: TcpSegmentRaw<B>, _: TcpParseArgs<A, C>, ) -> Result<Self, Self::Error>
Self from the raw form in raw with args.Source§impl<B: SplitByteSlice + CloneableByteSlice, A: IpAddress, C: TcpParseContext> ParsablePacket<B, TcpParseArgs<A, C>> for TcpSegment<B>
When parsing, this type imposes a B: CloneableByteSlice bound. This is
so that the type can
impl<B: SplitByteSlice + CloneableByteSlice, A: IpAddress, C: TcpParseContext> ParsablePacket<B, TcpParseArgs<A, C>> for TcpSegment<B>
When parsing, this type imposes a B: CloneableByteSlice bound. This is
so that the type can
- retain the original
Bto return the option bytes exactly as they were, and - have individual fields reference subsections of the
Bto avoid needless copies. This prevents parsing aTcpSegmentfrom aMutableByteSlice, but we deem that acceptable because it’s not a known requirement.
Source§fn parse_metadata(&self) -> ParseMetadata
fn parse_metadata(&self) -> ParseMetadata
GrowBuffer::undo_parse. Read moreSource§fn parse<BV: BufferView<B>>(
buffer: BV,
args: TcpParseArgs<A, C>,
) -> ParseResult<Self>
fn parse<BV: BufferView<B>>( buffer: BV, args: TcpParseArgs<A, C>, ) -> 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 TcpSegment<B>where
B: Freeze,
impl<B> RefUnwindSafe for TcpSegment<B>where
B: RefUnwindSafe,
impl<B> Send for TcpSegment<B>where
B: Send,
impl<B> Sync for TcpSegment<B>where
B: Sync,
impl<B> Unpin for TcpSegment<B>where
B: Unpin,
impl<B> UnsafeUnpin for TcpSegment<B>where
B: UnsafeUnpin,
impl<B> UnwindSafe for TcpSegment<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