TapDev -> TunTapDev

This commit is contained in:
Dennis Schwerdel 2015-11-21 17:06:57 +01:00
parent 8c414f9c23
commit 2fe004c074
6 changed files with 40 additions and 22 deletions

View File

@ -1,5 +1,5 @@
extern crate gcc; extern crate gcc;
fn main() { fn main() {
gcc::Config::new().file("src/c/tapdev.c").include("src").compile("libtapdev.a"); gcc::Config::new().file("src/c/tuntap.c").include("src").compile("libtuntap.a");
} }

View File

@ -1,9 +1,7 @@
default: libtapdev.a default: libtuntap.a
tapdev.o: tapdev.c
gcc -Os -c tapdev.c
libtapdev.a: tapdev.o
ar rcs libtapdev.a tapdev.o
tapdev.o: tuntap.c
gcc -Os -c tuntap.c
libtapdev.a: tuntap.o
ar rcs libtuntap.a tuntap.o

View File

@ -4,12 +4,20 @@
#include <string.h> #include <string.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
int32_t setup_tap_device(int32_t fd, char *ifname) { int32_t setup_device(int32_t fd, char *ifname, int32_t flags) {
struct ifreq ifr; struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr)); memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI; ifr.ifr_flags = flags;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ); strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) return 1; if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) return 1;
strncpy(ifname, ifr.ifr_name, IFNAMSIZ); strncpy(ifname, ifr.ifr_name, IFNAMSIZ);
return 0; return 0;
} }
int32_t setup_tap_device(int32_t fd, char *ifname) {
return setup_device(fd, ifname, IFF_TAP | IFF_NO_PI);
}
int32_t setup_tun_device(int32_t fd, char *ifname) {
return setup_device(fd, ifname, IFF_TUN | IFF_NO_PI);
}

View File

@ -12,7 +12,7 @@ use epoll;
use super::{ethernet, udpmessage}; use super::{ethernet, udpmessage};
use super::udpmessage::{Options, Message}; use super::udpmessage::{Options, Message};
use super::ethernet::MacTable; use super::ethernet::MacTable;
use super::tapdev::TapDevice; use super::tuntap::{TunTapDevice, DeviceType};
#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] #[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
@ -109,7 +109,7 @@ pub struct EthCloud {
reconnect_peers: Vec<SocketAddr>, reconnect_peers: Vec<SocketAddr>,
mactable: MacTable, mactable: MacTable,
socket: UdpSocket, socket: UdpSocket,
tapdev: TapDevice, tapdev: TunTapDevice,
network_id: Option<NetworkId>, network_id: Option<NetworkId>,
next_peerlist: SteadyTime, next_peerlist: SteadyTime,
update_freq: Duration, update_freq: Duration,
@ -123,7 +123,7 @@ impl EthCloud {
Ok(socket) => socket, Ok(socket) => socket,
_ => panic!("Failed to open socket") _ => panic!("Failed to open socket")
}; };
let tapdev = match TapDevice::new(device) { let tapdev = match TunTapDevice::new(device, DeviceType::TapDevice) {
Ok(tapdev) => tapdev, Ok(tapdev) => tapdev,
_ => panic!("Failed to open tap device") _ => panic!("Failed to open tap device")
}; };

View File

@ -6,7 +6,7 @@ extern crate epoll;
mod util; mod util;
mod udpmessage; mod udpmessage;
mod tapdev; mod tuntap;
mod ethernet; mod ethernet;
mod ip; mod ip;
mod ethcloud; mod ethcloud;

View File

@ -4,22 +4,29 @@ use std::os::unix::io::{AsRawFd, RawFd};
extern { extern {
fn setup_tap_device(fd: i32, ifname: *mut u8) -> i32; fn setup_tap_device(fd: i32, ifname: *mut u8) -> i32;
fn setup_tun_device(fd: i32, ifname: *mut u8) -> i32;
} }
pub struct TapDevice { #[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Eq, Ord)]
pub enum DeviceType {
TunDevice, TapDevice
}
pub struct TunTapDevice {
fd: fs::File, fd: fs::File,
ifname: String ifname: String,
iftype: DeviceType
} }
impl TapDevice { impl TunTapDevice {
pub fn new(ifname: &str) -> IoResult<TapDevice> { pub fn new(ifname: &str, iftype: DeviceType) -> IoResult<Self> {
let fd = try!(fs::OpenOptions::new().read(true).write(true).open("/dev/net/tun")); let fd = try!(fs::OpenOptions::new().read(true).write(true).open("/dev/net/tun"));
let mut ifname_string = String::with_capacity(32); let mut ifname_string = String::with_capacity(32);
ifname_string.push_str(ifname); ifname_string.push_str(ifname);
ifname_string.push('\0'); ifname_string.push('\0');
let mut ifname_c = ifname_string.into_bytes(); let mut ifname_c = ifname_string.into_bytes();
match unsafe { setup_tap_device(fd.as_raw_fd(), ifname_c.as_mut_ptr()) } { match unsafe { setup_tap_device(fd.as_raw_fd(), ifname_c.as_mut_ptr()) } {
0 => Ok(TapDevice{fd: fd, ifname: String::from_utf8(ifname_c).unwrap()}), 0 => Ok(TunTapDevice{fd: fd, ifname: String::from_utf8(ifname_c).unwrap(), iftype: iftype}),
_ => Err(IoError::last_os_error()) _ => Err(IoError::last_os_error())
} }
} }
@ -29,6 +36,11 @@ impl TapDevice {
&self.ifname &self.ifname
} }
#[inline(always)]
pub fn iftype(&self) -> DeviceType {
self.iftype
}
#[inline(always)] #[inline(always)]
pub fn read(&mut self, buffer: &mut [u8]) -> IoResult<usize> { pub fn read(&mut self, buffer: &mut [u8]) -> IoResult<usize> {
self.fd.read(buffer) self.fd.read(buffer)
@ -40,7 +52,7 @@ impl TapDevice {
} }
} }
impl AsRawFd for TapDevice { impl AsRawFd for TunTapDevice {
#[inline(always)] #[inline(always)]
fn as_raw_fd(&self) -> RawFd { fn as_raw_fd(&self) -> RawFd {
self.fd.as_raw_fd() self.fd.as_raw_fd()