74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package node
|
|
|
|
import (
|
|
"net/netip"
|
|
"sync/atomic"
|
|
)
|
|
|
|
func getRelayRoute() *peerRoute {
|
|
if ip := relayIP.Load(); ip != nil {
|
|
return routingTable[*ip].Load()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func getLocalAddr() netip.AddrPort {
|
|
if a := localAddr.Load(); a != nil {
|
|
return *a
|
|
}
|
|
return netip.AddrPort{}
|
|
}
|
|
|
|
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)
|
|
}
|