|
|
|
|
@ -168,16 +168,14 @@ func (m *peerMap) forEachEndpointWithDiscoKey(dk key.DiscoPublic, f func(ep *end |
|
|
|
|
// upsertEndpoint stores endpoint in the peerInfo for
|
|
|
|
|
// ep.publicKey, and updates indexes. m must already have a
|
|
|
|
|
// tailcfg.Node for ep.publicKey.
|
|
|
|
|
func (m *peerMap) upsertEndpoint(ep *endpoint) { |
|
|
|
|
func (m *peerMap) upsertEndpoint(ep *endpoint, oldDiscoKey key.DiscoPublic) { |
|
|
|
|
pi := m.byNodeKey[ep.publicKey] |
|
|
|
|
if pi == nil { |
|
|
|
|
pi = newPeerInfo(ep) |
|
|
|
|
m.byNodeKey[ep.publicKey] = pi |
|
|
|
|
} else { |
|
|
|
|
old := pi.ep |
|
|
|
|
pi.ep = ep |
|
|
|
|
if old.discoKey != ep.discoKey { |
|
|
|
|
delete(m.nodesOfDisco[old.discoKey], ep.publicKey) |
|
|
|
|
if oldDiscoKey != ep.discoKey { |
|
|
|
|
delete(m.nodesOfDisco[oldDiscoKey], ep.publicKey) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if !ep.discoKey.IsZero() { |
|
|
|
|
@ -2306,8 +2304,9 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) { |
|
|
|
|
// handle full set updates.
|
|
|
|
|
for _, n := range nm.Peers { |
|
|
|
|
if ep, ok := c.peerMap.endpointForNodeKey(n.Key); ok { |
|
|
|
|
oldDiscoKey := ep.discoKey |
|
|
|
|
ep.updateFromNode(n) |
|
|
|
|
c.peerMap.upsertEndpoint(ep) // maybe update discokey mappings in peerMap
|
|
|
|
|
c.peerMap.upsertEndpoint(ep, oldDiscoKey) // maybe update discokey mappings in peerMap
|
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -2347,7 +2346,7 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) { |
|
|
|
|
} |
|
|
|
|
})) |
|
|
|
|
ep.updateFromNode(n) |
|
|
|
|
c.peerMap.upsertEndpoint(ep) |
|
|
|
|
c.peerMap.upsertEndpoint(ep, key.DiscoPublic{}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If the set of nodes changed since the last SetNetworkMap, the
|
|
|
|
|
|