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