netlink_packet_sock_diag/
message.rs

1// SPDX-License-Identifier: MIT
2
3use 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}