use crate::error::RobinError;
use crate::model::Command;
use neli::consts::nl::NlmF;
use neli::genl::{Genlmsghdr, GenlmsghdrBuilder};
use neli::nl::{NlPayload, Nlmsghdr, NlmsghdrBuilder};
use neli::types::{Buffer, GenlBuffer};
pub fn build_genl_msg(
cmd: Command,
attrs: GenlBuffer<u16, Buffer>,
) -> Result<Genlmsghdr<u8, u16>, RobinError> {
let genl_msg = GenlmsghdrBuilder::default()
.cmd(cmd.into())
.version(1)
.attrs(attrs)
.build()
.map_err(|e| RobinError::Netlink(format!("Failed to build GENL header: {:?}", e)))?;
Ok(genl_msg)
}
#[allow(dead_code)]
pub fn build_nl_msg(
family_id: u16,
cmd: Command,
attrs: GenlBuffer<u16, Buffer>,
seq: u32,
) -> Result<Nlmsghdr<u16, Genlmsghdr<u8, u16>>, RobinError> {
let genl_msg = build_genl_msg(cmd, attrs)
.map_err(|e| RobinError::Netlink(format!("Failed to build GENL header: {:?}", e)))?;
let nl_msg = NlmsghdrBuilder::default()
.nl_type(family_id)
.nl_flags(NlmF::REQUEST | NlmF::DUMP) .nl_seq(seq) .nl_pid(0) .nl_payload(NlPayload::Payload(genl_msg))
.build()
.map_err(|e| RobinError::Netlink(format!("Failed to build NL header: {:?}", e)))?;
Ok(nl_msg)
}