cgroup_sock_addr.rs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //! Cgroup socket address programs.
  2. use alloc::{borrow::ToOwned, string::String};
  3. use crate::generated::bpf_attach_type;
  4. #[cfg(not(feature = "std"))]
  5. use crate::std;
  6. /// Defines where to attach a `CgroupSockAddr` program.
  7. #[derive(Copy, Clone, Debug)]
  8. pub enum CgroupSockAddrAttachType {
  9. /// Attach to IPv4 bind events.
  10. Bind4,
  11. /// Attach to IPv6 bind events.
  12. Bind6,
  13. /// Attach to IPv4 connect events.
  14. Connect4,
  15. /// Attach to IPv6 connect events.
  16. Connect6,
  17. /// Attach to IPv4 getpeername events.
  18. GetPeerName4,
  19. /// Attach to IPv6 getpeername events.
  20. GetPeerName6,
  21. /// Attach to IPv4 getsockname events.
  22. GetSockName4,
  23. /// Attach to IPv6 getsockname events.
  24. GetSockName6,
  25. /// Attach to IPv4 udp_sendmsg events.
  26. UDPSendMsg4,
  27. /// Attach to IPv6 udp_sendmsg events.
  28. UDPSendMsg6,
  29. /// Attach to IPv4 udp_recvmsg events.
  30. UDPRecvMsg4,
  31. /// Attach to IPv6 udp_recvmsg events.
  32. UDPRecvMsg6,
  33. }
  34. impl From<CgroupSockAddrAttachType> for bpf_attach_type {
  35. fn from(s: CgroupSockAddrAttachType) -> bpf_attach_type {
  36. match s {
  37. CgroupSockAddrAttachType::Bind4 => bpf_attach_type::BPF_CGROUP_INET4_BIND,
  38. CgroupSockAddrAttachType::Bind6 => bpf_attach_type::BPF_CGROUP_INET6_BIND,
  39. CgroupSockAddrAttachType::Connect4 => bpf_attach_type::BPF_CGROUP_INET4_CONNECT,
  40. CgroupSockAddrAttachType::Connect6 => bpf_attach_type::BPF_CGROUP_INET6_CONNECT,
  41. CgroupSockAddrAttachType::GetPeerName4 => bpf_attach_type::BPF_CGROUP_INET4_GETPEERNAME,
  42. CgroupSockAddrAttachType::GetPeerName6 => bpf_attach_type::BPF_CGROUP_INET6_GETPEERNAME,
  43. CgroupSockAddrAttachType::GetSockName4 => bpf_attach_type::BPF_CGROUP_INET4_GETSOCKNAME,
  44. CgroupSockAddrAttachType::GetSockName6 => bpf_attach_type::BPF_CGROUP_INET6_GETSOCKNAME,
  45. CgroupSockAddrAttachType::UDPSendMsg4 => bpf_attach_type::BPF_CGROUP_UDP4_SENDMSG,
  46. CgroupSockAddrAttachType::UDPSendMsg6 => bpf_attach_type::BPF_CGROUP_UDP6_SENDMSG,
  47. CgroupSockAddrAttachType::UDPRecvMsg4 => bpf_attach_type::BPF_CGROUP_UDP4_RECVMSG,
  48. CgroupSockAddrAttachType::UDPRecvMsg6 => bpf_attach_type::BPF_CGROUP_UDP6_RECVMSG,
  49. }
  50. }
  51. }
  52. #[derive(Debug, thiserror::Error)]
  53. #[error("{0} is not a valid attach type for a CGROUP_SOCK_ADDR program")]
  54. pub(crate) struct InvalidAttachType(String);
  55. impl CgroupSockAddrAttachType {
  56. pub(crate) fn try_from(value: &str) -> Result<CgroupSockAddrAttachType, InvalidAttachType> {
  57. match value {
  58. "bind4" => Ok(CgroupSockAddrAttachType::Bind4),
  59. "bind6" => Ok(CgroupSockAddrAttachType::Bind6),
  60. "connect4" => Ok(CgroupSockAddrAttachType::Connect4),
  61. "connect6" => Ok(CgroupSockAddrAttachType::Connect6),
  62. "getpeername4" => Ok(CgroupSockAddrAttachType::GetPeerName4),
  63. "getpeername6" => Ok(CgroupSockAddrAttachType::GetPeerName6),
  64. "getsockname4" => Ok(CgroupSockAddrAttachType::GetSockName4),
  65. "getsockname6" => Ok(CgroupSockAddrAttachType::GetSockName6),
  66. "sendmsg4" => Ok(CgroupSockAddrAttachType::UDPSendMsg4),
  67. "sendmsg6" => Ok(CgroupSockAddrAttachType::UDPSendMsg6),
  68. "recvmsg4" => Ok(CgroupSockAddrAttachType::UDPRecvMsg4),
  69. "recvmsg6" => Ok(CgroupSockAddrAttachType::UDPRecvMsg6),
  70. _ => Err(InvalidAttachType(value.to_owned())),
  71. }
  72. }
  73. }