diff options
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 + } +} |