aboutsummaryrefslogtreecommitdiffstats
path: root/src/wireguard
diff options
context:
space:
mode:
authorMathias Hall-Andersen <mathias@hall-andersen.dk>2019-11-02 21:58:04 +0100
committerMathias Hall-Andersen <mathias@hall-andersen.dk>2019-11-02 21:58:04 +0100
commit027d3d24d97e80af8b46c82b9de6786aa126b5b9 (patch)
tree3defa4bca61c3a8e1107e74ad6fef9dab31636a9 /src/wireguard
parentAdd derived_session (diff)
downloadwireguard-rs-027d3d24d97e80af8b46c82b9de6786aa126b5b9.tar.xz
wireguard-rs-027d3d24d97e80af8b46c82b9de6786aa126b5b9.zip
Work on configuration interface
Diffstat (limited to 'src/wireguard')
-rw-r--r--src/wireguard/router/peer.rs6
-rw-r--r--src/wireguard/router/tests.rs8
-rw-r--r--src/wireguard/tests.rs4
-rw-r--r--src/wireguard/timers.rs14
-rw-r--r--src/wireguard/wireguard.rs20
5 files changed, 43 insertions, 9 deletions
diff --git a/src/wireguard/router/peer.rs b/src/wireguard/router/peer.rs
index 5467eb7..5522a3e 100644
--- a/src/wireguard/router/peer.rs
+++ b/src/wireguard/router/peer.rs
@@ -515,7 +515,7 @@ impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: bind::Writer<E>> Peer<E, C, T
///
/// If an identical value already exists as part of a prior peer,
/// the allowed IP entry will be removed from that peer and added to this peer.
- pub fn add_allowed_ips(&self, ip: IpAddr, masklen: u32) {
+ pub fn add_allowed_ip(&self, ip: IpAddr, masklen: u32) {
debug!("peer.add_allowed_ips");
match ip {
IpAddr::V4(v4) => {
@@ -523,14 +523,14 @@ impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: bind::Writer<E>> Peer<E, C, T
.device
.ipv4
.write()
- .insert(v4, masklen, self.state.clone())
+ .insert(v4.mask(masklen), masklen, self.state.clone())
}
IpAddr::V6(v6) => {
self.state
.device
.ipv6
.write()
- .insert(v6, masklen, self.state.clone())
+ .insert(v6.mask(masklen), masklen, self.state.clone())
}
};
}
diff --git a/src/wireguard/router/tests.rs b/src/wireguard/router/tests.rs
index 1b122a8..d5a1133 100644
--- a/src/wireguard/router/tests.rs
+++ b/src/wireguard/router/tests.rs
@@ -152,7 +152,7 @@ mod tests {
let (mask, len, ip) = ("192.168.1.0", 24, "192.168.1.20");
let mask: IpAddr = mask.parse().unwrap();
let ip1: IpAddr = ip.parse().unwrap();
- peer.add_allowed_ips(mask, len);
+ peer.add_allowed_ip(mask, len);
// every iteration sends 10 GB
b.iter(|| {
@@ -210,7 +210,7 @@ mod tests {
}
// map subnet to peer
- peer.add_allowed_ips(mask, *len);
+ peer.add_allowed_ip(mask, *len);
// create "IP packet"
let msg = make_packet_dst_padded(1024, ip.parse().unwrap(), 0);
@@ -334,13 +334,13 @@ mod tests {
let (mask, len, _ip, _okay) = p1;
let peer1 = router1.new_peer(opaq1.clone());
let mask: IpAddr = mask.parse().unwrap();
- peer1.add_allowed_ips(mask, *len);
+ peer1.add_allowed_ip(mask, *len);
peer1.add_keypair(dummy_keypair(false));
let (mask, len, _ip, _okay) = p2;
let peer2 = router2.new_peer(opaq2.clone());
let mask: IpAddr = mask.parse().unwrap();
- peer2.add_allowed_ips(mask, *len);
+ peer2.add_allowed_ip(mask, *len);
peer2.set_endpoint(dummy::UnitEndpoint::new());
if *stage {
diff --git a/src/wireguard/tests.rs b/src/wireguard/tests.rs
index 37dd571..6a02e1f 100644
--- a/src/wireguard/tests.rs
+++ b/src/wireguard/tests.rs
@@ -133,11 +133,11 @@ fn test_pure_wireguard() {
peer1
.router
- .add_allowed_ips("192.168.1.0".parse().unwrap(), 24);
+ .add_allowed_ip("192.168.1.0".parse().unwrap(), 24);
peer2
.router
- .add_allowed_ips("192.168.2.0".parse().unwrap(), 24);
+ .add_allowed_ip("192.168.2.0".parse().unwrap(), 24);
// set endpoint (the other should be learned dynamically)
diff --git a/src/wireguard/timers.rs b/src/wireguard/timers.rs
index 485f466..22a0ff1 100644
--- a/src/wireguard/timers.rs
+++ b/src/wireguard/timers.rs
@@ -124,14 +124,28 @@ impl<B: bind::Bind> PeerInner<B> {
self.timers_any_authenticated_packet_sent();
}
+
+ pub fn set_persistent_keepalive_interval(&self, interval: usize) {
+ self.timers().send_persistent_keepalive.stop();
+ self.keepalive.store(interval, Ordering::SeqCst);
+ if interval > 0 {
+ self.timers()
+ .send_persistent_keepalive
+ .start(Duration::from_secs(interval as u64));
+ }
+ }
+
fn packet_send_queued_handshake_initiation(&self, is_retry: bool) {
if !is_retry {
self.timers().handshake_attempts.store(0, Ordering::SeqCst);
}
self.packet_send_handshake_initiation();
}
+
+
}
+
impl Timers {
pub fn new<T, B>(runner: &Runner, peer: Peer<T, B>) -> Timers
where
diff --git a/src/wireguard/wireguard.rs b/src/wireguard/wireguard.rs
index 674c96f..78f24da 100644
--- a/src/wireguard/wireguard.rs
+++ b/src/wireguard/wireguard.rs
@@ -148,6 +148,16 @@ impl<B: Bind> PeerInner<B> {
self.queue.lock().send(HandshakeJob::New(self.pk)).unwrap();
}
}
+
+ pub fn set_persistent_keepalive_interval(&self, interval: usize) {
+ self.timers().send_persistent_keepalive.stop();
+ self.keepalive.store(interval, Ordering::SeqCst);
+ if interval > 0 {
+ self.timers()
+ .send_persistent_keepalive
+ .start(Duration::from_secs(internal as u64));
+ }
+ }
}
struct Handshake {
@@ -161,6 +171,12 @@ impl<T: Tun, B: Bind> Deref for WireguardHandle<T, B> {
&self.inner
}
}
+impl<T: Tun, B: Bind> Deref for Wireguard<T, B> {
+ type Target = Arc<WireguardInner<T, B>>;
+ fn deref(&self) -> &Self::Target {
+ &self.state
+ }
+}
pub struct Wireguard<T: Tun, B: Bind> {
runner: Runner,
@@ -240,6 +256,10 @@ impl<T: Tun, B: Bind> Wireguard<T, B> {
}
}
+ pub fn set_psk(&self, pk: PublicKey, psk: Option<[u8; 32]>) -> bool {
+ self.state.handshake.write().device.set_psk(pk, psk).is_ok()
+ }
+
pub fn new_peer(&self, pk: PublicKey) {
let mut rng = OsRng::new().unwrap();
let state = Arc::new(PeerInner {