netlink_packet_route/tc/actions/
header.rs

1// SPDX-License-Identifier: MIT
2
3use 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    /// Returns an iterator over the attributes of a `TcActionMessageBuffer`.
19    pub fn attributes(&self) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, NlaError>> {
20        NlasIterator::new(self.payload())
21    }
22}
23
24/// Header for a traffic control action message.
25#[derive(Debug, PartialEq, Eq, Clone, Default)]
26pub struct TcActionMessageHeader {
27    /// Address family (usually `AddressFamily::Unspec`).
28    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}