vppn/peer/mcreader.go
2025-02-19 14:13:25 +01:00

58 lines
1.0 KiB
Go

package peer
import (
"log"
"sync/atomic"
)
type mcReader struct {
conn udpReader
super controlMsgHandler
peers [256]*atomic.Pointer[remotePeer]
incoming []byte
buf []byte
}
func newMCReader(
conn udpReader,
super controlMsgHandler,
peers [256]*atomic.Pointer[remotePeer],
) *mcReader {
return &mcReader{conn, super, peers, newBuf(), newBuf()}
}
func (r *mcReader) Run() {
for {
r.handleNextPacket()
}
}
func (r *mcReader) handleNextPacket() {
incoming := r.incoming[:bufferSize]
n, remoteAddr, err := r.conn.ReadFromUDPAddrPort(incoming)
if err != nil {
log.Fatalf("Failed to read from UDP multicast port: %v", err)
}
incoming = incoming[:n]
h, ok := headerFromLocalDiscoveryPacket(incoming)
if !ok {
return
}
peer := r.peers[h.SourceIP].Load()
if peer == nil || peer.PubSignKey == nil {
return
}
if !verifyLocalDiscoveryPacket(incoming, r.buf, peer.PubSignKey) {
return
}
r.super.HandleControlMsg(controlMsg[packetLocalDiscovery]{
SrcIP: h.SourceIP,
SrcAddr: remoteAddr,
})
}