aboutsummaryrefslogtreecommitdiff
path: root/src/expr/reject.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/reject.rs')
-rw-r--r--src/expr/reject.rs71
1 files changed, 8 insertions, 63 deletions
diff --git a/src/expr/reject.rs b/src/expr/reject.rs
index 10b95ea..83fd843 100644
--- a/src/expr/reject.rs
+++ b/src/expr/reject.rs
@@ -1,10 +1,6 @@
-use rustables_macros::nfnetlink_struct;
+use rustables_macros::{nfnetlink_enum, nfnetlink_struct};
-use crate::{
- nlmsg::{NfNetlinkAttribute, NfNetlinkDeserializable},
- parser::DecodeError,
- sys,
-};
+use crate::sys;
use super::Expression;
@@ -26,70 +22,19 @@ pub struct Reject {
/// An ICMP reject code.
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
-#[repr(u32)]
+#[nfnetlink_enum(u32)]
pub enum RejectType {
IcmpUnreach = sys::NFT_REJECT_ICMP_UNREACH,
TcpRst = sys::NFT_REJECT_TCP_RST,
IcmpxUnreach = sys::NFT_REJECT_ICMPX_UNREACH,
}
-impl NfNetlinkDeserializable for RejectType {
- fn deserialize(buf: &[u8]) -> Result<(Self, &[u8]), DecodeError> {
- let (v, remaining_code) = u32::deserialize(buf)?;
- Ok((
- match v {
- sys::NFT_REJECT_ICMP_UNREACH => Self::IcmpUnreach,
- sys::NFT_REJECT_TCP_RST => Self::TcpRst,
- sys::NFT_REJECT_ICMPX_UNREACH => Self::IcmpxUnreach,
- _ => return Err(DecodeError::UnknownRejectType(v)),
- },
- remaining_code,
- ))
- }
-}
-
-impl NfNetlinkAttribute for RejectType {
- fn get_size(&self) -> usize {
- (*self as u32).get_size()
- }
-
- unsafe fn write_payload(&self, addr: *mut u8) {
- (*self as u32).write_payload(addr);
- }
-}
-
/// An ICMP reject code.
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
-#[repr(u8)]
+#[nfnetlink_enum(u8)]
pub enum IcmpCode {
- NoRoute = sys::NFT_REJECT_ICMPX_NO_ROUTE as u8,
- PortUnreach = sys::NFT_REJECT_ICMPX_PORT_UNREACH as u8,
- HostUnreach = sys::NFT_REJECT_ICMPX_HOST_UNREACH as u8,
- AdminProhibited = sys::NFT_REJECT_ICMPX_ADMIN_PROHIBITED as u8,
-}
-
-impl NfNetlinkDeserializable for IcmpCode {
- fn deserialize(buf: &[u8]) -> Result<(Self, &[u8]), DecodeError> {
- let (value, remaining_code) = u8::deserialize(buf)?;
- Ok((
- match value as u32 {
- sys::NFT_REJECT_ICMPX_NO_ROUTE => Self::NoRoute,
- sys::NFT_REJECT_ICMPX_PORT_UNREACH => Self::PortUnreach,
- sys::NFT_REJECT_ICMPX_HOST_UNREACH => Self::HostUnreach,
- sys::NFT_REJECT_ICMPX_ADMIN_PROHIBITED => Self::AdminProhibited,
- _ => return Err(DecodeError::UnknownIcmpCode(value)),
- },
- remaining_code,
- ))
- }
-}
-
-impl NfNetlinkAttribute for IcmpCode {
- fn get_size(&self) -> usize {
- (*self as u8).get_size()
- }
-
- unsafe fn write_payload(&self, addr: *mut u8) {
- (*self as u8).write_payload(addr);
- }
+ NoRoute = sys::NFT_REJECT_ICMPX_NO_ROUTE,
+ PortUnreach = sys::NFT_REJECT_ICMPX_PORT_UNREACH,
+ HostUnreach = sys::NFT_REJECT_ICMPX_HOST_UNREACH,
+ AdminProhibited = sys::NFT_REJECT_ICMPX_ADMIN_PROHIBITED,
}