89 lines
2.0 KiB
Go
89 lines
2.0 KiB
Go
package node
|
|
|
|
import (
|
|
"net/netip"
|
|
"sync/atomic"
|
|
"time"
|
|
"vppn/m"
|
|
)
|
|
|
|
const (
|
|
bufferSize = 1536
|
|
if_mtu = 1200
|
|
if_queue_len = 2048
|
|
controlCipherOverhead = 16
|
|
dataCipherOverhead = 16
|
|
)
|
|
|
|
type peerRoute struct {
|
|
IP byte
|
|
Up bool // True if data can be sent on the route.
|
|
Relay bool // True if the peer is a relay.
|
|
Direct bool // True if this is a direct connection.
|
|
PubSignKey []byte
|
|
ControlCipher *controlCipher
|
|
DataCipher *dataCipher
|
|
RemoteAddr netip.AddrPort // Remote address if directly connected.
|
|
}
|
|
|
|
var (
|
|
// Configuration for this peer.
|
|
netName string
|
|
localIP byte
|
|
localPub bool
|
|
privKey []byte
|
|
privSignKey []byte
|
|
|
|
// Shared interface for writing.
|
|
_iface *ifWriter
|
|
|
|
// Shared connection for writing.
|
|
_conn *connWriter
|
|
|
|
// Counters for sending to each peer.
|
|
sendCounters [256]uint64 = func() (out [256]uint64) {
|
|
for i := range out {
|
|
out[i] = uint64(time.Now().Unix()<<30 + 1)
|
|
}
|
|
return
|
|
}()
|
|
|
|
// Duplicate checkers for incoming packets.
|
|
dupChecks [256]*dupCheck = func() (out [256]*dupCheck) {
|
|
for i := range out {
|
|
out[i] = newDupCheck(0)
|
|
}
|
|
return
|
|
}()
|
|
|
|
// Channels for incoming control packets.
|
|
controlPackets [256]chan controlPacket = func() (out [256]chan controlPacket) {
|
|
for i := range out {
|
|
out[i] = make(chan controlPacket, 256)
|
|
}
|
|
return
|
|
}()
|
|
|
|
// Channels for incoming peer updates from the hub.
|
|
peerUpdates [256]chan *m.Peer = func() (out [256]chan *m.Peer) {
|
|
for i := range out {
|
|
out[i] = make(chan *m.Peer)
|
|
}
|
|
return
|
|
}()
|
|
|
|
// Global routing table.
|
|
routingTable [256]*atomic.Pointer[peerRoute] = func() (out [256]*atomic.Pointer[peerRoute]) {
|
|
for i := range out {
|
|
out[i] = &atomic.Pointer[peerRoute]{}
|
|
out[i].Store(&peerRoute{})
|
|
}
|
|
return
|
|
}()
|
|
|
|
// Managed by the relayManager.
|
|
discoveryPackets = make(chan controlPacket, 256)
|
|
localAddr = &atomic.Pointer[netip.AddrPort]{}
|
|
relayIP = &atomic.Pointer[byte]{}
|
|
)
|