raw_socket.rs 2.1 KB

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