renet/src/phy/raw_socket.rs

52 lines
1.5 KiB
Rust
Raw Normal View History

2016-12-12 15:19:53 +08:00
use std::cell::RefCell;
use std::vec::Vec;
use std::io;
2016-12-11 07:15:26 +08:00
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-12 15:19:53 +08:00
lower: RefCell<sys::RawSocketDesc>,
buffer: RefCell<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());
2016-12-12 15:19:53 +08:00
let mut buffer = Vec::new();
2016-12-11 07:15:26 +08:00
buffer.resize(try!(lower.interface_mtu()), 0);
Ok(RawSocket {
2016-12-12 15:19:53 +08:00
lower: RefCell::new(lower),
buffer: RefCell::new(buffer)
2016-12-11 07:15:26 +08:00
})
}
}
2016-12-11 07:15:26 +08:00
impl Device for RawSocket {
2016-12-12 15:19:53 +08:00
fn mtu(&self) -> usize {
let mut lower = self.lower.borrow_mut();
lower.interface_mtu().unwrap()
}
2016-12-12 15:19:53 +08:00
fn recv<R, F: FnOnce(&[u8]) -> R>(&self, handler: F) -> R {
let mut lower = self.lower.borrow_mut();
let mut buffer = self.buffer.borrow_mut();
let len = lower.recv(&mut buffer[..]).unwrap();
handler(&buffer[..len])
}
2016-12-12 15:19:53 +08:00
fn send<R, F: FnOnce(&mut [u8]) -> R>(&self, len: usize, handler: F) -> R {
let mut lower = self.lower.borrow_mut();
let mut buffer = self.buffer.borrow_mut();
let result = handler(&mut buffer[..len]);
lower.send(&buffer[..len]).unwrap();
result
}
}