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