|
@@ -188,35 +188,6 @@ pub struct Function {
|
|
|
///
|
|
|
/// [Program Types and ELF Sections]: https://docs.kernel.org/bpf/libbpf/program_types.html
|
|
|
///
|
|
|
-/// ## Program Name
|
|
|
-///
|
|
|
-/// Each section name is parsed into a section type and a program name.
|
|
|
-///
|
|
|
-/// Generally speaking,
|
|
|
-/// - if the section name does not contain any slashes,
|
|
|
-/// then the program name is just that section name;
|
|
|
-/// - if there are some slashes, the name is `section_name.rsplitn(2, '/')[0]`,
|
|
|
-/// - except for tracepoint programs, for which the name is
|
|
|
-/// `section_name.splitn(2, '/')[1]`.
|
|
|
-///
|
|
|
-/// ```rust
|
|
|
-/// use aya_obj::ProgramSection;
|
|
|
-/// use std::str::FromStr;
|
|
|
-///
|
|
|
-/// assert_eq!(
|
|
|
-/// ProgramSection::from_str("kprobe/do_unlinkat")
|
|
|
-/// .unwrap().name(),
|
|
|
-/// "do_unlinkat",
|
|
|
-/// );
|
|
|
-/// assert_eq!(
|
|
|
-/// ProgramSection::from_str("tracepoint/syscalls/sys_enter_openat")
|
|
|
-/// .unwrap().name(),
|
|
|
-/// "syscalls/sys_enter_openat",
|
|
|
-/// );
|
|
|
-/// ```
|
|
|
-///
|
|
|
-/// The program name will be used in [Object] as references to each program.
|
|
|
-///
|
|
|
/// # Unsupported Sections
|
|
|
///
|
|
|
/// Currently, the following section names are not supported yet:
|
|
@@ -238,139 +209,53 @@ pub struct Function {
|
|
|
#[derive(Debug, Clone)]
|
|
|
#[allow(missing_docs)]
|
|
|
pub enum ProgramSection {
|
|
|
- KRetProbe {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- KProbe {
|
|
|
- name: String,
|
|
|
- },
|
|
|
+ KRetProbe,
|
|
|
+ KProbe,
|
|
|
UProbe {
|
|
|
- name: String,
|
|
|
sleepable: bool,
|
|
|
},
|
|
|
URetProbe {
|
|
|
- name: String,
|
|
|
sleepable: bool,
|
|
|
},
|
|
|
- TracePoint {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- SocketFilter {
|
|
|
- name: String,
|
|
|
- },
|
|
|
+ TracePoint,
|
|
|
+ SocketFilter,
|
|
|
Xdp {
|
|
|
- name: String,
|
|
|
frags: bool,
|
|
|
},
|
|
|
- SkMsg {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- SkSkbStreamParser {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- SkSkbStreamVerdict {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- SockOps {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- SchedClassifier {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- CgroupSkb {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- CgroupSkbIngress {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- CgroupSkbEgress {
|
|
|
- name: String,
|
|
|
- },
|
|
|
+ SkMsg,
|
|
|
+ SkSkbStreamParser,
|
|
|
+ SkSkbStreamVerdict,
|
|
|
+ SockOps,
|
|
|
+ SchedClassifier,
|
|
|
+ CgroupSkb,
|
|
|
+ CgroupSkbIngress,
|
|
|
+ CgroupSkbEgress,
|
|
|
CgroupSockAddr {
|
|
|
- name: String,
|
|
|
attach_type: CgroupSockAddrAttachType,
|
|
|
},
|
|
|
- CgroupSysctl {
|
|
|
- name: String,
|
|
|
- },
|
|
|
+ CgroupSysctl,
|
|
|
CgroupSockopt {
|
|
|
- name: String,
|
|
|
attach_type: CgroupSockoptAttachType,
|
|
|
},
|
|
|
- LircMode2 {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- PerfEvent {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- RawTracePoint {
|
|
|
- name: String,
|
|
|
- },
|
|
|
+ LircMode2,
|
|
|
+ PerfEvent,
|
|
|
+ RawTracePoint,
|
|
|
Lsm {
|
|
|
- name: String,
|
|
|
sleepable: bool,
|
|
|
},
|
|
|
- BtfTracePoint {
|
|
|
- name: String,
|
|
|
- },
|
|
|
+ BtfTracePoint,
|
|
|
FEntry {
|
|
|
- name: String,
|
|
|
sleepable: bool,
|
|
|
},
|
|
|
FExit {
|
|
|
- name: String,
|
|
|
sleepable: bool,
|
|
|
},
|
|
|
- Extension {
|
|
|
- name: String,
|
|
|
- },
|
|
|
- SkLookup {
|
|
|
- name: String,
|
|
|
- },
|
|
|
+ Extension,
|
|
|
+ SkLookup,
|
|
|
CgroupSock {
|
|
|
- name: String,
|
|
|
attach_type: CgroupSockAttachType,
|
|
|
},
|
|
|
- CgroupDevice {
|
|
|
- name: String,
|
|
|
- },
|
|
|
-}
|
|
|
-
|
|
|
-impl ProgramSection {
|
|
|
- /// Returns the program name
|
|
|
- pub fn name(&self) -> &str {
|
|
|
- match self {
|
|
|
- ProgramSection::KRetProbe { name } => name,
|
|
|
- ProgramSection::KProbe { name } => name,
|
|
|
- ProgramSection::UProbe { name, .. } => name,
|
|
|
- ProgramSection::URetProbe { name, .. } => name,
|
|
|
- ProgramSection::TracePoint { name } => name,
|
|
|
- ProgramSection::SocketFilter { name } => name,
|
|
|
- ProgramSection::Xdp { name, .. } => name,
|
|
|
- ProgramSection::SkMsg { name } => name,
|
|
|
- ProgramSection::SkSkbStreamParser { name } => name,
|
|
|
- ProgramSection::SkSkbStreamVerdict { name } => name,
|
|
|
- ProgramSection::SockOps { name } => name,
|
|
|
- ProgramSection::SchedClassifier { name } => name,
|
|
|
- ProgramSection::CgroupSkb { name, .. } => name,
|
|
|
- ProgramSection::CgroupSkbIngress { name, .. } => name,
|
|
|
- ProgramSection::CgroupSkbEgress { name, .. } => name,
|
|
|
- ProgramSection::CgroupSockAddr { name, .. } => name,
|
|
|
- ProgramSection::CgroupSysctl { name } => name,
|
|
|
- ProgramSection::CgroupSockopt { name, .. } => name,
|
|
|
- ProgramSection::LircMode2 { name } => name,
|
|
|
- ProgramSection::PerfEvent { name } => name,
|
|
|
- ProgramSection::RawTracePoint { name } => name,
|
|
|
- ProgramSection::Lsm { name, .. } => name,
|
|
|
- ProgramSection::BtfTracePoint { name, .. } => name,
|
|
|
- ProgramSection::FEntry { name, .. } => name,
|
|
|
- ProgramSection::FExit { name, .. } => name,
|
|
|
- ProgramSection::Extension { name } => name,
|
|
|
- ProgramSection::SkLookup { name } => name,
|
|
|
- ProgramSection::CgroupSock { name, .. } => name,
|
|
|
- ProgramSection::CgroupDevice { name } => name,
|
|
|
- }
|
|
|
- }
|
|
|
+ CgroupDevice,
|
|
|
}
|
|
|
|
|
|
impl FromStr for ProgramSection {
|
|
@@ -385,84 +270,63 @@ impl FromStr for ProgramSection {
|
|
|
None => (section, section),
|
|
|
Some((kind, name)) => (kind, name),
|
|
|
};
|
|
|
- let name = name.to_owned();
|
|
|
|
|
|
Ok(match kind {
|
|
|
- "kprobe" => KProbe { name },
|
|
|
- "kretprobe" => KRetProbe { name },
|
|
|
- "uprobe" => UProbe {
|
|
|
- name,
|
|
|
- sleepable: false,
|
|
|
- },
|
|
|
- "uprobe.s" => UProbe {
|
|
|
- name,
|
|
|
- sleepable: true,
|
|
|
- },
|
|
|
- "uretprobe" => URetProbe {
|
|
|
- name,
|
|
|
- sleepable: false,
|
|
|
- },
|
|
|
- "uretprobe.s" => URetProbe {
|
|
|
- name,
|
|
|
- sleepable: true,
|
|
|
- },
|
|
|
- "xdp" => Xdp { name, frags: false },
|
|
|
- "xdp.frags" => Xdp { name, frags: true },
|
|
|
- "tp_btf" => BtfTracePoint { name },
|
|
|
- _ if kind.starts_with("tracepoint") || kind.starts_with("tp") => {
|
|
|
- // tracepoint sections are named `tracepoint/category/event_name`,
|
|
|
- // and we want to parse the name as "category/event_name"
|
|
|
- let name = section.splitn(2, '/').last().unwrap().to_owned();
|
|
|
- TracePoint { name }
|
|
|
- }
|
|
|
- "socket" => SocketFilter { name },
|
|
|
- "sk_msg" => SkMsg { name },
|
|
|
- "sk_skb" => match &*name {
|
|
|
- "stream_parser" => SkSkbStreamParser { name },
|
|
|
- "stream_verdict" => SkSkbStreamVerdict { name },
|
|
|
+ "kprobe" => KProbe,
|
|
|
+ "kretprobe" => KRetProbe,
|
|
|
+ "uprobe" => UProbe { sleepable: false },
|
|
|
+ "uprobe.s" => UProbe { sleepable: true },
|
|
|
+ "uretprobe" => URetProbe { sleepable: false },
|
|
|
+ "uretprobe.s" => URetProbe { sleepable: true },
|
|
|
+ "xdp" => Xdp { frags: false },
|
|
|
+ "xdp.frags" => Xdp { frags: true },
|
|
|
+ "tp_btf" => BtfTracePoint,
|
|
|
+ kind if kind.starts_with("tracepoint") || kind.starts_with("tp") => TracePoint,
|
|
|
+ "socket" => SocketFilter,
|
|
|
+ "sk_msg" => SkMsg,
|
|
|
+ "sk_skb" => match name {
|
|
|
+ "stream_parser" => SkSkbStreamParser,
|
|
|
+ "stream_verdict" => SkSkbStreamVerdict,
|
|
|
_ => {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
- "sk_skb/stream_parser" => SkSkbStreamParser { name },
|
|
|
- "sk_skb/stream_verdict" => SkSkbStreamVerdict { name },
|
|
|
- "sockops" => SockOps { name },
|
|
|
- "classifier" => SchedClassifier { name },
|
|
|
- "cgroup_skb" => match &*name {
|
|
|
- "ingress" => CgroupSkbIngress { name },
|
|
|
- "egress" => CgroupSkbEgress { name },
|
|
|
+ "sk_skb/stream_parser" => SkSkbStreamParser,
|
|
|
+ "sk_skb/stream_verdict" => SkSkbStreamVerdict,
|
|
|
+ "sockops" => SockOps,
|
|
|
+ "classifier" => SchedClassifier,
|
|
|
+ "cgroup_skb" => match name {
|
|
|
+ "ingress" => CgroupSkbIngress,
|
|
|
+ "egress" => CgroupSkbEgress,
|
|
|
_ => {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
- "cgroup_skb/ingress" => CgroupSkbIngress { name },
|
|
|
- "cgroup_skb/egress" => CgroupSkbEgress { name },
|
|
|
- "cgroup/skb" => CgroupSkb { name },
|
|
|
+ "cgroup_skb/ingress" => CgroupSkbIngress,
|
|
|
+ "cgroup_skb/egress" => CgroupSkbEgress,
|
|
|
+ "cgroup/skb" => CgroupSkb,
|
|
|
"cgroup/sock" => CgroupSock {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAttachType::default(),
|
|
|
},
|
|
|
- "cgroup/sysctl" => CgroupSysctl { name },
|
|
|
- "cgroup/dev" => CgroupDevice { name },
|
|
|
+ "cgroup/sysctl" => CgroupSysctl,
|
|
|
+ "cgroup/dev" => CgroupDevice,
|
|
|
"cgroup/getsockopt" => CgroupSockopt {
|
|
|
- name,
|
|
|
attach_type: CgroupSockoptAttachType::Get,
|
|
|
},
|
|
|
"cgroup/setsockopt" => CgroupSockopt {
|
|
|
- name,
|
|
|
attach_type: CgroupSockoptAttachType::Set,
|
|
|
},
|
|
|
- "cgroup" => match &*name {
|
|
|
- "skb" => CgroupSkb { name },
|
|
|
- "sysctl" => CgroupSysctl { name },
|
|
|
- "dev" => CgroupDevice { name },
|
|
|
+ "cgroup" => match name {
|
|
|
+ "skb" => CgroupSkb,
|
|
|
+ "sysctl" => CgroupSysctl,
|
|
|
+ "dev" => CgroupDevice,
|
|
|
"getsockopt" | "setsockopt" => {
|
|
|
- if let Ok(attach_type) = CgroupSockoptAttachType::try_from(name.as_str()) {
|
|
|
- CgroupSockopt { name, attach_type }
|
|
|
+ if let Ok(attach_type) = CgroupSockoptAttachType::try_from(name) {
|
|
|
+ CgroupSockopt { attach_type }
|
|
|
} else {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
@@ -470,21 +334,20 @@ impl FromStr for ProgramSection {
|
|
|
}
|
|
|
}
|
|
|
"sock" => CgroupSock {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAttachType::default(),
|
|
|
},
|
|
|
"post_bind4" | "post_bind6" | "sock_create" | "sock_release" => {
|
|
|
- if let Ok(attach_type) = CgroupSockAttachType::try_from(name.as_str()) {
|
|
|
- CgroupSock { name, attach_type }
|
|
|
+ if let Ok(attach_type) = CgroupSockAttachType::try_from(name) {
|
|
|
+ CgroupSock { attach_type }
|
|
|
} else {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
- _ => {
|
|
|
- if let Ok(attach_type) = CgroupSockAddrAttachType::try_from(name.as_str()) {
|
|
|
- CgroupSockAddr { name, attach_type }
|
|
|
+ name => {
|
|
|
+ if let Ok(attach_type) = CgroupSockAddrAttachType::try_from(name) {
|
|
|
+ CgroupSockAddr { attach_type }
|
|
|
} else {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
@@ -493,98 +356,64 @@ impl FromStr for ProgramSection {
|
|
|
}
|
|
|
},
|
|
|
"cgroup/post_bind4" => CgroupSock {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAttachType::PostBind4,
|
|
|
},
|
|
|
"cgroup/post_bind6" => CgroupSock {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAttachType::PostBind6,
|
|
|
},
|
|
|
"cgroup/sock_create" => CgroupSock {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAttachType::SockCreate,
|
|
|
},
|
|
|
"cgroup/sock_release" => CgroupSock {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAttachType::SockRelease,
|
|
|
},
|
|
|
"cgroup/bind4" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::Bind4,
|
|
|
},
|
|
|
"cgroup/bind6" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::Bind6,
|
|
|
},
|
|
|
"cgroup/connect4" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::Connect4,
|
|
|
},
|
|
|
"cgroup/connect6" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::Connect6,
|
|
|
},
|
|
|
"cgroup/getpeername4" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::GetPeerName4,
|
|
|
},
|
|
|
"cgroup/getpeername6" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::GetPeerName6,
|
|
|
},
|
|
|
"cgroup/getsockname4" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::GetSockName4,
|
|
|
},
|
|
|
"cgroup/getsockname6" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::GetSockName6,
|
|
|
},
|
|
|
"cgroup/sendmsg4" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::UDPSendMsg4,
|
|
|
},
|
|
|
"cgroup/sendmsg6" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::UDPSendMsg6,
|
|
|
},
|
|
|
"cgroup/recvmsg4" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::UDPRecvMsg4,
|
|
|
},
|
|
|
"cgroup/recvmsg6" => CgroupSockAddr {
|
|
|
- name,
|
|
|
attach_type: CgroupSockAddrAttachType::UDPRecvMsg6,
|
|
|
},
|
|
|
- "lirc_mode2" => LircMode2 { name },
|
|
|
- "perf_event" => PerfEvent { name },
|
|
|
- "raw_tp" | "raw_tracepoint" => RawTracePoint { name },
|
|
|
- "lsm" => Lsm {
|
|
|
- name,
|
|
|
- sleepable: false,
|
|
|
- },
|
|
|
- "lsm.s" => Lsm {
|
|
|
- name,
|
|
|
- sleepable: true,
|
|
|
- },
|
|
|
- "fentry" => FEntry {
|
|
|
- name,
|
|
|
- sleepable: false,
|
|
|
- },
|
|
|
- "fentry.s" => FEntry {
|
|
|
- name,
|
|
|
- sleepable: true,
|
|
|
- },
|
|
|
- "fexit" => FExit {
|
|
|
- name,
|
|
|
- sleepable: false,
|
|
|
- },
|
|
|
- "fexit.s" => FExit {
|
|
|
- name,
|
|
|
- sleepable: true,
|
|
|
- },
|
|
|
- "freplace" => Extension { name },
|
|
|
- "sk_lookup" => SkLookup { name },
|
|
|
+ "lirc_mode2" => LircMode2,
|
|
|
+ "perf_event" => PerfEvent,
|
|
|
+ "raw_tp" | "raw_tracepoint" => RawTracePoint,
|
|
|
+ "lsm" => Lsm { sleepable: false },
|
|
|
+ "lsm.s" => Lsm { sleepable: true },
|
|
|
+ "fentry" => FEntry { sleepable: false },
|
|
|
+ "fentry.s" => FEntry { sleepable: true },
|
|
|
+ "fexit" => FExit { sleepable: false },
|
|
|
+ "fexit.s" => FExit { sleepable: true },
|
|
|
+ "freplace" => Extension,
|
|
|
+ "sk_lookup" => SkLookup,
|
|
|
_ => {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|