netlink_packet_route/nsid/
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 NSID_HEADER_LEN: usize = 4;
9
10buffer!(NsidMessageBuffer(NSID_HEADER_LEN) {
11    family: (u8, 0),
12    payload: (slice, NSID_HEADER_LEN..),
13});
14
15impl<'a, T: AsRef<[u8]> + ?Sized> NsidMessageBuffer<&'a T> {
16    pub fn attributes(&self) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, NlaError>> {
17        NlasIterator::new(self.payload())
18    }
19}
20
21#[derive(Debug, PartialEq, Eq, Clone, Default)]
22pub struct NsidHeader {
23    pub family: AddressFamily,
24}
25
26impl Emitable for NsidHeader {
27    fn buffer_len(&self) -> usize {
28        NSID_HEADER_LEN
29    }
30
31    fn emit(&self, buffer: &mut [u8]) {
32        let mut packet = NsidMessageBuffer::new(buffer);
33        packet.set_family(self.family.into());
34    }
35}
36
37impl<T: AsRef<[u8]>> Parseable<NsidMessageBuffer<T>> for NsidHeader {
38    type Error = ();
39    fn parse(buf: &NsidMessageBuffer<T>) -> Result<Self, ()> {
40        Ok(NsidHeader { family: buf.family().into() })
41    }
42}