aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--device/device.go22
-rw-r--r--device/uapi.go11
2 files changed, 24 insertions, 9 deletions
diff --git a/device/device.go b/device/device.go
index 5f128fc..f7885ce 100644
--- a/device/device.go
+++ b/device/device.go
@@ -90,6 +90,23 @@ type Device struct {
}
}
+// ListenPort returns the port that device is listening on.
+// It returns 0 if the device is not listening on any ports.
+func (device *Device) ListenPort() uint16 {
+ device.net.Lock()
+ defer device.net.Unlock()
+ return device.net.port
+}
+
+// SetListenPort sets the port that the device is listening on.
+// The new port is bound immediately.
+func (device *Device) SetListenPort(port uint16) error {
+ device.net.Lock()
+ defer device.net.Unlock()
+ device.net.port = port
+ return device.bindUpdateLocked()
+}
+
// An encryptionQueue is a channel of QueueOutboundElements awaiting encryption.
// An encryptionQueue is ref-counted using its wg field.
// An encryptionQueue created with newEncryptionQueue has one reference.
@@ -490,9 +507,12 @@ func (device *Device) BindSetMark(mark uint32) error {
}
func (device *Device) BindUpdate() error {
-
device.net.Lock()
defer device.net.Unlock()
+ return device.bindUpdateLocked()
+}
+
+func (device *Device) bindUpdateLocked() error {
// close existing sockets
diff --git a/device/uapi.go b/device/uapi.go
index 2843a4c..3575c11 100644
--- a/device/uapi.go
+++ b/device/uapi.go
@@ -58,8 +58,8 @@ func (device *Device) IpcGetOperation(w io.StringWriter) error {
send("private_key=" + device.staticIdentity.privateKey.ToHex())
}
- if device.net.port != 0 {
- send(fmt.Sprintf("listen_port=%d", device.net.port))
+ if port := device.ListenPort(); port != 0 {
+ send(fmt.Sprintf("listen_port=%d", port))
}
if device.net.fwmark != 0 {
@@ -162,12 +162,7 @@ func (device *Device) IpcSetOperation(r io.Reader) error {
// update port and rebind
logDebug.Println("UAPI: Updating listen port")
-
- device.net.Lock()
- device.net.port = uint16(port)
- device.net.Unlock()
-
- if err := device.BindUpdate(); err != nil {
+ if err := device.SetListenPort(uint16(port)); err != nil {
logError.Println("Failed to set listen_port:", err)
return &IPCError{ipc.IpcErrorPortInUse}
}