use crate::error::Error;
use neli::consts::nl::NlmF;
use neli::consts::socket::NlFamily;
use neli::genl::Genlmsghdr;
use neli::nl::NlPayload;
use neli::router::asynchronous::{NlRouter, NlRouterReceiverHandle};
use neli::utils::Groups;
pub struct BatadvSocket {
sock: NlRouter,
family_id: u16,
}
impl BatadvSocket {
pub async fn connect() -> Result<Self, Error> {
let (sock, _mcast) = NlRouter::connect(NlFamily::Generic, None, Groups::empty())
.await
.map_err(|e| Error::Netlink(format!("Failed to connect with NlRouter: {:?}", e)))?;
let family_id = sock
.resolve_genl_family("batadv")
.await
.map_err(|e| Error::Netlink(format!("Failed to resolve family: {:?}", e)))?;
Ok(Self { sock, family_id })
}
pub async fn send(
&mut self,
flags: NlmF,
msg: Genlmsghdr<u8, u16>,
) -> Result<NlRouterReceiverHandle<u16, Genlmsghdr<u8, u16>>, Error> {
let recv = self
.sock
.send(self.family_id, flags, NlPayload::Payload(msg))
.await
.map_err(|e| Error::Netlink(format!("Failed to send message: {:?}", e)))?;
Ok(recv)
}
}