Skip to main content

netlink_packet_route/address/
message.rs

1// SPDX-License-Identifier: MIT
2
3use 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}