58 lines
1.0 KiB
Go
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,
|
|
})
|
|
}
|