Skip to main content

IcmpTracerouteMsgPart

Struct IcmpTracerouteMsgPart 

Source
#[repr(C)]
pub struct IcmpTracerouteMsgPart { pub hops_out: [u8; 2], pub hops_in: [u8; 2], pub bandwidth_out: [u8; 4], pub mtu_out: [u8; 4], }
Expand description

Represents the variable length portion of a Traceroute message (RFC 1393) that follows the ICMP header.

Contains hop counts, bandwidth, and MTU information about the traced route. All fields are stored in network byte order.

§Example

use core::mem;
use aya_ebpf::programs::TcContext;
use network_types::eth::EthHdr;
use network_types::icmp::{Icmpv4Hdr, Icmpv4HdrData, IcmpTracerouteMsgPart};
use network_types::ip::Ipv4Hdr;

fn handle_icmp_traceroute(ctx: &TcContext) -> Result<u32, ()> {
    // 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;

    // Check if it's a Traceroute Request/Reply message by matching on the safe enum.
    if let Ok(Icmpv4HdrData::Traceroute(traceroute_hdr)) = unsafe { (*icmp_hdr).data() } {
        // Access the traceroute-specific fields without repeating the type checks.
        let traceroute_msg: *const IcmpTracerouteMsgPart = unsafe {
            (icmp_start as *const u8)
                .add(Icmpv4Hdr::LEN) as *const IcmpTracerouteMsgPart
        };

        // Consume the traceroute fields in network byte order
        let _id = traceroute_hdr.id();
        unsafe {
            let _hops_out = (*traceroute_msg).hops_out();
            let _bandwidth = (*traceroute_msg).bandwidth_out();
            let _mtu = (*traceroute_msg).mtu_out();
            // Do something meaningful with these values here.
        }
    }
    Ok(0)
}

Fields§

§hops_out: [u8; 2]§hops_in: [u8; 2]§bandwidth_out: [u8; 4]§mtu_out: [u8; 4]

Implementations§

Source§

impl IcmpTracerouteMsgPart

Source

pub const LEN: usize

Source

pub fn hops_out(&self) -> u16

Returns the outbound hop count in host byte order. This indicates the maximum number of hops that can be traversed to the target.

Source

pub fn set_hops_out(&mut self, hops: u16)

Sets the outbound hop count field. The value will be stored in network byte order. This should be set to the maximum number of hops that can be traversed to the target.

Source

pub fn hops_in(&self) -> u16

Returns the inbound hop count in host byte order. This indicates the maximum number of hops that can be traversed in the return path.

Source

pub fn set_hops_in(&mut self, hops: u16)

Sets the inbound hop count field. The value will be stored in network byte order. This should be set to the maximum number of hops that can be traversed in the return path.

Source

pub fn bandwidth_out(&self) -> u32

Returns the outbound bandwidth estimate in host byte order. This represents the minimum bandwidth along the forward path in bytes per second.

Source

pub fn set_bandwidth_out(&mut self, bandwidth: u32)

Sets the outbound bandwidth field. The value will be stored in network byte order. This should be set to the minimum bandwidth along the forward path in bytes per second.

Source

pub fn mtu_out(&self) -> u32

Returns the outbound MTU in host byte order. This represents the minimum MTU along the forward path in bytes.

Source

pub fn set_mtu_out(&mut self, mtu: u32)

Sets the outbound MTU field. The value will be stored in network byte order. This should be set to the minimum MTU along the forward path in bytes.

Trait Implementations§

Source§

impl Clone for IcmpTracerouteMsgPart

Source§

fn clone(&self) -> IcmpTracerouteMsgPart

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 IcmpTracerouteMsgPart

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 IcmpTracerouteMsgPart

Source§

const TYPE_META: TypeMeta

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

type Dst = IcmpTracerouteMsgPart

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 IcmpTracerouteMsgPart

Source§

const TYPE_META: TypeMeta

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

type Src = IcmpTracerouteMsgPart

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 IcmpTracerouteMsgPart
where for<'_wincode_internal, '_wincode_internal> [u8; 2]: ZeroCopy<WincodeConfig>, for<'_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 IcmpTracerouteMsgPart

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