Update contrib/mobile for the latest iOS build

This commit is contained in:
Neil Alexander 2023-06-06 22:11:49 +01:00
parent 1420ea5662
commit db9b57c052
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
6 changed files with 73 additions and 13 deletions

View File

@ -37,7 +37,7 @@ if [ $IOS ]; then
echo "Building framework for iOS" echo "Building framework for iOS"
go get golang.org/x/mobile/bind go get golang.org/x/mobile/bind
gomobile bind \ gomobile bind \
-target ios -tags mobile -o Yggdrasil.xcframework \ -target ios,macos -tags mobile -o Yggdrasil.xcframework \
-ldflags="$LDFLAGS $STRIP" -gcflags="$GCFLAGS" \ -ldflags="$LDFLAGS $STRIP" -gcflags="$GCFLAGS" \
./contrib/mobile ./src/config; ./contrib/mobile ./src/config;
fi fi

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"net" "net"
"regexp" "regexp"
"runtime/debug"
"github.com/gologme/log" "github.com/gologme/log"
@ -15,6 +16,7 @@ import (
"github.com/yggdrasil-network/yggdrasil-go/src/defaults" "github.com/yggdrasil-network/yggdrasil-go/src/defaults"
"github.com/yggdrasil-network/yggdrasil-go/src/ipv6rwc" "github.com/yggdrasil-network/yggdrasil-go/src/ipv6rwc"
"github.com/yggdrasil-network/yggdrasil-go/src/multicast" "github.com/yggdrasil-network/yggdrasil-go/src/multicast"
"github.com/yggdrasil-network/yggdrasil-go/src/tun"
"github.com/yggdrasil-network/yggdrasil-go/src/version" "github.com/yggdrasil-network/yggdrasil-go/src/version"
_ "golang.org/x/mobile/bind" _ "golang.org/x/mobile/bind"
@ -30,7 +32,9 @@ type Yggdrasil struct {
iprwc *ipv6rwc.ReadWriteCloser iprwc *ipv6rwc.ReadWriteCloser
config *config.NodeConfig config *config.NodeConfig
multicast *multicast.Multicast multicast *multicast.Multicast
tun *tun.TunAdapter // optional
log MobileLogger log MobileLogger
logger *log.Logger
} }
// StartAutoconfigure starts a node with a randomly generated config // StartAutoconfigure starts a node with a randomly generated config
@ -41,10 +45,12 @@ func (m *Yggdrasil) StartAutoconfigure() error {
// StartJSON starts a node with the given JSON config. You can get JSON config // StartJSON starts a node with the given JSON config. You can get JSON config
// (rather than HJSON) by using the GenerateConfigJSON() function // (rather than HJSON) by using the GenerateConfigJSON() function
func (m *Yggdrasil) StartJSON(configjson []byte) error { func (m *Yggdrasil) StartJSON(configjson []byte) error {
logger := log.New(m.log, "", 0) debug.SetMemoryLimit(1024 * 1024 * 40)
logger.EnableLevel("error")
logger.EnableLevel("warn") m.logger = log.New(m.log, "", 0)
logger.EnableLevel("info") m.logger.EnableLevel("error")
m.logger.EnableLevel("warn")
m.logger.EnableLevel("info")
m.config = defaults.GenerateConfig() m.config = defaults.GenerateConfig()
if err := json.Unmarshal(configjson, &m.config); err != nil { if err := json.Unmarshal(configjson, &m.config); err != nil {
return err return err
@ -71,7 +77,7 @@ func (m *Yggdrasil) StartJSON(configjson []byte) error {
} }
options = append(options, core.AllowedPublicKey(k[:])) options = append(options, core.AllowedPublicKey(k[:]))
} }
m.core, err = core.New(sk[:], logger, options...) m.core, err = core.New(sk[:], m.logger, options...)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -90,9 +96,9 @@ func (m *Yggdrasil) StartJSON(configjson []byte) error {
Priority: uint8(intf.Priority), 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 { if err != nil {
logger.Errorln("An error occurred starting multicast:", err) m.logger.Errorln("An error occurred starting multicast:", err)
} }
} }
@ -155,6 +161,11 @@ func (m *Yggdrasil) Stop() error {
if err := m.multicast.Stop(); err != nil { if err := m.multicast.Stop(); err != nil {
return err return err
} }
if m.tun != nil {
if err := m.tun.Stop(); err != nil {
return err
}
}
m.core.Stop() m.core.Stop()
return nil return nil
} }

View File

@ -15,6 +15,8 @@ void Log(const char *text) {
import "C" import "C"
import ( import (
"unsafe" "unsafe"
"github.com/yggdrasil-network/yggdrasil-go/src/tun"
) )
type MobileLogger struct { type MobileLogger struct {
@ -26,3 +28,13 @@ func (nsl MobileLogger) Write(p []byte) (n int, err error) {
C.Log(cstr) C.Log(cstr)
return len(p), nil 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
}

View File

@ -6,6 +6,8 @@ func (m *TunAdapter) _applyOption(opt SetupOption) {
m.config.name = v m.config.name = v
case InterfaceMTU: case InterfaceMTU:
m.config.mtu = v m.config.mtu = v
case FileDescriptor:
m.config.fd = int32(v)
} }
} }
@ -15,6 +17,8 @@ type SetupOption interface {
type InterfaceName string type InterfaceName string
type InterfaceMTU uint64 type InterfaceMTU uint64
type FileDescriptor int32
func (a InterfaceName) isSetupOption() {} func (a InterfaceName) isSetupOption() {}
func (a InterfaceMTU) isSetupOption() {} func (a InterfaceMTU) isSetupOption() {}
func (a FileDescriptor) isSetupOption() {}

View File

@ -37,6 +37,7 @@ type TunAdapter struct {
isOpen bool isOpen bool
isEnabled bool // Used by the writer to drop sessionTraffic if not enabled isEnabled bool // Used by the writer to drop sessionTraffic if not enabled
config struct { config struct {
fd int32
name InterfaceName name InterfaceName
mtu InterfaceMTU mtu InterfaceMTU
} }
@ -119,7 +120,13 @@ func (tun *TunAdapter) _start() error {
if tun.rwc.MaxMTU() < mtu { if tun.rwc.MaxMTU() < mtu {
mtu = tun.rwc.MaxMTU() 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 return err
} }
if tun.MTU() != mtu { if tun.MTU() != mtu {

View File

@ -1,5 +1,5 @@
//go:build !mobile //go:build darwin || ios
// +build !mobile // +build darwin ios
package tun package tun
@ -7,6 +7,7 @@ package tun
import ( import (
"encoding/binary" "encoding/binary"
"os"
"strconv" "strconv"
"strings" "strings"
"unsafe" "unsafe"
@ -34,6 +35,31 @@ func (tun *TunAdapter) setup(ifname string, addr string, mtu uint64) error {
return tun.setupAddress(addr) 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 ( const (
darwin_SIOCAIFADDR_IN6 = 2155899162 // netinet6/in6_var.h darwin_SIOCAIFADDR_IN6 = 2155899162 // netinet6/in6_var.h
darwin_IN6_IFF_NODAD = 0x0020 // netinet6/in6_var.h darwin_IN6_IFF_NODAD = 0x0020 // netinet6/in6_var.h