aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock78
-rw-r--r--Cargo.toml3
-rw-r--r--src/consts.rs1
-rw-r--r--src/lib.rs4
-rw-r--r--src/main.rs4
-rw-r--r--src/route_monitor/linux.rs34
-rw-r--r--src/route_monitor/mod.rs5
7 files changed, 127 insertions, 2 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0ba6e60..45b1512 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -457,6 +457,11 @@ dependencies = [
]
[[package]]
+name = "ipnetwork"
+version = "0.12.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "itertools"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -726,11 +731,36 @@ dependencies = [
]
[[package]]
+name = "pnet"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_base 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_datalink 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_packet 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_sys 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_transport 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "pnet_base"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
+name = "pnet_datalink"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_base 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_sys 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "pnet_macros"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -761,6 +791,47 @@ dependencies = [
]
[[package]]
+name = "pnet_sys"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (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]]
+name = "pnet_transport"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_base 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_packet 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_sys 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "pnetlink"
+version = "0.0.2"
+source = "git+https://github.com/polachok/pnetlink#f027fa21ed767fc2b6cbbbac207020d54740dbcc"
+dependencies = [
+ "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_macros 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnet_macros_support 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syntex 0.42.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "proc-macro2"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1481,6 +1552,7 @@ dependencies = [
"nix 0.11.0-pre (git+https://github.com/mcginty/nix?branch=ipv6-pktinfo)",
"notify 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"pnet_packet 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pnetlink 0.0.2 (git+https://github.com/polachok/pnetlink)",
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"snow 0.1.8-preview (git+https://github.com/mcginty/snow?branch=wireguard)",
"socket2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1571,6 +1643,7 @@ dependencies = [
"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
"checksum inotify 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887fcc180136e77a85e6a6128579a719027b1bab9b1c38ea4444244fe262c20c"
"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
+"checksum ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)" = "70783119ac90828aaba91eae39db32c6c1b8838deea3637e5238efa0130801ab"
"checksum itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "f58856976b776fedd95533137617a02fb25719f40e7d9b01c7043cd65474f450"
"checksum itertools-num 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d78fa608383e6e608ba36f962ac991d5d6878d7203eb93b4711b14fa6717813"
"checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"
@@ -1602,10 +1675,15 @@ dependencies = [
"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30"
"checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc"
"checksum pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ab94faafeb93f4c5e3ce81ca0e5a779529a602ad5d09ae6d21996bfb8b6a52bf"
+"checksum pnet 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f3961c514be0c95233bdccdee9831aadd887a889ebc22e57d73e14d1cedb670"
"checksum pnet_base 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "948dbdd36f46888ada1d497703e6cae53d227ab0e8871638aba492ad1e4a76dc"
+"checksum pnet_datalink 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8d3b3dd76a11ad99d92fef54b2489f76f4045ebd5251bd1af485d55a7e13db6"
"checksum pnet_macros 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d228096fd739d4e3e60dee9e1e4f07d9ae0f3f309c876834192538748e561e4"
"checksum pnet_macros_support 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f92b7141318df140dfb8c3f7a1a5a331edb31b1791633cc5c8f03fcd9a7f6ac4"
"checksum pnet_packet 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef99f3cfa2c0ed07e9ad6d9f788592d863361a8dd3102989d79b0f6a787ba434"
+"checksum pnet_sys 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "963b9109a05c3ac370abc3fda61bff20d03743c2947942173871b9cac2b9acb0"
+"checksum pnet_transport 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "568a118fe2f74ebb08e9b9b6ac812b9730a7b043c5ca4d97325f4edeb018cae0"
+"checksum pnetlink 0.0.2 (git+https://github.com/polachok/pnetlink)" = "<none>"
"checksum proc-macro2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b16749538926f394755373f0dfec0852d79b3bd512a5906ceaeb72ee64a4eaa0"
"checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4"
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
diff --git a/Cargo.toml b/Cargo.toml
index 2946d1c..42ec23a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -64,3 +64,6 @@ colored = { version = "^1.6", optional = true }
structopt = { version = "^0.1", optional = true }
structopt-derive = { version = "^0.1", optional = true }
fern = { version = "^0.5", features = ["colored"], optional = true }
+
+[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]
+pnetlink = { git = "https://github.com/polachok/pnetlink" }
diff --git a/src/consts.rs b/src/consts.rs
index 0aa644d..3425469 100644
--- a/src/consts.rs
+++ b/src/consts.rs
@@ -30,5 +30,6 @@ pub const MAX_CONTENT_SIZE : usize = MAX_SEGMENT_SIZE - TRANSPORT_OVERHEAD;
pub const PADDING_MULTIPLE : usize = 16;
pub const MAX_QUEUED_INCOMING_HANDSHAKES : usize = 4096;
+pub const UNDER_LOAD_QUEUE_SIZE : usize = 512;
pub const MAX_QUEUED_PACKETS : usize = 1024;
pub const MAX_PEERS_PER_DEVICE : usize = 1 << 20;
diff --git a/src/lib.rs b/src/lib.rs
index 5302f19..e80b6ab 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -38,6 +38,9 @@ extern crate tokio_signal;
extern crate treebitmap;
extern crate x25519_dalek;
+#[cfg(any(target_os = "android", target_os = "linux"))]
+extern crate pnetlink;
+
pub mod interface;
pub mod peer;
pub mod noise;
@@ -50,6 +53,7 @@ mod cookie;
mod error;
mod ip_packet;
mod message;
+mod route_monitor;
mod router;
mod timer;
mod udp;
diff --git a/src/main.rs b/src/main.rs
index 183503c..79fecf8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -60,8 +60,8 @@ fn main() {
message,
))
})
- .level(log::LevelFilter::Info)
- .level_for("wireguard", log::LevelFilter::Debug)
+ .level(log::LevelFilter::Warn)
+ // .level_for("wireguard", log::LevelFilter::Debug)
.chain(std::io::stdout())
.apply().unwrap();
diff --git a/src/route_monitor/linux.rs b/src/route_monitor/linux.rs
new file mode 100644
index 0000000..a08cff2
--- /dev/null
+++ b/src/route_monitor/linux.rs
@@ -0,0 +1,34 @@
+use failure::Error;
+use futures::stream::Stream;
+use futures::{Async, Poll};
+use pnetlink::socket::NetlinkProtocol;
+use pnetlink::packet::route::RtMsgPacket;
+use pnetlink::tokio::{NetlinkSocket, NetlinkCodec};
+use tokio_core::reactor::Handle;
+use tokio_io::{AsyncRead, codec::Framed};
+use std::io;
+
+pub struct RouteListener {
+ inner: Framed<NetlinkSocket, NetlinkCodec>,
+}
+
+impl RouteListener {
+ pub fn bind(handle: &Handle) -> io::Result<Self> {
+ let sock = NetlinkSocket::bind(NetlinkProtocol::Route, 0, handle)?;
+
+ Ok(RouteListener {
+ inner: AsyncRead::framed(sock, NetlinkCodec {});
+ })
+ }
+}
+
+impl Stream for RouteListener {
+ type Item = ();
+ type Error = Error;
+
+ fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
+ match self.inner.poll() {
+ Ok(Async::Ready(Some(packet)))
+ }
+ }
+} \ No newline at end of file
diff --git a/src/route_monitor/mod.rs b/src/route_monitor/mod.rs
new file mode 100644
index 0000000..db74130
--- /dev/null
+++ b/src/route_monitor/mod.rs
@@ -0,0 +1,5 @@
+#[cfg(any(target_os = "android", target_os = "linux"))]
+mod linux;
+
+#[cfg(any(target_os = "android", target_os = "linux"))]
+pub use self::linux::RouteListener; \ No newline at end of file