1use core::fmt;
4
5use crate::error::ParseError;
6
7#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9pub enum Ipv6ExtensionTraversalError {
10 Parse(ParseError),
12 InvalidExtensionHeaderLength {
14 next_header: u8,
16 minimum: usize,
18 actual: usize,
20 },
21 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#[derive(Clone, Copy, Debug, Eq, PartialEq)]
46pub enum Ipv6DispatchError {
47 Traversal(Ipv6ExtensionTraversalError),
49 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}