Skip to main content

IcmpTimestampMsgPart

Struct IcmpTimestampMsgPart 

Source
#[repr(C)]
pub struct IcmpTimestampMsgPart { pub originate_timestamp: [u8; 4], pub receive_timestamp: [u8; 4], pub transmit_timestamp: [u8; 4], }
Expand description

Represents the variable length portion of a Timestamp Request/Reply message (RFC 792) that follows the ICMP header.

Timestamps are milliseconds since midnight UT and are stored in network byte order.

§Example

use aya_ebpf::programs::TcContext;
use network_types::eth::EthHdr;
use network_types::icmp::{Icmpv4Hdr, IcmpError, Icmpv4HdrData, IcmpTimestampMsgPart};
use network_types::ip::Ipv4Hdr;

fn handle_icmp_timestamp(ctx: &TcContext) -> Result<u32, IcmpError> {
    // Parse the ICMP header from start of payload
    let icmp_start = ctx.data() + EthHdr::LEN + Ipv4Hdr::LEN;
    let icmp_hdr: *mut Icmpv4Hdr = icmp_start as *mut Icmpv4Hdr;

    // Timestamp request/reply share the same echo layout; ensure the type matches
    match unsafe { (*icmp_hdr).data()? } {
        Icmpv4HdrData::Timestamp(id_seq)
            | Icmpv4HdrData::TimestampReply(id_seq) => {
            let timestamps_ptr_location = icmp_start + Icmpv4Hdr::LEN;
            let timestamps: *const IcmpTimestampMsgPart =
                timestamps_ptr_location as *const IcmpTimestampMsgPart;

            let _id = id_seq.id();
            let _sequence = id_seq.sequence();
            unsafe {
                let _orig = (*timestamps).originate_timestamp();
                let _recv = (*timestamps).receive_timestamp();
                let _xmit = (*timestamps).transmit_timestamp();
                // Use the timestamp fields as needed.
            }
        },
        _ => {},
    }
    Ok(0)
}

Fields§

§originate_timestamp: [u8; 4]§receive_timestamp: [u8; 4]§transmit_timestamp: [u8; 4]

Implementations§

Source§

impl IcmpTimestampMsgPart

Source

pub const LEN: usize

Source

pub fn originate_timestamp(&self) -> u32

Returns the originate timestamp in host byte order (milliseconds since midnight UT)

Source

pub fn set_originate_timestamp(&mut self, timestamp: u32)

Sets the originate timestamp field (milliseconds since midnight UT). The value will be stored in network byte order.

Source

pub fn receive_timestamp(&self) -> u32

Returns the receive timestamp in host byte order (milliseconds since midnight UT)

Source

pub fn set_receive_timestamp(&mut self, timestamp: u32)

Sets the receive timestamp field (milliseconds since midnight UT). The value will be stored in network byte order.

Source

pub fn transmit_timestamp(&self) -> u32

Returns the transmit timestamp in host byte order (milliseconds since midnight UT)

Source

pub fn set_transmit_timestamp(&mut self, timestamp: u32)

Sets the transmit timestamp field (milliseconds since midnight UT). The value will be stored in network byte order.

Trait Implementations§

Source§

impl Clone for IcmpTimestampMsgPart

Source§

fn clone(&self) -> IcmpTimestampMsgPart

Returns a duplicate 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 Debug for IcmpTimestampMsgPart

Source§

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

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

impl<'de, WincodeConfig: Config> SchemaRead<'de, WincodeConfig> for IcmpTimestampMsgPart

Source§

const TYPE_META: TypeMeta

Metadata about the type’s serialization. Read more
Source§

type Dst = IcmpTimestampMsgPart

Source§

