netlink_packet_generic/
message.rs1use crate::{constants::GENL_HDRLEN, header::GenlHeader, traits::*};
6use netlink_packet_core::{
7 DecodeError, Emitable, NetlinkDeserializable, NetlinkHeader,
8 NetlinkPayload, NetlinkSerializable, ParseableParametrized,
9};
10use std::fmt::Debug;
11
12#[cfg(doc)]
13use netlink_packet_core::NetlinkMessage;
14
15#[derive(Clone, Debug, PartialEq, Eq)]
22pub struct GenlMessage<F> {
23 pub header: GenlHeader,
24 pub payload: F,
25 resolved_family_id: u16,
26}
27
28impl<F> GenlMessage<F>
29where
30 F: Debug,
31{
32 pub fn new(header: GenlHeader, payload: F, family_id: u16) -> Self {
34 Self {
35 header,
36 payload,
37 resolved_family_id: family_id,
38 }
39 }
40
41 pub fn from_parts(header: GenlHeader, payload: F) -> Self {
43 Self {
44 header,
45 payload,
46 resolved_family_id: 0,
47 }
48 }
49
50 pub fn into_parts(self) -> (GenlHeader, F) {
52 (self.header, self.payload)
53 }
54
55 pub fn resolved_family_id(&self) -> u16 {
60 self.resolved_family_id
61 }
62
63 pub fn set_resolved_family_id(&mut self, family_id: u16) {
78 self.resolved_family_id = family_id;
79 }
80}
81
82impl<F> GenlMessage<F>
83where
84 F: GenlFamily + Debug,
85{
86 pub fn from_payload(payload: F) -> Self {
92 Self {
93 header: GenlHeader {
94 cmd: payload.command(),
95 version: payload.version(),
96 },
97 payload,
98 resolved_family_id: 0,
99 }
100 }
101
102 pub fn finalize(&mut self) {
111 self.header.cmd = self.payload.command();
112 self.header.version = self.payload.version();
113 }
114
115 pub fn family_id(&self) -> u16 {
123 let static_id = self.payload.family_id();
124 if static_id == 0 {
125 self.resolved_family_id
126 } else {
127 static_id
128 }
129 }
130}
131
132impl<F> Emitable for GenlMessage<F>
133where
134 F: GenlFamily + Emitable + Debug,
135{
136 fn buffer_len(&self) -> usize {
137 self.header.buffer_len() + self.payload.buffer_len()
138 }
139
140 fn emit(&self, buffer: &mut [u8]) {
141 self.header.emit(buffer);
142
143 let buffer = &mut buffer[self.header.buffer_len()..];
144 self.payload.emit(buffer);
145 }
146}
147
148impl<F> NetlinkSerializable for GenlMessage<F>
149where
150 F: GenlFamily + Emitable + Debug,
151{
152 fn message_type(&self) -> u16 {
153 self.family_id()
154 }
155
156 fn buffer_len(&self) -> usize {
157 <Self as Emitable>::buffer_len(self)
158 }
159
160 fn serialize(&self, buffer: &mut [u8]) {
161 self.emit(buffer)
162 }
163}
164
165impl<F> NetlinkDeserializable for GenlMessage<F>
166where
167 F: ParseableParametrized<[u8], GenlHeader> + Debug,
168{
169 type Error = DecodeError;
170 fn deserialize(
171 header: &NetlinkHeader,
172 payload: &[u8],
173 ) -> Result<Self, Self::Error> {
174 GenlMessage::parse_with_param(payload, header.message_type)
175 }
176}
177
178impl<F> ParseableParametrized<[u8], u16> for GenlMessage<F>
179where
180 F: ParseableParametrized<[u8], GenlHeader> + Debug,
181{
182 fn parse_with_param(
183 buf: &[u8],
184 message_type: u16,
185 ) -> Result<Self, DecodeError> {
186 let header = GenlHeader::parse(buf)?;
187 let payload_buf = &buf[GENL_HDRLEN..];
188 Ok(GenlMessage::new(
189 header,
190 F::parse_with_param(payload_buf, header)?,
191 message_type,
192 ))
193 }
194}
195
196impl<F> From<GenlMessage<F>> for NetlinkPayload<GenlMessage<F>>
197where
198 F: Debug,
199{
200 fn from(message: GenlMessage<F>) -> Self {
201 NetlinkPayload::InnerMessage(message)
202 }
203}