Browse Source

Merge pull request #766 from aya-rs/obj-better-sense

aya-obj: reduce indirection in section parsing
Tamir Duberstein 1 year ago
parent
commit
e9690df

+ 92 - 110
aya-obj/src/obj.rs

@@ -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,

+ 0 - 21
aya-obj/src/programs/cgroup_sock.rs

@@ -1,11 +1,6 @@
 //! Cgroup socket programs.
-use alloc::{borrow::ToOwned, string::String};
-
 use crate::generated::bpf_attach_type;
 
-#[cfg(not(feature = "std"))]
-use crate::std;
-
 /// Defines where to attach a `CgroupSock` program.
 #[derive(Copy, Clone, Debug, Default)]
 pub enum CgroupSockAttachType {
@@ -30,19 +25,3 @@ impl From<CgroupSockAttachType> for bpf_attach_type {
         }
     }
 }
-
-#[derive(Debug, thiserror::Error)]
-#[error("{0} is not a valid attach type for a CGROUP_SOCK program")]
-pub(crate) struct InvalidAttachType(String);
-
-impl CgroupSockAttachType {
-    pub(crate) fn try_from(value: &str) -> Result<CgroupSockAttachType, InvalidAttachType> {
-        match value {
-            "post_bind4" => Ok(CgroupSockAttachType::PostBind4),
-            "post_bind6" => Ok(CgroupSockAttachType::PostBind6),
-            "sock_create" => Ok(CgroupSockAttachType::SockCreate),
-            "sock_release" => Ok(CgroupSockAttachType::SockRelease),
-            _ => Err(InvalidAttachType(value.to_owned())),
-        }
-    }
-}

+ 0 - 29
aya-obj/src/programs/cgroup_sock_addr.rs

@@ -1,11 +1,6 @@
 //! Cgroup socket address programs.
-use alloc::{borrow::ToOwned, string::String};
-
 use crate::generated::bpf_attach_type;
 
-#[cfg(not(feature = "std"))]
-use crate::std;
-
 /// Defines where to attach a `CgroupSockAddr` program.
 #[derive(Copy, Clone, Debug)]
 pub enum CgroupSockAddrAttachType {
@@ -53,27 +48,3 @@ impl From<CgroupSockAddrAttachType> for bpf_attach_type {
         }
     }
 }
-
-#[derive(Debug, thiserror::Error)]
-#[error("{0} is not a valid attach type for a CGROUP_SOCK_ADDR program")]
-pub(crate) struct InvalidAttachType(String);
-
-impl CgroupSockAddrAttachType {
-    pub(crate) fn try_from(value: &str) -> Result<CgroupSockAddrAttachType, InvalidAttachType> {
-        match value {
-            "bind4" => Ok(CgroupSockAddrAttachType::Bind4),
-            "bind6" => Ok(CgroupSockAddrAttachType::Bind6),
-            "connect4" => Ok(CgroupSockAddrAttachType::Connect4),
-            "connect6" => Ok(CgroupSockAddrAttachType::Connect6),
-            "getpeername4" => Ok(CgroupSockAddrAttachType::GetPeerName4),
-            "getpeername6" => Ok(CgroupSockAddrAttachType::GetPeerName6),
-            "getsockname4" => Ok(CgroupSockAddrAttachType::GetSockName4),
-            "getsockname6" => Ok(CgroupSockAddrAttachType::GetSockName6),
-            "sendmsg4" => Ok(CgroupSockAddrAttachType::UDPSendMsg4),
-            "sendmsg6" => Ok(CgroupSockAddrAttachType::UDPSendMsg6),
-            "recvmsg4" => Ok(CgroupSockAddrAttachType::UDPRecvMsg4),
-            "recvmsg6" => Ok(CgroupSockAddrAttachType::UDPRecvMsg6),
-            _ => Err(InvalidAttachType(value.to_owned())),
-        }
-    }
-}

+ 0 - 19
aya-obj/src/programs/cgroup_sockopt.rs

@@ -1,11 +1,6 @@
 //! Cgroup socket option programs.
-use alloc::{borrow::ToOwned, string::String};
-
 use crate::generated::bpf_attach_type;
 
-#[cfg(not(feature = "std"))]
-use crate::std;
-
 /// Defines where to attach a `CgroupSockopt` program.
 #[derive(Copy, Clone, Debug)]
 pub enum CgroupSockoptAttachType {
@@ -23,17 +18,3 @@ impl From<CgroupSockoptAttachType> for bpf_attach_type {
         }
     }
 }
-
-#[derive(Debug, thiserror::Error)]
-#[error("{0} is not a valid attach type for a CGROUP_SOCKOPT program")]
-pub(crate) struct InvalidAttachType(String);
-
-impl CgroupSockoptAttachType {
-    pub(crate) fn try_from(value: &str) -> Result<CgroupSockoptAttachType, InvalidAttachType> {
-        match value {
-            "getsockopt" => Ok(CgroupSockoptAttachType::Get),
-            "setsockopt" => Ok(CgroupSockoptAttachType::Set),
-            _ => Err(InvalidAttachType(value.to_owned())),
-        }
-    }
-}