package node import ( "log" "sync/atomic" ) func _sendControlPacket( pkt interface{ Marshal([]byte) []byte }, route peerRoute, buf1 []byte, buf2 []byte, ) { buf := pkt.Marshal(buf1) h1 := header{ StreamID: controlStreamID, Counter: atomic.AddUint64(&sendCounters[route.IP], 1), SourceIP: localIP, DestIP: route.IP, } buf = route.ControlCipher.Encrypt(h1, buf, buf2) if route.RelayIP == 0 { _conn.WriteTo(buf, route.RemoteAddr) return } relayRoute := routingTable[route.RelayIP].Load() if !relayRoute.Up || !relayRoute.Relay { log.Print("Failed to send control packet: relay not available.") return } h2 := header{ StreamID: dataStreamID, Counter: atomic.AddUint64(&sendCounters[relayRoute.IP], 1), SourceIP: localIP, DestIP: route.IP, } buf = relayRoute.DataCipher.Encrypt(h2, buf, buf1) _conn.WriteTo(buf, relayRoute.RemoteAddr) } func _sendDataPacket( pkt []byte, route *peerRoute, buf1 []byte, buf2 []byte, ) { h := header{ StreamID: dataStreamID, Counter: atomic.AddUint64(&sendCounters[route.IP], 1), SourceIP: localIP, DestIP: route.IP, } enc := route.DataCipher.Encrypt(h, pkt, buf1) if route.RelayIP == 0 { _conn.WriteTo(enc, route.RemoteAddr) return } relayRoute := routingTable[route.RelayIP].Load() if !relayRoute.Up || !relayRoute.Relay { log.Print("Failed to send data packet: relay not available.") return } h2 := header{ StreamID: dataStreamID, Counter: atomic.AddUint64(&sendCounters[relayRoute.IP], 1), SourceIP: localIP, DestIP: route.IP, } enc = relayRoute.DataCipher.Encrypt(h2, enc, buf2) _conn.WriteTo(enc, relayRoute.RemoteAddr) }