fragmentation.rs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. #![allow(unused)]
  2. use managed::{ManagedMap, ManagedSlice};
  3. use crate::storage::Assembler;
  4. use crate::time::Instant;
  5. use crate::Error;
  6. use crate::Result;
  7. pub trait PacketAssemblerInfo: PartialEq {
  8. /// Calculate a new offset based on some other information.
  9. fn calc_offset(&self, offset: usize) -> usize;
  10. }
  11. #[derive(Debug, PartialEq)]
  12. pub struct NoInfo;
  13. impl PacketAssemblerInfo for NoInfo {
  14. #[inline]
  15. fn calc_offset(&self, offset: usize) -> usize {
  16. offset
  17. }
  18. }
  19. /// Holds different fragments of one packet, used for assembling fragmented packets.
  20. #[derive(Debug)]
  21. #[cfg_attr(feature = "defmt", derive(defmt::Format))]
  22. pub struct PacketAssembler<'a, Info: PacketAssemblerInfo = NoInfo> {
  23. buffer: ManagedSlice<'a, u8>,
  24. assembler: AssemblerState<Info>,
  25. }
  26. /// Holds the state of the assembling of one packet.
  27. #[derive(Debug, PartialEq)]
  28. #[cfg_attr(feature = "defmt", derive(defmt::Format))]
  29. enum AssemblerState<Info: PacketAssemblerInfo = NoInfo> {
  30. NotInit,
  31. Assembling {
  32. assembler: Assembler,
  33. total_size: usize,
  34. info: Info,
  35. last_updated: Instant,
  36. started_on: Instant,
  37. },
  38. }
  39. impl<'a, Info: PacketAssemblerInfo> PacketAssembler<'a, Info> {
  40. /// Create a new empty buffer for fragments.
  41. pub fn new<S>(storage: S) -> Self
  42. where
  43. S: Into<ManagedSlice<'a, u8>>,
  44. {
  45. let s = storage.into();
  46. PacketAssembler {
  47. buffer: s,
  48. assembler: AssemblerState::NotInit,
  49. }
  50. }
  51. /// Start with saving fragments.
  52. /// We initialize the assembler with the total size of the final packet.
  53. ///
  54. /// # Errors
  55. ///
  56. /// - Returns [`Error::PacketAssemblerBufferTooSmall`] when the buffer is too smal for holding all the
  57. /// fragments of a packet.
  58. pub(crate) fn start(
  59. &mut self,
  60. total_size: usize,
  61. info: Info,
  62. start_time: Instant,
  63. ) -> Result<()> {
  64. match &mut self.buffer {
  65. ManagedSlice::Borrowed(b) if b.len() < total_size => {
  66. return Err(Error::PacketAssemblerBufferTooSmall);
  67. }
  68. ManagedSlice::Borrowed(_) => (),
  69. #[cfg(any(feature = "std", feature = "alloc"))]
  70. ManagedSlice::Owned(b) => {
  71. b.resize(total_size, 0);
  72. }
  73. }
  74. self.assembler = AssemblerState::Assembling {
  75. assembler: Assembler::new(total_size),
  76. total_size,
  77. info,
  78. last_updated: start_time,
  79. started_on: start_time,
  80. };
  81. Ok(())
  82. }
  83. /// Add a fragment into the packet that is being reassembled.
  84. ///
  85. /// # Errors
  86. ///
  87. /// - Returns [`Error::PacketAssemblerNotInit`] when the assembler was not initialized (try initializing the
  88. /// assembler with [Self::start]).
  89. /// - Returns [`Error::PacketAssemblerBufferTooSmall`] when trying to add data into the buffer at a non-existing
  90. /// place.
  91. /// - Returns [`Error::PacketAssemblerOverlap`] when there was an overlap when adding data.
  92. pub(crate) fn add(&mut self, data: &[u8], offset: usize, now: Instant) -> Result<bool> {
  93. match self.assembler {
  94. AssemblerState::NotInit => Err(Error::PacketAssemblerNotInit),
  95. AssemblerState::Assembling {
  96. ref mut assembler,
  97. total_size,
  98. ref info,
  99. ref mut last_updated,
  100. ..
  101. } => {
  102. let offset = info.calc_offset(offset);
  103. if offset + data.len() > total_size {
  104. return Err(Error::PacketAssemblerBufferTooSmall);
  105. }
  106. let len = data.len();
  107. self.buffer[offset..][..len].copy_from_slice(data);
  108. match assembler.add(offset, data.len()) {
  109. Ok(false) => {
  110. *last_updated = now;
  111. self.is_complete()
  112. }
  113. Ok(true) => Err(Error::PacketAssemblerOverlap),
  114. // NOTE(thvdveld): hopefully we wont get too many holes errors I guess?
  115. Err(_) => Err(Error::PacketAssemblerTooManyHoles),
  116. }
  117. }
  118. }
  119. }
  120. /// Get an immutable slice of the underlying packet data.
  121. /// This will mark the assembler state as [`AssemblerState::NotInit`] such that it can be reused.
  122. ///
  123. /// # Errors
  124. ///
  125. /// - Returns [`Error::PacketAssemblerNotInit`] when the assembler was not initialized (try initializing the
  126. /// assembler with [`Self::start`]).
  127. /// - Returns [`Error::PacketAssemblerIncomplete`] when not all the fragments have been collected.
  128. pub(crate) fn assemble(&mut self) -> Result<&'_ [u8]> {
  129. let b = match self.assembler {
  130. AssemblerState::NotInit => return Err(Error::PacketAssemblerNotInit),
  131. AssemblerState::Assembling { total_size, .. } => {
  132. if self.is_complete()? {
  133. let a = &self.buffer[..total_size];
  134. self.assembler = AssemblerState::NotInit;
  135. a
  136. } else {
  137. return Err(Error::PacketAssemblerIncomplete);
  138. }
  139. }
  140. };
  141. self.assembler = AssemblerState::NotInit;
  142. Ok(b)
  143. }
  144. /// Returns `true` when all fragments have been received, otherwise `false`.
  145. ///
  146. /// # Errors
  147. ///
  148. /// - Returns [`Error::PacketAssemblerNotInit`] when the assembler was not initialized (try initializing the
  149. /// assembler with [`Self::start`]).
  150. pub(crate) fn is_complete(&self) -> Result<bool> {
  151. match &self.assembler {
  152. AssemblerState::NotInit => Err(Error::PacketAssemblerNotInit),
  153. AssemblerState::Assembling {
  154. assembler,
  155. total_size,
  156. ..
  157. } => {
  158. if let Some(front) = assembler.peek_front() {
  159. Ok(front == *total_size)
  160. } else {
  161. Ok(false)
  162. }
  163. }
  164. }
  165. }
  166. /// Returns `true` when the packet assembler is free to use.
  167. fn is_free(&self) -> bool {
  168. self.assembler == AssemblerState::NotInit
  169. }
  170. /// Returns the [`Instant`] when the packet assembler was started.
  171. ///
  172. /// # Errors
  173. ///
  174. /// - Returns [`Error::PacketAssemblerNotInit`] when the packet assembler was not initialized.
  175. pub fn start_time(&self) -> Result<Instant> {
  176. match self.assembler {
  177. AssemblerState::NotInit => Err(Error::PacketAssemblerNotInit),
  178. AssemblerState::Assembling { started_on, .. } => Ok(started_on),
  179. }
  180. }
  181. /// Returns the [`Instant`] when the packet assembler was last updated.
  182. ///
  183. /// # Errors
  184. ///
  185. /// - Returns [`Error::PacketAssemblerNotInit`] when the packet assembler was not initialized.
  186. pub fn last_update_time(&self) -> Result<Instant> {
  187. match self.assembler {
  188. AssemblerState::NotInit => Err(Error::PacketAssemblerNotInit),
  189. AssemblerState::Assembling { last_updated, .. } => Ok(last_updated),
  190. }
  191. }
  192. /// Mark this assembler as [`AssemblerState::NotInit`].
  193. /// This is then cleaned up by the [`PacketAssemblerSet`].
  194. pub fn mark_discarded(&mut self) {
  195. self.assembler = AssemblerState::NotInit;
  196. }
  197. }
  198. /// Set holding multiple [`PacketAssembler`].
  199. #[derive(Debug)]
  200. #[cfg_attr(feature = "defmt", derive(defmt::Format))]
  201. pub struct PacketAssemblerSet<'a, Key: Eq + Ord + Clone + Copy, Info: PacketAssemblerInfo> {
  202. packet_buffer: ManagedSlice<'a, PacketAssembler<'a, Info>>,
  203. index_buffer: ManagedMap<'a, Key, u8>,
  204. }
  205. impl<'a, K: Eq + Ord + Clone + Copy, Info: PacketAssemblerInfo> PacketAssemblerSet<'a, K, Info> {
  206. /// Create a new set of packet assemblers.
  207. ///
  208. /// # Panics
  209. ///
  210. /// This will panic when:
  211. /// - The packet buffer and index buffer don't have the same size or are empty (when they are
  212. /// both borrowed).
  213. /// - The packet buffer is empty (when only the packet buffer is borrowed).
  214. /// - The index buffer is empty (when only the index buffer is borrowed).
  215. pub fn new<FB, IB>(packet_buffer: FB, index_buffer: IB) -> Self
  216. where
  217. FB: Into<ManagedSlice<'a, PacketAssembler<'a, Info>>>,
  218. IB: Into<ManagedMap<'a, K, u8>>,
  219. {
  220. let packet_buffer = packet_buffer.into();
  221. let index_buffer = index_buffer.into();
  222. match (&packet_buffer, &index_buffer) {
  223. (ManagedSlice::Borrowed(f), ManagedMap::Borrowed(i)) => {
  224. if f.len() != i.len() {
  225. panic!("The amount of places in the index buffer must be the same as the amount of possible fragments assemblers.");
  226. }
  227. }
  228. #[cfg(any(feature = "std", feature = "alloc"))]
  229. (ManagedSlice::Borrowed(f), ManagedMap::Owned(_)) => {
  230. if f.is_empty() {
  231. panic!("The packet buffer cannot be empty.");
  232. }
  233. }
  234. #[cfg(any(feature = "std", feature = "alloc"))]
  235. (ManagedSlice::Owned(_), ManagedMap::Borrowed(i)) => {
  236. if i.is_empty() {
  237. panic!("The index buffer cannot be empty.");
  238. }
  239. }
  240. #[cfg(any(feature = "std", feature = "alloc"))]
  241. (ManagedSlice::Owned(_), ManagedMap::Owned(_)) => (),
  242. }
  243. Self {
  244. packet_buffer,
  245. index_buffer,
  246. }
  247. }
  248. /// Reserve a [`PacketAssembler`], which is linked to a specific key.
  249. /// Returns the reserved fragments assembler.
  250. ///
  251. /// # Errors
  252. ///
  253. /// - Returns [`Error::PacketAssemblerSetFull`] when every [`PacketAssembler`] in the buffer is used (only
  254. /// when the non allocating version of is used).
  255. pub(crate) fn reserve_with_key(&mut self, key: &K) -> Result<&mut PacketAssembler<'a, Info>> {
  256. if self.packet_buffer.len() == self.index_buffer.len() {
  257. match &mut self.packet_buffer {
  258. ManagedSlice::Borrowed(_) => return Err(Error::PacketAssemblerSetFull),
  259. #[cfg(any(feature = "std", feature = "alloc"))]
  260. ManagedSlice::Owned(b) => {
  261. b.resize_with(self.index_buffer.len() + 1, || {
  262. PacketAssembler::new(Vec::new())
  263. });
  264. }
  265. }
  266. }
  267. let i = self
  268. .get_free_packet_assembler()
  269. .ok_or(Error::PacketAssemblerSetFull)?;
  270. // NOTE(thvdveld): this should not fail because we already checked the available space.
  271. match self.index_buffer.insert(*key, i as u8) {
  272. Ok(_) => Ok(&mut self.packet_buffer[i]),
  273. Err(_) => unreachable!(),
  274. }
  275. }
  276. /// Return the first free packet assembler available from the cache.
  277. fn get_free_packet_assembler(&self) -> Option<usize> {
  278. self.packet_buffer
  279. .iter()
  280. .enumerate()
  281. .find(|(_, b)| b.is_free())
  282. .map(|(i, _)| i)
  283. }
  284. /// Return a mutable slice to a packet assembler.
  285. ///
  286. /// # Errors
  287. ///
  288. /// - Returns [`Error::PacketAssemblerSetKeyNotFound`] when the key was not found in the set.
  289. pub(crate) fn get_packet_assembler_mut(
  290. &mut self,
  291. key: &K,
  292. ) -> Result<&mut PacketAssembler<'a, Info>> {
  293. if let Some(i) = self.index_buffer.get(key) {
  294. Ok(&mut self.packet_buffer[*i as usize])
  295. } else {
  296. Err(Error::PacketAssemblerSetKeyNotFound)
  297. }
  298. }
  299. /// Return the assembled packet from a packet assembler.
  300. /// This also removes it from the set.
  301. ///
  302. /// # Errors
  303. ///
  304. /// - Returns [`Error::PacketAssemblerSetKeyNotFound`] when the `key` was not found.
  305. /// - Returns [`Error::PacketAssemblerIncomplete`] when the fragments assembler was empty or not fully assembled.
  306. pub(crate) fn get_assembled_packet(&mut self, key: &K) -> Result<&[u8]> {
  307. if let Some(i) = self.index_buffer.get(key) {
  308. let p = self.packet_buffer[*i as usize].assemble()?;
  309. self.index_buffer.remove(key);
  310. Ok(p)
  311. } else {
  312. Err(Error::PacketAssemblerSetKeyNotFound)
  313. }
  314. }
  315. /// Remove all [`PacketAssembler`]s that are marked as discared.
  316. pub fn remove_discarded(&mut self) {
  317. loop {
  318. let mut key = None;
  319. for (k, i) in self.index_buffer.iter() {
  320. if self.packet_buffer[*i as usize].assembler == AssemblerState::NotInit {
  321. key = Some(*k);
  322. break;
  323. }
  324. }
  325. if let Some(k) = key {
  326. self.index_buffer.remove(&k);
  327. } else {
  328. break;
  329. }
  330. }
  331. }
  332. /// Remove all [`PacketAssembler`]s for which `f` returns `Ok(true)`.
  333. pub fn remove_when(
  334. &mut self,
  335. f: impl Fn(&mut PacketAssembler<'_, Info>) -> Result<bool>,
  336. ) -> Result<()> {
  337. for (_, i) in &mut self.index_buffer.iter() {
  338. let frag = &mut self.packet_buffer[*i as usize];
  339. if f(frag)? {
  340. frag.mark_discarded();
  341. }
  342. }
  343. self.remove_discarded();
  344. Ok(())
  345. }
  346. }
  347. #[cfg(feature = "proto-sixlowpan")]
  348. pub mod sixlowpan {
  349. #[derive(Debug, PartialEq)]
  350. pub struct SixlowpanAssemblerInfo {
  351. header_size: usize,
  352. }
  353. impl SixlowpanAssemblerInfo {
  354. pub fn new(header_size: usize) -> Self {
  355. SixlowpanAssemblerInfo { header_size }
  356. }
  357. }
  358. impl super::PacketAssemblerInfo for SixlowpanAssemblerInfo {
  359. #[inline]
  360. fn calc_offset(&self, offset: usize) -> usize {
  361. match offset {
  362. 0 => 0,
  363. offset => offset - self.header_size,
  364. }
  365. }
  366. }
  367. }
  368. #[cfg(test)]
  369. mod tests {
  370. use super::*;
  371. #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
  372. struct Key {
  373. id: usize,
  374. }
  375. #[test]
  376. fn packet_assembler_not_init() {
  377. let mut p_assembler = PacketAssembler::<NoInfo>::new(vec![]);
  378. let data = b"Hello World!";
  379. assert_eq!(
  380. p_assembler.add(&data[..], data.len(), Instant::now()),
  381. Err(Error::PacketAssemblerNotInit)
  382. );
  383. assert_eq!(
  384. p_assembler.is_complete(),
  385. Err(Error::PacketAssemblerNotInit)
  386. );
  387. assert_eq!(p_assembler.assemble(), Err(Error::PacketAssemblerNotInit));
  388. }
  389. #[test]
  390. fn packet_assembler_buffer_too_small() {
  391. let mut storage = [0u8; 1];
  392. let mut p_assembler = PacketAssembler::<NoInfo>::new(&mut storage[..]);
  393. assert_eq!(
  394. p_assembler.start(2, NoInfo, Instant::now()),
  395. Err(Error::PacketAssemblerBufferTooSmall)
  396. );
  397. assert_eq!(p_assembler.start(1, NoInfo, Instant::now()), Ok(()));
  398. let data = b"Hello World!";
  399. assert_eq!(
  400. p_assembler.add(&data[..], data.len(), Instant::now()),
  401. Err(Error::PacketAssemblerBufferTooSmall)
  402. );
  403. }
  404. #[test]
  405. fn packet_assembler_overlap() {
  406. let mut storage = [0u8; 5];
  407. let mut p_assembler = PacketAssembler::new(&mut storage[..]);
  408. p_assembler.start(5, NoInfo, Instant::now()).unwrap();
  409. let data = b"Rust";
  410. p_assembler.add(&data[..], 0, Instant::now()).unwrap();
  411. assert_eq!(
  412. p_assembler.add(&data[..], 1, Instant::now()),
  413. Err(Error::PacketAssemblerOverlap),
  414. );
  415. }
  416. #[test]
  417. fn packet_assembler_assemble() {
  418. let mut storage = [0u8; 12];
  419. let mut p_assembler = PacketAssembler::new(&mut storage[..]);
  420. let data = b"Hello World!";
  421. p_assembler
  422. .start(data.len(), NoInfo, Instant::now())
  423. .unwrap();
  424. p_assembler.add(b"Hello ", 0, Instant::now()).unwrap();
  425. assert_eq!(
  426. p_assembler.assemble(),
  427. Err(Error::PacketAssemblerIncomplete)
  428. );
  429. p_assembler
  430. .add(b"World!", b"Hello ".len(), Instant::now())
  431. .unwrap();
  432. assert_eq!(p_assembler.assemble(), Ok(&b"Hello World!"[..]));
  433. }
  434. #[test]
  435. fn packet_assembler_set() {
  436. let key = Key { id: 1 };
  437. let mut set =
  438. PacketAssemblerSet::<'_, _, NoInfo>::new(vec![], std::collections::BTreeMap::new());
  439. if let Err(e) = set.get_packet_assembler_mut(&key) {
  440. assert_eq!(e, Error::PacketAssemblerSetKeyNotFound);
  441. }
  442. assert!(set.reserve_with_key(&key).is_ok());
  443. }
  444. #[test]
  445. fn packet_assembler_set_borrowed() {
  446. let mut buf = [0u8, 127];
  447. let mut packet_assembler_cache = [PacketAssembler::<'_, NoInfo>::new(&mut buf[..])];
  448. let mut packet_index_cache = [None];
  449. let key = Key { id: 1 };
  450. let mut set =
  451. PacketAssemblerSet::new(&mut packet_assembler_cache[..], &mut packet_index_cache[..]);
  452. if let Err(e) = set.get_packet_assembler_mut(&key) {
  453. assert_eq!(e, Error::PacketAssemblerSetKeyNotFound);
  454. }
  455. assert!(set.reserve_with_key(&key).is_ok());
  456. }
  457. #[test]
  458. fn packet_assembler_set_assembling_many() {
  459. let mut buf = [0u8, 127];
  460. let mut packet_assembler_cache = [PacketAssembler::new(&mut buf[..])];
  461. let mut packet_index_cache = [None];
  462. let mut set =
  463. PacketAssemblerSet::new(&mut packet_assembler_cache[..], &mut packet_index_cache[..]);
  464. let key = Key { id: 0 };
  465. set.reserve_with_key(&key).unwrap();
  466. set.get_packet_assembler_mut(&key)
  467. .unwrap()
  468. .start(0, NoInfo, Instant::now())
  469. .unwrap();
  470. set.get_assembled_packet(&key).unwrap();
  471. let key = Key { id: 1 };
  472. set.reserve_with_key(&key).unwrap();
  473. set.get_packet_assembler_mut(&key)
  474. .unwrap()
  475. .start(0, NoInfo, Instant::now())
  476. .unwrap();
  477. set.get_assembled_packet(&key).unwrap();
  478. let key = Key { id: 2 };
  479. set.reserve_with_key(&key).unwrap();
  480. set.get_packet_assembler_mut(&key)
  481. .unwrap()
  482. .start(0, NoInfo, Instant::now())
  483. .unwrap();
  484. set.get_assembled_packet(&key).unwrap();
  485. }
  486. }