netlink_packet_route/tc/actions/
header.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::nla::{NlaBuffer, 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(
20        &self,
21    ) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, DecodeError>> {
22        NlasIterator::new(self.payload())
23    }
24}
25
26/// Header for a traffic control action message.
27#[derive(Debug, PartialEq, Eq, Clone, Default)]
28pub struct TcActionMessageHeader {
29    /// Address family (usually `AddressFamily::Unspec`).
30    pub family: AddressFamily,
31}
32
33impl Emitable for TcActionMessageHeader {
34    fn buffer_len(&self) -> usize {
35        TCA_HEADER_LEN
36    }
37
38    fn emit(&self, buffer: &mut [u8]) {
39        let mut packet = TcActionMessageBuffer::new(buffer);
40        packet.set_family(self.family.into());
41    }
42}
43
44impl<T: AsRef<[u8]>> Parseable<TcActionMessageBuffer<T>>
45    for TcActionMessageHeader
46{
47    fn parse(buf: &TcActionMessageBuffer<T>) -> Result<Self, DecodeError> {
48        Ok(TcActionMessageHeader {
49            family: buf.family().into(),
50        })
51    }
52}