From 63e67a5e1302ee69f20f66c1644566ee1ff5796b Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 11 Dec 2018 22:21:33 +0100 Subject: Revert pure-go network monitoring and add wgSetConfig This reverts commit 99f0e457c34480f25582d7b4ed509404712c648c and adds a function too. Signed-off-by: Jason A. Donenfeld --- wireguard-go-bridge/src/api-ios.go | 101 +++++++------------------------------ wireguard-go-bridge/wireguard.h | 1 + 2 files changed, 18 insertions(+), 84 deletions(-) diff --git a/wireguard-go-bridge/src/api-ios.go b/wireguard-go-bridge/src/api-ios.go index 0fdb3be..ff7aab2 100644 --- a/wireguard-go-bridge/src/api-ios.go +++ b/wireguard-go-bridge/src/api-ios.go @@ -25,8 +25,6 @@ import ( "os/signal" "runtime" "strings" - "syscall" - "time" "unsafe" ) @@ -48,54 +46,12 @@ func (l *CLogger) Write(p []byte) (int, error) { return len(p), nil } -type DeviceState struct { - device *Device - logger *Logger - endpointsTimer *time.Timer - endpointsSettings string -} - -var tunnelHandles map[int32]*DeviceState - -func listenForRouteChanges() { - //TODO: replace with NWPathMonitor - data := make([]byte, os.Getpagesize()) - routeSocket, err := unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC) - if err != nil { - return - } - for { - n, err := unix.Read(routeSocket, data) - if err != nil { - if errno, ok := err.(syscall.Errno); ok && errno == syscall.EINTR { - continue - } - return - } - - if n < 4 { - continue - } - for _, deviceState := range tunnelHandles { - if deviceState.endpointsTimer == nil { - deviceState.endpointsTimer = time.AfterFunc(time.Second, func() { - deviceState.endpointsTimer = nil - bufferedSettings := bufio.NewReadWriter(bufio.NewReader(strings.NewReader(deviceState.endpointsSettings)), bufio.NewWriter(ioutil.Discard)) - deviceState.logger.Info.Println("Setting endpoints for re-resolution due to network change") - err := ipcSetOperation(deviceState.device, bufferedSettings) - if err != nil { - deviceState.logger.Error.Println(err) - } - }) - } - } - } -} +var tunnelHandles map[int32]*Device func init() { versionString = C.CString(WireGuardGoVersion) roamingDisabled = true - tunnelHandles = make(map[int32]*DeviceState) + tunnelHandles = make(map[int32]*Device) signals := make(chan os.Signal) signal.Notify(signals, unix.SIGUSR2) go func() { @@ -111,7 +67,6 @@ func init() { } } }() - go listenForRouteChanges() } //export wgSetLogger @@ -119,32 +74,6 @@ func wgSetLogger(loggerFn uintptr) { loggerFunc = unsafe.Pointer(loggerFn) } -func extractEndpointFromSettings(settings string) string { - var b strings.Builder - pubkey := "" - endpoint := "" - listenPort := "listen_port=0" - for _, line := range strings.Split(settings, "\n") { - if strings.HasPrefix(line, "listen_port=") { - listenPort = line - } else if strings.HasPrefix(line, "public_key=") { - if pubkey != "" && endpoint != "" { - b.WriteString(pubkey + "\n" + endpoint + "\n") - } - pubkey = line - } else if strings.HasPrefix(line, "endpoint=") { - endpoint = line - } else if line == "remove=true" { - pubkey = "" - endpoint = "" - } - } - if pubkey != "" && endpoint != "" { - b.WriteString(pubkey + "\n" + endpoint + "\n") - } - return listenPort + "\n" + b.String() -} - //export wgTurnOn func wgTurnOn(ifnameRef string, settings string, tunFd int32) int32 { interfaceName := string([]byte(ifnameRef)) @@ -184,27 +113,31 @@ func wgTurnOn(ifnameRef string, settings string, tunFd int32) int32 { if i == math.MaxInt32 { return -1 } - tunnelHandles[i] = &DeviceState{ - device: device, - logger: logger, - endpointsSettings: extractEndpointFromSettings(settings), - } + tunnelHandles[i] = device return i } //export wgTurnOff func wgTurnOff(tunnelHandle int32) { - deviceState, ok := tunnelHandles[tunnelHandle] + device, ok := tunnelHandles[tunnelHandle] if !ok { return } delete(tunnelHandles, tunnelHandle) - t := deviceState.endpointsTimer - if t != nil { - deviceState.endpointsTimer = nil - t.Stop() + device.Close() +} + +//export wgSetConfig +func wgSetConfig(tunnelHandle int32, settings string) { + device, ok := tunnelHandles[tunnelHandle] + if !ok { + return + } + bufferedSettings := bufio.NewReadWriter(bufio.NewReader(strings.NewReader(settings)), bufio.NewWriter(ioutil.Discard)) + err := ipcSetOperation(device, bufferedSettings) + if err != nil { + device.log.Error.Println(err) } - deviceState.device.Close() } //export wgVersion diff --git a/wireguard-go-bridge/wireguard.h b/wireguard-go-bridge/wireguard.h index 77d1661..54cb928 100644 --- a/wireguard-go-bridge/wireguard.h +++ b/wireguard-go-bridge/wireguard.h @@ -14,6 +14,7 @@ typedef void(*logger_fn_t)(int level, const char *msg); extern void wgSetLogger(logger_fn_t logger_fn); extern int wgTurnOn(gostring_t ifname, gostring_t settings, int32_t tun_fd); extern void wgTurnOff(int handle); +extern void wgSetConfig(int handle, gostring_t settings); extern char *wgVersion(); #endif -- cgit v1.2.3-59-g8ed1b