summaryrefslogtreecommitdiffhomepage
path: root/control/controlknobs/controlknobs.go
diff options
context:
space:
mode:
Diffstat (limited to 'control/controlknobs/controlknobs.go')
-rw-r--r--control/controlknobs/controlknobs.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/control/controlknobs/controlknobs.go b/control/controlknobs/controlknobs.go
new file mode 100644
index 000000000..884c0f8dd
--- /dev/null
+++ b/control/controlknobs/controlknobs.go
@@ -0,0 +1,41 @@
+// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package controlknobs contains client options configurable from control which can be turned on
+// or off. The ability to turn options on and off is for incrementally adding features in.
+package controlknobs
+
+import (
+ "os"
+ "strconv"
+ "sync/atomic"
+
+ "tailscale.com/types/opt"
+)
+
+// disableUPnP indicates whether to attempt UPnP mapping.
+var disableUPnP atomic.Value
+
+func init() {
+ v, _ := strconv.ParseBool(os.Getenv("TS_DISABLE_UPNP"))
+ var toStore opt.Bool
+ toStore.Set(v)
+ disableUPnP.Store(toStore)
+}
+
+// DisableUPnP reports the last reported value from control
+// whether UPnP portmapping should be disabled.
+func DisableUPnP() opt.Bool {
+ v, _ := disableUPnP.Load().(opt.Bool)
+ return v
+}
+
+// SetDisableUPnP will set whether UPnP connections are permitted or not,
+// intended to be set from control.
+func SetDisableUPnP(v opt.Bool) {
+ old, ok := disableUPnP.Load().(opt.Bool)
+ if !ok || old != v {
+ disableUPnP.Store(v)
+ }
+}