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)]
76pub enum SockDiagResponse {
77 InetResponse(Box<inet::InetResponse>),
78 UnixResponse(Box<unix::UnixResponse>),
79}
80
81impl SockDiagResponse {
82 pub fn message_type(&self) -> u16 {
83 match self {
84 SockDiagResponse::InetResponse(_) | SockDiagResponse::UnixResponse(_) => {
85 SOCK_DIAG_BY_FAMILY
86 }
87 }
88 }
89}
90
91impl Emitable for SockDiagResponse {
92 fn buffer_len(&self) -> usize {
93 match self {
94 SockDiagResponse::InetResponse(msg) => msg.buffer_len(),
95 SockDiagResponse::UnixResponse(msg) => msg.buffer_len(),
96 }
97 }
98
99 fn emit(&self, buffer: &mut [u8]) {
100 match self {
101 SockDiagResponse::InetResponse(msg) => msg.emit(buffer),
102 SockDiagResponse::UnixResponse(msg) => msg.emit(buffer),
103 }
104 }
105}
106
107impl NetlinkSerializable for SockDiagResponse {
108 fn message_type(&self) -> u16 {
109 self.message_type()
110 }
111
112 fn buffer_len(&self) -> usize {
113 <Self as Emitable>::buffer_len(self)
114 }
115
116 fn serialize(&self, buffer: &mut [u8]) {
117 self.emit(buffer)
118 }
119}
120
121impl NetlinkDeserializable for SockDiagResponse {
122 type Error = DecodeError;
123 fn deserialize(header: &NetlinkHeader, payload: &[u8]) -> Result<Self, Self::Error> {
124 let buffer = SockDiagBuffer::new(&payload)?;
125 SockDiagResponse::parse_with_param(&buffer, header.message_type)
126 }
127}
128
129impl From<SockDiagResponse> for NetlinkPayload<SockDiagResponse> {
130 fn from(message: SockDiagResponse) -> Self {
131 NetlinkPayload::InnerMessage(message)
132 }
133}