#[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
impl IcmpTracerouteMsgPart
pub const LEN: usize
Sourcepub fn hops_out(&self) -> u16
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.
Sourcepub fn set_hops_out(&mut self, hops: u16)
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.
Sourcepub fn hops_in(&self) -> u16
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.
Sourcepub fn set_hops_in(&mut self, hops: u16)
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.
Sourcepub fn bandwidth_out(&self) -> u32
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.
Sourcepub fn set_bandwidth_out(&mut self, bandwidth: u32)
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.
Sourcepub fn mtu_out(&self) -> u32
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.
Sourcepub fn set_mtu_out(&mut self, mtu: u32)
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
impl Clone for IcmpTracerouteMsgPart
Source§fn clone(&self) -> IcmpTracerouteMsgPart
fn clone(&self) -> IcmpTracerouteMsgPart
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for IcmpTracerouteMsgPart
impl Debug for IcmpTracerouteMsgPart
Source§impl<'de, WincodeConfig: Config> SchemaRead<'de, WincodeConfig> for IcmpTracerouteMsgPart
impl<'de, WincodeConfig: Config> SchemaRead<'de, WincodeConfig> for IcmpTracerouteMsgPart
type Dst = IcmpTracerouteMsgPart
Source§fn read(
reader: impl Reader<'de>,
dst: &mut MaybeUninit<Self::Dst>,
) -> ReadResult<()>
fn read( reader: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> ReadResult<()>
Source§impl<WincodeConfig: Config> SchemaWrite<WincodeConfig> for IcmpTracerouteMsgPart
impl<WincodeConfig: Config> SchemaWrite<WincodeConfig> for IcmpTracerouteMsgPart
Source§impl<WincodeConfig: Config> ZeroCopy<WincodeConfig> for IcmpTracerouteMsgPart
impl<WincodeConfig: Config> ZeroCopy<WincodeConfig> for IcmpTracerouteMsgPart
Source§fn from_bytes<'de>(bytes: &'de [u8], config: C) -> Result<&'de Self, ReadError>where
Self: Sized + SchemaRead<'de, C, Dst = Self>,
fn from_bytes<'de>(bytes: &'de [u8], config: C) -> Result<&'de Self, ReadError>where
Self: Sized + SchemaRead<'de, C, Dst = Self>,
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>,
fn from_bytes_mut<'de>(
bytes: &'de mut [u8],
config: C,
) -> Result<&'de mut Self, ReadError>where
Self: Sized + SchemaRead<'de, C, Dst = Self>,
crate::ZeroCopy::from_bytes_mut, but allows the caller to provide a custom configuration.impl Copy for IcmpTracerouteMsgPart
Auto Trait Implementations§
impl Freeze for IcmpTracerouteMsgPart
impl RefUnwindSafe for IcmpTracerouteMsgPart
impl Send for IcmpTracerouteMsgPart
impl Sync for IcmpTracerouteMsgPart
impl Unpin for IcmpTracerouteMsgPart
impl UnsafeUnpin for IcmpTracerouteMsgPart
impl UnwindSafe for IcmpTracerouteMsgPart
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<'de, T> Deserialize<'de> for Twhere
T: SchemaRead<'de, Configuration>,
impl<'de, T> Deserialize<'de> for Twhere
T: SchemaRead<'de, Configuration>,
Source§impl<'de, T, C> Deserialize<'de, C> for Twhere
C: Config,
T: SchemaRead<'de, C>,
impl<'de, T, C> Deserialize<'de, C> for Twhere
C: Config,
T: SchemaRead<'de, C>,
Source§impl<T, C> DeserializeOwned<C> for Twhere
C: Config,
T: SchemaReadOwned<C>,
impl<T, C> DeserializeOwned<C> for Twhere
C: Config,
T: SchemaReadOwned<C>,
Source§fn deserialize_from<'de>(src: impl Reader<'de>) -> Result<Self::Dst, ReadError>
fn deserialize_from<'de>(src: impl Reader<'de>) -> Result<Self::Dst, ReadError>
Reader into a new Self::Dst.Source§fn deserialize_from_into<'de>(
src: impl Reader<'de>,
dst: &mut MaybeUninit<Self::Dst>,
) -> Result<(), ReadError>
fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> Result<(), ReadError>
Reader into dst.Source§impl<T> DeserializeOwned for Twhere
T: SchemaReadOwned<Configuration>,
impl<T> DeserializeOwned for Twhere
T: SchemaReadOwned<Configuration>,
Source§fn deserialize_from<'de>(src: impl Reader<'de>) -> Result<Self::Dst, ReadError>
fn deserialize_from<'de>(src: impl Reader<'de>) -> Result<Self::Dst, ReadError>
Reader into a new Self::Dst.Source§fn deserialize_from_into<'de>(
src: impl Reader<'de>,
dst: &mut MaybeUninit<Self::Dst>,
) -> Result<(), ReadError>
fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> Result<(), ReadError>
Reader into dst.Source§impl<T, C> Serialize<C> for T
impl<T, C> Serialize<C> for T
Source§fn serialize_into(
dst: impl Writer,
src: &Self::Src,
config: C,
) -> Result<(), WriteError>
fn serialize_into( dst: impl Writer, src: &Self::Src, config: C, ) -> Result<(), WriteError>
Writer.