Centralise platform defaults into the 'defaults' package

This commit is contained in:
Neil Alexander 2018-07-07 12:08:52 +01:00
parent adc21baa28
commit 1692bd98fd
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
20 changed files with 169 additions and 105 deletions

View File

@ -13,6 +13,8 @@ import (
"strings" "strings"
"sync/atomic" "sync/atomic"
"time" "time"
"yggdrasil/defaults"
) )
// TODO: Add authentication // TODO: Add authentication
@ -155,15 +157,15 @@ func (a *admin) init(c *Core, listenaddr string) {
}) })
a.addHandler("setTunTap", []string{"name", "[tap_mode]", "[mtu]"}, func(in admin_info) (admin_info, error) { a.addHandler("setTunTap", []string{"name", "[tap_mode]", "[mtu]"}, func(in admin_info) (admin_info, error) {
// Set sane defaults // Set sane defaults
iftapmode := getDefaults().defaultIfTAPMode iftapmode := defaults.GetDefaults().DefaultIfTAPMode
ifmtu := getDefaults().defaultIfMTU ifmtu := defaults.GetDefaults().DefaultIfMTU
// Has TAP mode been specified? // Has TAP mode been specified?
if tap, ok := in["tap_mode"]; ok { if tap, ok := in["tap_mode"]; ok {
iftapmode = tap.(bool) iftapmode = tap.(bool)
} }
// Check we have enough params for MTU // Check we have enough params for MTU
if mtu, ok := in["mtu"]; ok { if mtu, ok := in["mtu"]; ok {
if mtu.(float64) >= 1280 && ifmtu <= getDefaults().maximumIfMTU { if mtu.(float64) >= 1280 && ifmtu <= defaults.GetDefaults().MaximumIfMTU {
ifmtu = int(in["mtu"].(float64)) ifmtu = int(in["mtu"].(float64))
} }
} }

View File

@ -9,6 +9,7 @@ import (
"regexp" "regexp"
"yggdrasil/config" "yggdrasil/config"
"yggdrasil/defaults"
) )
// The Core object represents the Yggdrasil node. You should create a Core // The Core object represents the Yggdrasil node. You should create a Core
@ -197,26 +198,31 @@ func (c *Core) AddAllowedEncryptionPublicKey(boxStr string) error {
return c.admin.addAllowedEncryptionPublicKey(boxStr) return c.admin.addAllowedEncryptionPublicKey(boxStr)
} }
// Gets the default admin listen address for your platform.
func (c *Core) GetAdminDefaultListen() string {
return defaults.GetDefaults().DefaultAdminListen
}
// Gets the default TUN/TAP interface name for your platform. // Gets the default TUN/TAP interface name for your platform.
func (c *Core) GetTUNDefaultIfName() string { func (c *Core) GetTUNDefaultIfName() string {
return getDefaults().defaultIfName return defaults.GetDefaults().DefaultIfName
} }
// Gets the default TUN/TAP interface MTU for your platform. This can be as high // Gets the default TUN/TAP interface MTU for your platform. This can be as high
// as 65535, depending on platform, but is never lower than 1280. // as 65535, depending on platform, but is never lower than 1280.
func (c *Core) GetTUNDefaultIfMTU() int { func (c *Core) GetTUNDefaultIfMTU() int {
return getDefaults().defaultIfMTU return defaults.GetDefaults().DefaultIfMTU
} }
// Gets the maximum supported TUN/TAP interface MTU for your platform. This // Gets the maximum supported TUN/TAP interface MTU for your platform. This
// can be as high as 65535, depending on platform, but is never lower than 1280. // can be as high as 65535, depending on platform, but is never lower than 1280.
func (c *Core) GetTUNMaximumIfMTU() int { func (c *Core) GetTUNMaximumIfMTU() int {
return getDefaults().maximumIfMTU return defaults.GetDefaults().MaximumIfMTU
} }
// Gets the default TUN/TAP interface mode for your platform. // Gets the default TUN/TAP interface mode for your platform.
func (c *Core) GetTUNDefaultIfTAPMode() bool { func (c *Core) GetTUNDefaultIfTAPMode() bool {
return getDefaults().defaultIfTAPMode return defaults.GetDefaults().DefaultIfTAPMode
} }
// Gets the current TUN/TAP interface name. // Gets the current TUN/TAP interface name.

View File

@ -0,0 +1,15 @@
package defaults
// Defines which parameters are expected by default for configuration on a
// specific platform. These values are populated in the relevant defaults_*.go
// for the platform being targeted. They must be set.
type platformDefaultParameters struct {
// Admin socket
DefaultAdminListen string
// TUN/TAP
MaximumIfMTU int
DefaultIfMTU int
DefaultIfName string
DefaultIfTAPMode bool
}

View File

@ -0,0 +1,18 @@
// +build darwin
package defaults
// Sane defaults for the macOS/Darwin platform. The "default" options may be
// may be replaced by the running configuration.
func GetDefaults() platformDefaultParameters {
return platformDefaultParameters{
// Admin
DefaultAdminListen: "unix:///var/run/yggdrasil.sock",
// TUN/TAP
MaximumIfMTU: 65535,
DefaultIfMTU: 65535,
DefaultIfName: "auto",
DefaultIfTAPMode: false,
}
}

View File

@ -0,0 +1,18 @@
// +build freebsd
package defaults
// Sane defaults for the BSD platforms. The "default" options may be
// may be replaced by the running configuration.
func GetDefaults() platformDefaultParameters {
return platformDefaultParameters{
// Admin
DefaultAdminListen: "unix:///var/run/yggdrasil.sock",
// TUN/TAP
MaximumIfMTU: 32767,
DefaultIfMTU: 32767,
DefaultIfName: "/dev/tap0",
DefaultIfTAPMode: true,
}
}

View File

@ -0,0 +1,18 @@
// +build linux
package defaults
// Sane defaults for the Linux platform. The "default" options may be
// may be replaced by the running configuration.
func GetDefaults() platformDefaultParameters {
return platformDefaultParameters{
// Admin
DefaultAdminListen: "unix:///var/run/yggdrasil.sock",
// TUN/TAP
MaximumIfMTU: 65535,
DefaultIfMTU: 65535,
DefaultIfName: "auto",
DefaultIfTAPMode: false,
}
}

View File

@ -0,0 +1,18 @@
// +build freebsd
package defaults
// Sane defaults for the BSD platforms. The "default" options may be
// may be replaced by the running configuration.
func GetDefaults() platformDefaultParameters {
return platformDefaultParameters{
// Admin
DefaultAdminListen: "unix:///var/run/yggdrasil.sock",
// TUN/TAP
MaximumIfMTU: 9000,
DefaultIfMTU: 9000,
DefaultIfName: "/dev/tap0",
DefaultIfTAPMode: true,
}
}

View File

@ -0,0 +1,18 @@
// +build freebsd
package defaults
// Sane defaults for the BSD platforms. The "default" options may be
// may be replaced by the running configuration.
func GetDefaults() platformDefaultParameters {
return platformDefaultParameters{
// Admin
DefaultAdminListen: "unix:///var/run/yggdrasil.sock",
// TUN/TAP
MaximumIfMTU: 16384,
DefaultIfMTU: 16384,
DefaultIfName: "/dev/tap0",
DefaultIfTAPMode: true,
}
}

View File

@ -0,0 +1,18 @@
// +build !linux,!darwin,!windows,!openbsd,!freebsd,!netbsd
package defaults
// Sane defaults for the other platforms. The "default" options may be
// may be replaced by the running configuration.
func GetDefaults() platformDefaultParameters {
return platformDefaultParameters{
// Admin
DefaultAdminListen: "tcp://localhost:9001",
// TUN/TAP
MaximumIfMTU: 65535,
DefaultIfMTU: 65535,
DefaultIfName: "none",
DefaultIfTAPMode: false,
}
}

View File

@ -0,0 +1,18 @@
// +build windows
package defaults
// Sane defaults for the Windows platform. The "default" options may be
// may be replaced by the running configuration.
func GetDefaults() platformDefaultParameters {
return platformDefaultParameters{
// Admin
DefaultAdminListen: "tcp://localhost:9001",
// TUN/TAP
MaximumIfMTU: 65535,
DefaultIfMTU: 65535,
DefaultIfName: "auto",
DefaultIfTAPMode: true,
}
}

View File

@ -3,6 +3,8 @@ package yggdrasil
// This manages the tun driver to send/recv packets to/from applications // This manages the tun driver to send/recv packets to/from applications
import ( import (
"yggdrasil/defaults"
"github.com/songgao/packets/ethernet" "github.com/songgao/packets/ethernet"
"github.com/yggdrasil-network/water" "github.com/yggdrasil-network/water"
) )
@ -20,21 +22,11 @@ type tunDevice struct {
iface *water.Interface iface *water.Interface
} }
// Defines which parameters are expected by default for a TUN/TAP adapter on a
// specific platform. These values are populated in the relevant tun_*.go for
// the platform being targeted. They must be set.
type tunDefaultParameters struct {
maximumIfMTU int
defaultIfMTU int
defaultIfName string
defaultIfTAPMode bool
}
// Gets the maximum supported MTU for the platform based on the defaults in // Gets the maximum supported MTU for the platform based on the defaults in
// getDefaults(). // defaults.GetDefaults().
func getSupportedMTU(mtu int) int { func getSupportedMTU(mtu int) int {
if mtu > getDefaults().maximumIfMTU { if mtu > defaults.GetDefaults().MaximumIfMTU {
return getDefaults().maximumIfMTU return defaults.GetDefaults().MaximumIfMTU
} }
return mtu return mtu
} }

View File

@ -13,17 +13,6 @@ import (
water "github.com/yggdrasil-network/water" water "github.com/yggdrasil-network/water"
) )
// Sane defaults for the Darwin/macOS platform. The "default" options may be
// may be replaced by the running configuration.
func getDefaults() tunDefaultParameters {
return tunDefaultParameters{
maximumIfMTU: 65535,
defaultIfMTU: 65535,
defaultIfName: "auto",
defaultIfTAPMode: false,
}
}
// Configures the "utun" adapter with the correct IPv6 address and MTU. // Configures the "utun" adapter with the correct IPv6 address and MTU.
func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error { func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error {
if iftapmode { if iftapmode {

View File

@ -1,12 +0,0 @@
package yggdrasil
// Sane defaults for the FreeBSD platform. The "default" options may be
// may be replaced by the running configuration.
func getDefaults() tunDefaultParameters {
return tunDefaultParameters{
maximumIfMTU: 32767,
defaultIfMTU: 32767,
defaultIfName: "/dev/tap0",
defaultIfTAPMode: true,
}
}

View File

@ -12,17 +12,6 @@ import (
water "github.com/yggdrasil-network/water" water "github.com/yggdrasil-network/water"
) )
// Sane defaults for the Linux platform. The "default" options may be
// may be replaced by the running configuration.
func getDefaults() tunDefaultParameters {
return tunDefaultParameters{
maximumIfMTU: 65535,
defaultIfMTU: 65535,
defaultIfName: "auto",
defaultIfTAPMode: false,
}
}
// Configures the TAP adapter with the correct IPv6 address and MTU. // Configures the TAP adapter with the correct IPv6 address and MTU.
func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error { func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error {
var config water.Config var config water.Config

View File

@ -1,12 +0,0 @@
package yggdrasil
// Sane defaults for the NetBSD platform. The "default" options may be
// may be replaced by the running configuration.
func getDefaults() tunDefaultParameters {
return tunDefaultParameters{
maximumIfMTU: 9000,
defaultIfMTU: 9000,
defaultIfName: "/dev/tap0",
defaultIfTAPMode: true,
}
}

View File

@ -1,12 +0,0 @@
package yggdrasil
// Sane defaults for the OpenBSD platform. The "default" options may be
// may be replaced by the running configuration.
func getDefaults() tunDefaultParameters {
return tunDefaultParameters{
maximumIfMTU: 16384,
defaultIfMTU: 16384,
defaultIfName: "/dev/tap0",
defaultIfTAPMode: true,
}
}

View File

@ -7,17 +7,6 @@ import water "github.com/yggdrasil-network/water"
// This is to catch unsupported platforms // This is to catch unsupported platforms
// If your platform supports tun devices, you could try configuring it manually // If your platform supports tun devices, you could try configuring it manually
// These are sane defaults for any platform that has not been matched by one of
// the other tun_*.go files.
func getDefaults() tunDefaultParameters {
return tunDefaultParameters{
maximumIfMTU: 65535,
defaultIfMTU: 65535,
defaultIfName: "none",
defaultIfTAPMode: false,
}
}
// Creates the TUN/TAP adapter, if supported by the Water library. Note that // Creates the TUN/TAP adapter, if supported by the Water library. Note that
// no guarantees are made at this point on an unsupported platform. // no guarantees are made at this point on an unsupported platform.
func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error { func (tun *tunDevice) setup(ifname string, iftapmode bool, addr string, mtu int) error {

View File

@ -10,17 +10,6 @@ import (
// This is to catch Windows platforms // This is to catch Windows platforms
// Sane defaults for the Windows platform. The "default" options may be
// may be replaced by the running configuration.
func getDefaults() tunDefaultParameters {
return tunDefaultParameters{
maximumIfMTU: 65535,
defaultIfMTU: 65535,
defaultIfName: "auto",
defaultIfTAPMode: true,
}
}
// Configures the TAP adapter with the correct IPv6 address and MTU. On Windows // Configures the TAP adapter with the correct IPv6 address and MTU. On Windows
// we don't make use of a direct operating system API to do this - we instead // we don't make use of a direct operating system API to do this - we instead
// delegate the hard work to "netsh". // delegate the hard work to "netsh".

View File

@ -23,6 +23,7 @@ import (
"yggdrasil" "yggdrasil"
"yggdrasil/config" "yggdrasil/config"
"yggdrasil/defaults"
) )
type nodeConfig = config.NodeConfig type nodeConfig = config.NodeConfig
@ -53,7 +54,7 @@ func generateConfig(isAutoconf bool) *nodeConfig {
r1 := rand.New(rand.NewSource(time.Now().UnixNano())) r1 := rand.New(rand.NewSource(time.Now().UnixNano()))
cfg.Listen = fmt.Sprintf("[::]:%d", r1.Intn(65534-32768)+32768) cfg.Listen = fmt.Sprintf("[::]:%d", r1.Intn(65534-32768)+32768)
} }
cfg.AdminListen = "localhost:9001" cfg.AdminListen = defaults.GetDefaults().DefaultAdminListen
cfg.EncryptionPublicKey = hex.EncodeToString(bpub[:]) cfg.EncryptionPublicKey = hex.EncodeToString(bpub[:])
cfg.EncryptionPrivateKey = hex.EncodeToString(bpriv[:]) cfg.EncryptionPrivateKey = hex.EncodeToString(bpriv[:])
cfg.SigningPublicKey = hex.EncodeToString(spub[:]) cfg.SigningPublicKey = hex.EncodeToString(spub[:])
@ -61,9 +62,9 @@ func generateConfig(isAutoconf bool) *nodeConfig {
cfg.Peers = []string{} cfg.Peers = []string{}
cfg.AllowedEncryptionPublicKeys = []string{} cfg.AllowedEncryptionPublicKeys = []string{}
cfg.MulticastInterfaces = []string{".*"} cfg.MulticastInterfaces = []string{".*"}
cfg.IfName = core.GetTUNDefaultIfName() cfg.IfName = defaults.GetDefaults().DefaultIfName
cfg.IfMTU = core.GetTUNDefaultIfMTU() cfg.IfMTU = defaults.GetDefaults().DefaultIfMTU
cfg.IfTAPMode = core.GetTUNDefaultIfTAPMode() cfg.IfTAPMode = defaults.GetDefaults().DefaultIfTAPMode
return &cfg return &cfg
} }

View File

@ -9,10 +9,12 @@ import "encoding/json"
import "strconv" import "strconv"
import "os" import "os"
import "yggdrasil/defaults"
type admin_info map[string]interface{} type admin_info map[string]interface{}
func main() { func main() {
server := flag.String("endpoint", "localhost:9001", "Admin socket endpoint") server := flag.String("endpoint", defaults.GetDefaults().DefaultAdminListen, "Admin socket endpoint")
injson := flag.Bool("json", false, "Output in JSON format") injson := flag.Bool("json", false, "Output in JSON format")
flag.Parse() flag.Parse()
args := flag.Args() args := flag.Args()