netlink_packet_sock_diag/
message.rs1use netlink_packet_core::{
4 NetlinkDeserializable, NetlinkHeader, NetlinkPayload, NetlinkSerializable,
5};
6use netlink_packet_utils::DecodeError;
7use netlink_packet_utils::traits::{Emitable, ParseableParametrized};
8
9use crate::{SOCK_DESTROY, SOCK_DIAG_BY_FAMILY, SockDiagBuffer, inet, unix};
10
11#[derive(Debug, PartialEq, Eq, Clone)]
12pub enum SockDiagRequest {
13 InetRequest(inet::InetRequest),
14 UnixRequest(unix::UnixRequest),
15 InetSockDestroy(inet::InetRequest),
16}
17
18impl SockDiagRequest {
19 pub fn message_type(&self) -> u16 {
20 match self {
21 SockDiagRequest::InetRequest(_) | SockDiagRequest::UnixRequest(_) => {
22 SOCK_DIAG_BY_FAMILY
23 }
24 SockDiagRequest::InetSockDestroy(_) => SOCK_DESTROY,
25 }
26 }
27}
28
29impl Emitable for SockDiagRequest {
30 fn buffer_len(&self) -> usize {
31 match self {
32 SockDiagRequest::InetRequest(msg) => msg.buffer_len(),
33 SockDiagRequest::UnixRequest(msg) => msg.buffer_len(),
34 SockDiagRequest::InetSockDestroy(msg) => msg.buffer_len(),
35 }
36 }
37
38 fn emit(&self, buffer: &mut [u8]) {
39 match self {
40 SockDiagRequest::InetRequest(msg) => msg.emit(buffer),
41 SockDiagRequest::UnixRequest(msg) => msg.emit(buffer),
42 SockDiagRequest::InetSockDestroy(msg) => msg.emit(buffer),
43 }
44 }
45}
46
47impl NetlinkSerializable for SockDiagRequest {
48 fn message_type(&self) -> u16 {
49 self.message_type()
50 }
51
52 fn buffer_len(&self) -> usize {
53 <Self as Emitable>::buffer_len(self)
54 }
55
56 fn serialize(&self, buffer: &mut [u8]) {
57 self.emit(buffer)
58 }
59}
60
61impl NetlinkDeserializable for SockDiagRequest {
62 type Error = DecodeError;
63 fn deserialize(header: &NetlinkHeader, payload: &[u8]) -> Result<Self, Self::Error> {
64 let buffer = SockDiagBuffer::new(&payload)?;
65 SockDiagRequest::parse_with_param(&buffer, header.message_type)
66 }
67}
68
69impl From<SockDiagRequest> for NetlinkPayload<SockDiagRequest> {
70 fn from(message: SockDiagRequest) -> Self {
71 NetlinkPayload::InnerMessage(message)
72 }
73}
74
75#[derive(Debug, PartialEq, Eq, Clone)]
76#[allow(clippy::large_enum_variant)]
77pub enum SockDiagResponse {
78 InetResponse(inet::InetResponse),
79 UnixResponse(unix::UnixResponse),
80}
81
82impl SockDiagResponse {
83 pub fn message_type(&self) -> u16 {
84 match self {
85 SockDiagResponse::InetResponse(_) | SockDiagResponse::UnixResponse(_) => {
86 SOCK_DIAG_BY_FAMILY
87 }
88 }
89 }
90}
91
92impl Emitable for SockDiagResponse {
93 fn buffer_len(&self) -> usize {
94 match self {
95 SockDiagResponse::InetResponse(msg) => msg.buffer_len(),
96 SockDiagResponse::UnixResponse(msg) => msg.buffer_len(),
97 }
98 }
99
100 fn emit(&self, buffer: &mut [u8]) {
101 match self {
102 SockDiagResponse::InetResponse(msg) => msg.emit(buffer),
103 SockDiagResponse::UnixResponse(msg) => msg.emit(buffer),
104 }
105 }
106}
107
108impl NetlinkSerializable for SockDiagResponse {
109 fn message_type(&self) -> u16 {
110 self.message_type()
111 }
112
113 fn buffer_len(&self) -> usize {
114 <Self as Emitable>::buffer_len(self)
115 }
116
117 fn serialize(&self, buffer: &mut [u8]) {
118 self.emit(buffer)
119 }
120}
121
122impl NetlinkDeserializable for SockDiagResponse {
123 type Error = DecodeError;
124 fn deserialize(header: &NetlinkHeader, payload: &[u8]) -> Result<Self, Self::Error> {
125 let buffer = SockDiagBuffer::new(&payload)?;
126 SockDiagResponse::parse_with_param(&buffer, header.message_type)
127 }
128}
129
130impl From<SockDiagResponse> for NetlinkPayload<SockDiagResponse> {
131 fn from(message: SockDiagResponse) -> Self {
132 NetlinkPayload::InnerMessage(message)
133 }
134}