package node import ( "sync/atomic" ) func getRelayRoute() *peerRoute { if ip := relayIP.Load(); ip != nil { return routingTable[*ip].Load() } return nil } func _sendControlPacket(pkt interface{ Marshal([]byte) []byte }, route peerRoute, buf1, buf2 []byte) { buf := pkt.Marshal(buf2) h := header{ StreamID: controlStreamID, Counter: atomic.AddUint64(&sendCounters[route.IP], 1), SourceIP: localIP, DestIP: route.IP, } buf = route.ControlCipher.Encrypt(h, buf, buf1) if route.Direct { _conn.WriteTo(buf, route.RemoteAddr) return } _relayPacket(route.IP, buf, buf2) } func _sendDataPacket(route *peerRoute, pkt, buf1, 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.Direct { _conn.WriteTo(enc, route.RemoteAddr) return } _relayPacket(route.IP, enc, buf2) } func _relayPacket(destIP byte, data, buf []byte) { relayRoute := getRelayRoute() if relayRoute == nil || !relayRoute.Up || !relayRoute.Relay { return } h := header{ StreamID: dataStreamID, Counter: atomic.AddUint64(&sendCounters[relayRoute.IP], 1), SourceIP: localIP, DestIP: destIP, } enc := relayRoute.DataCipher.Encrypt(h, data, buf) _conn.WriteTo(enc, relayRoute.RemoteAddr) }