use aya_obj::{
btf::{Btf, BtfKind},
generated::{bpf_attach_type::BPF_TRACE_FENTRY, bpf_prog_type::BPF_PROG_TYPE_TRACING},
};
use crate::programs::{
FdLink, FdLinkId, ProgramData, ProgramError, ProgramType, define_link_wrapper,
load_program_with_attach_type, utils::attach_raw_tracepoint,
};
#[derive(Debug)]
#[doc(alias = "BPF_TRACE_FENTRY")]
#[doc(alias = "BPF_PROG_TYPE_TRACING")]
pub struct FEntry {
pub(crate) data: ProgramData<FEntryLink>,
}
impl FEntry {
pub const PROGRAM_TYPE: ProgramType = ProgramType::Tracing;
pub fn load(&mut self, fn_name: &str, btf: &Btf) -> Result<(), ProgramError> {
let Self { data } = self;
data.attach_btf_id = Some(btf.id_by_type_name_kind(fn_name, BtfKind::Func)?);
load_program_with_attach_type(BPF_PROG_TYPE_TRACING, BPF_TRACE_FENTRY, data)
}
pub fn attach(&mut self) -> Result<FEntryLinkId, ProgramError> {
attach_raw_tracepoint(&mut self.data, None)
}
}
define_link_wrapper!(FEntryLink, FEntryLinkId, FdLink, FdLinkId, FEntry);