netlink_packet_route/rule/
port_range.rs1use netlink_packet_utils::{DecodeError, Emitable};
4
5const RULE_PORT_RANGE_LEN: usize = 4;
6
7#[derive(Clone, Eq, PartialEq, Debug, Copy)]
8pub struct RulePortRange {
9 pub start: u16,
10 pub end: u16,
11}
12
13impl RulePortRange {
14 pub(crate) fn parse(buf: &[u8]) -> Result<Self, DecodeError> {
15 if buf.len() == RULE_PORT_RANGE_LEN {
16 Ok(Self {
17 start: u16::from_ne_bytes([buf[0], buf[1]]),
18 end: u16::from_ne_bytes([buf[2], buf[3]]),
19 })
20 } else {
21 Err(DecodeError::from(format!(
22 "Invalid rule port range data, expecting \
23 {RULE_PORT_RANGE_LEN} u8 array, but got {:?}",
24 buf
25 )))
26 }
27 }
28}
29
30impl Emitable for RulePortRange {
31 fn buffer_len(&self) -> usize {
32 RULE_PORT_RANGE_LEN
33 }
34
35 fn emit(&self, buffer: &mut [u8]) {
36 buffer[0..2].copy_from_slice(&self.start.to_ne_bytes());
37 buffer[2..4].copy_from_slice(&self.end.to_ne_bytes());
38 }
39}