From e9bd98d213d46ee55eb0700e584207d4dac5cf6b Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Sun, 11 Feb 2018 21:45:44 +0000 Subject: [PATCH] Add "IfTAPMode" configuration option to allow selecting TAP mode on supported platforms --- src/yggdrasil/debug.go | 8 ++++---- src/yggdrasil/tun_darwin.go | 5 ++++- src/yggdrasil/tun_linux.go | 9 +++++++-- src/yggdrasil/tun_other.go | 9 +++++++-- src/yggdrasil/tun_windows.go | 5 ++++- yggdrasil.go | 10 ++++++++-- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/yggdrasil/debug.go b/src/yggdrasil/debug.go index ca330c5a..1f31bec6 100644 --- a/src/yggdrasil/debug.go +++ b/src/yggdrasil/debug.go @@ -205,14 +205,14 @@ func (c *Core) DEBUG_getAddr() *address { return address_addrForNodeID(&c.dht.nodeID) } -func (c *Core) DEBUG_startTun(ifname string) { - c.DEBUG_startTunWithMTU(ifname, 1280) +func (c *Core) DEBUG_startTun(ifname string, iftapmode bool) { + c.DEBUG_startTunWithMTU(ifname, iftapmode, 1280) } -func (c *Core) DEBUG_startTunWithMTU(ifname string, mtu int) { +func (c *Core) DEBUG_startTunWithMTU(ifname string, iftapmode bool, mtu int) { addr := c.DEBUG_getAddr() straddr := fmt.Sprintf("%s/%v", net.IP(addr[:]).String(), 8*len(address_prefix)) - err := c.tun.setup(ifname, straddr, mtu) + err := c.tun.setup(ifname, iftapmode, straddr, mtu) if err != nil { panic(err) } diff --git a/src/yggdrasil/tun_darwin.go b/src/yggdrasil/tun_darwin.go index fde6c1ee..0e2fa245 100644 --- a/src/yggdrasil/tun_darwin.go +++ b/src/yggdrasil/tun_darwin.go @@ -10,7 +10,10 @@ import "golang.org/x/sys/unix" import water "github.com/songgao/water" -func (tun *tunDevice) setup(ifname string, addr string, mtu int) error { +func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error { + if iftapmode { + tun.core.log.Printf("TAP mode is not supported on this platform, defaulting to TUN") + } config := water.Config{DeviceType: water.TUN} iface, err := water.New(config) if err != nil { diff --git a/src/yggdrasil/tun_linux.go b/src/yggdrasil/tun_linux.go index 825b3993..8748aa92 100644 --- a/src/yggdrasil/tun_linux.go +++ b/src/yggdrasil/tun_linux.go @@ -9,8 +9,13 @@ import "strings" import water "github.com/songgao/water" -func (tun *tunDevice) setup(ifname string, addr string, mtu int) error { - config := water.Config{DeviceType: water.TUN} +func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error { + var config water.Config + if iftapmode { + config = water.Config{DeviceType: water.TAP} + } else { + config = water.Config{DeviceType: water.TUN} + } if ifname != "" && ifname != "auto" { config.Name = ifname } diff --git a/src/yggdrasil/tun_other.go b/src/yggdrasil/tun_other.go index 4f86d050..388260cd 100644 --- a/src/yggdrasil/tun_other.go +++ b/src/yggdrasil/tun_other.go @@ -9,8 +9,13 @@ import water "github.com/songgao/water" // This is to catch unsupported platforms // If your platform supports tun devices, you could try configuring it manually -func (tun *tunDevice) setup(ifname string, addr string, mtu int) error { - config := water.Config{DeviceType: water.TUN} +func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error { + var config water.Config + if iftapmode { + config = water.Config{DeviceType: water.TAP} + } else { + config = water.Config{DeviceType: water.TUN} + } iface, err := water.New(config) if err != nil { panic(err) diff --git a/src/yggdrasil/tun_windows.go b/src/yggdrasil/tun_windows.go index b7906224..acaf20fc 100644 --- a/src/yggdrasil/tun_windows.go +++ b/src/yggdrasil/tun_windows.go @@ -7,7 +7,10 @@ import "fmt" // This is to catch Windows platforms -func (tun *tunDevice) setup(ifname string, addr string, mtu int) error { +func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error { + if !iftapmode { + tun.core.log.Printf("TUN mode is not supported on this platform, defaulting to TAP") + } config := water.Config{DeviceType: water.TAP} config.PlatformSpecificParams.ComponentID = "tap0901" config.PlatformSpecificParams.Network = "169.254.0.1/32" diff --git a/yggdrasil.go b/yggdrasil.go index cc3066bd..9e6cc86a 100644 --- a/yggdrasil.go +++ b/yggdrasil.go @@ -39,6 +39,7 @@ type nodeConfig struct { Multicast bool LinkLocal string IfName string + IfTAPMode bool } type node struct { @@ -104,7 +105,7 @@ func generateConfig() *nodeConfig { spub, spriv := core.DEBUG_newSigKeys() cfg := nodeConfig{} cfg.Listen = "[::]:0" - cfg.AdminListen = "localhost:9001" + cfg.AdminListen = "[::1]:9001" cfg.BoxPub = hex.EncodeToString(bpub[:]) cfg.BoxPriv = hex.EncodeToString(bpriv[:]) cfg.SigPub = hex.EncodeToString(spub[:]) @@ -113,6 +114,11 @@ func generateConfig() *nodeConfig { cfg.Multicast = true cfg.LinkLocal = "" cfg.IfName = "auto" + if runtime.GOOS == "windows" { + cfg.IfTAPMode = true + } else { + cfg.IfTAPMode = false + } return &cfg } @@ -258,7 +264,7 @@ func main() { n.init(cfg, logger) logger.Println("Starting tun...") //n.core.DEBUG_startTun(cfg.IfName) // 1280, the smallest supported MTU - n.core.DEBUG_startTunWithMTU(cfg.IfName, 65535) // Largest supported MTU + n.core.DEBUG_startTunWithMTU(cfg.IfName, cfg.IfTAPMode, 65535) // Largest supported MTU defer func() { logger.Println("Closing...") n.core.DEBUG_stopTun()