|
|
|
|
@ -41,7 +41,7 @@ const sprayPeriod = 3 * time.Second |
|
|
|
|
// be fake addrs representing DERP servers.
|
|
|
|
|
//
|
|
|
|
|
// It also returns as's current roamAddr, if any.
|
|
|
|
|
func (as *AddrSet) appendDests(dsts []netaddr.IPPort, b []byte) (_ []netaddr.IPPort, roamAddr netaddr.IPPort) { |
|
|
|
|
func (as *addrSet) appendDests(dsts []netaddr.IPPort, b []byte) (_ []netaddr.IPPort, roamAddr netaddr.IPPort) { |
|
|
|
|
spray := shouldSprayPacket(b) // true for handshakes
|
|
|
|
|
now := as.timeNow() |
|
|
|
|
|
|
|
|
|
@ -127,11 +127,11 @@ func (as *AddrSet) appendDests(dsts []netaddr.IPPort, b []byte) (_ []netaddr.IPP |
|
|
|
|
return dsts, roamAddr |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// AddrSet is a set of UDP addresses that implements wireguard/conn.Endpoint.
|
|
|
|
|
// addrSet is a set of UDP addresses that implements wireguard/conn.Endpoint.
|
|
|
|
|
//
|
|
|
|
|
// This is the legacy endpoint for peers that don't support discovery;
|
|
|
|
|
// it predates discoEndpoint.
|
|
|
|
|
type AddrSet struct { |
|
|
|
|
type addrSet struct { |
|
|
|
|
publicKey key.Public // peer public key used for DERP communication
|
|
|
|
|
|
|
|
|
|
// addrs is an ordered priority list provided by wgengine,
|
|
|
|
|
@ -180,8 +180,8 @@ type AddrSet struct { |
|
|
|
|
loggedLogPriMask uint32 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// derpID returns this AddrSet's home DERP node, or 0 if none is found.
|
|
|
|
|
func (as *AddrSet) derpID() int { |
|
|
|
|
// 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 |
|
|
|
|
@ -190,7 +190,7 @@ func (as *AddrSet) derpID() int { |
|
|
|
|
return 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (as *AddrSet) timeNow() time.Time { |
|
|
|
|
func (as *addrSet) timeNow() time.Time { |
|
|
|
|
if as.clock != nil { |
|
|
|
|
return as.clock() |
|
|
|
|
} |
|
|
|
|
@ -199,7 +199,7 @@ func (as *AddrSet) timeNow() time.Time { |
|
|
|
|
|
|
|
|
|
var noAddr, _ = netaddr.FromStdAddr(net.ParseIP("127.127.127.127"), 127, "") |
|
|
|
|
|
|
|
|
|
func (a *AddrSet) dst() netaddr.IPPort { |
|
|
|
|
func (a *addrSet) dst() netaddr.IPPort { |
|
|
|
|
a.mu.Lock() |
|
|
|
|
defer a.mu.Unlock() |
|
|
|
|
|
|
|
|
|
@ -229,21 +229,21 @@ func packUDPAddr(ua *net.UDPAddr) []byte { |
|
|
|
|
return b |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (a *AddrSet) DstToBytes() []byte { |
|
|
|
|
func (a *addrSet) DstToBytes() []byte { |
|
|
|
|
return packIPPort(a.dst()) |
|
|
|
|
} |
|
|
|
|
func (a *AddrSet) DstToString() string { |
|
|
|
|
func (a *addrSet) DstToString() string { |
|
|
|
|
dst := a.dst() |
|
|
|
|
return dst.String() |
|
|
|
|
} |
|
|
|
|
func (a *AddrSet) DstIP() net.IP { |
|
|
|
|
func (a *addrSet) DstIP() net.IP { |
|
|
|
|
return a.dst().IP.IPAddr().IP // TODO: add netaddr accessor to cut an alloc here?
|
|
|
|
|
} |
|
|
|
|
func (a *AddrSet) SrcIP() net.IP { return nil } |
|
|
|
|
func (a *AddrSet) SrcToString() string { return "" } |
|
|
|
|
func (a *AddrSet) ClearSrc() {} |
|
|
|
|
func (a *addrSet) SrcIP() net.IP { return nil } |
|
|
|
|
func (a *addrSet) SrcToString() string { return "" } |
|
|
|
|
func (a *addrSet) ClearSrc() {} |
|
|
|
|
|
|
|
|
|
func (a *AddrSet) UpdateDst(new *net.UDPAddr) error { |
|
|
|
|
func (a *addrSet) UpdateDst(new *net.UDPAddr) error { |
|
|
|
|
if new.IP.Equal(derpMagicIP) { |
|
|
|
|
// Never consider DERP addresses as a viable candidate for
|
|
|
|
|
// either curAddr or roamAddr. It's only ever a last resort
|
|
|
|
|
@ -327,7 +327,7 @@ func equalUDPAddr(x, y *net.UDPAddr) bool { |
|
|
|
|
return x.Port == y.Port && x.IP.Equal(y.IP) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (a *AddrSet) String() string { |
|
|
|
|
func (a *addrSet) String() string { |
|
|
|
|
a.mu.Lock() |
|
|
|
|
defer a.mu.Unlock() |
|
|
|
|
|
|
|
|
|
@ -351,7 +351,7 @@ func (a *AddrSet) String() string { |
|
|
|
|
return buf.String() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (as *AddrSet) populatePeerStatus(ps *ipnstate.PeerStatus) { |
|
|
|
|
func (as *addrSet) populatePeerStatus(ps *ipnstate.PeerStatus) { |
|
|
|
|
as.mu.Lock() |
|
|
|
|
defer as.mu.Unlock() |
|
|
|
|
|
|
|
|
|
@ -371,7 +371,7 @@ func (as *AddrSet) populatePeerStatus(ps *ipnstate.PeerStatus) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (a *AddrSet) Addrs() []wgcfg.Endpoint { |
|
|
|
|
func (a *addrSet) Addrs() []wgcfg.Endpoint { |
|
|
|
|
var eps []wgcfg.Endpoint |
|
|
|
|
for _, addr := range a.addrs { |
|
|
|
|
eps = append(eps, wgcfg.Endpoint{ |
|
|
|
|
|