aboutsummaryrefslogtreecommitdiff
path: root/src/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.rs')
-rw-r--r--src/parser.rs28
1 files changed, 13 insertions, 15 deletions
diff --git a/src/parser.rs b/src/parser.rs
index ddcfbf4..a8df855 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -314,9 +314,11 @@ impl<'a> NfNetlinkAttributeReader<'a> {
})
}
- pub fn decode<T: NfNetlinkObject>(
- mut self,
- ) -> Result<(&'a [u8], NfNetlinkAttributes), DecodeError> {
+ pub fn get_raw_data(&self) -> &'a [u8] {
+ &self.buf[self.pos..]
+ }
+
+ pub fn decode<T: NfNetlinkObject>(mut self) -> Result<NfNetlinkAttributes, DecodeError> {
while self.remaining_size > pad_netlink_object::<nlattr>() {
let nlattr =
unsafe { *transmute::<*const u8, *const nlattr>(self.buf[self.pos..].as_ptr()) };
@@ -337,29 +339,25 @@ impl<'a> NfNetlinkAttributeReader<'a> {
self.remaining_size -= pad_netlink_object_with_variable_size(nlattr.nla_len as usize);
}
- Ok((&self.buf[self.pos..], self.attrs))
+ Ok(self.attrs)
}
}
-pub fn expect_msgtype_in_nlmsg<'a>(
+pub fn parse_object<'a>(
+ hdr: nlmsghdr,
+ msg: NlMsg<'a>,
buf: &'a [u8],
- nlmsg_type: u8,
-) -> Result<(nlmsghdr, Nfgenmsg, &'a [u8], NfNetlinkAttributeReader<'a>), DecodeError> {
- let (hdr, msg) = parse_nlmsg(buf)?;
-
- if get_operation_from_nlmsghdr_type(hdr.nlmsg_type) != nlmsg_type {
- return Err(DecodeError::UnexpectedType(hdr.nlmsg_type));
- }
-
+) -> Result<(Nfgenmsg, NfNetlinkAttributeReader<'a>, &'a [u8]), DecodeError> {
let remaining_size = hdr.nlmsg_len as usize
- pad_netlink_object_with_variable_size(size_of::<nlmsghdr>() + size_of::<Nfgenmsg>());
+ let remaining_data = &buf[pad_netlink_object_with_variable_size(hdr.nlmsg_len as usize)..];
+
match msg {
NlMsg::NfGenMsg(nfgenmsg, content) => Ok((
- hdr,
nfgenmsg,
- content,
NfNetlinkAttributeReader::new(content, remaining_size)?,
+ remaining_data,
)),
_ => Err(DecodeError::UnexpectedType(hdr.nlmsg_type)),
}