code: func (ch *Channel) receiveReplyInternal(msg api.Message, expSeqNum uint16) (lastReplyReceived bool, err error) {
  	if msg == nil {
  		return false, errors.New("nil message passed in")
  	}
  
  	var ignore bool
  
  	if vppReply := ch.delayedReply; vppReply != nil {
  		// try the delayed reply
  		ch.delayedReply = nil
  		ignore, lastReplyReceived, err = ch.processReply(vppReply, expSeqNum, msg)
  		if !ignore {
  			return lastReplyReceived, err
  		}
  	}
  
  	timer := time.NewTimer(ch.replyTimeout)
  	for {
  		select {
  		// blocks until a reply comes to ReplyChan or until timeout expires
  		case vppReply := <-ch.replyChan:
  			ignore, lastReplyReceived, err = ch.processReply(vppReply, expSeqNum, msg)
  			if ignore {
  				logrus.Warnf("ignoring reply: %+v", vppReply)
  				continue
  			}
  			return lastReplyReceived, err
  
  		case <-timer.C:
  			err = fmt.Errorf("no reply received within the timeout period %s", ch.replyTimeout)
  			return false, err
  		}
  	}
  	return
  }
docs: // receiveReplyInternal receives a reply from the reply channel into the provided msg structure.