This commit is contained in:
jdl 2025-02-19 16:34:03 +01:00
parent fb8f51ba67
commit b797c5b321
9 changed files with 89 additions and 65 deletions

View File

@ -50,9 +50,7 @@ func (r *connReader) Run() {
func (r *connReader) handleNextPacket() { func (r *connReader) handleNextPacket() {
buf := r.buf[:bufferSize] buf := r.buf[:bufferSize]
log.Printf("Getting next packet...")
n, remoteAddr, err := r.readFromUDPAddrPort(buf) n, remoteAddr, err := r.readFromUDPAddrPort(buf)
log.Printf("Packet from %v...", remoteAddr)
if err != nil { if err != nil {
log.Fatalf("Failed to read from UDP port: %v", err) log.Fatalf("Failed to read from UDP port: %v", err)
} }

View File

@ -51,9 +51,7 @@ func newHubPoller(
} }
func (hp *hubPoller) Run() { func (hp *hubPoller) Run() {
log.Printf("Running hub poller...")
state, err := loadNetworkState(hp.netName) state, err := loadNetworkState(hp.netName)
log.Printf("Got state (%s) : %v", hp.netName, state)
if err != nil { if err != nil {
log.Printf("Failed to load network state: %v", err) log.Printf("Failed to load network state: %v", err)
log.Printf("Polling hub...") log.Printf("Polling hub...")

View File

@ -1,54 +1,70 @@
package peer package peer
/* import (
type mcReader struct { "log"
conn udpReader "net"
super controlMsgHandler "sync/atomic"
peers [256]*atomic.Pointer[remotePeer] "time"
)
incoming []byte func runMCReader(
buf []byte rt *atomic.Pointer[routingTable],
} handleControlMsg func(destIP byte, msg any),
) {
func newMCReader(
conn udpReader,
super controlMsgHandler,
peers [256]*atomic.Pointer[remotePeer],
) *mcReader {
return &mcReader{conn, super, peers, newBuf(), newBuf()}
}
func (r *mcReader) Run() {
for { for {
r.handleNextPacket() runMCReader2(rt, handleControlMsg)
time.Sleep(8 * time.Second)
} }
} }
func (r *mcReader) handleNextPacket() { func runMCReader2(
incoming := r.incoming[:bufferSize] rt *atomic.Pointer[routingTable],
n, remoteAddr, err := r.conn.ReadFromUDPAddrPort(incoming) handleControlMsg func(destIP byte, msg any),
) {
var (
raw = newBuf()
buf = newBuf()
logf = func(s string, args ...any) {
log.Printf("[MCReader] "+s, args...)
}
)
conn, err := net.ListenMulticastUDP("udp", nil, multicastAddr)
if err != nil { if err != nil {
log.Fatalf("Failed to read from UDP multicast port: %v", err) logf("Failed to bind to multicast address: %v", err)
}
incoming = incoming[:n]
h, ok := headerFromLocalDiscoveryPacket(incoming)
if !ok {
return return
} }
peer := r.peers[h.SourceIP].Load() for {
if peer == nil || peer.PubSignKey == nil { conn.SetReadDeadline(time.Now().Add(32 * time.Second))
return n, remoteAddr, err := conn.ReadFromUDPAddrPort(raw[:bufferSize])
} if err != nil {
logf("Failed to read from UDP port): %v", err)
return
}
if !verifyLocalDiscoveryPacket(incoming, r.buf, peer.PubSignKey) { raw = raw[:n]
return h, ok := headerFromLocalDiscoveryPacket(raw)
} if !ok {
logf("Failed to open discovery packet?")
continue
}
r.super.HandleControlMsg(controlMsg[packetLocalDiscovery]{ peer := rt.Load().Peers[h.SourceIP]
SrcIP: h.SourceIP, if peer.PubSignKey == nil {
SrcAddr: remoteAddr, logf("No signing key for peer %d.", h.SourceIP)
}) continue
}
if !verifyLocalDiscoveryPacket(raw, buf, peer.PubSignKey) {
logf("Invalid signature from peer: %d", h.SourceIP)
continue
}
msg := controlMsg[packetLocalDiscovery]{
SrcIP: h.SourceIP,
SrcAddr: remoteAddr,
}
handleControlMsg(h.SourceIP, msg)
}
} }
*/

View File

@ -1,6 +1,10 @@
package peer package peer
import ( import (
"log"
"net"
"time"
"golang.org/x/crypto/nacl/sign" "golang.org/x/crypto/nacl/sign"
) )
@ -32,22 +36,18 @@ func verifyLocalDiscoveryPacket(pkt, buf []byte, pubSignKey []byte) bool {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/* func runMCWriter(localIP byte, signingKey []byte) {
type mcWriter struct { discoveryPacket := createLocalDiscoveryPacket(localIP, signingKey)
conn mcUDPWriter conn, err := net.ListenMulticastUDP("udp", nil, multicastAddr)
discoveryPacket []byte if err != nil {
} log.Fatalf("Failed to bind to multicast address: %v", err)
}
func newMCWriter(conn mcUDPWriter, localIP byte, signingKey []byte) *mcWriter { for range time.Tick(16 * time.Second) {
return &mcWriter{ _, err := conn.WriteToUDP(discoveryPacket, multicastAddr)
conn: conn, if err != nil {
discoveryPacket: createLocalDiscoveryPacket(localIP, signingKey), log.Printf("[MCWriter] Failed to write multicast: %v", err)
}
} }
} }
func (w *mcWriter) SendLocalDiscovery() {
if _, err := w.conn.WriteToUDP(w.discoveryPacket, multicastAddr); err != nil {
log.Printf("[MCWriter] Failed to write multicast UDP packet: %v", err)
}
}*/

View File

@ -16,6 +16,8 @@ import (
) )
type peerMain struct { type peerMain struct {
conf localConfig
rt *atomic.Pointer[routingTable]
ifReader *ifReader ifReader *ifReader
connReader *connReader connReader *connReader
iface io.Writer iface io.Writer
@ -92,6 +94,8 @@ func newPeerMain(conf peerConfig) *peerMain {
} }
return &peerMain{ return &peerMain{
conf: config,
rt: rtPtr,
iface: iface, iface: iface,
ifReader: ifReader, ifReader: ifReader,
connReader: connReader, connReader: connReader,
@ -104,6 +108,8 @@ func (p *peerMain) Run() {
go p.ifReader.Run() go p.ifReader.Run()
go p.connReader.Run() go p.connReader.Run()
p.super.Start() p.super.Start()
go runMCWriter(p.conf.PeerIP, p.conf.PrivSignKey)
go runMCReader(p.rt, p.super.HandleControlMsg)
p.hubPoller.Run() p.hubPoller.Run()
} }

View File

@ -70,7 +70,6 @@ func (s *pState) OnPeerUpdate(peer *m.Peer) peerState {
s.staged.IP = peer.PeerIP s.staged.IP = peer.PeerIP
s.staged.PubSignKey = peer.PubSignKey s.staged.PubSignKey = peer.PubSignKey
log.Printf("New cipher: %x, %x", s.privKey, peer.PubKey)
s.staged.ControlCipher = newControlCipher(s.privKey, peer.PubKey) s.staged.ControlCipher = newControlCipher(s.privKey, peer.PubKey)
s.staged.DataCipher = newDataCipher() s.staged.DataCipher = newDataCipher()

View File

@ -5,10 +5,12 @@ import (
"net/netip" "net/netip"
"runtime/debug" "runtime/debug"
"sort" "sort"
"sync"
"time" "time"
) )
type pubAddrStore struct { type pubAddrStore struct {
lock sync.Mutex
localPub bool localPub bool
localAddr netip.AddrPort localAddr netip.AddrPort
lastSeen map[netip.AddrPort]time.Time lastSeen map[netip.AddrPort]time.Time
@ -25,6 +27,9 @@ func newPubAddrStore(localAddr netip.AddrPort) *pubAddrStore {
} }
func (store *pubAddrStore) Store(add netip.AddrPort) { func (store *pubAddrStore) Store(add netip.AddrPort) {
store.lock.Lock()
defer store.lock.Unlock()
if store.localPub { if store.localPub {
log.Printf("OOPS: Local pub but storage attempt: %s", debug.Stack()) log.Printf("OOPS: Local pub but storage attempt: %s", debug.Stack())
return return
@ -42,6 +47,11 @@ func (store *pubAddrStore) Store(add netip.AddrPort) {
} }
func (store *pubAddrStore) Get() (addrs [8]netip.AddrPort) { func (store *pubAddrStore) Get() (addrs [8]netip.AddrPort) {
store.lock.Lock()
defer store.lock.Unlock()
store.clean()
if store.localPub { if store.localPub {
addrs[0] = store.localAddr addrs[0] = store.localAddr
return return
@ -51,7 +61,7 @@ func (store *pubAddrStore) Get() (addrs [8]netip.AddrPort) {
return return
} }
func (store *pubAddrStore) Clean() { func (store *pubAddrStore) clean() {
if store.localPub { if store.localPub {
return return
} }

View File

@ -20,7 +20,7 @@ func TestPubAddrStore(t *testing.T) {
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond)
} }
s.Clean() s.clean()
l2 := s.Get() l2 := s.Get()
if l2[0] != l[2] || l2[1] != l[1] || l2[2] != l[0] { if l2[0] != l[2] || l2[1] != l[1] || l2[2] != l[0] {

View File

@ -1,7 +1,6 @@
package peer package peer
import ( import (
"log"
"net/netip" "net/netip"
"sync/atomic" "sync/atomic"
"time" "time"
@ -68,8 +67,6 @@ func (p remotePeer) EncryptControlPacket(pkt marshaller, tmp, out []byte) []byte
DestIP: p.IP, DestIP: p.IP,
} }
log.Printf("Encrypting with header: %#v", h)
return p.ControlCipher.Encrypt(h, tmp, out) return p.ControlCipher.Encrypt(h, tmp, out)
} }