func (ms *monitors) onPeerMsg(handle Handle, msg btcmsg.Message) { ms.mutex.RLock() defer ms.mutex.RUnlock() m, ok := ms.msgReceivers[msg.Command()] if ok { m.OnPeerMsg(handle, msg) } }
// Some of the messages are handled here instead of being sent to upper level // Returns true if we don't want send this message to upper level func (p *Peer) handleMessage(msg btcmsg.Message) bool { // Update timers p.keepAliveTimer.Reset(timeToPing) p.kickTimer.Reset(timeToKick) // Handle msg switch msg.Command() { case "ping": ping := msg.(*btcmsg.Message_ping) pong := btcmsg.NewPongMsg().(*btcmsg.Message_pong) pong.Nonce = ping.Nonce p.sendMsg(pong, 0, nil) return true case "pong": pong := msg.(*btcmsg.Message_pong) if pong.Nonce != uint64(p.handle) { // log.Infof("Bad pong nonce from: %d!=%d", p.handle, pong.Nonce) } return true default: p.expMutex.Lock() defer p.expMutex.Unlock() exps := p.expectors for i, e := range exps { if accept, stop := e.filter(msg); accept { e.retChan <- struct { btcmsg.Message Error error }{msg, nil} // Delete the expector if stop { close(e.done) p.expectors = append(exps[:i], exps[i+1:]...) } return true } } } return false }