Parcourir la source

Fix the ipv6 option structure

The IPv6 Option representation layer structure includes the type value
as the raw u8. This should be stored as the Type enum.

Closes: #229
Approved by: whitequark
Dan Robertson il y a 6 ans
Parent
commit
b3651cc5b8
1 fichiers modifiés avec 9 ajouts et 8 suppressions
  1. 9 8
      src/wire/ipv6option.rs

+ 9 - 8
src/wire/ipv6option.rs

@@ -218,7 +218,7 @@ pub enum Repr<'a> {
     Pad1,
     PadN(u8),
     Unknown {
-        type_:  u8,
+        type_:  Type,
         length: u8,
         data:   &'a [u8]
     },
@@ -235,9 +235,9 @@ impl<'a> Repr<'a> {
                 Ok(Repr::Pad1),
             Type::PadN =>
                 Ok(Repr::PadN(opt.data_len())),
-            Type::Unknown(type_) => {
+            unknown_type @ Type::Unknown(_) => {
                 Ok(Repr::Unknown {
-                    type_:  type_,
+                    type_:  unknown_type,
                     length: opt.data_len(),
                     data:   opt.data(),
                 })
@@ -272,7 +272,7 @@ impl<'a> Repr<'a> {
                 }
             }
             &Repr::Unknown{ type_, length, data } => {
-                opt.set_option_type(Type::Unknown(type_));
+                opt.set_option_type(type_);
                 opt.set_data_len(length);
                 opt.data_mut().copy_from_slice(&data[..length as usize]);
             }
@@ -342,7 +342,7 @@ impl<'a> fmt::Display for Repr<'a> {
             &Repr::PadN(len) =>
                 write!(f, "{} length={} ", Type::PadN, len),
             &Repr::Unknown{ type_, length, .. } =>
-                write!(f, "{} length={} ", Type::Unknown(type_), length),
+                write!(f, "{} length={} ", type_, length),
 
             &Repr::__Nonexhaustive => unreachable!()
         }
@@ -436,7 +436,7 @@ mod test {
         let data = [0u8; 3];
         let opt = Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN);
         let unknown = Repr::parse(&opt).unwrap();
-        assert_eq!(unknown, Repr::Unknown { type_: 255, length: 3, data: &data});
+        assert_eq!(unknown, Repr::Unknown { type_: Type::Unknown(255), length: 3, data: &data});
     }
 
     #[test]
@@ -454,7 +454,7 @@ mod test {
         assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_PADN);
 
         let data = [0u8; 3];
-        let repr = Repr::Unknown { type_: 255, length: 3, data: &data };
+        let repr = Repr::Unknown { type_: Type::Unknown(255), length: 3, data: &data };
         let mut bytes = [254u8; 5]; // don't assume bytes are initialized to zero
         let mut opt = Ipv6Option::new(&mut bytes);
         repr.emit(&mut opt);
@@ -493,7 +493,8 @@ mod test {
                 (2, Ok(Repr::PadN(2))) => continue,
                 (3, Ok(Repr::PadN(0))) => continue,
                 (4, Ok(Repr::Pad1)) => continue,
-                (5, Ok(Repr::Unknown { type_: 0x11, length: 0, .. })) => continue,
+                (5, Ok(Repr::Unknown { type_: Type::Unknown(0x11), length: 0, .. })) =>
+                    continue,
                 (6, Err(Error::Truncated)) => continue,
                 (i, res) => panic!("Unexpected option `{:?}` at index {}", res, i),
             }