netlink_packet_route/tc/actions/
header.rs
1use netlink_packet_utils::nla::{NlaBuffer, NlaError, NlasIterator};
4use netlink_packet_utils::{DecodeError, Emitable, Parseable};
5
6use crate::AddressFamily;
7
8const TCA_HEADER_LEN: usize = 4;
9
10buffer!(TcActionMessageBuffer(TCA_HEADER_LEN) {
11 family: (u8, 0),
12 pad1: (u8, 1),
13 pad2: (u16, 2..TCA_HEADER_LEN),
14 payload: (slice, TCA_HEADER_LEN..),
15});
16
17impl<'a, T: AsRef<[u8]> + ?Sized> TcActionMessageBuffer<&'a T> {
18 pub fn attributes(&self) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, NlaError>> {
20 NlasIterator::new(self.payload())
21 }
22}
23
24#[derive(Debug, PartialEq, Eq, Clone, Default)]
26pub struct TcActionMessageHeader {
27 pub family: AddressFamily,
29}
30
31impl Emitable for TcActionMessageHeader {
32 fn buffer_len(&self) -> usize {
33 TCA_HEADER_LEN
34 }
35
36 fn emit(&self, buffer: &mut [u8]) {
37 let mut packet = TcActionMessageBuffer::new(buffer);
38 packet.set_family(self.family.into());
39 }
40}
41
42impl<T: AsRef<[u8]>> Parseable<TcActionMessageBuffer<T>> for TcActionMessageHeader {
43 type Error = DecodeError;
44 fn parse(buf: &TcActionMessageBuffer<T>) -> Result<Self, DecodeError> {
45 Ok(TcActionMessageHeader { family: buf.family().into() })
46 }
47}