Skip to content

Commit

Permalink
Merge branch 'develop' into future
Browse files Browse the repository at this point in the history
  • Loading branch information
neilalexander authored Sep 3, 2023
2 parents 5b203ad + fbc5f62 commit 6ab0639
Show file tree
Hide file tree
Showing 10 changed files with 94 additions and 8 deletions.
2 changes: 1 addition & 1 deletion contrib/mobile/build
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ if [ $IOS ]; then
echo "Building framework for iOS"
go get golang.org/x/mobile/bind
gomobile bind \
-target ios -tags mobile -o Yggdrasil.xcframework \
-target ios,macos -tags mobile -o Yggdrasil.xcframework \
-ldflags="$LDFLAGS $STRIP" -gcflags="$GCFLAGS" \
./contrib/mobile ./src/config;
fi
Expand Down
15 changes: 13 additions & 2 deletions contrib/mobile/mobile.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding/json"
"net"
"regexp"
"runtime/debug"

"github.com/gologme/log"

Expand All @@ -13,6 +14,7 @@ import (
"github.com/yggdrasil-network/yggdrasil-go/src/core"
"github.com/yggdrasil-network/yggdrasil-go/src/ipv6rwc"
"github.com/yggdrasil-network/yggdrasil-go/src/multicast"
"github.com/yggdrasil-network/yggdrasil-go/src/tun"
"github.com/yggdrasil-network/yggdrasil-go/src/version"

_ "golang.org/x/mobile/bind"
Expand All @@ -28,7 +30,9 @@ type Yggdrasil struct {
iprwc *ipv6rwc.ReadWriteCloser
config *config.NodeConfig
multicast *multicast.Multicast
tun *tun.TunAdapter // optional
log MobileLogger
logger *log.Logger
}

// StartAutoconfigure starts a node with a randomly generated config
Expand All @@ -39,6 +43,8 @@ func (m *Yggdrasil) StartAutoconfigure() error {
// StartJSON starts a node with the given JSON config. You can get JSON config
// (rather than HJSON) by using the GenerateConfigJSON() function
func (m *Yggdrasil) StartJSON(configjson []byte) error {
debug.SetMemoryLimit(1024 * 1024 * 40)

logger := log.New(m.log, "", 0)
logger.EnableLevel("error")
logger.EnableLevel("warn")
Expand Down Expand Up @@ -88,9 +94,9 @@ func (m *Yggdrasil) StartJSON(configjson []byte) error {
Priority: uint8(intf.Priority),
})
}
m.multicast, err = multicast.New(m.core, logger, options...)
m.multicast, err = multicast.New(m.core, m.logger, options...)
if err != nil {
logger.Errorln("An error occurred starting multicast:", err)
m.logger.Errorln("An error occurred starting multicast:", err)
}
}

