Skip to content

Commit

Permalink
SQUASH: Tests and minor refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
daniel-noland committed May 14, 2024
1 parent 3b2721e commit 75fd817
Show file tree
Hide file tree
Showing 10 changed files with 882 additions and 31 deletions.
17 changes: 12 additions & 5 deletions src/net/vxlan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,16 @@ impl Vni {
Self(vni)
}

pub const MAX: u32 = (1 << 24) - 1;
pub const MIN: u32 = 1;
/// The largest legal VXLAN VNI
pub const MAX: Self = Self((1 << 24) - 1);
/// The smallest legal VXLAN VNI
pub const MIN: Self = Self(1);
}

impl TryFrom<u32> for Vni {
type Error = DecodeError;

/// Creates a new `Vni` value from a `u32`.
/// Creates a new `Vni` value from an `u32`.
///
/// # Errors
/// Returns an error if the VNI is zero or greater than or equal to 2^24.
Expand Down Expand Up @@ -81,14 +83,19 @@ mod tests {
assert!(Vni::new(0).is_err());
}

#[test]
fn min_vni_is_valid() {
assert!(Vni::new(Vni::MIN.0).is_ok());
}

#[test]
fn max_vni_is_valid() {
assert!(Vni::new(Vni::MAX).is_ok());
assert!(Vni::new(Vni::MAX.0).is_ok());
}

#[test]
fn vni_greater_than_max_is_invalid() {
assert!(Vni::new(Vni::MAX + 1).is_err());
assert!(Vni::new(Vni::MAX.0 + 1).is_err());
}

#[test]
Expand Down
41 changes: 31 additions & 10 deletions src/tc/filters/cls_flower.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use crate::net::mpls;
use crate::net::{ethernet, icmpv4, icmpv6};
use crate::tc::filters::flower;
use crate::tc::filters::flower::encap;
use crate::tc::flower::encap::OptionsList;
use crate::tc::{TcAction, TcFlowerOptionFlags, TcHandle};
use crate::{EncKeyId, IpProtocol};

Expand Down Expand Up @@ -266,8 +267,8 @@ pub enum TcFilterFlowerOption {
KeyEncIpTosMask(u8),
KeyEncIpTtl(u8),
KeyEncIpTtlMask(u8),
KeyEncOpts(encap::Options),
KeyEncOptsMask(encap::Options),
KeyEncOpts(encap::OptionsList),
KeyEncOptsMask(encap::OptionsList),
KeyPortSrcMin(u16),
KeyPortSrcMax(u16),
KeyPortDstMin(u16),
Expand Down Expand Up @@ -381,8 +382,8 @@ impl Nla for TcFilterFlowerOption {
Self::KeyEncIpTosMask(_) => 1,
Self::KeyEncIpTtl(_) => 1,
Self::KeyEncIpTtlMask(_) => 1,
Self::KeyEncOpts(opts) => opts.buffer_len(),
Self::KeyEncOptsMask(opts) => opts.buffer_len(),
Self::KeyEncOpts(opts) => opts.value_len(),
Self::KeyEncOptsMask(opts) => opts.value_len(),
Self::InHwCount(_) => 4,
Self::KeyPortSrcMin(_) => 2,
Self::KeyPortSrcMax(_) => 2,
Expand Down Expand Up @@ -501,8 +502,28 @@ impl Nla for TcFilterFlowerOption {
Self::KeyEncIpTosMask(_) => TCA_FLOWER_KEY_ENC_IP_TOS_MASK,
Self::KeyEncIpTtl(_) => TCA_FLOWER_KEY_ENC_IP_TTL,
Self::KeyEncIpTtlMask(_) => TCA_FLOWER_KEY_ENC_IP_TTL_MASK,
Self::KeyEncOpts(_) => TCA_FLOWER_KEY_ENC_OPTS,
Self::KeyEncOptsMask(_) => TCA_FLOWER_KEY_ENC_OPTS_MASK,
// NOTE: iproute2 is just not consistent with the use of the NLAF_NESTED flag
// for encap options.
Self::KeyEncOpts(OptionsList(opts)) => {
TCA_FLOWER_KEY_ENC_OPTS
| match opts {
encap::Options::Geneve(_) => 0,
encap::Options::Vxlan(_) => NLA_F_NESTED,
encap::Options::Erspan(_) => 0,
encap::Options::Gtp(_) => 0,
encap::Options::Other(_) => 0,
}
}
Self::KeyEncOptsMask(OptionsList(opts)) => {
TCA_FLOWER_KEY_ENC_OPTS_MASK
| match opts {
encap::Options::Geneve(_) => 0,
encap::Options::Vxlan(_) => NLA_F_NESTED,
encap::Options::Erspan(_) => 0,
encap::Options::Gtp(_) => 0,
encap::Options::Other(_) => 0,
}
}
Self::InHwCount(_) => TCA_FLOWER_IN_HW_COUNT,
Self::KeyPortSrcMin(_) => TCA_FLOWER_KEY_PORT_SRC_MIN,
Self::KeyPortSrcMax(_) => TCA_FLOWER_KEY_PORT_SRC_MAX,
Expand Down Expand Up @@ -740,8 +761,8 @@ impl Nla for TcFilterFlowerOption {
Self::KeyEncIpTtlMask(ttl) => {
buffer.copy_from_slice(ttl.to_be_bytes().as_slice());
}
Self::KeyEncOpts(opts) => opts.emit(buffer),
Self::KeyEncOptsMask(opts) => opts.emit(buffer),
Self::KeyEncOpts(opts) => opts.emit_value(buffer),
Self::KeyEncOptsMask(opts) => opts.emit_value(buffer),
Self::InHwCount(count) => {
NativeEndian::write_u32(buffer, *count);
}
Expand Down Expand Up @@ -1495,10 +1516,10 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>>
Self::KeyEncIpTtlMask(payload[0])
}
TCA_FLOWER_KEY_ENC_OPTS => {
Self::KeyEncOpts(encap::Options::parse(buf)?)
Self::KeyEncOpts(encap::OptionsList::parse(buf)?)
}
TCA_FLOWER_KEY_ENC_OPTS_MASK => {
Self::KeyEncOptsMask(encap::Options::parse(buf)?)
Self::KeyEncOptsMask(encap::OptionsList::parse(buf)?)
}
TCA_FLOWER_IN_HW_COUNT => Self::InHwCount(
parse_u32(payload)
Expand Down
170 changes: 170 additions & 0 deletions src/tc/filters/flower/encap/erspan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -278,3 +278,173 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for Options {
})
}
}

#[cfg(test)]
mod test {
use super::*;
use netlink_packet_utils::Emitable;

#[test]
fn parse_back_version_zero() {
let example = Version::new(0);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Version::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_version_example() {
let example = Version::new(0x12);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Version::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_index_zero() {
let example = Index::new(0);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Index::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_index_example() {
let example = Index::new(0x12345678);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Index::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_direction_ingress() {
let example = Direction::Ingress;
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Direction::parse(&NlaBuffer::new_checked(&buffer).unwrap())
.unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_direction_egress() {
let example = Direction::Egress;
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Direction::parse(&NlaBuffer::new_checked(&buffer).unwrap())
.unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_hwid_zero() {
let example = ErspanHwid::new(0);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
ErspanHwid::parse(&NlaBuffer::new_checked(&buffer).unwrap())
.unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_hwid_example() {
let example = ErspanHwid::new(0x12);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
ErspanHwid::parse(&NlaBuffer::new_checked(&buffer).unwrap())
.unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_version_zero() {
let example = Options::Version(Version::new(0));
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_version_example() {
let example = Options::Version(Version::new(0x12));
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_index_zero() {
let example = Options::Index(Index::new(0));
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_index_example() {
let example = Options::Index(Index::new(0x12345678));
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_direction_ingress() {
let example = Options::Direction(Direction::Ingress);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_direction_egress() {
let example = Options::Direction(Direction::Egress);
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_hwid_zero() {
let example = Options::Hwid(ErspanHwid::new(0));
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}

#[test]
fn parse_back_options_hwid_example() {
let example = Options::Hwid(ErspanHwid::new(0x12));
let mut buffer = vec![0; example.buffer_len()];
example.emit(&mut buffer);
let parsed =
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
assert_eq!(example, parsed);
}
}
Loading

0 comments on commit 75fd817

Please sign in to comment.