netlink_packet_generic/
buffer.rs

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