diff options
Diffstat (limited to 'src/expr/reject.rs')
-rw-r--r-- | src/expr/reject.rs | 71 |
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, } |