package node import ( "log" "net/netip" "time" ) func addrDiscoveryServer() { var ( buf1 = make([]byte, bufferSize) buf2 = make([]byte, bufferSize) ) for { pkt := <-discoveryPackets p, ok := pkt.Payload.(addrDiscoveryPacket) if !ok { continue } route := routingTable[pkt.SrcIP].Load() if route == nil || !route.RemoteAddr.IsValid() { continue } _sendControlPacket(addrDiscoveryPacket{ TraceID: p.TraceID, ToAddr: pkt.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 pkt := <-discoveryPackets: p, ok := pkt.Payload.(addrDiscoveryPacket) if !ok || 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) } } }