netlink_packet_route/rule/
message.rs

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