Pārlūkot izejas kodu

limit the WIP reassemblies

Thibaut Vandervelden 3 gadi atpakaļ
vecāks
revīzija
6f9dca3ef9
1 mainītis faili ar 10 papildinājumiem un 8 dzēšanām
  1. 10 8
      src/iface/fragmentation.rs

+ 10 - 8
src/iface/fragmentation.rs

@@ -221,7 +221,7 @@ impl<'a, Info: PacketAssemblerInfo> PacketAssembler<'a, Info> {
 #[cfg_attr(feature = "defmt", derive(defmt::Format))]
 pub struct PacketAssemblerSet<'a, Key: Eq + Ord + Clone + Copy, Info: PacketAssemblerInfo> {
     packet_buffer: ManagedSlice<'a, PacketAssembler<'a, Info>>,
-    index_buffer: ManagedMap<'a, Key, u8>,
+    index_buffer: ManagedMap<'a, Key, usize>,
 }
 
 impl<'a, K: Eq + Ord + Clone + Copy, Info: PacketAssemblerInfo> PacketAssemblerSet<'a, K, Info> {
@@ -237,7 +237,7 @@ impl<'a, K: Eq + Ord + Clone + Copy, Info: PacketAssemblerInfo> PacketAssemblerS
     pub fn new<FB, IB>(packet_buffer: FB, index_buffer: IB) -> Self
     where
         FB: Into<ManagedSlice<'a, PacketAssembler<'a, Info>>>,
-        IB: Into<ManagedMap<'a, K, u8>>,
+        IB: Into<ManagedMap<'a, K, usize>>,
     {
         let packet_buffer = packet_buffer.into();
         let index_buffer = index_buffer.into();
@@ -278,15 +278,17 @@ impl<'a, K: Eq + Ord + Clone + Copy, Info: PacketAssemblerInfo> PacketAssemblerS
     /// - Returns [`Error::PacketAssemblerSetFull`] when every [`PacketAssembler`] in the buffer is used (only
     /// when the non allocating version of is used).
     pub(crate) fn reserve_with_key(&mut self, key: &K) -> Result<&mut PacketAssembler<'a, Info>> {
+        // Check how many WIP reassemblies we have.
+        // The limit is currently set to 255.
+        if self.index_buffer.len() == u8::MAX as usize {
+            return Err(Error::PacketAssemblerSetFull);
+        }
+
         if self.packet_buffer.len() == self.index_buffer.len() {
             match &mut self.packet_buffer {
                 ManagedSlice::Borrowed(_) => return Err(Error::PacketAssemblerSetFull),
                 #[cfg(any(feature = "std", feature = "alloc"))]
-                ManagedSlice::Owned(b) => {
-                    b.resize_with(self.index_buffer.len() + 1, || {
-                        PacketAssembler::new(Vec::new())
-                    });
-                }
+                ManagedSlice::Owned(b) => (),
             }
         }
 
@@ -295,7 +297,7 @@ impl<'a, K: Eq + Ord + Clone + Copy, Info: PacketAssemblerInfo> PacketAssemblerS
             .ok_or(Error::PacketAssemblerSetFull)?;
 
         // NOTE(thvdveld): this should not fail because we already checked the available space.
-        match self.index_buffer.insert(*key, i as u8) {
+        match self.index_buffer.insert(*key, i) {
             Ok(_) => Ok(&mut self.packet_buffer[i]),
             Err(_) => unreachable!(),
         }