Skip to main content

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)]
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}