]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Revert pure-go network monitoring and add wgSetConfig
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 11 Dec 2018 21:21:33 +0000 (22:21 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 11 Dec 2018 21:25:54 +0000 (22:25 +0100)
This reverts commit 99f0e457c34480f25582d7b4ed509404712c648c and adds a
function too.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
wireguard-go-bridge/src/api-ios.go
wireguard-go-bridge/wireguard.h

index 0fdb3be31394465a70300e5ee91a5813bcaf991f..ff7aab2dcb9d2b9e90fac194f54e2a41def97869 100644 (file)
@@ -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
index 77d166189fc546b344d4a5707bdc0717380f4467..54cb9289f78d7c673215aa93356f4e0b90dcafe4 100644 (file)
@@ -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