]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: add Device.ListenPort and Device.SetListenPort js/sample-api
authorJosh Bleecher Snyder <josh@tailscale.com>
Tue, 22 Dec 2020 19:12:54 +0000 (11:12 -0800)
committerJosh Bleecher Snyder <josh@tailscale.com>
Tue, 22 Dec 2020 19:29:28 +0000 (11:29 -0800)
This is a sample commit for a possible way to make
a Go API that lives alongside UAPI.

The general idea is to add Device and Peer methods
corresponding to UAPI directives, including a way to
look up a peer from a device based on a public key,
as in UAPI.

The UAPI code then deals with parsing and generating textual
input/output, and calls the Go methods to do the work.

This commit also contains a bug fix for a racy access of device.net.port
I will send an independently commit that fixes those directly in UAPI.
This commit is NOT meant to be merged as-is.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
device/device.go
device/uapi.go

index 5f128fc402ebde83dc51de05f16ff861e69185ef..f7885ce6ca76ad11196e97732d39d83e21aff5b8 100644 (file)
@@ -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
 
index 2843a4c20be37d5d677fae4e30ff8c0b6e9c60f7..3575c115ce7d47386a42aa87005730dbf67dfdec 100644 (file)
@@ -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}
                                }