From: Sergey Matveev Date: Sat, 6 Dec 2014 12:18:40 +0000 (+0300) Subject: FreeBSD TAP support X-Git-Tag: 1.1^0 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e8e7d6cbd119d5916f1f8dfa415363568ede35f4;p=govpn.git FreeBSD TAP support Signed-off-by: Sergey Matveev --- 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 +}