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) } } }