Revert pure-go network monitoring and add wgSetConfig
This reverts commit 99f0e457c3
and adds a
function too.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
bde984625c
commit
63e67a5e13
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue