netlink_packet_route/tc/actions/
header.rs1use 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 pub fn attributes(
20 &self,
21 ) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, DecodeError>> {
22 NlasIterator::new(self.payload())
23 }
24}
25
26#[derive(Debug, PartialEq, Eq, Clone, Default)]
28pub struct TcActionMessageHeader {
29 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}