|
|
|
|
@ -389,6 +389,26 @@ func (c *Conn) pickDERPFallback() int { |
|
|
|
|
return 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// See where our peers are. Pick wherever the most nodes are.
|
|
|
|
|
var ( |
|
|
|
|
peersOnDerp = map[int]int{} |
|
|
|
|
best int |
|
|
|
|
bestCount int |
|
|
|
|
) |
|
|
|
|
for _, as := range c.addrsByKey { |
|
|
|
|
if id := as.derpID(); id != 0 { |
|
|
|
|
peersOnDerp[id]++ |
|
|
|
|
if v := peersOnDerp[id]; v > bestCount { |
|
|
|
|
bestCount = v |
|
|
|
|
best = id |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if best != 0 { |
|
|
|
|
return best |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Otherwise just pick something randomly.
|
|
|
|
|
h := fnv.New64() |
|
|
|
|
h.Write([]byte(fmt.Sprintf("%p/%d", c, processStartUnixNano))) // arbitrary
|
|
|
|
|
return ids[rand.New(rand.NewSource(int64(h.Sum64()))).Intn(len(ids))] |
|
|
|
|
@ -1487,6 +1507,16 @@ type AddrSet struct { |
|
|
|
|
lastSpray time.Time |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// derpID returns this AddrSet's home DERP node, or 0 if none is found.
|
|
|
|
|
func (as *AddrSet) derpID() int { |
|
|
|
|
for _, ua := range as.addrs { |
|
|
|
|
if ua.IP.Equal(derpMagicIP) { |
|
|
|
|
return ua.Port |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (as *AddrSet) timeNow() time.Time { |
|
|
|
|
if as.clock != nil { |
|
|
|
|
return as.clock() |
|
|
|
|
|