aboutsummaryrefslogtreecommitdiffstats
path: root/src/udp/frame.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/udp/frame.rs')
-rw-r--r--src/udp/frame.rs36
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
+ }
+}