netlink_packet_route/nsid/
header.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::{
4    nla::{NlaBuffer, NlasIterator},
5    DecodeError, Emitable, Parseable,
6};
7
8use crate::AddressFamily;
9
10const NSID_HEADER_LEN: usize = 4;
11
12buffer!(NsidMessageBuffer(NSID_HEADER_LEN) {
13    family: (u8, 0),
14    payload: (slice, NSID_HEADER_LEN..),
15});
16
17impl<'a, T: AsRef<[u8]> + ?Sized> NsidMessageBuffer<&'a T> {
18    pub fn attributes(
19        &self,
20    ) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, DecodeError>> {
21        NlasIterator::new(self.payload())
22    }
23}
24
25#[derive(Debug, PartialEq, Eq, Clone, Default)]
26pub struct NsidHeader {
27    pub family: AddressFamily,
28}
29
30impl Emitable for NsidHeader {
31    fn buffer_len(&self) -> usize {
32        NSID_HEADER_LEN
33    }
34
35    fn emit(&self, buffer: &mut [u8]) {
36        let mut packet = NsidMessageBuffer::new(buffer);
37        packet.set_family(self.family.into());
38    }
39}
40
41impl<T: AsRef<[u8]>> Parseable<NsidMessageBuffer<T>> for NsidHeader {
42    fn parse(buf: &NsidMessageBuffer<T>) -> Result<Self, DecodeError> {
43        Ok(NsidHeader {
44            family: buf.family().into(),
45        })
46    }
47}