Skip to main content

netlink_packet_route/nsid/
message.rs

1// SPDX-License-Identifier: MIT
2
3use crate::RouteNetlinkMessageParseMode;
4use crate::nsid::{NsidAttribute, NsidError, NsidHeader, NsidMessageBuffer};
5use netlink_packet_utils::nla::{HasNlas, NlaParseMode};
6use netlink_packet_utils::traits::{Emitable, Parseable, ParseableParametrized};
7
8#[derive(Debug, PartialEq, Eq, Clone, Default)]
9#[non_exhaustive]
10pub struct NsidMessage {
11    pub header: NsidHeader,
12    pub attributes: Vec<NsidAttribute>,
13}
14
15impl<'a, T: AsRef<[u8]> + 'a>
16    ParseableParametrized<NsidMessageBuffer<&'a T>, RouteNetlinkMessageParseMode> for NsidMessage
17{
18    type Error = NsidError;
19    fn parse_with_param(
20        buf: &NsidMessageBuffer<&'a T>,
21        mode: RouteNetlinkMessageParseMode,
22    ) -> Result<Self, NsidError> {
23        Ok(Self {
24            // unwrap: parsing the header can't fail
25            header: NsidHeader::parse(buf).unwrap(),
26            attributes: Vec::<NsidAttribute>::parse_with_param(buf, mode.into())?,
27        })
28    }
29}
30
31impl<'a, T: AsRef<[u8]> + 'a> ParseableParametrized<NsidMessageBuffer<&'a T>, NlaParseMode>
32    for Vec<NsidAttribute>
33{
34    type Error = NsidError;
35    fn parse_with_param(
36        buf: &NsidMessageBuffer<&'a T>,
37        mode: NlaParseMode,
38    ) -> Result<Self, NsidError> {
39        buf.parse_attributes(mode, NsidAttribute::parse)
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.as_slice().emit(&mut buffer[self.header.buffer_len()..]);
51    }
52}