|
|
|
|
@ -644,7 +644,11 @@ func (c *Conn) consumeEventbusTopics(cli *eventbus.Client) func(*eventbus.Client
|
|
|
|
|
nodeViewsSub := eventbus.Subscribe[NodeViewsUpdate](cli)
|
|
|
|
|
nodeMutsSub := eventbus.Subscribe[NodeMutationsUpdate](cli)
|
|
|
|
|
syncSub := eventbus.Subscribe[syncPoint](cli)
|
|
|
|
|
allocRelayEndpointSub := eventbus.Subscribe[UDPRelayAllocResp](cli)
|
|
|
|
|
|
|
|
|
|
var relayCh <-chan UDPRelayAllocResp
|
|
|
|
|
if buildfeatures.HasRelayServer {
|
|
|
|
|
relayCh = eventbus.Subscribe[UDPRelayAllocResp](cli).Events()
|
|
|
|
|
}
|
|
|
|
|
return func(cli *eventbus.Client) {
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
@ -661,11 +665,13 @@ func (c *Conn) consumeEventbusTopics(cli *eventbus.Client) func(*eventbus.Client
|
|
|
|
|
case syncPoint := <-syncSub.Events():
|
|
|
|
|
c.dlogf("magicsock: received sync point after reconfig")
|
|
|
|
|
syncPoint.Signal()
|
|
|
|
|
case allocResp := <-allocRelayEndpointSub.Events():
|
|
|
|
|
case allocResp := <-relayCh:
|
|
|
|
|
if buildfeatures.HasRelayServer {
|
|
|
|
|
c.onUDPRelayAllocResp(allocResp)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Conn) onUDPRelayAllocResp(allocResp UDPRelayAllocResp) {
|
|
|
|
|
@ -1945,12 +1951,14 @@ func (c *Conn) sendDiscoMessage(dst epAddr, dstKey key.NodePublic, dstDisco key.
|
|
|
|
|
var di *discoInfo
|
|
|
|
|
switch {
|
|
|
|
|
case isRelayHandshakeMsg:
|
|
|
|
|
if buildfeatures.HasRelayServer {
|
|
|
|
|
var ok bool
|
|
|
|
|
di, ok = c.relayManager.discoInfo(dstDisco)
|
|
|
|
|
if !ok {
|
|
|
|
|
c.mu.Unlock()
|
|
|
|
|
return false, errors.New("unknown relay server")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
case c.peerMap.knownPeerDiscoKey(dstDisco):
|
|
|
|
|
di = c.discoInfoForKnownPeerLocked(dstDisco)
|
|
|
|
|
default:
|
|
|
|
|
@ -2169,6 +2177,7 @@ func (c *Conn) handleDiscoMessage(msg []byte, src epAddr, shouldBeRelayHandshake
|
|
|
|
|
var di *discoInfo
|
|
|
|
|
switch {
|
|
|
|
|
case shouldBeRelayHandshakeMsg:
|
|
|
|
|
if buildfeatures.HasRelayServer {
|
|
|
|
|
var ok bool
|
|
|
|
|
di, ok = c.relayManager.discoInfo(sender)
|
|
|
|
|
if !ok {
|
|
|
|
|
@ -2177,6 +2186,7 @@ func (c *Conn) handleDiscoMessage(msg []byte, src epAddr, shouldBeRelayHandshake
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
case c.peerMap.knownPeerDiscoKey(sender):
|
|
|
|
|
di = c.discoInfoForKnownPeerLocked(sender)
|
|
|
|
|
default:
|
|
|
|
|
@ -2894,6 +2904,9 @@ func (c *Conn) onFilterUpdate(f FilterUpdate) {
|
|
|
|
|
// 2. Moving this work upstream into [nodeBackend] or similar, and publishing
|
|
|
|
|
// the computed result over the eventbus instead.
|
|
|
|
|
func (c *Conn) updateRelayServersSet(filt *filter.Filter, self tailcfg.NodeView, peers views.Slice[tailcfg.NodeView]) {
|
|
|
|
|
if !buildfeatures.HasRelayServer {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
relayServers := make(set.Set[candidatePeerRelay])
|
|
|
|
|
nodes := append(peers.AsSlice(), self)
|
|
|
|
|
for _, maybeCandidate := range nodes {
|
|
|
|
|
|