TcpSegment

Struct TcpSegment 

Source
pub struct TcpSegment<'a, T: 'a> { /* private fields */ }
Expand description

Interprets the inner bytes as a TCP segment.

Implementations§

Source§

impl<T: NetworkBytes + Debug> TcpSegment<'_, T>

Source

pub fn source_port(&self) -> u16

Returns the source port.

Source

pub fn destination_port(&self) -> u16

Returns the destination port.

Source

pub fn sequence_number(&self) -> u32

Returns the sequence number.

Source

pub fn ack_number(&self) -> u32

Returns the acknowledgement number (only valid if the ACK flag is set).

Source

pub fn header_len_rsvd_ns(&self) -> (u8, u8, bool)

Returns the header length, the value of the reserved bits, and whether the NS flag is set or not.

Source

pub fn header_len(&self) -> u8

Returns the length of the header.

Source

pub fn flags_after_ns(&self) -> Flags

Returns the TCP header flags, with the exception of NS.

Source

pub fn window_size(&self) -> u16

Returns the value of the window size header field.

Source

pub fn checksum(&self) -> u16

Returns the value of the checksum header field.

Source

pub fn urgent_pointer(&self) -> u16

Returns the value of the urgent pointer header field (only valid if the URG flag is set).

Source

pub fn options_unchecked(&self, header_len: usize) -> &[u8]

Returns the TCP header options as an [&u8] slice.

§Panics

This method may panic if the value of header_len is invalid.

Source

pub fn payload_unchecked(&self, header_len: usize) -> &[u8]

Returns a slice which contains the payload of the segment. May panic if the value of header_len is invalid.

§Panics

This method may panic if the value of header_len is invalid.

Source

pub fn len(&self) -> u16

Returns the length of the segment.

Source

pub fn payload(&self) -> &[u8]

Returns a slice which contains the payload of the segment.

Source

pub fn payload_len(&self) -> u16

Returns the length of the payload.

Source

pub fn compute_checksum(&self, src_addr: Ipv4Addr, dst_addr: Ipv4Addr) -> u16

Computes the TCP checksum of the segment. More details about TCP checksum computation can be found here.

Source

pub fn parse_mss_option_unchecked( &self, header_len: usize, ) -> Result<Option<NonZeroU16>, TcpError>

Parses TCP header options (only MSS is supported for now).

If no error is encountered, returns the MSS value, or None if the option is not present.

§Panics

This method may panic if the value of header_len is invalid.

Source

pub fn from_bytes_unchecked(bytes: T) -> Self

Interprets bytes as a TCP segment without any validity checks.

§Panics

This method does not panic, but further method calls on the resulting object may panic if bytes contains invalid input.

Source

pub fn from_bytes( bytes: T, verify_checksum: Option<(Ipv4Addr, Ipv4Addr)>, ) -> Result<Self, TcpError>

Attempts to interpret bytes as a TCP segment, checking the validity of the header fields.

The verify_checksum parameter must contain the source and destination addresses from the enclosing IPv4 packet if the TCP checksum must be validated.

Source§

impl<T: NetworkBytesMut + Debug> TcpSegment<'_, T>

Source

pub fn set_source_port(&mut self, value: u16) -> &mut Self

Sets the source port.

Source

pub fn set_destination_port(&mut self, value: u16) -> &mut Self

Sets the destination port.

Source

pub fn set_sequence_number(&mut self, value: u32) -> &mut Self

Sets the value of the sequence number field.

Source

pub fn set_ack_number(&mut self, value: u32) -> &mut Self

Sets the value of the acknowledgement number field.

Source

pub fn set_header_len_rsvd_ns(&mut self, header_len: u8, ns: bool) -> &mut Self

Sets the value of the ihl header field based on header_len (which should be a multiple of 4), clears the reserved bits, and sets the NS flag according to the last parameter.

Source

pub fn set_flags_after_ns(&mut self, flags: Flags) -> &mut Self

Sets the value of the header byte containing every TCP flag except NS.

Source

pub fn set_window_size(&mut self, value: u16) -> &mut Self

