renet/src/phy/tap_interface.rs

53 lines
1.6 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};
/// 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
}
}