vppn/node/globalfuncs.go
2024-12-23 08:08:23 +01:00

80 lines
1.6 KiB
Go

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