1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use byteorder::{ByteOrder, NativeEndian};
use std::mem::size_of;
use {
Emitable, Error, Field, NetlinkBuffer, NetlinkHeader, Parseable, Rest, Result,
NETLINK_HEADER_LEN,
};
const CODE: Field = 0..4;
const PAYLOAD: Rest = 4..;
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct ErrorBuffer<T> {
buffer: T,
}
impl<T: AsRef<[u8]>> ErrorBuffer<T> {
pub fn new(buffer: T) -> ErrorBuffer<T> {
ErrorBuffer { buffer }
}
pub fn into_inner(self) -> T {
self.buffer
}
pub fn code(&self) -> i32 {
let data = self.buffer.as_ref();
NativeEndian::read_i32(&data[CODE])
}
}
impl<'a, T: AsRef<[u8]> + ?Sized> ErrorBuffer<&'a T> {
pub fn payload(&self) -> &'a [u8] {
let data = self.buffer.as_ref();
&data[PAYLOAD]
}
}
impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> ErrorBuffer<&'a mut T> {
pub fn payload_mut(&mut self) -> &mut [u8] {
let data = self.buffer.as_mut();
&mut data[PAYLOAD]
}
}
impl<T: AsRef<[u8]> + AsMut<[u8]>> ErrorBuffer<T> {
pub fn set_code(&mut self, value: i32) {
let data = self.buffer.as_mut();
NativeEndian::write_i32(&mut data[CODE], value)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ErrorMessage {
pub code: i32,
pub header: NetlinkHeader,
}
pub type AckMessage = ErrorMessage;
impl Emitable for ErrorMessage {
fn buffer_len(&self) -> usize {
size_of::<i32>() + self.header.buffer_len()
}
fn emit(&self, buffer: &mut [u8]) {
let mut buffer = ErrorBuffer::new(buffer);
buffer.set_code(self.code);
self.header.emit(buffer.payload_mut())
}
}
impl<'buffer, T: AsRef<[u8]> + 'buffer> Parseable<ErrorMessage> for ErrorBuffer<&'buffer T> {
fn parse(&self) -> Result<ErrorMessage> {
let header: NetlinkHeader = {
if self.payload().len() < NETLINK_HEADER_LEN {
return Err(Error::Truncated);
}
NetlinkBuffer::new(self.payload()).parse()?
};
Ok(ErrorMessage {
code: self.code(),
header,
})
}
}