loopback.rs 2.1 KB

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