netlink_packet_generic/
buffer.rs1use 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}