aboutsummaryrefslogtreecommitdiff
path: root/src/table.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/table.rs')
-rw-r--r--src/table.rs24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/table.rs b/src/table.rs
index 6b34291..42c4f86 100644
--- a/src/table.rs
+++ b/src/table.rs
@@ -3,13 +3,11 @@ use std::fmt::Debug;
use crate::nlmsg::{NfNetlinkObject, NfNetlinkWriter};
use crate::parser::{
- expect_msgtype_in_nlmsg, parse_nlmsg, Attribute, DecodeError, NfNetlinkAttributeReader,
- NfNetlinkAttributes, NlMsg, SerializeNfNetlink,
+ get_operation_from_nlmsghdr_type, parse_nlmsg, parse_object, Attribute, DecodeError,
+ NfNetlinkAttributeReader, NfNetlinkAttributes, NlMsg, SerializeNfNetlink,
};
use crate::sys::{self, NFTA_OBJ_TABLE, NFTA_TABLE_FLAGS, NFTA_TABLE_NAME};
use crate::{impl_attr_getters_and_setters, MsgType, ProtoFamily};
-#[cfg(feature = "query")]
-use crate::{parser::Nfgenmsg, query::ParseError};
use libc;
/// Abstraction of `nftnl_table`, the top level container in netfilter. A table has a protocol
@@ -69,6 +67,7 @@ impl NfNetlinkObject for Table {
} as u16;
writer.write_header(raw_msg_type, self.family, libc::NLM_F_ACK as u16, seq, None);
self.inner.serialize(writer);
+ writer.finalize_writing_object();
}
fn decode_attribute(attr_type: u16, buf: &[u8]) -> Result<Attribute, DecodeError> {
@@ -84,18 +83,25 @@ impl NfNetlinkObject for Table {
}
}
- fn deserialize(buf: &[u8]) -> Result<(&[u8], Self), DecodeError> {
- let (hdr, nfgenmsg, content, mut attrs) =
- expect_msgtype_in_nlmsg(buf, libc::NFT_MSG_NEWTABLE as u8)?;
+ fn deserialize(buf: &[u8]) -> Result<(Self, &[u8]), DecodeError> {
+ let (hdr, msg) = parse_nlmsg(buf)?;
+
+ let op = get_operation_from_nlmsghdr_type(hdr.nlmsg_type) as i32;
+
+ if op != libc::NFT_MSG_NEWTABLE && op != libc::NFT_MSG_DELTABLE {
+ return Err(DecodeError::UnexpectedType(hdr.nlmsg_type));
+ }
+
+ let (nfgenmsg, attrs, remaining_data) = parse_object(hdr, msg, buf)?;
- let (remaining_buf, inner) = attrs.decode::<Table>()?;
+ let inner = attrs.decode::<Table>()?;
Ok((
- remaining_buf,
Table {
inner,
family: ProtoFamily::try_from(nfgenmsg.family as i32)?,
},
+ remaining_data,
))
}
}