renet/src/phy/tap_interface.rs

43 lines
1.2 KiB
Rust
Raw Normal View History

2016-12-11 07:15:26 +08:00
use std::{vec, io};
use super::{sys, Device};
/// A virtual Ethernet interface.
#[derive(Debug)]
pub struct TapInterface {
lower: sys::TapInterfaceDesc,
buffer: vec::Vec<u8>
}
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());
let mut buffer = vec::Vec::new();
buffer.resize(Self::MTU, 0);
Ok(TapInterface {
lower: lower,
buffer: buffer
})
}
}
impl Device for TapInterface {
const MTU: usize = 1536;
fn recv<F: FnOnce(&[u8])>(&mut self, handler: F) {
let len = self.lower.recv(&mut self.buffer[..]).unwrap();
handler(&self.buffer[..len])
}
fn send<F: FnOnce(&mut [u8])>(&mut self, len: usize, handler: F) {
handler(&mut self.buffer[..len]);
self.lower.send(&self.buffer[..len]).unwrap();
}
}