Seperated fwmark update code into function

This commit is contained in:
Mathias Hall-Andersen 2018-02-18 20:49:03 +01:00
parent 8f1d1b8c54
commit 9de17e6c9c
2 changed files with 34 additions and 9 deletions

37
conn.go
View File

@ -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

View File

@ -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}
}