loopback.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. use alloc::collections::VecDeque;
  2. use alloc::vec;
  3. use alloc::vec::Vec;
  4. use crate::phy::{self, ChecksumCapabilities, Device, DeviceCapabilities, Medium};
  5. use crate::time::Instant;
  6. /// A loopback device.
  7. #[derive(Debug)]
  8. pub struct Loopback {
  9. pub(crate) queue: VecDeque<Vec<u8>>,
  10. medium: Medium,
  11. }
  12. #[allow(clippy::new_without_default)]
  13. impl Loopback {
  14. /// Creates a loopback device.
  15. ///
  16. /// Every packet transmitted through this device will be received through it
  17. /// in FIFO order.
  18. pub fn new(medium: Medium) -> Loopback {
  19. Loopback {
  20. queue: VecDeque::new(),
  21. medium,
  22. }
  23. }
  24. }
  25. impl Device for Loopback {
  26. type RxToken<'a> = RxToken;
  27. type TxToken<'a> = TxToken<'a>;
  28. fn capabilities(&self) -> DeviceCapabilities {
  29. DeviceCapabilities {
  30. max_transmission_unit: 65535,
  31. medium: self.medium,
  32. checksum: ChecksumCapabilities::ignored(),
  33. ..DeviceCapabilities::default()
  34. }
  35. }
  36. fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
  37. self.queue.pop_front().map(move |buffer| {
  38. let rx = RxToken { buffer };
  39. let tx = TxToken {
  40. queue: &mut self.queue,
  41. };
  42. (rx, tx)
  43. })
  44. }
  45. fn transmit(&mut self, _timestamp: Instant) -> Option<Self::TxToken<'_>> {
  46. Some(TxToken {
  47. queue: &mut self.queue,
  48. })
  49. }
  50. }
  51. #[doc(hidden)]
  52. pub struct RxToken {
  53. buffer: Vec<u8>,
  54. }
  55. impl phy::RxToken for RxToken {
  56. fn consume<R, F>(self, f: F) -> R
  57. where
  58. F: FnOnce(&[u8]) -> R,
  59. {
  60. f(&self.buffer)
  61. }
  62. }
  63. #[doc(hidden)]
  64. #[derive(Debug)]
  65. pub struct TxToken<'a> {
  66. queue: &'a mut VecDeque<Vec<u8>>,
  67. }
  68. impl<'a> phy::TxToken for TxToken<'a> {
  69. fn consume<R, F>(self, len: usize, f: F) -> R
  70. where
  71. F: FnOnce(&mut [u8]) -> R,
  72. {
  73. let mut buffer = vec![0; len];
  74. let result = f(&mut buffer);
  75. self.queue.push_back(buffer);
  76. result
  77. }
  78. }