Skip to main content

net_wire/ipv6/
error.rs

1//! IPv6 extension traversal and upper-layer dispatch errors.
2
3use core::fmt;
4
5use crate::error::ParseError;
6
7/// Failure while traversing IPv6 extension headers.
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9pub enum Ipv6ExtensionTraversalError {
10    /// A shared structural parse failure occurred during traversal.
11    Parse(ParseError),
12    /// An extension header encodes a length below that header's format minimum.
13    InvalidExtensionHeaderLength {
14        /// Next Header value identifying the invalid extension header.
15        next_header: u8,
16        /// Minimum valid extension-header length.
17        minimum: usize,
18        /// Encoded extension-header length.
19        actual: usize,
20    },
21    /// A nonempty IPv6 tail cannot be resolved when the base Payload Length is zero.
22    UnresolvedPayloadLength,
23}
24
25impl fmt::Display for Ipv6ExtensionTraversalError {
26    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
27        match self {
28            Self::Parse(error) => write!(formatter, "IPv6 extension traversal failed: {error}"),
29            Self::InvalidExtensionHeaderLength {
30                next_header,
31                minimum,
32                actual,
33            } => write!(
34                formatter,
35                "invalid IPv6 extension header length for next header {next_header}: minimum {minimum}, got {actual}"
36            ),
37            Self::UnresolvedPayloadLength => {
38                formatter.write_str("IPv6 payload length is unresolved")
39            }
40        }
41    }
42}
43
44/// Failure while dispatching an IPv6 payload to a concrete upper-layer parser.
45#[derive(Clone, Copy, Debug, Eq, PartialEq)]
46pub enum Ipv6DispatchError {
47    /// IPv6 extension-header traversal failed.
48    Traversal(Ipv6ExtensionTraversalError),
49    /// The selected upper-layer parser failed.
50    UpperLayer(ParseError),
51}
52
53impl fmt::Display for Ipv6DispatchError {
54    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
55        match self {
56            Self::Traversal(error) => write!(formatter, "IPv6 dispatch traversal failed: {error}"),
57            Self::UpperLayer(error) => {
58                write!(formatter, "IPv6 upper-layer parsing failed: {error}")
59            }
60        }
61    }
62}