From e8e7d6cbd119d5916f1f8dfa415363568ede35f4 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sat, 6 Dec 2014 15:18:40 +0300 Subject: [PATCH] FreeBSD TAP support Signed-off-by: Sergey Matveev --- README | 2 +- govpn.go | 14 ++++++++------ tap_freebsd.go | 19 +++++++++++++++++++ tap_linux.go | 18 ++++++++++++++++++ 4 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 tap_freebsd.go create mode 100644 tap_linux.go diff --git a/README b/README index 34d8be8..f436127 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ SYNOPSIS govpn is simple high-performance secure virtual private network daemon. It uses DH-EKE for mutual zero-knowledge authentication and -authenticated encrypted transport. +authenticated encrypted transport. It runs under GNU/Linux and FreeBSD. DESCRIPTION diff --git a/govpn.go b/govpn.go index fcd1a00..a06456d 100644 --- a/govpn.go +++ b/govpn.go @@ -22,13 +22,13 @@ import ( "encoding/hex" "flag" "fmt" + "io" "log" "net" "time" "code.google.com/p/go.crypto/poly1305" "code.google.com/p/go.crypto/salsa20" - "github.com/chon219/water" ) var ( @@ -48,6 +48,11 @@ const ( S20BS = 64 ) +type TAP interface { + io.Reader + io.Writer +} + type Peer struct { addr *net.UDPAddr key *[KeySize]byte // encryption key @@ -78,10 +83,7 @@ func main() { // Interface listening maxIfacePktSize := *mtu - poly1305.TagSize - NonceSize log.Println("Max MTU", maxIfacePktSize, "on interface", *ifaceName) - iface, err := water.NewTAP(*ifaceName) - if err != nil { - panic(err) - } + iface := NewTAP(*ifaceName) ethBuf := make([]byte, maxIfacePktSize) ethSink := make(chan int) ethSinkReady := make(chan bool) @@ -236,7 +238,7 @@ func main() { peer.nonceRecv = nonceRecv timeouts = 0 if _, err := iface.Write(buf[S20BS : S20BS+udpPkt.size-NonceSize-poly1305.TagSize]); err != nil { - log.Println("Error writing to iface") + log.Println("Error writing to iface: ", err) } if *verbose { fmt.Print("r") diff --git a/tap_freebsd.go b/tap_freebsd.go new file mode 100644 index 0000000..d4b45e6 --- /dev/null +++ b/tap_freebsd.go @@ -0,0 +1,19 @@ +// +build freebsd +/* +govpn -- high-performance secure virtual private network daemon +Copyright (C) 2014 Sergey Matveev +*/ +package main + +import ( + "os" + "path" +) + +func NewTAP(ifaceName string) TAP { + fd, err := os.OpenFile(path.Join("/dev/", ifaceName), os.O_RDWR, os.ModePerm) + if err != nil { + panic(err) + } + return fd +} diff --git a/tap_linux.go b/tap_linux.go new file mode 100644 index 0000000..90ece18 --- /dev/null +++ b/tap_linux.go @@ -0,0 +1,18 @@ +// +build linux +/* +govpn -- high-performance secure virtual private network daemon +Copyright (C) 2014 Sergey Matveev +*/ +package main + +import ( + "github.com/chon219/water" +) + +func NewTAP(string ifaceName) TAP { + iface, err := water.NewTAP(ifaceName) + if err != nil { + panic(err) + } + return iface +} -- 2.44.0