diff options
author | Jake McGinty <me@jake.su> | 2018-03-01 21:40:27 +0000 |
---|---|---|
committer | Jake McGinty <me@jake.su> | 2018-03-04 01:23:43 +0000 |
commit | a19f0aaf515c78d53dec05fd3b3c6a2f38621508 (patch) | |
tree | 73668514662ce09bb3d69b2b1389e8388a265286 /src/udp/frame.rs | |
parent | udp: switch to own tokio UdpSocket implementation for performance reasons (diff) | |
download | wireguard-rs-a19f0aaf515c78d53dec05fd3b3c6a2f38621508.tar.xz wireguard-rs-a19f0aaf515c78d53dec05fd3b3c6a2f38621508.zip |
udp: enable SO_REUSEPORT to start getting clever
Diffstat (limited to 'src/udp/frame.rs')
-rw-r--r-- | src/udp/frame.rs | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/udp/frame.rs b/src/udp/frame.rs index c85c873..51d6c33 100644 --- a/src/udp/frame.rs +++ b/src/udp/frame.rs @@ -1,5 +1,5 @@ use std::io; -use std::net::{SocketAddr, Ipv4Addr, SocketAddrV4}; +use std::net::{SocketAddr, Ipv4Addr, SocketAddrV4, IpAddr}; use futures::{Async, Poll, Stream, Sink, StartSend, AsyncSink}; @@ -185,4 +185,36 @@ impl<C> UdpFramed<C> { Socket::Unconnected(socket) => socket } } -}
\ No newline at end of file +} + +pub type PeerServerMessage = (SocketAddr, Vec<u8>); +pub struct VecUdpCodec; +impl UdpCodec for VecUdpCodec { + type In = PeerServerMessage; + type Out = PeerServerMessage; + + fn decode(&mut self, src: &SocketAddr, buf: &[u8]) -> io::Result<Self::In> { + let unmapped_ip = match src.ip() { + IpAddr::V6(v6addr) => { + if let Some(v4addr) = v6addr.to_ipv4() { + IpAddr::V4(v4addr) + } else { + IpAddr::V6(v6addr) + } + } + v4addr => v4addr + }; + Ok((SocketAddr::new(unmapped_ip, src.port()), buf.to_vec())) + } + + fn encode(&mut self, msg: Self::Out, buf: &mut Vec<u8>) -> SocketAddr { + let (mut addr, mut data) = msg; + buf.append(&mut data); + let mapped_ip = match addr.ip() { + IpAddr::V4(v4addr) => IpAddr::V6(v4addr.to_ipv6_mapped()), + v6addr => v6addr + }; + addr.set_ip(mapped_ip); + addr + } +} |