68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
package node
|
|
|
|
import (
|
|
"log"
|
|
"net/netip"
|
|
"time"
|
|
)
|
|
|
|
func addrDiscoveryServer() {
|
|
var (
|
|
buf1 = make([]byte, bufferSize)
|
|
buf2 = make([]byte, bufferSize)
|
|
)
|
|
|
|
for {
|
|
msg := <-discoveryMessages
|
|
p := msg.Packet
|
|
|
|
route := routingTable[msg.SrcIP].Load()
|
|
if route == nil || !route.RemoteAddr.IsValid() {
|
|
continue
|
|
}
|
|
|
|
_sendControlPacket(addrDiscoveryPacket{
|
|
TraceID: p.TraceID,
|
|
ToAddr: msg.SrcAddr,
|
|
}, *route, buf1, buf2)
|
|
}
|
|
}
|
|
|
|
func addrDiscoveryClient() {
|
|
var (
|
|
checkInterval = 8 * time.Second
|
|
timer = time.NewTimer(4 * time.Second)
|
|
|
|
buf1 = make([]byte, bufferSize)
|
|
buf2 = make([]byte, bufferSize)
|
|
|
|
addrPacket addrDiscoveryPacket
|
|
lAddr netip.AddrPort
|
|
)
|
|
|
|
for {
|
|
select {
|
|
case msg := <-discoveryMessages:
|
|
p := msg.Packet
|
|
if p.TraceID != addrPacket.TraceID || !p.ToAddr.IsValid() || p.ToAddr == lAddr {
|
|
continue
|
|
}
|
|
|
|
log.Printf("Discovered local address: %v", p.ToAddr)
|
|
lAddr = p.ToAddr
|
|
localAddr.Store(&p.ToAddr)
|
|
|
|
case <-timer.C:
|
|
timer.Reset(checkInterval)
|
|
|
|
route := getRelayRoute()
|
|
if route == nil {
|
|
continue
|
|
}
|
|
|
|
addrPacket.TraceID = newTraceID()
|
|
_sendControlPacket(addrPacket, *route, buf1, buf2)
|
|
}
|
|
}
|
|
}
|