@ -21,10 +21,8 @@ import (
"tailscale.com/ipn/ipnext"
"tailscale.com/ipn/localapi"
"tailscale.com/net/udprelay"
"tailscale.com/net/udprelay/endpoint"
"tailscale.com/net/udprelay/status"
"tailscale.com/tailcfg"
"tailscale.com/types/key"
"tailscale.com/types/logger"
"tailscale.com/types/ptr"
"tailscale.com/util/eventbus"
@ -91,13 +89,6 @@ type extension struct {
hasNodeAttrDisableRelayServer bool // tailcfg.NodeAttrDisableRelayServer
}
// relayServer is the interface of [udprelay.Server].
type relayServer interface {
AllocateEndpoint ( discoA key . DiscoPublic , discoB key . DiscoPublic ) ( endpoint . ServerEndpoint , error )
Close ( ) error
GetSessions ( ) [ ] status . ServerSession
}
// Name implements [ipnext.Extension].
func ( e * extension ) Name ( ) string {
return featureName
@ -182,7 +173,11 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
debugSessionsCh := e . debugSessionsCh
return func ( ec * eventbus . Client ) {
var rs relayServer // lazily initialized
rs , err := udprelay . NewServer ( e . logf , port , overrideAddrs ( ) )
if err != nil {
e . logf ( "error initializing server: %v" , err )
}
defer func ( ) {
if rs != nil {
rs . Close ( )
@ -194,7 +189,6 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
return
case respCh := <- debugSessionsCh :
if rs == nil {
// Don't initialize the server simply for a debug request.
respCh <- nil
continue
}
@ -202,7 +196,8 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
respCh <- sessions
case req := <- reqSub . Events ( ) :
if rs == nil {
var err error
// The server may have previously failed to initialize if
// the configured port was in use, try again.
rs , err = udprelay . NewServer ( e . logf , port , overrideAddrs ( ) )
if err != nil {
e . logf ( "error initializing server: %v" , err )