netlink_packet_route/address/
message.rs1use netlink_packet_core::{
4 DecodeError, Emitable, ErrorContext, NlaBuffer, NlasIterator, Parseable,
5};
6
7use crate::{
8 address::{AddressAttribute, AddressHeaderFlags, AddressScope},
9 AddressFamily,
10};
11
12const ADDRESS_HEADER_LEN: usize = 8;
13
14buffer!(AddressMessageBuffer(ADDRESS_HEADER_LEN) {
15 family: (u8, 0),
16 prefix_len: (u8, 1),
17 flags: (u8, 2),
18 scope: (u8, 3),
19 index: (u32, 4..ADDRESS_HEADER_LEN),
20 payload: (slice, ADDRESS_HEADER_LEN..),
21});
22
23impl<'a, T: AsRef<[u8]> + ?Sized> AddressMessageBuffer<&'a T> {
24 pub fn attributes(
25 &self,
26 ) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, DecodeError>> {
27 NlasIterator::new(self.payload())
28 }
29}
30
31#[derive(Debug, PartialEq, Eq, Clone, Default)]
32#[non_exhaustive]
33pub struct AddressMessage {
34 pub header: AddressHeader,
35 pub attributes: Vec<AddressAttribute>,
36}
37
38#[derive(Debug, PartialEq, Eq, Clone, Default)]
39pub struct AddressHeader {
40 pub family: AddressFamily,
41 pub prefix_len: u8,
42 pub flags: AddressHeaderFlags,
43 pub scope: AddressScope,
44 pub index: u32,
45}
46
47impl Emitable for AddressHeader {
48 fn buffer_len(&self) -> usize {
49 ADDRESS_HEADER_LEN
50 }
51
52 fn emit(&self, buffer: &mut [u8]) {
53 let mut packet = AddressMessageBuffer::new(buffer);
54 packet.set_family(self.family.into());
55 packet.set_prefix_len(self.prefix_len);
56 packet.set_flags(self.flags.bits());
57 packet.set_scope(self.scope.into());
58 packet.set_index(self.index);
59 }
60}
61
62impl Emitable for AddressMessage {
63 fn buffer_len(&self) -> usize {
64 self.header.buffer_len() + self.attributes.as_slice().buffer_len()
65 }
66
67 fn emit(&self, buffer: &mut [u8]) {
68 self.header.emit(buffer);
69 self.attributes
70 .as_slice()
71 .emit(&mut buffer[self.header.buffer_len()..]);
72 }
73}
74
75impl<T: AsRef<[u8]>> Parseable<AddressMessageBuffer<T>> for AddressHeader {
76 fn parse(buf: &AddressMessageBuffer<T>) -> Result<Self, DecodeError> {
77 Ok(Self {
78 family: buf.family().into(),
79 prefix_len: buf.prefix_len(),
80 flags: AddressHeaderFlags::from_bits_retain(buf.flags()),
81 scope: buf.scope().into(),
82 index: buf.index(),
83 })
84 }
85}
86
87impl<'a, T: AsRef<[u8]> + 'a> Parseable<AddressMessageBuffer<&'a T>>
88 for AddressMessage
89{
90 fn parse(buf: &AddressMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
91 Ok(AddressMessage {
92 header: AddressHeader::parse(buf)
93 .context("failed to parse address message header")?,
94 attributes: Vec::<AddressAttribute>::parse(buf)
95 .context("failed to parse address message NLAs")?,
96 })
97 }
98}
99
100impl<'a, T: AsRef<[u8]> + 'a> Parseable<AddressMessageBuffer<&'a T>>
101 for Vec<AddressAttribute>
102{
103 fn parse(buf: &AddressMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
104 let mut attributes = vec![];
105 for nla_buf in buf.attributes() {
106 attributes.push(AddressAttribute::parse(&nla_buf?)?);
107 }
108 Ok(attributes)
109 }
110}