Skip to content

Commit 75fd817

Browse files
committed
SQUASH: Tests and minor refactor
1 parent 3b2721e commit 75fd817

File tree

10 files changed

+882
-31
lines changed

10 files changed

+882
-31
lines changed

src/net/vxlan.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,16 @@ impl Vni {
3636
Self(vni)
3737
}
3838

39-
pub const MAX: u32 = (1 << 24) - 1;
40-
pub const MIN: u32 = 1;
39+
/// The largest legal VXLAN VNI
40+
pub const MAX: Self = Self((1 << 24) - 1);
41+
/// The smallest legal VXLAN VNI
42+
pub const MIN: Self = Self(1);
4143
}
4244

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

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

86+
#[test]
87+
fn min_vni_is_valid() {
88+
assert!(Vni::new(Vni::MIN.0).is_ok());
89+
}
90+
8491
#[test]
8592
fn max_vni_is_valid() {
86-
assert!(Vni::new(Vni::MAX).is_ok());
93+
assert!(Vni::new(Vni::MAX.0).is_ok());
8794
}
8895

8996
#[test]
9097
fn vni_greater_than_max_is_invalid() {
91-
assert!(Vni::new(Vni::MAX + 1).is_err());
98+
assert!(Vni::new(Vni::MAX.0 + 1).is_err());
9299
}
93100

94101
#[test]

src/tc/filters/cls_flower.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use crate::net::mpls;
2222
use crate::net::{ethernet, icmpv4, icmpv6};
2323
use crate::tc::filters::flower;
2424
use crate::tc::filters::flower::encap;
25+
use crate::tc::flower::encap::OptionsList;
2526
use crate::tc::{TcAction, TcFlowerOptionFlags, TcHandle};
2627
use crate::{EncKeyId, IpProtocol};
2728