Expand Down Expand Up @@ -153,6 +159,11 @@ func (m *Yggdrasil) Stop() error {
if err := m.multicast.Stop(); err != nil {
return err
}
if m.tun != nil {
if err := m.tun.Stop(); err != nil {
return err
}
}
m.core.Stop()
return nil
}
Expand Down
12 changes: 12 additions & 0 deletions contrib/mobile/mobile_ios.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ void Log(const char *text) {
import "C"
import (
"unsafe"

"github.com/yggdrasil-network/yggdrasil-go/src/tun"
)

type MobileLogger struct {
Expand All @@ -26,3 +28,13 @@ func (nsl MobileLogger) Write(p []byte) (n int, err error) {
C.Log(cstr)
return len(p), nil
}

func (m *Yggdrasil) TakeOverTUN(fd int32) error {
options := []tun.SetupOption{
tun.FileDescriptor(fd),
tun.InterfaceMTU(m.iprwc.MTU()),
}
var err error
m.tun, err = tun.New(m.iprwc, m.logger, options...)
return err
}
8 changes: 6 additions & 2 deletions src/tun/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ func (m *TunAdapter) _applyOption(opt SetupOption) {
m.config.name = v
case InterfaceMTU:
m.config.mtu = v
case FileDescriptor:
m.config.fd = int32(v)
}
}

Expand All @@ -15,6 +17,8 @@ type SetupOption interface {

type InterfaceName string
type InterfaceMTU uint64
type FileDescriptor int32

func (a InterfaceName) isSetupOption() {}
func (a InterfaceMTU) isSetupOption() {}
func (a InterfaceName) isSetupOption() {}
func (a InterfaceMTU) isSetupOption() {}
func (a FileDescriptor) isSetupOption() {}
9 changes: 8 additions & 1 deletion src/tun/tun.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ type TunAdapter struct {
isOpen bool
isEnabled bool // Used by the writer to drop sessionTraffic if not enabled
config struct {
fd int32
name InterfaceName
mtu InterfaceMTU
}
Expand Down Expand Up @@ -126,7 +127,13 @@ func (tun *TunAdapter) _start() error {
if tun.rwc.MaxMTU() < mtu {
mtu = tun.rwc.MaxMTU()
}
if err := tun.setup(string(tun.config.name), addr, mtu); err != nil {
var err error
if tun.config.fd > 0 {
err = tun.setupFD(tun.config.fd, addr, mtu)
} else {
err = tun.setup(string(tun.config.name), addr, mtu)
}
if err != nil {
return err
}
if tun.MTU() != mtu {
Expand Down
6 changes: 6 additions & 0 deletions src/tun/tun_bsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package tun

import (
"encoding/binary"
"fmt"
"os/exec"
"strconv"
"strings"
Expand Down Expand Up @@ -88,6 +89,11 @@ func (tun *TunAdapter) setup(ifname string, addr string, mtu uint64) error {
return tun.setupAddress(addr)
}

// Configures the "utun" adapter from an existing file descriptor.
func (tun *TunAdapter) setupFD(fd int32, addr string, mtu uint64) error {
return fmt.Errorf("setup via FD not supported on this platform")
}

func (tun *TunAdapter) setupAddress(addr string) error {
var sfd int
var err error
Expand Down
30 changes: 28 additions & 2 deletions src/tun/tun_darwin.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
//go:build !mobile
// +build !mobile
//go:build darwin || ios
// +build darwin ios

package tun

// The darwin platform specific tun parts

import (
"encoding/binary"
"os"
"strconv"
"strings"
"unsafe"
Expand Down Expand Up @@ -34,6 +35,31 @@ func (tun *TunAdapter) setup(ifname string, addr string, mtu uint64) error {
return tun.setupAddress(addr)
}

// Configures the "utun" adapter from an existing file descriptor.
func (tun *TunAdapter) setupFD(fd int32, addr string, mtu uint64) error {
dfd, err := unix.Dup(int(fd))
if err != nil {
return err
}
err = unix.SetNonblock(dfd, true)
if err != nil {
unix.Close(dfd)
return err
}
iface, err := wgtun.CreateTUNFromFile(os.NewFile(uintptr(dfd), "/dev/tun"), 0)
if err != nil {
unix.Close(dfd)
return err
}
tun.iface = iface
if m, err := iface.MTU(); err == nil {
tun.mtu = getSupportedMTU(uint64(m))
} else {
tun.mtu = 0
}
return nil // tun.setupAddress(addr)
}

const (
darwin_SIOCAIFADDR_IN6 = 2155899162 // netinet6/in6_var.h
darwin_IN6_IFF_NODAD = 0x0020 // netinet6/in6_var.h
Expand Down
7 changes: 7 additions & 0 deletions src/tun/tun_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ package tun
// The linux platform specific tun parts

import (
"fmt"

"github.com/vishvananda/netlink"
wgtun "golang.zx2c4.com/wireguard/tun"
)
Expand All @@ -28,6 +30,11 @@ func (tun *TunAdapter) setup(ifname string, addr string, mtu uint64) error {
return tun.setupAddress(addr)
}

// Configures the "utun" adapter from an existing file descriptor.
func (tun *TunAdapter) setupFD(fd int32, addr string, mtu uint64) error {
return fmt.Errorf("setup via FD not supported on this platform")
}

// Configures the TUN adapter with the correct IPv6 address and MTU. Netlink
// is used to do this, so there is not a hard requirement on "ip" or "ifconfig"
// to exist on the system, but this will fail if Netlink is not present in the
Expand Down
7 changes: 7 additions & 0 deletions src/tun/tun_other.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ package tun
// If your platform supports tun devices, you could try configuring it manually

import (
"fmt"

wgtun "golang.zx2c4.com/wireguard/tun"
)

Expand All @@ -25,6 +27,11 @@ func (tun *TunAdapter) setup(ifname string, addr string, mtu uint64) error {
return tun.setupAddress(addr)
}

// Configures the "utun" adapter from an existing file descriptor.
func (tun *TunAdapter) setupFD(fd int32, addr string, mtu uint64) error {
return fmt.Errorf("setup via FD not supported on this platform")
}

// We don't know how to set the IPv6 address on an unknown platform, therefore
// write about it to stdout and don't try to do anything further.
func (tun *TunAdapter) setupAddress(addr string) error {
Expand Down
6 changes: 6 additions & 0 deletions src/tun/tun_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package tun
import (
"bytes"
"errors"
"fmt"
"log"
"net"

Expand Down Expand Up @@ -50,6 +51,11 @@ func (tun *TunAdapter) setup(ifname string, addr string, mtu uint64) error {
})
}

// Configures the "utun" adapter from an existing file descriptor.
func (tun *TunAdapter) setupFD(fd int32, addr string, mtu uint64) error {
return fmt.Errorf("setup via FD not supported on this platform")
}

// Sets the MTU of the TUN adapter.
func (tun *TunAdapter) setupMTU(mtu uint64) error {
if tun.iface == nil || tun.Name() == "" {
Expand Down

0 comments on commit 6ab0639

Please sign in to comment.