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()
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
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}
}