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