netlink_packet_audit/
status.rs1use byteorder::{ByteOrder, NativeEndian};
4
5use netlink_packet_utils::{
6 traits::{Emitable, Parseable},
7 DecodeError,
8};
9
10use crate::Field;
11
12const MASK: Field = 0..4;
13const ENABLED: Field = 4..8;
14const FAILURE: Field = 8..12;
15const PID: Field = 12..16;
16const RATE_LIMITING: Field = 16..20;
17const BACKLOG_LIMIT: Field = 20..24;
18const LOST: Field = 24..28;
19const BACKLOG: Field = 28..32;
20const FEATURE_BITMAP: Field = 32..36;
21const BACKLOG_WAIT_TIME: Field = 36..40;
22pub const STATUS_MESSAGE_LEN: usize = BACKLOG_WAIT_TIME.end;
23
24#[derive(Debug, PartialEq, Eq, Clone, Default)]
25#[non_exhaustive]
26pub struct StatusMessage {
27 pub mask: u32,
29 pub enabled: u32,
30 pub failure: u32,
32 pub pid: u32,
34 pub rate_limiting: u32,
36 pub backlog_limit: u32,
38 pub lost: u32,
40 pub backlog: u32,
42 pub feature_bitmap: u32,
44 pub backlog_wait_time: u32,
46}
47
48impl StatusMessage {
49 pub fn new() -> Self {
50 Default::default()
51 }
52}
53
54#[derive(Debug, PartialEq, Eq, Clone)]
55#[non_exhaustive]
56pub struct StatusMessageBuffer<T> {
57 buffer: T,
58}
59
60impl<T: AsRef<[u8]>> StatusMessageBuffer<T> {
61 pub fn new(buffer: T) -> StatusMessageBuffer<T> {
62 StatusMessageBuffer { buffer }
63 }
64
65 pub fn new_checked(
66 buffer: T,
67 ) -> Result<StatusMessageBuffer<T>, DecodeError> {
68 let buf = Self::new(buffer);
69 buf.check_buffer_length()?;
70 Ok(buf)
71 }
72
73 fn check_buffer_length(&self) -> Result<(), DecodeError> {
74 let len = self.buffer.as_ref().len();
75 if len < STATUS_MESSAGE_LEN {
76 return Err(format!(
77 "invalid StatusMessageBuffer buffer: length is {len} \
78 instead of {STATUS_MESSAGE_LEN}"
79 )
80 .into());
81 }
82 Ok(())
83 }
84
85 pub fn into_inner(self) -> T {
86 self.buffer
87 }
88
89 pub fn mask(&self) -> u32 {
90 NativeEndian::read_u32(&self.buffer.as_ref()[MASK])
91 }
92
93 pub fn enabled(&self) -> u32 {
94 NativeEndian::read_u32(&self.buffer.as_ref()[ENABLED])
95 }
96
97 pub fn failure(&self) -> u32 {
98 NativeEndian::read_u32(&self.buffer.as_ref()[FAILURE])
99 }
100
101 pub fn pid(&self) -> u32 {
102 NativeEndian::read_u32(&self.buffer.as_ref()[PID])
103 }
104
105 pub fn rate_limiting(&self) -> u32 {
106 NativeEndian::read_u32(&self.buffer.as_ref()[RATE_LIMITING])
107 }
108
109 pub fn backlog_limit(&self) -> u32 {
110 NativeEndian::read_u32(&self.buffer.as_ref()[BACKLOG_LIMIT])
111 }
112
113 pub fn lost(&self) -> u32 {
114 NativeEndian::read_u32(&self.buffer.as_ref()[LOST])
115 }
116
117 pub fn backlog(&self) -> u32 {
118 NativeEndian::read_u32(&self.buffer.as_ref()[BACKLOG])
119 }
120
121 pub fn feature_bitmap(&self) -> u32 {
122 NativeEndian::read_u32(&self.buffer.as_ref()[FEATURE_BITMAP])
123 }
124
125 pub fn backlog_wait_time(&self) -> u32 {
126 NativeEndian::read_u32(&self.buffer.as_ref()[BACKLOG_WAIT_TIME])
127 }
128}
129
130impl<T: AsRef<[u8]> + AsMut<[u8]>> StatusMessageBuffer<T> {
131 pub fn set_mask(&mut self, value: u32) {
132 NativeEndian::write_u32(&mut self.buffer.as_mut()[MASK], value)
133 }
134
135 pub fn set_enabled(&mut self, value: u32) {
136 NativeEndian::write_u32(&mut self.buffer.as_mut()[ENABLED], value)
137 }
138
139 pub fn set_failure(&mut self, value: u32) {
140 NativeEndian::write_u32(&mut self.buffer.as_mut()[FAILURE], value)
141 }
142
143 pub fn set_pid(&mut self, value: u32) {
144 NativeEndian::write_u32(&mut self.buffer.as_mut()[PID], value)
145 }
146
147 pub fn set_rate_limiting(&mut self, value: u32) {
148 NativeEndian::write_u32(&mut self.buffer.as_mut()[RATE_LIMITING], value)
149 }
150
151 pub fn set_backlog_limit(&mut self, value: u32) {
152 NativeEndian::write_u32(&mut self.buffer.as_mut()[BACKLOG_LIMIT], value)
153 }
154
155 pub fn set_lost(&mut self, value: u32) {
156 NativeEndian::write_u32(&mut self.buffer.as_mut()[LOST], value)
157 }
158
159 pub fn set_backlog(&mut self, value: u32) {
160 NativeEndian::write_u32(&mut self.buffer.as_mut()[BACKLOG], value)
161 }
162
163 pub fn set_feature_bitmap(&mut self, value: u32) {
164 NativeEndian::write_u32(
165 &mut self.buffer.as_mut()[FEATURE_BITMAP],
166 value,
167 )
168 }
169
170 pub fn set_backlog_wait_time(&mut self, value: u32) {
171 NativeEndian::write_u32(
172 &mut self.buffer.as_mut()[BACKLOG_WAIT_TIME],
173 value,
174 )
175 }
176}
177
178impl<T: AsRef<[u8]>> Parseable<StatusMessageBuffer<T>> for StatusMessage {
179 fn parse(buf: &StatusMessageBuffer<T>) -> Result<Self, DecodeError> {
180 buf.check_buffer_length()?;
181 Ok(StatusMessage {
182 mask: buf.mask(),
183 enabled: buf.enabled(),
184 failure: buf.failure(),
185 pid: buf.pid(),
186 rate_limiting: buf.rate_limiting(),
187 backlog_limit: buf.backlog_limit(),
188 lost: buf.lost(),
189 backlog: buf.backlog(),
190 feature_bitmap: buf.feature_bitmap(),
191 backlog_wait_time: buf.backlog_wait_time(),
192 })
193 }
194}
195
196impl Emitable for StatusMessage {
197 fn buffer_len(&self) -> usize {
198 STATUS_MESSAGE_LEN
199 }
200
201 fn emit(&self, buffer: &mut [u8]) {
202 let mut buffer = StatusMessageBuffer::new(buffer);
203 buffer.set_mask(self.mask);
204 buffer.set_enabled(self.enabled);
205 buffer.set_failure(self.failure);
206 buffer.set_pid(self.pid);
207 buffer.set_rate_limiting(self.rate_limiting);
208 buffer.set_backlog_limit(self.backlog_limit);
209 buffer.set_lost(self.lost);
210 buffer.set_backlog(self.backlog);
211 buffer.set_feature_bitmap(self.feature_bitmap);
212 buffer.set_backlog_wait_time(self.backlog_wait_time);
213 }
214}