aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface/mod.rs
diff options
context:
space:
mode:
authorJake McGinty <me@jake.su>2018-02-05 22:17:19 +0000
committerJake McGinty <me@jake.su>2018-02-05 22:17:19 +0000
commit6676d5fd95161fd2a16595bc5566e52438cbbcaf (patch)
tree068377bf43c5f1ab9acba28f42f9e45ef76881c8 /src/interface/mod.rs
parentroute IPv6 traffic correctly over utun (diff)
downloadwireguard-rs-6676d5fd95161fd2a16595bc5566e52438cbbcaf.tar.xz
wireguard-rs-6676d5fd95161fd2a16595bc5566e52438cbbcaf.zip
finish up basic utun ipv6 support
Diffstat (limited to 'src/interface/mod.rs')
-rw-r--r--src/interface/mod.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/interface/mod.rs b/src/interface/mod.rs
index 18a15dd..228ea31 100644
--- a/src/interface/mod.rs
+++ b/src/interface/mod.rs
@@ -56,13 +56,27 @@ pub enum UtunPacket {
Inet4(Vec<u8>),
Inet6(Vec<u8>),
}
+
+impl UtunPacket {
+ pub fn payload(&self) -> &[u8] {
+ match self {
+ &UtunPacket::Inet4(ref payload) => &payload,
+ &UtunPacket::Inet6(ref payload) => &payload,
+ }
+ }
+}
+
impl UtunCodec for VecUtunCodec {
- type In = Vec<u8>;
+ type In = UtunPacket;
type Out = UtunPacket;
fn decode(&mut self, buf: &[u8]) -> io::Result<Self::In> {
trace!("utun packet type {}", buf[3]);
- Ok(buf[4..].to_vec())
+ match buf[3] {
+ 0x02 => Ok(UtunPacket::Inet4(buf[4..].to_vec())),
+ 0x1e => Ok(UtunPacket::Inet6(buf[4..].to_vec())),
+ _ => Err(io::ErrorKind::InvalidData.into())
+ }
}
fn encode(&mut self, msg: Self::Out, buf: &mut Vec<u8>) {