netlink_packet_route/tc/actions/
header.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_core::{
4    DecodeError, Emitable, NlaBuffer, NlasIterator, Parseable,
5};
6
7use crate::AddressFamily;
8
9const TCA_HEADER_LEN: usize = 4;
10
11buffer!(TcActionMessageBuffer(TCA_HEADER_LEN) {
12    family: (u8, 0),
13    pad1: (u8, 1),
14    pad2: (u16, 2..TCA_HEADER_LEN),
15    payload: (slice, TCA_HEADER_LEN..),
16});
17
18impl<'a, T: AsRef<[u8]> + ?Sized> TcActionMessageBuffer<&'a T> {
19    /// Returns an iterator over the attributes of a `TcActionMessageBuffer`.
20    pub fn attributes(
21        &self,
22    ) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, DecodeError>> {
23        NlasIterator::new(self.payload())
24    }
25}
26
27/// Header for a traffic control action message.
28#[derive(Debug, PartialEq, Eq, Clone, Default)]
29pub struct TcActionMessageHeader {
30    /// Address family (usually `AddressFamily::Unspec`).
31    pub family: AddressFamily,
32}
33
34impl Emitable for TcActionMessageHeader {
35    fn buffer_len(&self) -> usize {
36        TCA_HEADER_LEN
37    }
38
39    fn emit(&self, buffer: &mut [u8]) {
40        let mut packet = TcActionMessageBuffer::new(buffer);
41        packet.set_family(self.family.into());
42    }
43}
44
45impl<T: AsRef<[u8]>> Parseable<TcActionMessageBuffer<T>>
46    for TcActionMessageHeader
47{
48    fn parse(buf: &TcActionMessageBuffer<T>) -> Result<Self, DecodeError> {
49        Ok(TcActionMessageHeader {
50            family: buf.family().into(),
51        })
52    }
53}