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};
|
|
|
|
|
|
|
|
/// A virtual Ethernet interface.
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct TapInterface {
|
2016-12-12 15:19:53 +08:00
|
|
|
lower: RefCell<sys::TapInterfaceDesc>,
|
|
|
|
buffer: RefCell<Vec<u8>>
|
2016-12-11 07:15:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl TapInterface {
|
|
|
|
/// Attaches to a TAP interface called `name`, or creates it if it does not exist.
|
|
|
|
///
|
|
|
|
/// If `name` is a persistent interface configured with UID of the current user,
|
|
|
|
/// no special privileges are needed. Otherwise, this requires superuser privileges
|
|
|
|
/// or a corresponding capability set on the executable.
|
|
|
|
pub fn new(name: &str) -> io::Result<TapInterface> {
|
|
|
|
let mut lower = try!(sys::TapInterfaceDesc::new(name));
|
|
|
|
try!(lower.attach_interface());
|
|
|
|
|
2016-12-12 15:19:53 +08:00
|
|
|
let mut buffer = Vec::new();
|
|
|
|
buffer.resize(1536, 0);
|
2016-12-11 07:15:26 +08:00
|
|
|
Ok(TapInterface {
|
2016-12-12 15:19:53 +08:00
|
|
|
lower: RefCell::new(lower),
|
|
|
|
buffer: RefCell::new(buffer)
|
2016-12-11 07:15:26 +08:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Device for TapInterface {
|
2016-12-12 15:19:53 +08:00
|
|
|
fn mtu(&self) -> usize {
|
|
|
|
let buffer = self.buffer.borrow();
|
|
|
|
buffer.len()
|
|
|
|
}
|
2016-12-11 07:15:26 +08:00
|
|
|
|
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-11 07:15:26 +08:00
|
|
|
}
|
|
|
|
|
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
|
2016-12-11 07:15:26 +08:00
|
|
|
}
|
|
|
|
}
|