mirror of https://github.com/dswd/vpncloud.git
Listening on ipv4 and ipv6
This commit is contained in:
parent
cd2259c09d
commit
2f2f7b725f
|
@ -4,7 +4,9 @@ This project follows [semantic versioning](http://semver.org).
|
||||||
|
|
||||||
### Unreleased
|
### Unreleased
|
||||||
|
|
||||||
|
- [changed] Using SO_REUSEADDR to allow frequent rebinding
|
||||||
- [changed] Building and using local libsodium library automatically
|
- [changed] Building and using local libsodium library automatically
|
||||||
|
- [changed] Updated dependencies
|
||||||
|
|
||||||
### v0.5.0 (2016-04-05)
|
### v0.5.0 (2016-04-05)
|
||||||
|
|
||||||
|
|
|
@ -3,23 +3,24 @@ name = "vpncloud"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aligned_alloc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aligned_alloc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"docopt 0.6.78 (registry+https://github.com/rust-lang/crates.io-index)",
|
"docopt 0.6.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"epoll 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"epoll 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fnv 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fnv 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gcc 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"net2 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"nix 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"nix 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"signal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"signal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aho-corasick"
|
name = "aho-corasick"
|
||||||
version = "0.5.1"
|
version = "0.5.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -30,8 +31,8 @@ name = "aligned_alloc"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -45,12 +46,17 @@ name = "bitflags"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "docopt"
|
name = "docopt"
|
||||||
version = "0.6.78"
|
version = "0.6.80"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"regex 0.1.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.1.69 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
@ -61,7 +67,7 @@ version = "0.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"errno 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"errno 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -69,8 +75,8 @@ name = "errno"
|
||||||
version = "0.1.6"
|
version = "0.1.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -81,12 +87,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gcc"
|
name = "gcc"
|
||||||
version = "0.3.26"
|
version = "0.3.28"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kernel32-sys"
|
name = "kernel32-sys"
|
||||||
version = "0.2.1"
|
version = "0.2.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -100,7 +106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.9"
|
version = "0.2.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -113,13 +119,20 @@ name = "memchr"
|
||||||
version = "0.1.11"
|
version = "0.1.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mempool"
|
name = "net2"
|
||||||
version = "0.3.0"
|
version = "0.2.23"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nix"
|
name = "nix"
|
||||||
|
@ -136,7 +149,7 @@ version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -149,18 +162,18 @@ name = "rand"
|
||||||
version = "0.3.14"
|
version = "0.3.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "0.1.62"
|
version = "0.1.69"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aho-corasick 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mempool 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"thread_local 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -176,7 +189,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal"
|
name = "signal"
|
||||||
version = "0.1.3"
|
version = "0.1.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -189,13 +202,30 @@ name = "strsim"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thread-id"
|
||||||
|
version = "2.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thread_local"
|
||||||
|
version = "0.2.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time"
|
name = "time"
|
||||||
version = "0.1.35"
|
version = "0.1.35"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -214,3 +244,12 @@ name = "winapi-build"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ws2_32-sys"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,13 @@ docopt = "0.6"
|
||||||
rustc-serialize = "0.3"
|
rustc-serialize = "0.3"
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
epoll = "0.3"
|
epoll = "0.3"
|
||||||
signal = "0.1"
|
signal = ">=0.1.4"
|
||||||
nix = "0.5"
|
nix = "0.5"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
aligned_alloc = "0.1"
|
aligned_alloc = "0.1"
|
||||||
rand = "0.3"
|
rand = "0.3"
|
||||||
fnv = "1"
|
fnv = "1"
|
||||||
|
net2 = "*"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
gcc = "0.3"
|
gcc = "0.3"
|
||||||
|
|
|
@ -20,15 +20,13 @@ VpnCloud version: `VpnCloud v0.5.0, protocol version 1, libsodium 1.0.10 (AES256
|
||||||
The sender runs the following command:
|
The sender runs the following command:
|
||||||
|
|
||||||
```
|
```
|
||||||
$> ./vpncloud -t tap -l SENDER:3210 -c RECEIVER:3210 \
|
$> ./vpncloud -t tap -l 3210 -c RECEIVER:3210 --ifup 'ifconfig $IFNAME 10.0.0.1/24 mtu 1400 up' &
|
||||||
--ifup 'ifconfig $IFNAME 10.2.1.1/24 mtu 1400 up' &
|
|
||||||
```
|
```
|
||||||
|
|
||||||
and the receiver runs:
|
and the receiver runs:
|
||||||
|
|
||||||
```
|
```
|
||||||
$> ./vpncloud -t tap -l RECEIVER:3210 -c SENDER:3210 \
|
$> ./vpncloud -t tap -l 3210 -c SENDER:3210 --ifup 'ifconfig $IFNAME 10.0.0.2/24 mtu 1400 up' &
|
||||||
--ifup 'ifconfig $IFNAME 10.2.1.2/24 mtu 1400 up' &
|
|
||||||
$> iperf -s &
|
$> iperf -s &
|
||||||
$> top
|
$> top
|
||||||
```
|
```
|
||||||
|
|
60
src/cloud.rs
60
src/cloud.rs
|
@ -2,8 +2,8 @@
|
||||||
// Copyright (C) 2015-2016 Dennis Schwerdel
|
// Copyright (C) 2015-2016 Dennis Schwerdel
|
||||||
// This software is licensed under GPL-3 or newer (see LICENSE.md)
|
// This software is licensed under GPL-3 or newer (see LICENSE.md)
|
||||||
|
|
||||||
use std::net::{SocketAddr, ToSocketAddrs};
|
use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
|
||||||
use std::collections::HashMap;
|
use std::collections::{HashSet, HashMap};
|
||||||
use std::hash::Hasher;
|
use std::hash::Hasher;
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
@ -19,6 +19,7 @@ use nix::sys::signal::{SIGTERM, SIGQUIT, SIGINT};
|
||||||
use signal::trap::Trap;
|
use signal::trap::Trap;
|
||||||
use time::SteadyTime;
|
use time::SteadyTime;
|
||||||
use rand::{random, sample, thread_rng};
|
use rand::{random, sample, thread_rng};
|
||||||
|
use net2::UdpBuilder;
|
||||||
|
|
||||||
use super::types::{Table, Protocol, Range, Error, NetworkId, NodeId};
|
use super::types::{Table, Protocol, Range, Error, NetworkId, NodeId};
|
||||||
use super::device::Device;
|
use super::device::Device;
|
||||||
|
@ -98,7 +99,8 @@ pub struct GenericCloud<P: Protocol> {
|
||||||
reconnect_peers: Vec<SocketAddr>,
|
reconnect_peers: Vec<SocketAddr>,
|
||||||
blacklist_peers: Vec<SocketAddr>,
|
blacklist_peers: Vec<SocketAddr>,
|
||||||
table: Box<Table>,
|
table: Box<Table>,
|
||||||
socket: UdpSocket,
|
socket4: UdpSocket,
|
||||||
|
socket6: UdpSocket,
|
||||||
device: Device,
|
device: Device,
|
||||||
options: Options,
|
options: Options,
|
||||||
crypto: Crypto,
|
crypto: Crypto,
|
||||||
|
@ -110,12 +112,19 @@ pub struct GenericCloud<P: Protocol> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<P: Protocol> GenericCloud<P> {
|
impl<P: Protocol> GenericCloud<P> {
|
||||||
pub fn new(device: Device, listen: &str, network_id: Option<NetworkId>, table: Box<Table>,
|
pub fn new(device: Device, listen: u16, network_id: Option<NetworkId>, table: Box<Table>,
|
||||||
peer_timeout: Duration, learning: bool, broadcast: bool, addresses: Vec<Range>,
|
peer_timeout: Duration, learning: bool, broadcast: bool, addresses: Vec<Range>,
|
||||||
crypto: Crypto) -> Self {
|
crypto: Crypto) -> Self {
|
||||||
let socket = match UdpSocket::bind(listen) {
|
let socket4 = match UdpBuilder::new_v4().expect("Failed to obtain ipv4 socket builder")
|
||||||
|
.reuse_address(true).expect("Failed to set so_reuseaddr").bind(("0.0.0.0", listen)) {
|
||||||
Ok(socket) => socket,
|
Ok(socket) => socket,
|
||||||
_ => fail!("Failed to open socket {}", listen)
|
Err(err) => fail!("Failed to open ipv4 address 0.0.0.0:{}: {}", listen, err)
|
||||||
|
};
|
||||||
|
let socket6 = match UdpBuilder::new_v6().expect("Failed to obtain ipv6 socket builder")
|
||||||
|
.only_v6(true).expect("Failed to set only_v6")
|
||||||
|
.reuse_address(true).expect("Failed to set so_reuseaddr").bind(("::", listen)) {
|
||||||
|
Ok(socket) => socket,
|
||||||
|
Err(err) => fail!("Failed to open ipv6 address ::{}: {}", listen, err)
|
||||||
};
|
};
|
||||||
let mut options = Options::default();
|
let mut options = Options::default();
|
||||||
options.network_id = network_id;
|
options.network_id = network_id;
|
||||||
|
@ -128,7 +137,8 @@ impl<P: Protocol> GenericCloud<P> {
|
||||||
reconnect_peers: Vec::new(),
|
reconnect_peers: Vec::new(),
|
||||||
blacklist_peers: Vec::new(),
|
blacklist_peers: Vec::new(),
|
||||||
table: table,
|
table: table,
|
||||||
socket: socket,
|
socket4: socket4,
|
||||||
|
socket6: socket6,
|
||||||
device: device,
|
device: device,
|
||||||
options: options,
|
options: options,
|
||||||
crypto: crypto,
|
crypto: crypto,
|
||||||
|
@ -150,7 +160,11 @@ impl<P: Protocol> GenericCloud<P> {
|
||||||
debug!("Broadcasting {:?}", msg);
|
debug!("Broadcasting {:?}", msg);
|
||||||
let msg_data = encode(&mut self.options, msg, &mut self.buffer_out, &mut self.crypto);
|
let msg_data = encode(&mut self.options, msg, &mut self.buffer_out, &mut self.crypto);
|
||||||
for addr in &self.peers.as_vec() {
|
for addr in &self.peers.as_vec() {
|
||||||
try!(match self.socket.send_to(msg_data, addr) {
|
let socket = match addr {
|
||||||
|
&SocketAddr::V4(_) => &self.socket4,
|
||||||
|
&SocketAddr::V6(_) => &self.socket6
|
||||||
|
};
|
||||||
|
try!(match socket.send_to(msg_data, addr) {
|
||||||
Ok(written) if written == msg_data.len() => Ok(()),
|
Ok(written) if written == msg_data.len() => Ok(()),
|
||||||
Ok(_) => Err(Error::SocketError("Sent out truncated packet")),
|
Ok(_) => Err(Error::SocketError("Sent out truncated packet")),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -166,7 +180,11 @@ impl<P: Protocol> GenericCloud<P> {
|
||||||
fn send_msg(&mut self, addr: SocketAddr, msg: &mut Message) -> Result<(), Error> {
|
fn send_msg(&mut self, addr: SocketAddr, msg: &mut Message) -> Result<(), Error> {
|
||||||
debug!("Sending {:?} to {}", msg, addr);
|
debug!("Sending {:?} to {}", msg, addr);
|
||||||
let msg_data = encode(&mut self.options, msg, &mut self.buffer_out, &mut self.crypto);
|
let msg_data = encode(&mut self.options, msg, &mut self.buffer_out, &mut self.crypto);
|
||||||
match self.socket.send_to(msg_data, addr) {
|
let socket = match &addr {
|
||||||
|
&SocketAddr::V4(_) => &self.socket4,
|
||||||
|
&SocketAddr::V6(_) => &self.socket6
|
||||||
|
};
|
||||||
|
match socket.send_to(msg_data, addr) {
|
||||||
Ok(written) if written == msg_data.len() => Ok(()),
|
Ok(written) if written == msg_data.len() => Ok(()),
|
||||||
Ok(_) => Err(Error::SocketError("Sent out truncated packet")),
|
Ok(_) => Err(Error::SocketError("Sent out truncated packet")),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -177,8 +195,8 @@ impl<P: Protocol> GenericCloud<P> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn address(&self) -> IoResult<SocketAddr> {
|
pub fn address(&self) -> IoResult<(SocketAddr, SocketAddr)> {
|
||||||
self.socket.local_addr()
|
Ok((try!(self.socket4.local_addr()), try!(self.socket6.local_addr())))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
@ -325,11 +343,14 @@ impl<P: Protocol> GenericCloud<P> {
|
||||||
let dummy_time = SteadyTime::now();
|
let dummy_time = SteadyTime::now();
|
||||||
let trap = Trap::trap(&[SIGINT, SIGTERM, SIGQUIT]);
|
let trap = Trap::trap(&[SIGINT, SIGTERM, SIGQUIT]);
|
||||||
let epoll_handle = try_fail!(epoll::create1(0), "Failed to create epoll handle: {}");
|
let epoll_handle = try_fail!(epoll::create1(0), "Failed to create epoll handle: {}");
|
||||||
let socket_fd = self.socket.as_raw_fd();
|
let socket4_fd = self.socket4.as_raw_fd();
|
||||||
|
let socket6_fd = self.socket6.as_raw_fd();
|
||||||
let device_fd = self.device.as_raw_fd();
|
let device_fd = self.device.as_raw_fd();
|
||||||
let mut socket_event = epoll::EpollEvent{events: epoll::util::event_type::EPOLLIN, data: 0};
|
let mut socket4_event = epoll::EpollEvent{events: epoll::util::event_type::EPOLLIN, data: 0};
|
||||||
let mut device_event = epoll::EpollEvent{events: epoll::util::event_type::EPOLLIN, data: 1};
|
let mut socket6_event = epoll::EpollEvent{events: epoll::util::event_type::EPOLLIN, data: 1};
|
||||||
try_fail!(epoll::ctl(epoll_handle, epoll::util::ctl_op::ADD, socket_fd, &mut socket_event), "Failed to add socket to epoll handle: {}");
|
let mut device_event = epoll::EpollEvent{events: epoll::util::event_type::EPOLLIN, data: 2};
|
||||||
|
try_fail!(epoll::ctl(epoll_handle, epoll::util::ctl_op::ADD, socket4_fd, &mut socket4_event), "Failed to add ipv4 socket to epoll handle: {}");
|
||||||
|
try_fail!(epoll::ctl(epoll_handle, epoll::util::ctl_op::ADD, socket6_fd, &mut socket6_event), "Failed to add ipv6 socket to epoll handle: {}");
|
||||||
try_fail!(epoll::ctl(epoll_handle, epoll::util::ctl_op::ADD, device_fd, &mut device_event), "Failed to add device to epoll handle: {}");
|
try_fail!(epoll::ctl(epoll_handle, epoll::util::ctl_op::ADD, device_fd, &mut device_event), "Failed to add device to epoll handle: {}");
|
||||||
let mut events = [epoll::EpollEvent{events: 0, data: 0}; 2];
|
let mut events = [epoll::EpollEvent{events: 0, data: 0}; 2];
|
||||||
let mut buffer = [0; 64*1024];
|
let mut buffer = [0; 64*1024];
|
||||||
|
@ -339,13 +360,20 @@ impl<P: Protocol> GenericCloud<P> {
|
||||||
for i in 0..count {
|
for i in 0..count {
|
||||||
match &events[i].data {
|
match &events[i].data {
|
||||||
&0 => {
|
&0 => {
|
||||||
let (size, src) = try_fail!(self.socket.recv_from(&mut buffer), "Failed to read from network socket: {}");
|
let (size, src) = try_fail!(self.socket4.recv_from(&mut buffer), "Failed to read from ipv4 network socket: {}");
|
||||||
match decode(&mut buffer[..size], &mut self.crypto).and_then(|(options, msg)| self.handle_net_message(src, options, msg)) {
|
match decode(&mut buffer[..size], &mut self.crypto).and_then(|(options, msg)| self.handle_net_message(src, options, msg)) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(e) => error!("Error: {}, from: {}", e, src)
|
Err(e) => error!("Error: {}, from: {}", e, src)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
&1 => {
|
&1 => {
|
||||||
|
let (size, src) = try_fail!(self.socket6.recv_from(&mut buffer), "Failed to read from ipv6 network socket: {}");
|
||||||
|
match decode(&mut buffer[..size], &mut self.crypto).and_then(|(options, msg)| self.handle_net_message(src, options, msg)) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(e) => error!("Error: {}, from: {}", e, src)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
&2 => {
|
||||||
let start = 64;
|
let start = 64;
|
||||||
let size = try_fail!(self.device.read(&mut buffer[start..]), "Failed to read from tap device: {}");
|
let size = try_fail!(self.device.read(&mut buffer[start..]), "Failed to read from tap device: {}");
|
||||||
match self.handle_interface_data(&mut buffer, start, start+size) {
|
match self.handle_interface_data(&mut buffer, start, start+size) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ extern crate libc;
|
||||||
extern crate aligned_alloc;
|
extern crate aligned_alloc;
|
||||||
extern crate rand;
|
extern crate rand;
|
||||||
extern crate fnv;
|
extern crate fnv;
|
||||||
|
extern crate net2;
|
||||||
#[cfg(feature = "bench")] extern crate test;
|
#[cfg(feature = "bench")] extern crate test;
|
||||||
|
|
||||||
#[macro_use] mod util;
|
#[macro_use] mod util;
|
||||||
|
@ -69,7 +70,7 @@ struct Args {
|
||||||
flag_crypto: CryptoMethod,
|
flag_crypto: CryptoMethod,
|
||||||
flag_subnet: Vec<String>,
|
flag_subnet: Vec<String>,
|
||||||
flag_device: String,
|
flag_device: String,
|
||||||
flag_listen: String,
|
flag_listen: u16,
|
||||||
flag_network_id: Option<String>,
|
flag_network_id: Option<String>,
|
||||||
flag_connect: Vec<String>,
|
flag_connect: Vec<String>,
|
||||||
flag_peer_timeout: Duration,
|
flag_peer_timeout: Duration,
|
||||||
|
@ -123,7 +124,7 @@ fn run<T: Protocol> (args: Args) {
|
||||||
Some(key) => Crypto::from_shared_key(args.flag_crypto, &key),
|
Some(key) => Crypto::from_shared_key(args.flag_crypto, &key),
|
||||||
None => Crypto::None
|
None => Crypto::None
|
||||||
};
|
};
|
||||||
let mut cloud = GenericCloud::<T>::new(device, &args.flag_listen, network_id, table, peer_timeout, learning, broadcasting, ranges, crypto);
|
let mut cloud = GenericCloud::<T>::new(device, args.flag_listen, network_id, table, peer_timeout, learning, broadcasting, ranges, crypto);
|
||||||
if let Some(script) = args.flag_ifup {
|
if let Some(script) = args.flag_ifup {
|
||||||
run_script(script, cloud.ifname());
|
run_script(script, cloud.ifname());
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,8 @@ Options:
|
||||||
[default: vpncloud%d]
|
[default: vpncloud%d]
|
||||||
-m <mode>, --mode <mode> The mode of the VPN ("hub", "switch",
|
-m <mode>, --mode <mode> The mode of the VPN ("hub", "switch",
|
||||||
"router", or "normal"). [default: normal]
|
"router", or "normal"). [default: normal]
|
||||||
-l <addr>, --listen <addr> The address to listen for data.
|
-l <port>, --listen <port> The port number on which to listen for data.
|
||||||
[default: 0.0.0.0:3210]
|
[default: 3210]
|
||||||
-c <addr>, --connect <addr> Address of a peer to connect to.
|
-c <addr>, --connect <addr> Address of a peer to connect to.
|
||||||
--subnet <subnet> The local subnets to use.
|
--subnet <subnet> The local subnets to use.
|
||||||
--network-id <id> Optional token that identifies the network.
|
--network-id <id> Optional token that identifies the network.
|
||||||
|
|
|
@ -27,9 +27,9 @@ vpncloud(1) -- Peer-to-peer VPN
|
||||||
peers and ignore them otherwise. The **normal** mode is switch for tap
|
peers and ignore them otherwise. The **normal** mode is switch for tap
|
||||||
devices and router for tun devices. [default: `normal`]
|
devices and router for tun devices. [default: `normal`]
|
||||||
|
|
||||||
* `-l <addr>`, `--listen <addr>`:
|
* `-l <port>`, `--listen <port>`:
|
||||||
|
|
||||||
The address to listen for data. [default: `0.0.0.0:3210`]
|
The port number on which to listen for data. [default: `3210`]
|
||||||
|
|
||||||
* `-c <addr>`, `--connect <addr>`:
|
* `-c <addr>`, `--connect <addr>`:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue