diff options
-rw-r--r-- | Cargo.lock | 78 | ||||
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | src/consts.rs | 1 | ||||
-rw-r--r-- | src/lib.rs | 4 | ||||
-rw-r--r-- | src/main.rs | 4 | ||||
-rw-r--r-- | src/route_monitor/linux.rs | 34 | ||||
-rw-r--r-- | src/route_monitor/mod.rs | 5 |
7 files changed, 127 insertions, 2 deletions
@@ -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" @@ -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; @@ -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 |