|
|
|
@ -54,6 +54,7 @@ type Server struct {
|
|
|
|
|
updates map[tailcfg.NodeID]chan updateType
|
|
|
|
|
authPath map[string]*AuthPath
|
|
|
|
|
nodeKeyAuthed map[tailcfg.NodeKey]bool // key => true once authenticated
|
|
|
|
|
pingReqsToAdd map[tailcfg.NodeKey]*tailcfg.PingRequest
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NumNodes returns the number of nodes in the testcontrol server.
|
|
|
|
@ -67,6 +68,27 @@ func (s *Server) NumNodes() int {
|
|
|
|
|
return len(s.nodes)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AddPingRequest sends the ping pr to nodeKeyDst. It reports whether it did so. That is,
|
|
|
|
|
// it reports whether nodeKeyDst was connected.
|
|
|
|
|
func (s *Server) AddPingRequest(nodeKeyDst tailcfg.NodeKey, pr *tailcfg.PingRequest) bool {
|
|
|
|
|
s.mu.Lock()
|
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
if s.pingReqsToAdd == nil {
|
|
|
|
|
s.pingReqsToAdd = map[tailcfg.NodeKey]*tailcfg.PingRequest{}
|
|
|
|
|
}
|
|
|
|
|
// Now send the update to the channel
|
|
|
|
|
node := s.nodeLocked(nodeKeyDst)
|
|
|
|
|
if node == nil {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s.pingReqsToAdd[nodeKeyDst] = pr
|
|
|
|
|
nodeID := node.ID
|
|
|
|
|
oldUpdatesCh := s.updates[nodeID]
|
|
|
|
|
sendUpdate(oldUpdatesCh, updateDebugInjection)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type AuthPath struct {
|
|
|
|
|
nodeKey tailcfg.NodeKey
|
|
|
|
|
|
|
|
|
@ -380,6 +402,9 @@ const (
|
|
|
|
|
// via a lite endpoint update. These ones are never dup-suppressed,
|
|
|
|
|
// as the client is expecting an answer regardless.
|
|
|
|
|
updateSelfChanged
|
|
|
|
|
|
|
|
|
|
// updateDebugInjection is an update used for PingRequests
|
|
|
|
|
updateDebugInjection
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func (s *Server) updateLocked(source string, peers []tailcfg.NodeID) {
|
|
|
|
@ -561,6 +586,14 @@ func (s *Server) MapResponse(req *tailcfg.MapRequest) (res *tailcfg.MapResponse,
|
|
|
|
|
netaddr.MustParseIPPrefix(fmt.Sprintf("100.64.%d.%d/32", uint8(node.ID>>8), uint8(node.ID))),
|
|
|
|
|
}
|
|
|
|
|
res.Node.AllowedIPs = res.Node.Addresses
|
|
|
|
|
|
|
|
|
|
// Consume the PingRequest while protected by mutex if it exists
|
|
|
|
|
s.mu.Lock()
|
|
|
|
|
if pr, ok := s.pingReqsToAdd[node.Key]; ok {
|
|
|
|
|
res.PingRequest = pr
|
|
|
|
|
delete(s.pingReqsToAdd, node.Key)
|
|
|
|
|
}
|
|
|
|
|
s.mu.Unlock()
|
|
|
|
|
return res, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|