use std::os::fd::AsFd as _;
use crate::{
generated::{bpf_attach_type::BPF_SK_MSG_VERDICT, bpf_prog_type::BPF_PROG_TYPE_SK_MSG},
maps::sock::SockMapFd,
programs::{
define_link_wrapper, load_program, CgroupAttachMode, ProgAttachLink, ProgAttachLinkId,
ProgramData, ProgramError,
},
};
#[derive(Debug)]
#[doc(alias = "BPF_PROG_TYPE_SK_MSG")]
pub struct SkMsg {
pub(crate) data: ProgramData<SkMsgLink>,
}
impl SkMsg {
pub fn load(&mut self) -> Result<(), ProgramError> {
load_program(BPF_PROG_TYPE_SK_MSG, &mut self.data)
}
pub fn attach(&mut self, map: &SockMapFd) -> Result<SkMsgLinkId, ProgramError> {
let prog_fd = self.fd()?;
let prog_fd = prog_fd.as_fd();
let link = ProgAttachLink::attach(
prog_fd,
map.as_fd(),
BPF_SK_MSG_VERDICT,
CgroupAttachMode::Single,
)?;
self.data.links.insert(SkMsgLink::new(link))
}
pub fn detach(&mut self, link_id: SkMsgLinkId) -> Result<(), ProgramError> {
self.data.links.remove(link_id)
}
pub fn take_link(&mut self, link_id: SkMsgLinkId) -> Result<SkMsgLink, ProgramError> {
self.data.take_link(link_id)
}
}
define_link_wrapper!(
SkMsgLink,
SkMsgLinkId,
ProgAttachLink,
ProgAttachLinkId
);