netlink_packet_generic/
buffer.rs

1// SPDX-License-Identifier: MIT
2
3//! Buffer definition of generic netlink packet
4use crate::{constants::GENL_HDRLEN, header::GenlHeader, message::GenlMessage};
5use netlink_packet_utils::{DecodeError, Parseable, ParseableParametrized};
6use std::fmt::Debug;
7
8buffer!(GenlBuffer(GENL_HDRLEN) {
9    cmd: (u8, 0),
10    version: (u8, 1),
11    payload: (slice, GENL_HDRLEN..),
12});
13
14impl<F> ParseableParametrized<[u8], u16> for GenlMessage<F>
15where
16    F: ParseableParametrized<[u8], GenlHeader> + Debug,
17{
18    fn parse_with_param(
19        buf: &[u8],
20        message_type: u16,
21    ) -> Result<Self, DecodeError> {
22        let buf = GenlBuffer::new_checked(buf)?;
23        Self::parse_with_param(&buf, message_type)
24    }
25}
26
27impl<'a, F, T> ParseableParametrized<GenlBuffer<&'a T>, u16> for GenlMessage<F>
28where
29    F: ParseableParametrized<[u8], GenlHeader> + Debug,
30    T: AsRef<[u8]> + ?Sized,
31{
32    fn parse_with_param(
33        buf: &GenlBuffer<&'a T>,
34        message_type: u16,
35    ) -> Result<Self, DecodeError> {
36        let header = GenlHeader::parse(buf)?;
37        let payload_buf = buf.payload();
38        Ok(GenlMessage::new(
39            header,
40            F::parse_with_param(payload_buf, header)?,
41            message_type,
42        ))
43    }
44}