2016-12-11 07:15:26 +08:00
|
|
|
use std::{vec, io};
|
|
|
|
use super::{sys, 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-11 07:15:26 +08:00
|
|
|
lower: sys::RawSocketDesc,
|
2016-12-11 00:25:43 +08:00
|
|
|
buffer: vec::Vec<u8>
|
|
|
|
}
|
|
|
|
|
|
|
|
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> {
|
2016-12-11 07:15:26 +08:00
|
|
|
let mut lower = try!(sys::RawSocketDesc::new(name));
|
|
|
|
try!(lower.bind_interface());
|
|
|
|
|
|
|
|
let mut buffer = vec::Vec::new();
|
|
|
|
buffer.resize(try!(lower.interface_mtu()), 0);
|
|
|
|
Ok(RawSocket {
|
|
|
|
lower: lower,
|
|
|
|
buffer: buffer
|
|
|
|
})
|
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-11 03:27:07 +08:00
|
|
|
const MTU: usize = 1536;
|
|
|
|
|
|
|
|
fn recv<F: FnOnce(&[u8])>(&mut self, handler: F) {
|
2016-12-11 07:15:26 +08:00
|
|
|
let len = self.lower.recv(&mut self.buffer[..]).unwrap();
|
|
|
|
handler(&self.buffer[..len])
|
2016-12-11 00:25:43 +08:00
|
|
|
}
|
|
|
|
|
2016-12-11 07:15:26 +08:00
|
|
|
fn send<F: FnOnce(&mut [u8])>(&mut self, len: usize, handler: F) {
|
|
|
|
handler(&mut self.buffer[..len]);
|
|
|
|
self.lower.send(&self.buffer[..len]).unwrap();
|
2016-12-11 00:25:43 +08:00
|
|
|
}
|
|
|
|
}
|