Sets the value of the window size field.

Source

pub fn set_checksum(&mut self, value: u16) -> &mut Self

Sets the value of the checksum field.

Source

pub fn set_urgent_pointer(&mut self, value: u16) -> &mut Self

Sets the value of the urgent pointer field.

Source

pub fn payload_mut_unchecked(&mut self, header_len: usize) -> &mut [u8]

Returns a mutable slice containing the segment payload.

§Panics

This method may panic if the value of header_len is invalid.

Source

pub fn payload_mut(&mut self) -> &mut [u8]

Returns a mutable slice containing the segment payload.

Source

pub fn write_segment<R: ByteBuffer + ?Sized + Debug>( buf: T, src_port: u16, dst_port: u16, seq_number: u32, ack_number: u32, flags_after_ns: Flags, window_size: u16, mss_option: Option<u16>, mss_remaining: u16, payload: Option<(&R, usize)>, compute_checksum: Option<(Ipv4Addr, Ipv4Addr)>, ) -> Result<Self, TcpError>

Writes a complete TCP segment.

§Arguments
  • buf - Write the segment to this buffer.
  • src_port - Source port.
  • dst_port - Destination port.
  • seq_number - Sequence number.
  • ack_number - Acknowledgement number.
  • flags_after_ns - TCP flags to set (except NS, which is always set to 0).
  • window_size - Value to write in the window size field.
  • mss_option - When a value is specified, use it to add a TCP MSS option to the header.
  • mss_remaining - Represents an upper bound on the payload length (the number of bytes used up by things like IP options have to be subtracted from the MSS). There is some redundancy looking at this argument and the next one, so we might end up removing or changing something.
  • payload - May contain a buffer which holds payload data and the maximum amount of bytes we should read from that buffer. When None, the TCP segment will carry no payload.
  • compute_checksum - May contain the pair addresses from the enclosing IPv4 packet, which are required for TCP checksum computation. Skip the checksum altogether when None.
Source

pub fn write_incomplete_segment<R: ByteBuffer + ?Sized + Debug>( buf: T, seq_number: u32, ack_number: u32, flags_after_ns: Flags, window_size: u16, mss_option: Option<u16>, mss_remaining: u16, payload: Option<(&R, usize)>, ) -> Result<Incomplete<Self>, TcpError>

Writes an incomplete TCP segment, which is missing the source port, destination port, and checksum fields.

This method writes the rest of the segment, including data (when available). Only the MSS option is supported for now. The NS flag, URG flag, and urgent pointer field are set to 0.

§Arguments
  • buf - Write the segment to this buffer.
  • seq_number - Sequence number.
  • ack_number - Acknowledgement number.
  • flags_after_ns - TCP flags to set (except NS, which is always set to 0).
  • window_size - Value to write in the window size field.
  • mss_option - When a value is specified, use it to add a TCP MSS option to the header.
  • mss_remaining - Represents an upper bound on the payload length (the number of bytes used up by things like IP options have to be subtracted from the MSS). There is some redundancy looking at this argument and the next one, so we might end up removing or changing something.
  • payload - May contain a buffer which holds payload data and the maximum amount of bytes we should read from that buffer. When None, the TCP segment will carry no payload.

Trait Implementations§

Source§

impl<'a, T: Debug + 'a> Debug for TcpSegment<'a, T>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for TcpSegment<'a, T>
where T: Freeze,

§

impl<'a, T> RefUnwindSafe for TcpSegment<'a, T>
where T: RefUnwindSafe,

§

impl<'a, T> Send for TcpSegment<'a, T>
where T: Send + Sync,

§

impl<'a, T> Sync for TcpSegment<'a, T>
where T: Sync,

§

impl<'a, T> Unpin for TcpSegment<'a, T>
where T: Unpin,

§

impl<'a, T> UnwindSafe for TcpSegment<'a, T>

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> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Return the immutable any encapsulated object.
Source§

fn as_mut_any(&mut self) -> &mut (dyn Any + 'static)

Return the mutable encapsulated any object.
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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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.

§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V