@@ -266,8 +267,8 @@ pub enum TcFilterFlowerOption {
266267
KeyEncIpTosMask(u8),
267268
KeyEncIpTtl(u8),
268269
KeyEncIpTtlMask(u8),
269-
KeyEncOpts(encap::Options),
270-
KeyEncOptsMask(encap::Options),
270+
KeyEncOpts(encap::OptionsList),
271+
KeyEncOptsMask(encap::OptionsList),
271272
KeyPortSrcMin(u16),
272273
KeyPortSrcMax(u16),
273274
KeyPortDstMin(u16),
@@ -381,8 +382,8 @@ impl Nla for TcFilterFlowerOption {
381382
Self::KeyEncIpTosMask(_) => 1,
382383
Self::KeyEncIpTtl(_) => 1,
383384
Self::KeyEncIpTtlMask(_) => 1,
384-
Self::KeyEncOpts(opts) => opts.buffer_len(),
385-
Self::KeyEncOptsMask(opts) => opts.buffer_len(),
385+
Self::KeyEncOpts(opts) => opts.value_len(),
386+
Self::KeyEncOptsMask(opts) => opts.value_len(),
386387
Self::InHwCount(_) => 4,
387388
Self::KeyPortSrcMin(_) => 2,
388389
Self::KeyPortSrcMax(_) => 2,
@@ -501,8 +502,28 @@ impl Nla for TcFilterFlowerOption {
501502
Self::KeyEncIpTosMask(_) => TCA_FLOWER_KEY_ENC_IP_TOS_MASK,
502503
Self::KeyEncIpTtl(_) => TCA_FLOWER_KEY_ENC_IP_TTL,
503504
Self::KeyEncIpTtlMask(_) => TCA_FLOWER_KEY_ENC_IP_TTL_MASK,
504-
Self::KeyEncOpts(_) => TCA_FLOWER_KEY_ENC_OPTS,
505-
Self::KeyEncOptsMask(_) => TCA_FLOWER_KEY_ENC_OPTS_MASK,
505+
// NOTE: iproute2 is just not consistent with the use of the NLAF_NESTED flag
506+
// for encap options.
507+
Self::KeyEncOpts(OptionsList(opts)) => {
508+
TCA_FLOWER_KEY_ENC_OPTS
509+
| match opts {
510+
encap::Options::Geneve(_) => 0,
511+
encap::Options::Vxlan(_) => NLA_F_NESTED,
512+
encap::Options::Erspan(_) => 0,
513+
encap::Options::Gtp(_) => 0,
514+
encap::Options::Other(_) => 0,
515+
}
516+
}
517+
Self::KeyEncOptsMask(OptionsList(opts)) => {
518+
TCA_FLOWER_KEY_ENC_OPTS_MASK
519+
| match opts {
520+
encap::Options::Geneve(_) => 0,
521+
encap::Options::Vxlan(_) => NLA_F_NESTED,
522+
encap::Options::Erspan(_) => 0,
523+
encap::Options::Gtp(_) => 0,
524+
encap::Options::Other(_) => 0,
525+
}
526+
}
506527
Self::InHwCount(_) => TCA_FLOWER_IN_HW_COUNT,
507528
Self::KeyPortSrcMin(_) => TCA_FLOWER_KEY_PORT_SRC_MIN,
508529
Self::KeyPortSrcMax(_) => TCA_FLOWER_KEY_PORT_SRC_MAX,
@@ -740,8 +761,8 @@ impl Nla for TcFilterFlowerOption {
740761
Self::KeyEncIpTtlMask(ttl) => {
741762
buffer.copy_from_slice(ttl.to_be_bytes().as_slice());
742763
}
743-
Self::KeyEncOpts(opts) => opts.emit(buffer),
744-
Self::KeyEncOptsMask(opts) => opts.emit(buffer),
764+
Self::KeyEncOpts(opts) => opts.emit_value(buffer),
765+
Self::KeyEncOptsMask(opts) => opts.emit_value(buffer),
745766
Self::InHwCount(count) => {
746767
NativeEndian::write_u32(buffer, *count);
747768
}
@@ -1495,10 +1516,10 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>>
14951516
Self::KeyEncIpTtlMask(payload[0])
14961517
}
14971518
TCA_FLOWER_KEY_ENC_OPTS => {
1498-
Self::KeyEncOpts(encap::Options::parse(buf)?)
1519+
Self::KeyEncOpts(encap::OptionsList::parse(buf)?)
14991520
}
15001521
TCA_FLOWER_KEY_ENC_OPTS_MASK => {
1501-
Self::KeyEncOptsMask(encap::Options::parse(buf)?)
1522+
Self::KeyEncOptsMask(encap::OptionsList::parse(buf)?)
15021523
}
15031524
TCA_FLOWER_IN_HW_COUNT => Self::InHwCount(
15041525
parse_u32(payload)

src/tc/filters/flower/encap/erspan.rs

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,173 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for Options {
278278
})
279279
}
280280
}
281+
282+
#[cfg(test)]
283+
mod test {
284+
use super::*;
285+
use netlink_packet_utils::Emitable;
286+
287+
#[test]
288+
fn parse_back_version_zero() {
289+
let example = Version::new(0);
290+
let mut buffer = vec![0; example.buffer_len()];
291+
example.emit(&mut buffer);
292+
let parsed =
293+
Version::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
294+
assert_eq!(example, parsed);
295+
}
296+
297+
#[test]
298+
fn parse_back_version_example() {
299+
let example = Version::new(0x12);
300+
let mut buffer = vec![0; example.buffer_len()];
301+
example.emit(&mut buffer);
302+
let parsed =
303+
Version::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
304+
assert_eq!(example, parsed);
305+
}
306+
307+
#[test]
308+
fn parse_back_index_zero() {
309+
let example = Index::new(0);
310+
let mut buffer = vec![0; example.buffer_len()];
311+
example.emit(&mut buffer);
312+
let parsed =
313+
Index::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
314+
assert_eq!(example, parsed);
315+
}
316+
317+
#[test]
318+
fn parse_back_index_example() {
319+
let example = Index::new(0x12345678);
320+
let mut buffer = vec![0; example.buffer_len()];
321+
example.emit(&mut buffer);
322+
let parsed =
323+
Index::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
324+
assert_eq!(example, parsed);
325+
}
326+
327+
#[test]
328+
fn parse_back_direction_ingress() {
329+
let example = Direction::Ingress;
330+
let mut buffer = vec![0; example.buffer_len()];
331+
example.emit(&mut buffer);
332+
let parsed =
333+
Direction::parse(&NlaBuffer::new_checked(&buffer).unwrap())
334+
.unwrap();
335+
assert_eq!(example, parsed);
336+
}
337+
338+
#[test]
339+
fn parse_back_direction_egress() {
340+
let example = Direction::Egress;
341+
let mut buffer = vec![0; example.buffer_len()];
342+
example.emit(&mut buffer);
343+
let parsed =
344+
Direction::parse(&NlaBuffer::new_checked(&buffer).unwrap())
345+
.unwrap();
346+
assert_eq!(example, parsed);
347+
}
348+
349+
#[test]
350+
fn parse_back_hwid_zero() {
351+
let example = ErspanHwid::new(0);
352+
let mut buffer = vec![0; example.buffer_len()];
353+
example.emit(&mut buffer);
354+
let parsed =
355+
ErspanHwid::parse(&NlaBuffer::new_checked(&buffer).unwrap())
356+
.unwrap();
357+
assert_eq!(example, parsed);
358+
}
359+
360+
#[test]
361+
fn parse_back_hwid_example() {
362+
let example = ErspanHwid::new(0x12);
363+
let mut buffer = vec![0; example.buffer_len()];
364+
example.emit(&mut buffer);
365+
let parsed =
366+
ErspanHwid::parse(&NlaBuffer::new_checked(&buffer).unwrap())
367+
.unwrap();
368+
assert_eq!(example, parsed);
369+
}
370+
371+
#[test]
372+
fn parse_back_options_version_zero() {
373+
let example = Options::Version(Version::new(0));
374+
let mut buffer = vec![0; example.buffer_len()];
375+
example.emit(&mut buffer);
376+
let parsed =
377+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
378+
assert_eq!(example, parsed);
379+
}
380+
381+
#[test]
382+
fn parse_back_options_version_example() {
383+
let example = Options::Version(Version::new(0x12));
384+
let mut buffer = vec![0; example.buffer_len()];
385+
example.emit(&mut buffer);
386+
let parsed =
387+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
388+
assert_eq!(example, parsed);
389+
}
390+
391+
#[test]
392+
fn parse_back_options_index_zero() {
393+
let example = Options::Index(Index::new(0));
394+
let mut buffer = vec![0; example.buffer_len()];
395+
example.emit(&mut buffer);
396+
let parsed =
397+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
398+
assert_eq!(example, parsed);
399+
}
400+
401+
#[test]
402+
fn parse_back_options_index_example() {
403+
let example = Options::Index(Index::new(0x12345678));
404+
let mut buffer = vec![0; example.buffer_len()];
405+
example.emit(&mut buffer);
406+
let parsed =
407+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
408+
assert_eq!(example, parsed);
409+
}
410+
411+
#[test]
412+
fn parse_back_options_direction_ingress() {
413+
let example = Options::Direction(Direction::Ingress);
414+
let mut buffer = vec![0; example.buffer_len()];
415+
example.emit(&mut buffer);
416+
let parsed =
417+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
418+
assert_eq!(example, parsed);
419+
}
420+
421+
#[test]
422+
fn parse_back_options_direction_egress() {
423+
let example = Options::Direction(Direction::Egress);
424+
let mut buffer = vec![0; example.buffer_len()];
425+
example.emit(&mut buffer);
426+
let parsed =
427+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
428+
assert_eq!(example, parsed);
429+
}
430+
431+
#[test]
432+
fn parse_back_options_hwid_zero() {
433+
let example = Options::Hwid(ErspanHwid::new(0));
434+
let mut buffer = vec![0; example.buffer_len()];
435+
example.emit(&mut buffer);
436+
let parsed =
437+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
438+
assert_eq!(example, parsed);
439+
}
440+
441+
#[test]
442+
fn parse_back_options_hwid_example() {
443+
let example = Options::Hwid(ErspanHwid::new(0x12));
444+
let mut buffer = vec![0; example.buffer_len()];
445+
example.emit(&mut buffer);
446+
let parsed =
447+
Options::parse(&NlaBuffer::new_checked(&buffer).unwrap()).unwrap();
448+
assert_eq!(example, parsed);
449+
}
450+
}

0 commit comments

Comments
 (0)