diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-09-21 03:09:57 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-09-21 03:10:03 +0200 |
commit | c545d63bb93b8192dfdc7037952fc2661dd1222b (patch) | |
tree | 02313ddc69501e8cbcb7e0fe562e3bd7efdd9126 /src/uapi.go | |
parent | 47a21c8bb08c84d5f84e66ffd3b81ded957dda6d (diff) |
Fix up fwmark handling
Diffstat (limited to 'src/uapi.go')
-rw-r--r-- | src/uapi.go | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/uapi.go b/src/uapi.go index 871232c..428b173 100644 --- a/src/uapi.go +++ b/src/uapi.go @@ -42,6 +42,9 @@ func ipcGetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { if device.net.addr != nil { send(fmt.Sprintf("listen_port=%d", device.net.addr.Port)) } + if device.net.fwmark != 0 { + send(fmt.Sprintf("fwmark=%d", device.net.fwmark)) + } for _, peer := range device.peers { func() { @@ -158,25 +161,32 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { // TODO: Clear source address of all peers case "fwmark": - fwmark, err := strconv.ParseInt(value, 10, 32) - if err != nil { - logError.Println("Invalid fwmark", err) - return &IPCError{Code: ipcErrorInvalid} + var fwmark uint64 = 0 + if value != "" { + var err error + fwmark, err = strconv.ParseUint(value, 10, 32) + if err != nil { + logError.Println("Invalid fwmark", err) + return &IPCError{Code: ipcErrorInvalid} + } } device.net.mutex.Lock() - device.net.fwmark = int(fwmark) - err = setMark( - device.net.conn, - device.net.fwmark, - ) - device.net.mutex.Unlock() - if err != nil { - logError.Println("Failed to set fwmark:", err) - return &IPCError{Code: ipcErrorIO} - } + if fwmark > 0 || device.net.fwmark > 0 { + device.net.fwmark = uint32(fwmark) + err := setMark( + device.net.conn, + device.net.fwmark, + ) + if err != nil { + logError.Println("Failed to set fwmark:", err) + device.net.mutex.Unlock() + return &IPCError{Code: ipcErrorIO} + } - // TODO: Clear source address of all peers + // TODO: Clear source address of all peers + } + device.net.mutex.Unlock() case "public_key": |