use crate::*;
#[deprecated(since = "0.14.0", note = "`IpHeader` was renamed to `NetHeaders`")]
pub type IpHeader = NetHeaders;
#[derive(Clone, Debug, Eq, PartialEq)]
#[allow(clippy::large_enum_variant)]
pub enum NetHeaders {
Ipv4(Ipv4Header, Ipv4Extensions),
Ipv6(Ipv6Header, Ipv6Extensions),
}
impl NetHeaders {
pub fn ipv4_ref(&self) -> Option<(&Ipv4Header, &Ipv4Extensions)> {
if let NetHeaders::Ipv4(header, exts) = self {
Some((header, exts))
} else {
None
}
}
pub fn ipv6_ref(&self) -> Option<(&Ipv6Header, &Ipv6Extensions)> {
if let NetHeaders::Ipv6(header, exts) = self {
Some((header, exts))
} else {
None
}
}
pub fn header_len(&self) -> usize {
use crate::NetHeaders::*;
match *self {
Ipv4(ref header, ref extensions) => header.header_len() + extensions.header_len(),
Ipv6(_, ref extensions) => Ipv6Header::LEN + extensions.header_len(),
}
}
}
impl From<IpHeaders> for NetHeaders {
#[inline]
fn from(value: IpHeaders) -> Self {
match value {
IpHeaders::Ipv4(h, e) => NetHeaders::Ipv4(h, e),
IpHeaders::Ipv6(h, e) => NetHeaders::Ipv6(h, e),
}
}
}
#[cfg(test)]
mod tests {
use crate::*;
use alloc::format;
#[test]
fn debug() {
let h = Ipv4Header {
..Default::default()
};
let e = Ipv4Extensions {
..Default::default()
};
let n = NetHeaders::Ipv4(h.clone(), e.clone());
assert_eq!(format!("{n:?}"), format!("Ipv4({h:?}, {e:?})"));
}
#[test]
fn clone_eq() {
let n = NetHeaders::Ipv4(Default::default(), Default::default());
assert_eq!(n, n.clone())
}
#[test]
fn ipv4_ref() {
{
let h: Ipv4Header = Default::default();
let e: Ipv4Extensions = Default::default();
let s = NetHeaders::Ipv4(h.clone(), e.clone());
assert_eq!(s.ipv4_ref(), Some((&h, &e)));
}
{
let h: Ipv6Header = Default::default();
let e: Ipv6Extensions = Default::default();
let s = NetHeaders::Ipv6(h.clone(), e.clone());
assert_eq!(s.ipv4_ref(), None);
}
}
#[test]
fn ipv6_ref() {
{
let h: Ipv4Header = Default::default();
let e: Ipv4Extensions = Default::default();
let s = NetHeaders::Ipv4(h.clone(), e.clone());
assert_eq!(s.ipv6_ref(), None);
}
{
let h: Ipv6Header = Default::default();
let e: Ipv6Extensions = Default::default();
let s = NetHeaders::Ipv6(h.clone(), e.clone());
assert_eq!(s.ipv6_ref(), Some((&h, &e)));
}
}
#[test]
fn header_len() {
{
let h: Ipv4Header = Default::default();
let e: Ipv4Extensions = Default::default();
let s = NetHeaders::Ipv4(h.clone(), e.clone());
assert_eq!(s.header_len(), h.header_len() + e.header_len());
}
{
let h: Ipv6Header = Default::default();
let e: Ipv6Extensions = Default::default();
let s = NetHeaders::Ipv6(h.clone(), e.clone());
assert_eq!(s.header_len(), h.header_len() + e.header_len());
}
}
#[test]
fn from() {
{
let h: Ipv4Header = Default::default();
let e: Ipv4Extensions = Default::default();
let s = IpHeaders::Ipv4(h.clone(), e.clone());
let a: NetHeaders = s.clone().into();
assert_eq!(a, NetHeaders::Ipv4(h.clone(), e.clone()));
}
{
let h: Ipv6Header = Default::default();
let e: Ipv6Extensions = Default::default();
let s = IpHeaders::Ipv6(h.clone(), e.clone());
let a: NetHeaders = s.clone().into();
assert_eq!(a, NetHeaders::Ipv6(h.clone(), e.clone()));
}
}
}