device: add Device.ListenPort and Device.SetListenPort

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>
This commit is contained in:
Josh Bleecher Snyder
2020-12-22 11:12:54 -08:00
parent 60b271ff95
commit 4794021bb8
2 changed files with 24 additions and 9 deletions

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