netlink_packet_route/nsid/
message.rs

1// SPDX-License-Identifier: MIT
2
3use anyhow::Context;
4use netlink_packet_utils::{
5    traits::{Emitable, Parseable},
6    DecodeError,
7};
8
9use crate::nsid::{NsidAttribute, NsidHeader, NsidMessageBuffer};
10
11#[derive(Debug, PartialEq, Eq, Clone, Default)]
12#[non_exhaustive]
13pub struct NsidMessage {
14    pub header: NsidHeader,
15    pub attributes: Vec<NsidAttribute>,
16}
17
18impl<'a, T: AsRef<[u8]> + 'a> Parseable<NsidMessageBuffer<&'a T>>
19    for NsidMessage
20{
21    fn parse(buf: &NsidMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
22        Ok(Self {
23            header: NsidHeader::parse(buf)
24                .context("failed to parse nsid message header")?,
25            attributes: Vec::<NsidAttribute>::parse(buf)
26                .context("failed to parse nsid message NLAs")?,
27        })
28    }
29}
30
31impl<'a, T: AsRef<[u8]> + 'a> Parseable<NsidMessageBuffer<&'a T>>
32    for Vec<NsidAttribute>
33{
34    fn parse(buf: &NsidMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
35        let mut attributes = vec![];
36        for nla_buf in buf.attributes() {
37            attributes.push(NsidAttribute::parse(&nla_buf?)?);
38        }
39        Ok(attributes)
40    }
41}
42
43impl Emitable for NsidMessage {
44    fn buffer_len(&self) -> usize {
45        self.header.buffer_len() + self.attributes.as_slice().buffer_len()
46    }
47
48    fn emit(&self, buffer: &mut [u8]) {
49        self.header.emit(buffer);
50        self.attributes
51            .as_slice()
52            .emit(&mut buffer[self.header.buffer_len()..]);
53    }
54}