renet/src/phy/raw_socket.rs

42 lines
1.1 KiB
Rust
Raw Normal View History

2016-12-11 07:15:26 +08:00
use std::{vec, io};
use super::{sys, Device};
2016-12-11 07:15:26 +08:00
/// A socket that captures or transmits the complete frame.
#[derive(Debug)]
pub struct RawSocket {
2016-12-11 07:15:26 +08:00
lower: sys::RawSocketDesc,
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.
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 07:15:26 +08:00
impl Device for RawSocket {
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 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();
}
}