cmd/tailscaled, ipn/{ipnlocal,ipnserver}: let netstack get access to LocalBackend

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick
2021-03-15 09:23:38 -07:00
committed by Brad Fitzpatrick
parent 25d2dd868b
commit 2bc518dcb2
3 changed files with 40 additions and 0 deletions

28
ipn/ipnlocal/future.go Normal file
View File

@@ -0,0 +1,28 @@
// 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 ipnlocal
import "sync"
// LocalBackendFuture is a Future that returns a *LocalBackend.
type LocalBackendFuture struct {
getOnce sync.Once
ch chan *LocalBackend
v *LocalBackend
}
func (f *LocalBackendFuture) Get() *LocalBackend {
f.getOnce.Do(f.get)
return f.v
}
func (f *LocalBackendFuture) get() { f.v = <-f.ch }
func (f *LocalBackendFuture) Set(v *LocalBackend) { f.ch <- v }
func NewLocalBackendFuture() *LocalBackendFuture {
return &LocalBackendFuture{
ch: make(chan *LocalBackend, 1),
}
}

View File

@@ -92,6 +92,10 @@ type Options struct {
// DebugMux, if non-nil, specifies an HTTP ServeMux in which
// to register a debug handler.
DebugMux *http.ServeMux
// OnBackendCreated, if non-nil, is called once when the LocalBackend
// is created.
OnBackendCreated func(*ipnlocal.LocalBackend)
}
// server is an IPN backend and its set of 0 or more active connections
@@ -739,6 +743,10 @@ func Run(ctx context.Context, logf logger.Logf, logid string, getEngine func() (
return smallzstd.NewDecoder(nil)
})
if opts.OnBackendCreated != nil {
opts.OnBackendCreated(b)
}
if opts.DebugMux != nil {
opts.DebugMux.HandleFunc("/debug/ipn", func(w http.ResponseWriter, r *http.Request) {
serveHTMLStatus(w, b)