2016-12-12 15:19:53 +08:00
|
|
|
use std::cell::RefCell;
|
|
|
|
use std::vec::Vec;
|
2016-12-12 20:30:35 +08:00
|
|
|
use std::rc::Rc;
|
2016-12-12 15:19:53 +08:00
|
|
|
use std::io;
|
2016-12-12 20:30:35 +08:00
|
|
|
|
|
|
|
use Error;
|
2017-03-07 18:56:48 +08:00
|
|
|
use super::{sys, DeviceLimits, Device};
|
2016-12-11 00:25:43 +08:00
|
|
|
|
2016-12-11 07:15:26 +08:00
|
|
|
/// A socket that captures or transmits the complete frame.
|
2016-12-11 00:25:43 +08:00
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct RawSocket {
|
2016-12-12 20:30:35 +08:00
|
|
|
lower: Rc<RefCell<sys::RawSocketDesc>>,
|
|
|
|
mtu: usize
|
2016-12-11 00:25:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl RawSocket {
|
2016-12-11 07:15:26 +08:00
|
|
|
/// Creates a raw socket, bound to the interface called `name`.
|
|
|
|
///
|
|
|
|
/// This requires superuser privileges or a corresponding capability bit
|
|
|
|
/// set on the executable.
|
2016-12-11 00:25:43 +08:00
|
|
|
pub fn new(name: &str) -> io::Result<RawSocket> {
|
2017-06-25 00:34:32 +08:00
|
|
|
let mut lower = sys::RawSocketDesc::new(name)?;
|
|
|
|
lower.bind_interface()?;
|
|
|
|
let mtu = lower.interface_mtu()?;
|
2016-12-11 07:15:26 +08:00
|
|
|
Ok(RawSocket {
|
2016-12-12 20:30:35 +08:00
|
|
|
lower: Rc::new(RefCell::new(lower)),
|
|
|
|
mtu: mtu
|
2016-12-11 07:15:26 +08:00
|
|
|
})
|
2016-12-11 00:25:43 +08:00
|
|
|
}
|
2016-12-11 03:27:07 +08:00
|
|
|
}
|
2016-12-11 00:25:43 +08:00
|
|
|
|
2016-12-11 07:15:26 +08:00
|
|
|
impl Device for RawSocket {
|
2016-12-12 20:30:35 +08:00
|
|
|
type RxBuffer = Vec<u8>;
|
|
|
|
type TxBuffer = TxBuffer;
|
|
|
|
|
2017-03-07 18:56:48 +08:00
|
|
|
fn limits(&self) -> DeviceLimits {
|
|
|
|
DeviceLimits {
|
|
|
|
max_transmission_unit: self.mtu,
|
|
|
|
..DeviceLimits::default()
|
|
|
|
}
|
|
|
|
}
|
2016-12-12 20:30:35 +08:00
|
|
|
|
2017-07-23 17:44:54 +08:00
|
|
|
fn receive(&mut self, _timestamp: u64) -> Result<Self::RxBuffer, Error> {
|
2016-12-12 15:19:53 +08:00
|
|
|
let mut lower = self.lower.borrow_mut();
|
2016-12-12 20:30:35 +08:00
|
|
|
let mut buffer = vec![0; self.mtu];
|
2016-12-20 07:50:04 +08:00
|
|
|
let size = lower.recv(&mut buffer[..]).unwrap();
|
|
|
|
buffer.resize(size, 0);
|
2016-12-12 20:30:35 +08:00
|
|
|
Ok(buffer)
|
2016-12-12 15:19:53 +08:00
|
|
|
}
|
2016-12-11 03:27:07 +08:00
|
|
|
|
2017-07-23 17:44:54 +08:00
|
|
|
fn transmit(&mut self, _timestamp: u64, length: usize) -> Result<Self::TxBuffer, Error> {
|
2016-12-12 20:30:35 +08:00
|
|
|
Ok(TxBuffer {
|
|
|
|
lower: self.lower.clone(),
|
2016-12-31 09:10:46 +08:00
|
|
|
buffer: vec![0; length]
|
2016-12-12 20:30:35 +08:00
|
|
|
})
|
2016-12-11 00:25:43 +08:00
|
|
|
}
|
2016-12-12 20:30:35 +08:00
|
|
|
}
|
2016-12-11 00:25:43 +08:00
|
|
|
|
2016-12-12 20:30:35 +08:00
|
|
|
#[doc(hidden)]
|
|
|
|
pub struct TxBuffer {
|
|
|
|
lower: Rc<RefCell<sys::RawSocketDesc>>,
|
|
|
|
buffer: Vec<u8>
|
|
|
|
}
|
|
|
|
|
|
|
|
impl AsRef<[u8]> for TxBuffer {
|
|
|
|
fn as_ref(&self) -> &[u8] { self.buffer.as_ref() }
|
|
|
|
}
|
|
|
|
|
|
|
|
impl AsMut<[u8]> for TxBuffer {
|
|
|
|
fn as_mut(&mut self) -> &mut [u8] { self.buffer.as_mut() }
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Drop for TxBuffer {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
let mut lower = self.lower.borrow_mut();
|
|
|
|
lower.send(&mut self.buffer[..]).unwrap();
|
2016-12-11 00:25:43 +08:00
|
|
|
}
|
|
|
|
}
|