diff --git a/rust/relay/ebpf-turn-router/src/channel_data.rs b/rust/relay/ebpf-turn-router/src/channel_data.rs index ed0072d43..3c7d61e99 100644 --- a/rust/relay/ebpf-turn-router/src/channel_data.rs +++ b/rust/relay/ebpf-turn-router/src/channel_data.rs @@ -1,4 +1,4 @@ -use crate::{Error, slice_mut_at::slice_mut_at, udp::UdpHdr}; +use crate::{Error, ref_mut_at::ref_mut_at, udp::UdpHdr}; use aya_ebpf::programs::XdpContext; use network_types::eth::EthHdr; @@ -12,7 +12,7 @@ pub struct ChannelData<'a> { impl<'a> ChannelData<'a> { #[inline(always)] pub fn parse(ctx: &'a XdpContext, ip_header_length: usize) -> Result { - let hdr = slice_mut_at::(ctx, EthHdr::LEN + ip_header_length + UdpHdr::LEN)?; + let hdr = ref_mut_at::(ctx, EthHdr::LEN + ip_header_length + UdpHdr::LEN)?; if !(0x4000..0x4FFF).contains(&u16::from_be_bytes(hdr.number)) { return Err(Error::NotAChannelDataMessage); diff --git a/rust/relay/ebpf-turn-router/src/eth.rs b/rust/relay/ebpf-turn-router/src/eth.rs index 173f73921..3008130d7 100644 --- a/rust/relay/ebpf-turn-router/src/eth.rs +++ b/rust/relay/ebpf-turn-router/src/eth.rs @@ -5,7 +5,7 @@ use network_types::eth::{EthHdr, EtherType}; use core::net::{IpAddr, Ipv4Addr, Ipv6Addr}; -use crate::{error::Error, slice_mut_at::slice_mut_at}; +use crate::{error::Error, ref_mut_at::ref_mut_at}; const MAX_ETHERNET_MAPPINGS: u32 = 0x100000; @@ -18,7 +18,7 @@ impl<'a> Eth<'a> { #[inline(always)] pub fn parse(ctx: &'a XdpContext) -> Result { Ok(Self { - inner: slice_mut_at::(ctx, 0)?, + inner: ref_mut_at::(ctx, 0)?, ctx, }) } diff --git a/rust/relay/ebpf-turn-router/src/ip4.rs b/rust/relay/ebpf-turn-router/src/ip4.rs index fc667f8f5..e846a9288 100644 --- a/rust/relay/ebpf-turn-router/src/ip4.rs +++ b/rust/relay/ebpf-turn-router/src/ip4.rs @@ -1,6 +1,6 @@ use core::net::Ipv4Addr; -use crate::{Error, checksum::ChecksumUpdate, slice_mut_at::slice_mut_at}; +use crate::{Error, checksum::ChecksumUpdate, ref_mut_at::ref_mut_at}; use aya_ebpf::programs::XdpContext; use aya_log_ebpf::debug; use network_types::{eth::EthHdr, ip::IpProto}; @@ -14,7 +14,7 @@ pub struct Ip4<'a> { impl<'a> Ip4<'a> { #[inline(always)] pub fn parse(ctx: &'a XdpContext) -> Result { - let ip4_hdr = slice_mut_at::(ctx, EthHdr::LEN)?; + let ip4_hdr = ref_mut_at::(ctx, EthHdr::LEN)?; // IPv4 packets with options are handled in user-space. if usize::from(ip4_hdr.ihl()) * 4 != Ipv4Hdr::LEN { diff --git a/rust/relay/ebpf-turn-router/src/ip6.rs b/rust/relay/ebpf-turn-router/src/ip6.rs index 9c2cd254f..c65d2a7f0 100644 --- a/rust/relay/ebpf-turn-router/src/ip6.rs +++ b/rust/relay/ebpf-turn-router/src/ip6.rs @@ -1,6 +1,6 @@ use core::net::Ipv6Addr; -use crate::{Error, checksum::ChecksumUpdate, slice_mut_at::slice_mut_at}; +use crate::{Error, checksum::ChecksumUpdate, ref_mut_at::ref_mut_at}; use aya_ebpf::programs::XdpContext; use aya_log_ebpf::debug; use network_types::{eth::EthHdr, ip::IpProto}; @@ -16,7 +16,7 @@ impl<'a> Ip6<'a> { pub fn parse(ctx: &'a XdpContext) -> Result { Ok(Self { ctx, - inner: slice_mut_at::(ctx, EthHdr::LEN)?, + inner: ref_mut_at::(ctx, EthHdr::LEN)?, }) } diff --git a/rust/relay/ebpf-turn-router/src/main.rs b/rust/relay/ebpf-turn-router/src/main.rs index 8825e35f1..f47af7e11 100644 --- a/rust/relay/ebpf-turn-router/src/main.rs +++ b/rust/relay/ebpf-turn-router/src/main.rs @@ -33,7 +33,7 @@ mod eth; mod ip4; mod ip6; mod move_headers; -mod slice_mut_at; +mod ref_mut_at; mod stats; mod udp; diff --git a/rust/relay/ebpf-turn-router/src/slice_mut_at.rs b/rust/relay/ebpf-turn-router/src/ref_mut_at.rs similarity index 54% rename from rust/relay/ebpf-turn-router/src/slice_mut_at.rs rename to rust/relay/ebpf-turn-router/src/ref_mut_at.rs index 18173cc34..cbefeeaed 100644 --- a/rust/relay/ebpf-turn-router/src/slice_mut_at.rs +++ b/rust/relay/ebpf-turn-router/src/ref_mut_at.rs @@ -2,8 +2,12 @@ use aya_ebpf::programs::XdpContext; use crate::error::Error; +/// Returns a mutable reference to a type `T` at the specified offset in the packet data. +/// +/// The length is based on the size of `T` and the bytes at the specified offset will simply be cast into `T`. +/// `T` should therefore most definitely be `repr(C)`. #[inline(always)] -pub(crate) fn slice_mut_at(ctx: &XdpContext, offset: usize) -> Result<&mut T, Error> { +pub(crate) fn ref_mut_at(ctx: &XdpContext, offset: usize) -> Result<&mut T, Error> { let start = ctx.data(); let end = ctx.data_end(); let len = core::mem::size_of::(); diff --git a/rust/relay/ebpf-turn-router/src/udp.rs b/rust/relay/ebpf-turn-router/src/udp.rs index 161bb2d11..7349186d8 100644 --- a/rust/relay/ebpf-turn-router/src/udp.rs +++ b/rust/relay/ebpf-turn-router/src/udp.rs @@ -1,4 +1,4 @@ -use crate::{Error, checksum::ChecksumUpdate, slice_mut_at::slice_mut_at}; +use crate::{Error, checksum::ChecksumUpdate, ref_mut_at::ref_mut_at}; use aya_ebpf::programs::XdpContext; use aya_log_ebpf::debug; use network_types::eth::EthHdr; @@ -14,7 +14,7 @@ impl<'a> Udp<'a> { pub fn parse(ctx: &'a XdpContext, ip_header_length: usize) -> Result { Ok(Self { ctx, - inner: slice_mut_at::(ctx, EthHdr::LEN + ip_header_length)?, + inner: ref_mut_at::(ctx, EthHdr::LEN + ip_header_length)?, }) }