From 2e3c1779be03898dd6a01644012ef21b2475ad63 Mon Sep 17 00:00:00 2001 From: Mikhail Trishchenkov Date: Mon, 20 Mar 2023 12:20:46 +0700 Subject: [PATCH] aya: Allow to attach XDP probe by interface index --- aya/src/programs/xdp.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/aya/src/programs/xdp.rs b/aya/src/programs/xdp.rs index d36d5f27..52805bc7 100644 --- a/aya/src/programs/xdp.rs +++ b/aya/src/programs/xdp.rs @@ -98,14 +98,29 @@ impl Xdp { /// [`XdpError::NetlinkError`] is returned for older /// kernels. pub fn attach(&mut self, interface: &str, flags: XdpFlags) -> Result { - let prog_fd = self.data.fd_or_err()?; let c_interface = CString::new(interface).unwrap(); - let if_index = unsafe { if_nametoindex(c_interface.as_ptr()) } as RawFd; + let if_index = unsafe { if_nametoindex(c_interface.as_ptr()) }; if if_index == 0 { return Err(ProgramError::UnknownInterface { name: interface.to_string(), }); } + self.attach_by_ifindex(if_index, flags) + } + + /// Attaches the program to the given `interface`. + /// + /// The returned value can be used to detach, see [Xdp::detach]. + /// + /// # Errors + /// + /// When attaching fails, [`ProgramError::SyscallError`] is returned for + /// kernels `>= 5.9.0`, and instead + /// [`XdpError::NetlinkError`] is returned for older + /// kernels. + pub fn attach_by_ifindex(&mut self, if_index: libc::c_uint, flags: XdpFlags) -> Result { + let prog_fd = self.data.fd_or_err()?; + let if_index = if_index as RawFd; let k_ver = kernel_version().unwrap(); if k_ver >= (5, 9, 0) {