1 /// Error when decoding the IPv4 part of a message. 2 #[derive(Clone, Debug, Eq, PartialEq, Hash)] 3 pub enum HeaderError { 4 /// Error when the IPv4 header version field is not equal to 4. 5 UnexpectedVersion { 6 /// The unexpected version number in the IPv4 header. 7 version_number: u8, 8 }, 9 10 /// Error when the ipv4 internet header length is smaller then the header itself (5). 11 HeaderLengthSmallerThanHeader { 12 /// The internet header length that was too small. 13 ihl: u8, 14 }, 15 } 16 17 impl core::fmt::Display for HeaderError { fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result18 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 19 use HeaderError::*; 20 match self { 21 UnexpectedVersion { version_number } => write!(f, "IPv4 Header Error: Encountered '{}' as IP version number in the IPv4 header (must be '4' in an IPv4 header).", version_number), 22 HeaderLengthSmallerThanHeader { ihl } => write!(f, "IPv4 Header Error: The 'internet header length' value '{}' present in the IPv4 header is smaller than the minimum size of an IPv4 header. The minimum allowed value is '5'.", ihl), 23 } 24 } 25 } 26 27 #[cfg(feature = "std")] 28 #[cfg_attr(docsrs, doc(cfg(feature = "std")))] 29 impl std::error::Error for HeaderError { source(&self) -> Option<&(dyn std::error::Error + 'static)>30 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { 31 None 32 } 33 } 34 35 #[cfg(test)] 36 mod tests { 37 use super::{HeaderError::*, *}; 38 use alloc::format; 39 use std::{ 40 collections::hash_map::DefaultHasher, 41 error::Error, 42 hash::{Hash, Hasher}, 43 }; 44 45 #[test] debug()46 fn debug() { 47 assert_eq!( 48 "UnexpectedVersion { version_number: 6 }", 49 format!("{:?}", UnexpectedVersion { version_number: 6 }) 50 ); 51 } 52 53 #[test] clone_eq_hash()54 fn clone_eq_hash() { 55 let err = HeaderError::UnexpectedVersion { version_number: 6 }; 56 assert_eq!(err, err.clone()); 57 let hash_a = { 58 let mut hasher = DefaultHasher::new(); 59 err.hash(&mut hasher); 60 hasher.finish() 61 }; 62 let hash_b = { 63 let mut hasher = DefaultHasher::new(); 64 err.clone().hash(&mut hasher); 65 hasher.finish() 66 }; 67 assert_eq!(hash_a, hash_b); 68 } 69 70 #[test] fmt()71 fn fmt() { 72 assert_eq!( 73 "IPv4 Header Error: Encountered '1' as IP version number in the IPv4 header (must be '4' in an IPv4 header).", 74 format!("{}", UnexpectedVersion{ version_number: 1 }) 75 ); 76 assert_eq!( 77 "IPv4 Header Error: The 'internet header length' value '2' present in the IPv4 header is smaller than the minimum size of an IPv4 header. The minimum allowed value is '5'.", 78 format!("{}", HeaderLengthSmallerThanHeader{ ihl: 2 }) 79 ); 80 } 81 82 #[cfg(feature = "std")] 83 #[test] source()84 fn source() { 85 let values = [ 86 UnexpectedVersion { version_number: 0 }, 87 HeaderLengthSmallerThanHeader { ihl: 0 }, 88 ]; 89 for v in values { 90 assert!(v.source().is_none()); 91 } 92 } 93 } 94