netlink_packet_route/rtnl/rule/
message.rs

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