diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2018-02-18 20:49:03 +0100 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2018-02-18 20:49:03 +0100 |
commit | 9de17e6c9c90f3bf3ec3eb709a92c9e1295a6d67 (patch) | |
tree | 3bfc156930ea8b57e91e5ff7ca62409adc427de8 | |
parent | 8f1d1b8c54d747309d9fdf06b157823af2a823bd (diff) |
Seperated fwmark update code into function
-rw-r--r-- | conn.go | 37 | ||||
-rw-r--r-- | uapi.go | 6 |
2 files changed, 34 insertions, 9 deletions
@@ -64,6 +64,32 @@ func unsafeCloseBind(device *Device) error { return err } +func (device *Device) BindSetMark(mark uint32) error { + + device.net.mutex.Lock() + defer device.net.mutex.Unlock() + + device.peers.mutex.Lock() + defer device.peers.mutex.Unlock() + + // check if modified + + if device.net.fwmark == mark { + return nil + } + + // update fwmark on existing bind + + device.net.fwmark = mark + if device.isUp.Get() && device.net.bind != nil { + if err := device.net.bind.SetMark(mark); err != nil { + return err + } + } + + return nil +} + func (device *Device) BindUpdate() error { device.net.mutex.Lock() @@ -89,14 +115,17 @@ func (device *Device) BindUpdate() error { netc.bind, netc.port, err = CreateBind(netc.port) if err != nil { netc.bind = nil + netc.port = 0 return err } - // set mark + // set fwmark - err = netc.bind.SetMark(netc.fwmark) - if err != nil { - return err + if netc.fwmark != 0 { + err = netc.bind.SetMark(netc.fwmark) + if err != nil { + return err + } } // clear cached source addresses @@ -191,11 +191,7 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { logDebug.Println("UAPI: Updating fwmark") - device.net.mutex.Lock() - device.net.fwmark = uint32(fwmark) - device.net.mutex.Unlock() - - if err := device.BindUpdate(); err != nil { + if err := device.BindSetMark(uint32(fwmark)); err != nil { logError.Println("Failed to update fwmark:", err) return &IPCError{Code: ipcErrorPortInUse} } |