|
@@ -266,10 +266,15 @@ impl FromStr for ProgramSection {
|
|
|
|
|
|
// parse the common case, eg "xdp/program_name" or
|
|
|
// "sk_skb/stream_verdict/program_name"
|
|
|
- let (kind, name) = match section.rsplit_once('/') {
|
|
|
- None => (section, section),
|
|
|
- Some((kind, name)) => (kind, name),
|
|
|
+ let mut pieces = section.split('/');
|
|
|
+ let mut next = || {
|
|
|
+ pieces
|
|
|
+ .next()
|
|
|
+ .ok_or_else(|| ParseError::InvalidProgramSection {
|
|
|
+ section: section.to_owned(),
|
|
|
+ })
|
|
|
};
|
|
|
+ let kind = next()?;
|
|
|
|
|
|
Ok(match kind {
|
|
|
"kprobe" => KProbe,
|
|
@@ -281,128 +286,105 @@ impl FromStr for ProgramSection {
|
|
|
"xdp" => Xdp { frags: false },
|
|
|
"xdp.frags" => Xdp { frags: true },
|
|
|
"tp_btf" => BtfTracePoint,
|
|
|
- kind if kind.starts_with("tracepoint") || kind.starts_with("tp") => TracePoint,
|
|
|
+ "tracepoint" | "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,
|
|
|
- "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,
|
|
|
- "cgroup_skb/egress" => CgroupSkbEgress,
|
|
|
- "cgroup/skb" => CgroupSkb,
|
|
|
- "cgroup/sock" => CgroupSock {
|
|
|
- attach_type: CgroupSockAttachType::default(),
|
|
|
- },
|
|
|
- "cgroup/sysctl" => CgroupSysctl,
|
|
|
- "cgroup/dev" => CgroupDevice,
|
|
|
- "cgroup/getsockopt" => CgroupSockopt {
|
|
|
- attach_type: CgroupSockoptAttachType::Get,
|
|
|
- },
|
|
|
- "cgroup/setsockopt" => CgroupSockopt {
|
|
|
- attach_type: CgroupSockoptAttachType::Set,
|
|
|
- },
|
|
|
- "cgroup" => match name {
|
|
|
- "skb" => CgroupSkb,
|
|
|
- "sysctl" => CgroupSysctl,
|
|
|
- "dev" => CgroupDevice,
|
|
|
- "getsockopt" | "setsockopt" => {
|
|
|
- if let Ok(attach_type) = CgroupSockoptAttachType::try_from(name) {
|
|
|
- CgroupSockopt { attach_type }
|
|
|
- } else {
|
|
|
+ "sk_skb" => {
|
|
|
+ let name = next()?;
|
|
|
+ match name {
|
|
|
+ "stream_parser" => SkSkbStreamParser,
|
|
|
+ "stream_verdict" => SkSkbStreamVerdict,
|
|
|
+ _ => {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
|
- });
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
- "sock" => CgroupSock {
|
|
|
- attach_type: CgroupSockAttachType::default(),
|
|
|
- },
|
|
|
- "post_bind4" | "post_bind6" | "sock_create" | "sock_release" => {
|
|
|
- if let Ok(attach_type) = CgroupSockAttachType::try_from(name) {
|
|
|
- CgroupSock { attach_type }
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ "sockops" => SockOps,
|
|
|
+ "classifier" => SchedClassifier,
|
|
|
+ "cgroup_skb" => {
|
|
|
+ let name = next()?;
|
|
|
+ match name {
|
|
|
+ "ingress" => CgroupSkbIngress,
|
|
|
+ "egress" => CgroupSkbEgress,
|
|
|
+ _ => {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
|
- });
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
- name => {
|
|
|
- if let Ok(attach_type) = CgroupSockAddrAttachType::try_from(name) {
|
|
|
- CgroupSockAddr { attach_type }
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ "cgroup" => {
|
|
|
+ let name = next()?;
|
|
|
+ match name {
|
|
|
+ "skb" => CgroupSkb,
|
|
|
+ "sysctl" => CgroupSysctl,
|
|
|
+ "dev" => CgroupDevice,
|
|
|
+ "getsockopt" => CgroupSockopt {
|
|
|
+ attach_type: CgroupSockoptAttachType::Get,
|
|
|
+ },
|
|
|
+ "setsockopt" => CgroupSockopt {
|
|
|
+ attach_type: CgroupSockoptAttachType::Set,
|
|
|
+ },
|
|
|
+ "sock" => CgroupSock {
|
|
|
+ attach_type: CgroupSockAttachType::default(),
|
|
|
+ },
|
|
|
+ "post_bind4" => CgroupSock {
|
|
|
+ attach_type: CgroupSockAttachType::PostBind4,
|
|
|
+ },
|
|
|
+ "post_bind6" => CgroupSock {
|
|
|
+ attach_type: CgroupSockAttachType::PostBind6,
|
|
|
+ },
|
|
|
+ "sock_create" => CgroupSock {
|
|
|
+ attach_type: CgroupSockAttachType::SockCreate,
|
|
|
+ },
|
|
|
+ "sock_release" => CgroupSock {
|
|
|
+ attach_type: CgroupSockAttachType::SockRelease,
|
|
|
+ },
|
|
|
+ "bind4" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::Bind4,
|
|
|
+ },
|
|
|
+ "bind6" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::Bind6,
|
|
|
+ },
|
|
|
+ "connect4" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::Connect4,
|
|
|
+ },
|
|
|
+ "connect6" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::Connect6,
|
|
|
+ },
|
|
|
+ "getpeername4" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::GetPeerName4,
|
|
|
+ },
|
|
|
+ "getpeername6" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::GetPeerName6,
|
|
|
+ },
|
|
|
+ "getsockname4" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::GetSockName4,
|
|
|
+ },
|
|
|
+ "getsockname6" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::GetSockName6,
|
|
|
+ },
|
|
|
+ "sendmsg4" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::UDPSendMsg4,
|
|
|
+ },
|
|
|
+ "sendmsg6" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::UDPSendMsg6,
|
|
|
+ },
|
|
|
+ "recvmsg4" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::UDPRecvMsg4,
|
|
|
+ },
|
|
|
+ "recvmsg6" => CgroupSockAddr {
|
|
|
+ attach_type: CgroupSockAddrAttachType::UDPRecvMsg6,
|
|
|
+ },
|
|
|
+ _ => {
|
|
|
return Err(ParseError::InvalidProgramSection {
|
|
|
section: section.to_owned(),
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
- },
|
|
|
- "cgroup/post_bind4" => CgroupSock {
|
|
|
- attach_type: CgroupSockAttachType::PostBind4,
|
|
|
- },
|
|
|
- "cgroup/post_bind6" => CgroupSock {
|
|
|
- attach_type: CgroupSockAttachType::PostBind6,
|
|
|
- },
|
|
|
- "cgroup/sock_create" => CgroupSock {
|
|
|
- attach_type: CgroupSockAttachType::SockCreate,
|
|
|
- },
|
|
|
- "cgroup/sock_release" => CgroupSock {
|
|
|
- attach_type: CgroupSockAttachType::SockRelease,
|
|
|
- },
|
|
|
- "cgroup/bind4" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::Bind4,
|
|
|
- },
|
|
|
- "cgroup/bind6" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::Bind6,
|
|
|
- },
|
|
|
- "cgroup/connect4" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::Connect4,
|
|
|
- },
|
|
|
- "cgroup/connect6" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::Connect6,
|
|
|
- },
|
|
|
- "cgroup/getpeername4" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::GetPeerName4,
|
|
|
- },
|
|
|
- "cgroup/getpeername6" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::GetPeerName6,
|
|
|
- },
|
|
|
- "cgroup/getsockname4" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::GetSockName4,
|
|
|
- },
|
|
|
- "cgroup/getsockname6" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::GetSockName6,
|
|
|
- },
|
|
|
- "cgroup/sendmsg4" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::UDPSendMsg4,
|
|
|
- },
|
|
|
- "cgroup/sendmsg6" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::UDPSendMsg6,
|
|
|
- },
|
|
|
- "cgroup/recvmsg4" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::UDPRecvMsg4,
|
|
|
- },
|
|
|
- "cgroup/recvmsg6" => CgroupSockAddr {
|
|
|
- attach_type: CgroupSockAddrAttachType::UDPRecvMsg6,
|
|
|
- },
|
|
|
+ }
|
|
|
"lirc_mode2" => LircMode2,
|
|
|
"perf_event" => PerfEvent,
|
|
|
"raw_tp" | "raw_tracepoint" => RawTracePoint,
|