netlink_packet_route/nsid/
message.rs1use 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}