|
2 | 2 |
|
3 | 3 | use std::fmt::Debug; |
4 | 4 |
|
5 | | -use anyhow::Context; |
6 | | -use netlink_packet_utils::DecodeError; |
7 | | - |
8 | 5 | use crate::{ |
9 | 6 | payload::{NLMSG_DONE, NLMSG_ERROR, NLMSG_NOOP, NLMSG_OVERRUN}, |
10 | | - DoneBuffer, DoneMessage, Emitable, ErrorBuffer, ErrorMessage, |
| 7 | + CoreError, DoneBuffer, DoneMessage, Emitable, ErrorBuffer, ErrorMessage, |
11 | 8 | NetlinkBuffer, NetlinkDeserializable, NetlinkHeader, NetlinkPayload, |
12 | 9 | NetlinkSerializable, Parseable, |
13 | 10 | }; |
|
39 | 36 | I: NetlinkDeserializable, |
40 | 37 | { |
41 | 38 | /// Parse the given buffer as a netlink message |
42 | | - pub fn deserialize(buffer: &[u8]) -> Result<Self, DecodeError> { |
| 39 | + pub fn deserialize(buffer: &[u8]) -> Result<Self, CoreError> { |
43 | 40 | let netlink_buffer = NetlinkBuffer::new_checked(&buffer)?; |
44 | 41 | <Self as Parseable<NetlinkBuffer<&&[u8]>>>::parse(&netlink_buffer) |
45 | 42 | } |
@@ -88,33 +85,43 @@ where |
88 | 85 | B: AsRef<[u8]> + 'buffer, |
89 | 86 | I: NetlinkDeserializable, |
90 | 87 | { |
91 | | - fn parse(buf: &NetlinkBuffer<&'buffer B>) -> Result<Self, DecodeError> { |
| 88 | + type Error = CoreError; |
| 89 | + |
| 90 | + fn parse(buf: &NetlinkBuffer<&'buffer B>) -> Result<Self, Self::Error> { |
92 | 91 | use self::NetlinkPayload::*; |
93 | 92 |
|
94 | 93 | let header = |
95 | 94 | <NetlinkHeader as Parseable<NetlinkBuffer<&'buffer B>>>::parse(buf) |
96 | | - .context("failed to parse netlink header")?; |
| 95 | + .map_err(|e| CoreError::InvalidHeader { due_to: e.into() })?; |
97 | 96 |
|
98 | 97 | let bytes = buf.payload(); |
99 | 98 | let payload = match header.message_type { |
100 | 99 | NLMSG_ERROR => { |
101 | 100 | let msg = ErrorBuffer::new_checked(&bytes) |
102 | 101 | .and_then(|buf| ErrorMessage::parse(&buf)) |
103 | | - .context("failed to parse NLMSG_ERROR")?; |
| 102 | + .map_err(|e| CoreError::InvalidErrorMsg { |
| 103 | + due_to: e.into(), |
| 104 | + })?; |
104 | 105 | Error(msg) |
105 | 106 | } |
106 | 107 | NLMSG_NOOP => Noop, |
107 | 108 | NLMSG_DONE => { |
108 | 109 | let msg = DoneBuffer::new_checked(&bytes) |
109 | 110 | .and_then(|buf| DoneMessage::parse(&buf)) |
110 | | - .context("failed to parse NLMSG_DONE")?; |
| 111 | + .map_err(|e| CoreError::InvalidDoneMsg { |
| 112 | + due_to: e.into(), |
| 113 | + })?; |
111 | 114 | Done(msg) |
112 | 115 | } |
113 | 116 | NLMSG_OVERRUN => Overrun(bytes.to_vec()), |
114 | 117 | message_type => { |
115 | | - let inner_msg = I::deserialize(&header, bytes).context( |
116 | | - format!("Failed to parse message with type {message_type}"), |
117 | | - )?; |
| 118 | + let inner_msg = |
| 119 | + I::deserialize(&header, bytes).map_err(|e| { |
| 120 | + CoreError::ParseFailure { |
| 121 | + message_type, |
| 122 | + due_to: e.into(), |
| 123 | + } |
| 124 | + })?; |
118 | 125 | InnerMessage(inner_msg) |
119 | 126 | } |
120 | 127 | }; |
|
0 commit comments