netlink_packet_generic/
message.rs1use crate::buffer::GenlBuffer;
6use crate::header::GenlHeader;
7use crate::traits::*;
8use netlink_packet_core::{
9 NetlinkDeserializable, NetlinkHeader, NetlinkPayload, NetlinkSerializable,
10};
11use netlink_packet_utils::{DecodeError, Emitable, ParseableParametrized};
12use std::fmt::Debug;
13
14#[cfg(doc)]
15use netlink_packet_core::NetlinkMessage;
16
17#[derive(Clone, Debug, PartialEq, Eq)]
24pub struct GenlMessage<F> {
25 pub header: GenlHeader,
26 pub payload: F,
27 resolved_family_id: u16,
28}
29
30impl<F> GenlMessage<F>
31where
32 F: Debug,
33{
34 pub fn new(header: GenlHeader, payload: F, family_id: u16) -> Self {
36 Self { header, payload, resolved_family_id: family_id }
37 }
38
39 pub fn from_parts(header: GenlHeader, payload: F) -> Self {
41 Self { header, payload, resolved_family_id: 0 }
42 }
43
44 pub fn into_parts(self) -> (GenlHeader, F) {
46 (self.header, self.payload)
47 }
48
49 pub fn resolved_family_id(&self) -> u16 {
54 self.resolved_family_id
55 }
56
57 pub fn set_resolved_family_id(&mut self, family_id: u16) {
72 self.resolved_family_id = family_id;
73 }
74}
75
76impl<F> GenlMessage<F>
77where
78 F: GenlFamily + Debug,
79{
80 pub fn from_payload(payload: F) -> Self {
86 Self {
87 header: GenlHeader { cmd: payload.command(), version: payload.version() },
88 payload,
89 resolved_family_id: 0,
90 }
91 }
92
93 pub fn finalize(&mut self) {
102 self.header.cmd = self.payload.command();
103 self.header.version = self.payload.version();
104 }
105
106 pub fn family_id(&self) -> u16 {
114 let static_id = self.payload.family_id();
115 if static_id == 0 { self.resolved_family_id } else { static_id }
116 }
117}
118
119impl<F> Emitable for GenlMessage<F>
120where
121 F: GenlFamily + Emitable + Debug,
122{
123 fn buffer_len(&self) -> usize {
124 self.header.buffer_len() + self.payload.buffer_len()
125 }
126
127 fn emit(&self, buffer: &mut [u8]) {
128 self.header.emit(buffer);
129
130 let buffer = &mut buffer[self.header.buffer_len()..];
131 self.payload.emit(buffer);
132 }
133}
134
135impl<F> NetlinkSerializable for GenlMessage<F>
136where
137 F: GenlFamily + Emitable + Debug,
138{
139 fn message_type(&self) -> u16 {
140 self.family_id()
141 }
142
143 fn buffer_len(&self) -> usize {
144 <Self as Emitable>::buffer_len(self)
145 }
146
147 fn serialize(&self, buffer: &mut [u8]) {
148 self.emit(buffer)
149 }
150}
151
152#[derive(Default)]
154pub struct EmptyDeserializeOptions;
155
156impl<F> NetlinkDeserializable for GenlMessage<F>
157where
158 F: ParseableParametrized<[u8], GenlHeader> + Debug,
159 F::Error: Into<DecodeError>,
160{
161 type DeserializeOptions = EmptyDeserializeOptions;
162 type Error = DecodeError;
163 fn deserialize(
164 header: &NetlinkHeader,
165 payload: &[u8],
166 _options: EmptyDeserializeOptions,
167 ) -> Result<Self, Self::Error> {
168 let buffer = GenlBuffer::new(payload)?;
169 GenlMessage::parse_with_param(&buffer, header.message_type)
170 }
171}
172
173impl<F> From<GenlMessage<F>> for NetlinkPayload<GenlMessage<F>>
174where
175 F: Debug,
176{
177 fn from(message: GenlMessage<F>) -> Self {
178 NetlinkPayload::InnerMessage(message)
179 }
180}