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