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
152impl<F> NetlinkDeserializable for GenlMessage<F>
153where
154 F: ParseableParametrized<[u8], GenlHeader> + Debug,
155 F::Error: Into<DecodeError>,
156{
157 type Error = DecodeError;
158 fn deserialize(header: &NetlinkHeader, payload: &[u8]) -> Result<Self, Self::Error> {
159 let buffer = GenlBuffer::new_checked(payload)?;
160 GenlMessage::parse_with_param(&buffer, header.message_type)
161 }
162}
163
164impl<F> From<GenlMessage<F>> for NetlinkPayload<GenlMessage<F>>
165where
166 F: Debug,
167{
168 fn from(message: GenlMessage<F>) -> Self {
169 NetlinkPayload::InnerMessage(message)
170 }
171}