mirror of https://github.com/dswd/vpncloud.git
TapDev -> TunTapDev
This commit is contained in:
parent
8c414f9c23
commit
2fe004c074
2
build.rs
2
build.rs
|
@ -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");
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -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")
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
Loading…
Reference in New Issue