fn read( reader: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> ReadResult<()>

Read into dst from reader. Read more
Source§

fn get(reader: impl Reader<'de>) -> Result<Self::Dst, ReadError>

Read Self::Dst from reader into a new Self::Dst.
Source§

impl<WincodeConfig: Config> SchemaWrite<WincodeConfig> for IcmpTimestampMsgPart

Source§

const TYPE_META: TypeMeta

Metadata about the type’s serialization. Read more
Source§

type Src = IcmpTimestampMsgPart

Source§

fn size_of(src: &Self::Src) -> WriteResult<usize>

Get the serialized size of Self::Src. Read more
Source§

fn write(writer: impl Writer, src: &Self::Src) -> WriteResult<()>

Write Self::Src to writer.
Source§

impl<WincodeConfig: Config> ZeroCopy<WincodeConfig> for IcmpTimestampMsgPart
where for<'_wincode_internal, '_wincode_internal, '_wincode_internal> [u8; 4]: ZeroCopy<WincodeConfig>, for<'_wincode_internal> Assert<{ _ }>: IsTrue,

Source§

fn from_bytes<'de>(bytes: &'de [u8], config: C) -> Result<&'de Self, ReadError>
where Self: Sized + SchemaRead<'de, C, Dst = Self>,

Like crate::ZeroCopy::from_bytes, but allows the caller to provide a custom configuration.
Source§

fn from_bytes_mut<'de>( bytes: &'de mut [u8], config: C, ) -> Result<&'de mut Self, ReadError>
where Self: Sized + SchemaRead<'de, C, Dst = Self>,

Like crate::ZeroCopy::from_bytes_mut, but allows the caller to provide a custom configuration.
Source§

impl Copy for IcmpTimestampMsgPart

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<'de, T> Deserialize<'de> for T
where T: SchemaRead<'de, Configuration>,

Source§

fn deserialize(src: &'de [u8]) -> Result<Self::Dst, ReadError>

Deserialize the input src bytes into a new Self::Dst.
Source§

fn deserialize_into( src: &'de [u8], dst: &mut MaybeUninit<Self::Dst>, ) -> Result<(), ReadError>

Deserialize the input src bytes into dst.
Source§

impl<'de, T, C> Deserialize<'de, C> for T
where C: Config, T: SchemaRead<'de, C>,

Source§

fn deserialize(src: &'de [u8], config: C) -> Result<Self::Dst, ReadError>

Deserialize the input bytes into a new Self::Dst.
Source§

fn deserialize_into( src: &'de [u8], dst: &mut MaybeUninit<Self::Dst>, config: C, ) -> Result<(), ReadError>

Deserialize the input bytes into dst.
Source§

impl<T, C> DeserializeOwned<C> for T
where C: Config, T: SchemaReadOwned<C>,

Source§

fn deserialize_from<'de>(src: impl Reader<'de>) -> Result<Self::Dst, ReadError>

Deserialize from the given Reader into a new Self::Dst.
Source§

fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> Result<(), ReadError>

Deserialize from the given Reader into dst.
Source§

impl<T> DeserializeOwned for T

Source§

fn deserialize_from<'de>(src: impl Reader<'de>) -> Result<Self::Dst, ReadError>

Deserialize from the given Reader into a new Self::Dst.
Source§

fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> Result<(), ReadError>

Deserialize from the given Reader into dst.
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, C> Serialize<C> for T
where C: Config, T: SchemaWrite<C> + ?Sized,

Source§

fn serialize_into( dst: impl Writer, src: &Self::Src, config: C, ) -> Result<(), WriteError>

Serialize a serializable type into the given Writer.
Source§

fn serialized_size(src: &Self::Src, config: C) -> Result<u64, WriteError>

Get the size in bytes of the type when serialized.
Source§

impl<T> Serialize for T

Source§

fn serialize_into(dst: impl Writer, src: &Self::Src) -> Result<(), WriteError>

Serialize a serializable type into the given byte buffer.
Source§

fn serialized_size(src: &Self::Src) -> Result<u64, WriteError>

Get the size in bytes of the type when serialized.
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.
Source§

impl<T> ZeroCopy for T

Source§

fn from_bytes<'de>(bytes: &'de [u8]) -> Result<&'de Self, ReadError>
where Self: Sized + SchemaRead<'de, Configuration, Dst = Self>,

Get a reference to a type from the given bytes. Read more
Source§

fn from_bytes_mut<'de>(bytes: &'de mut [u8]) -> Result<&'de mut Self, ReadError>
where Self: Sized + SchemaRead<'de, Configuration, Dst = Self>,

Get a mutable reference to a type from the given bytes. Read more
Source§

impl<T, C> SchemaReadOwned<C> for T
where C: ConfigCore, T: for<'de> SchemaRead<'de, C>,