Bläddra i källkod

sixlowpan: make address context owned.

Dario Nieuwenhuis 2 år sedan
förälder
incheckning
bc7fe74d55
4 ändrade filer med 16 tillägg och 27 borttagningar
  1. 8 6
      src/iface/interface/mod.rs
  2. 1 1
      src/iface/interface/sixlowpan.rs
  3. 1 1
      src/iface/interface/tests.rs
  4. 6 19
      src/wire/sixlowpan.rs

+ 8 - 6
src/iface/interface/mod.rs

@@ -41,6 +41,8 @@ const MAX_IP_ADDR_COUNT: usize = 5;
 #[cfg(feature = "proto-igmp")]
 const MAX_IPV4_MULTICAST_GROUPS: usize = 4;
 const FRAGMENTATION_BUFFER_SIZE: usize = 1500;
+#[cfg(feature = "proto-sixlowpan")]
+const SIXLOWPAN_ADDRESS_CONTEXT_COUNT: usize = 4;
 
 pub(crate) struct FragmentsBuffer {
     #[cfg(feature = "proto-sixlowpan")]
@@ -271,7 +273,7 @@ pub struct InterfaceInner<'a> {
     #[cfg(feature = "proto-ipv4-fragmentation")]
     ipv4_id: u16,
     #[cfg(feature = "proto-sixlowpan")]
-    sixlowpan_address_context: &'a [SixlowpanAddressContext<'a>],
+    sixlowpan_address_context: Vec<SixlowpanAddressContext, SIXLOWPAN_ADDRESS_CONTEXT_COUNT>,
     #[cfg(feature = "proto-sixlowpan-fragmentation")]
     tag: u16,
     ip_addrs: Vec<IpCidr, MAX_IP_ADDR_COUNT>,
@@ -308,7 +310,7 @@ pub struct InterfaceBuilder<'a> {
     sixlowpan_reassembly_buffer_timeout: Duration,
 
     #[cfg(feature = "proto-sixlowpan")]
-    sixlowpan_address_context: &'a [SixlowpanAddressContext<'a>],
+    sixlowpan_address_context: Vec<SixlowpanAddressContext, SIXLOWPAN_ADDRESS_CONTEXT_COUNT>,
 }
 
 impl<'a> InterfaceBuilder<'a> {
@@ -369,7 +371,7 @@ let iface = builder.finalize(&mut device);
             sixlowpan_reassembly_buffer_timeout: Duration::from_secs(60),
 
             #[cfg(feature = "proto-sixlowpan")]
-            sixlowpan_address_context: &[],
+            sixlowpan_address_context: Vec::new(),
         }
     }
 
@@ -485,7 +487,7 @@ let iface = builder.finalize(&mut device);
     #[cfg(feature = "proto-sixlowpan")]
     pub fn sixlowpan_address_context(
         mut self,
-        sixlowpan_address_context: &'a [SixlowpanAddressContext<'a>],
+        sixlowpan_address_context: Vec<SixlowpanAddressContext, SIXLOWPAN_ADDRESS_CONTEXT_COUNT>,
     ) -> Self {
         self.sixlowpan_address_context = sixlowpan_address_context;
         self
@@ -633,7 +635,7 @@ let iface = builder.finalize(&mut device);
                 #[cfg(feature = "proto-ipv4-fragmentation")]
                 ipv4_id,
                 #[cfg(feature = "proto-sixlowpan")]
-                sixlowpan_address_context: &[],
+                sixlowpan_address_context: Vec::new(),
                 rand,
             },
         }
@@ -1353,7 +1355,7 @@ impl<'a> InterfaceInner<'a> {
             tag: 1,
 
             #[cfg(feature = "proto-sixlowpan")]
-            sixlowpan_address_context: &[],
+            sixlowpan_address_context: Vec::new(),
 
             #[cfg(feature = "proto-ipv4-fragmentation")]
             ipv4_id: 1,

+ 1 - 1
src/iface/interface/sixlowpan.rs

@@ -178,7 +178,7 @@ impl<'a> InterfaceInner<'a> {
             &iphc,
             ieee802154_repr.src_addr,
             ieee802154_repr.dst_addr,
-            self.sixlowpan_address_context,
+            &self.sixlowpan_address_context,
         )?;
 
         let mut decompressed_size = 40 + iphc.payload().len();

+ 1 - 1
src/iface/interface/tests.rs

@@ -1455,7 +1455,7 @@ fn test_echo_request_sixlowpan_128_bytes() {
         &request_first_part_iphc_packet,
         ieee802154_repr.src_addr,
         ieee802154_repr.dst_addr,
-        iface.inner.sixlowpan_address_context,
+        &iface.inner.sixlowpan_address_context,
     )
     .unwrap();
 

+ 6 - 19
src/wire/sixlowpan.rs

@@ -2,24 +2,17 @@
 //! IEEE802.154-based networks.
 //!
 //! [RFC 6282]: https://datatracker.ietf.org/doc/html/rfc6282
-use core::ops::Deref;
 
 use super::{Error, Result};
 use crate::wire::ieee802154::Address as LlAddress;
 use crate::wire::ipv6;
 use crate::wire::IpProtocol;
 
+const ADDRESS_CONTEXT_LENGTH: usize = 8;
+
 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
 #[cfg_attr(feature = "defmt", derive(defmt::Format))]
-pub struct AddressContext<'a>(pub &'a [u8]);
-
-impl<'a> Deref for AddressContext<'a> {
-    type Target = [u8];
-
-    fn deref(&self) -> &Self::Target {
-        self.0
-    }
-}
+pub struct AddressContext(pub [u8; ADDRESS_CONTEXT_LENGTH]);
 
 /// The representation of an unresolved address. 6LoWPAN compression of IPv6 addresses can be with
 /// and without context information. The decompression with context information is not yet
@@ -68,7 +61,7 @@ impl<'a> UnresolvedAddress<'a> {
     pub fn resolve(
         self,
         ll_address: Option<LlAddress>,
-        addr_context: &[AddressContext<'_>],
+        addr_context: &[AddressContext],
     ) -> Result<ipv6::Address> {
         let mut bytes = [0; 16];
 
@@ -78,13 +71,7 @@ impl<'a> UnresolvedAddress<'a> {
             }
 
             let context = addr_context[index];
-            let len = context.len();
-
-            if len > 8 {
-                return Err(Error);
-            }
-
-            bytes[..len].copy_from_slice(&context);
+            bytes[..ADDRESS_CONTEXT_LENGTH].copy_from_slice(&context.0);
 
             Ok(())
         };
@@ -1181,7 +1168,7 @@ pub mod iphc {
             packet: &Packet<&T>,
             ll_src_addr: Option<LlAddress>,
             ll_dst_addr: Option<LlAddress>,
-            addr_context: &[AddressContext<'_>],
+            addr_context: &[AddressContext],
         ) -> Result<Self> {
             // Ensure basic accessors will work.
             packet.check_len()?;