|
|
@ -90,7 +90,7 @@ pub(crate) unsafe fn netlink_qdisc_add_clsact(if_index: i32) -> Result<(), io::E
|
|
|
|
// add the TCA_KIND attribute
|
|
|
|
// add the TCA_KIND attribute
|
|
|
|
let attrs_buf = request_attributes(&mut req, nlmsg_len);
|
|
|
|
let attrs_buf = request_attributes(&mut req, nlmsg_len);
|
|
|
|
let attr_len = write_attr_bytes(attrs_buf, 0, TCA_KIND as u16, b"clsact\0")?;
|
|
|
|
let attr_len = write_attr_bytes(attrs_buf, 0, TCA_KIND as u16, b"clsact\0")?;
|
|
|
|
req.header.nlmsg_len += align_to(attr_len as usize, NLA_ALIGNTO as usize) as u32;
|
|
|
|
req.header.nlmsg_len += align_to(attr_len, NLA_ALIGNTO as usize) as u32;
|
|
|
|
|
|
|
|
|
|
|
|
sock.send(&bytes_of(&req)[..req.header.nlmsg_len as usize])?;
|
|
|
|
sock.send(&bytes_of(&req)[..req.header.nlmsg_len as usize])?;
|
|
|
|
sock.recv()?;
|
|
|
|
sock.recv()?;
|
|
|
@ -135,7 +135,7 @@ pub(crate) unsafe fn netlink_qdisc_attach(
|
|
|
|
options.write_attr(TCA_BPF_FLAGS as u16, flags)?;
|
|
|
|
options.write_attr(TCA_BPF_FLAGS as u16, flags)?;
|
|
|
|
let options_len = options.finish()?;
|
|
|
|
let options_len = options.finish()?;
|
|
|
|
|
|
|
|
|
|
|
|
req.header.nlmsg_len += align_to(kind_len + options_len as usize, NLA_ALIGNTO as usize) as u32;
|
|
|
|
req.header.nlmsg_len += align_to(kind_len + options_len, NLA_ALIGNTO as usize) as u32;
|
|
|
|
sock.send(&bytes_of(&req)[..req.header.nlmsg_len as usize])?;
|
|
|
|
sock.send(&bytes_of(&req)[..req.header.nlmsg_len as usize])?;
|
|
|
|
|
|
|
|
|
|
|
|
// find the RTM_NEWTFILTER reply and read the tcm_info field which we'll
|
|
|
|
// find the RTM_NEWTFILTER reply and read the tcm_info field which we'll
|
|
|
@ -440,7 +440,7 @@ impl<'a> NestedAttrs<'a> {
|
|
|
|
fn finish(self) -> Result<usize, io::Error> {
|
|
|
|
fn finish(self) -> Result<usize, io::Error> {
|
|
|
|
let nla_len = self.offset;
|
|
|
|
let nla_len = self.offset;
|
|
|
|
let attr = nlattr {
|
|
|
|
let attr = nlattr {
|
|
|
|
nla_type: NLA_F_NESTED as u16 | self.top_attr_type as u16,
|
|
|
|
nla_type: NLA_F_NESTED as u16 | self.top_attr_type,
|
|
|
|
nla_len: nla_len as u16,
|
|
|
|
nla_len: nla_len as u16,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -467,7 +467,7 @@ fn write_attr_bytes(
|
|
|
|
value: &[u8],
|
|
|
|
value: &[u8],
|
|
|
|
) -> Result<usize, io::Error> {
|
|
|
|
) -> Result<usize, io::Error> {
|
|
|
|
let attr = nlattr {
|
|
|
|
let attr = nlattr {
|
|
|
|
nla_type: attr_type as u16,
|
|
|
|
nla_type: attr_type,
|
|
|
|
nla_len: ((NLA_HDR_LEN + value.len()) as u16),
|
|
|
|
nla_len: ((NLA_HDR_LEN + value.len()) as u16),
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -575,10 +575,7 @@ impl From<NlAttrError> for io::Error {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
unsafe fn request_attributes<T>(req: &mut T, msg_len: usize) -> &mut [u8] {
|
|
|
|
unsafe fn request_attributes<T>(req: &mut T, msg_len: usize) -> &mut [u8] {
|
|
|
|
let attrs_addr = align_to(
|
|
|
|
let attrs_addr = align_to(req as *const _ as usize + msg_len, NLMSG_ALIGNTO as usize);
|
|
|
|
req as *const _ as usize + msg_len as usize,
|
|
|
|
|
|
|
|
NLMSG_ALIGNTO as usize,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
let attrs_end = req as *const _ as usize + mem::size_of::<T>();
|
|
|
|
let attrs_end = req as *const _ as usize + mem::size_of::<T>();
|
|
|
|
slice::from_raw_parts_mut(attrs_addr as *mut u8, attrs_end - attrs_addr)
|
|
|
|
slice::from_raw_parts_mut(attrs_addr as *mut u8, attrs_end - attrs_addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|