use crate::*;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Ipv6RoutingExtensions {
pub routing: Ipv6RawExtHeader,
pub final_destination_options: Option<Ipv6RawExtHeader>,
}
impl Ipv6RoutingExtensions {
pub const MIN_LEN: usize = Ipv6RawExtHeader::MAX_LEN;
pub const MAX_LEN: usize = Ipv6RawExtHeader::MAX_LEN * 2;
pub fn header_len(&self) -> usize {
self.routing.header_len()
+ self
.final_destination_options
.as_ref()
.map(|h| h.header_len())
.unwrap_or(0)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_gens::ipv6_raw_ext_any;
use proptest::prelude::*;
#[test]
fn debug() {
use alloc::format;
let a: Ipv6RoutingExtensions = Ipv6RoutingExtensions {
routing: Ipv6RawExtHeader::new_raw(0.into(), &[0; 6]).unwrap(),
final_destination_options: None,
};
assert_eq!(
&format!(
"Ipv6RoutingExtensions {{ routing: {:?}, final_destination_options: {:?} }}",
a.routing, a.final_destination_options,
),
&format!("{:?}", a)
);
}
#[test]
fn clone_eq() {
let a: Ipv6RoutingExtensions = Ipv6RoutingExtensions {
routing: Ipv6RawExtHeader::new_raw(0.into(), &[0; 6]).unwrap(),
final_destination_options: None,
};
assert_eq!(a, a.clone());
}
proptest! {
#[test]
fn header_len(
routing in ipv6_raw_ext_any(),
final_destination_options in ipv6_raw_ext_any()
) {
assert_eq!(
Ipv6RoutingExtensions{
routing: routing.clone(),
final_destination_options: None,
}.header_len(),
routing.header_len()
);
assert_eq!(
Ipv6RoutingExtensions{
routing: routing.clone(),
final_destination_options: Some(final_destination_options.clone()),
}.header_len(),
routing.header_len() + final_destination_options.header_len()
);
}
}
}