Skip to main content

netlink_packet_route/rule/
message.rs

1// SPDX-License-Identifier: MIT
2
3use super::{RuleAttribute, RuleError, RuleHeader, RuleMessageBuffer};
4use crate::RouteNetlinkMessageParseMode;
5use netlink_packet_utils::ParseableParametrized;
6use netlink_packet_utils::nla::{HasNlas, NlaParseMode};
7use netlink_packet_utils::traits::{Emitable, Parseable};
8
9#[derive(Debug, PartialEq, Eq, Clone, Default)]
10#[non_exhaustive]
11pub struct RuleMessage {
12    pub header: RuleHeader,
13    pub attributes: Vec<RuleAttribute>,
14}
15
16impl Emitable for RuleMessage {
17    fn buffer_len(&self) -> usize {
18        self.header.buffer_len() + self.attributes.as_slice().buffer_len()
19    }
20
21    fn emit(&self, buffer: &mut [u8]) {
22        self.header.emit(buffer);
23        self.attributes.as_slice().emit(&mut buffer[self.header.buffer_len()..]);
24    }
25}
26
27impl<'a, T: AsRef<[u8]> + 'a>
28    ParseableParametrized<RuleMessageBuffer<&'a T>, RouteNetlinkMessageParseMode> for RuleMessage
29{
30    type Error = RuleError;
31    fn parse_with_param(
32        buf: &RuleMessageBuffer<&'a T>,
33        mode: RouteNetlinkMessageParseMode,
34    ) -> Result<Self, RuleError> {
35        // unwrap: RuleHeader never fails to parse.
36        let header = RuleHeader::parse(buf).unwrap();
37        let attributes = Vec::<RuleAttribute>::parse_with_param(buf, mode.into())?;
38        Ok(RuleMessage { header, attributes })
39    }
40}
41
42impl<'a, T: AsRef<[u8]> + 'a> ParseableParametrized<RuleMessageBuffer<&'a T>, NlaParseMode>
43    for Vec<RuleAttribute>
44{
45    type Error = RuleError;
46    fn parse_with_param(
47        buf: &RuleMessageBuffer<&'a T>,
48        mode: NlaParseMode,
49    ) -> Result<Self, RuleError> {
50        buf.parse_attributes(mode, RuleAttribute::parse)
51    }
52}