raw_socket.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. use std::cell::RefCell;
  2. use std::vec::Vec;
  3. use std::rc::Rc;
  4. use std::io;
  5. use {Error, Result};
  6. use super::{sys, DeviceLimits, Device};
  7. /// A socket that captures or transmits the complete frame.
  8. #[derive(Debug)]
  9. pub struct RawSocket {
  10. lower: Rc<RefCell<sys::RawSocketDesc>>,
  11. mtu: usize
  12. }
  13. impl RawSocket {
  14. /// Creates a raw socket, bound to the interface called `name`.
  15. ///
  16. /// This requires superuser privileges or a corresponding capability bit
  17. /// set on the executable.
  18. pub fn new(name: &str) -> io::Result<RawSocket> {
  19. let mut lower = sys::RawSocketDesc::new(name)?;
  20. lower.bind_interface()?;
  21. let mtu = lower.interface_mtu()?;
  22. Ok(RawSocket {
  23. lower: Rc::new(RefCell::new(lower)),
  24. mtu: mtu
  25. })
  26. }
  27. }
  28. impl Device for RawSocket {
  29. type RxBuffer = Vec<u8>;
  30. type TxBuffer = TxBuffer;
  31. fn limits(&self) -> DeviceLimits {
  32. DeviceLimits {
  33. max_transmission_unit: self.mtu,
  34. ..DeviceLimits::default()
  35. }
  36. }
  37. fn receive(&mut self, _timestamp: u64) -> Result<Self::RxBuffer> {
  38. let mut lower = self.lower.borrow_mut();
  39. let mut buffer = vec![0; self.mtu];
  40. let size = lower.recv(&mut buffer[..]).unwrap();
  41. buffer.resize(size, 0);
  42. Ok(buffer)
  43. }
  44. fn transmit(&mut self, _timestamp: u64, length: usize) -> Result<Self::TxBuffer> {
  45. Ok(TxBuffer {
  46. lower: self.lower.clone(),
  47. buffer: vec![0; length]
  48. })
  49. }
  50. }
  51. #[doc(hidden)]
  52. pub struct TxBuffer {
  53. lower: Rc<RefCell<sys::RawSocketDesc>>,
  54. buffer: Vec<u8>
  55. }
  56. impl AsRef<[u8]> for TxBuffer {
  57. fn as_ref(&self) -> &[u8] { self.buffer.as_ref() }
  58. }
  59. impl AsMut<[u8]> for TxBuffer {
  60. fn as_mut(&mut self) -> &mut [u8] { self.buffer.as_mut() }
  61. }
  62. impl Drop for TxBuffer {
  63. fn drop(&mut self) {
  64. let mut lower = self.lower.borrow_mut();
  65. lower.send(&mut self.buffer[..]).unwrap();
  66. }
  67. }