in nmxact/nmserial/serial_sesn.go [289:334]
func (s *SerialSesn) RxCoap(opt sesn.TxOptions) (coap.Message, error) {
if !s.isOpen {
return nil, nmxutil.NewSesnClosedError(
"Attempt to listen for data from closed connection")
}
if s.cfg.MgmtProto != sesn.MGMT_PROTO_COAP_SERVER {
return nil, fmt.Errorf("Invalid operation for %s", s.cfg.MgmtProto)
}
if s.sx.reqSesn != s {
return nil, fmt.Errorf("Invalid operation")
}
waitTmoChan := time.After(opt.Timeout)
s.wg.Add(1)
defer s.wg.Done()
for {
select {
case data, ok := <-s.msgChan:
if !ok {
continue
}
msg, err := s.txvr.ProcessCoapReq(data)
if err != nil {
return nil, err
}
if msg != nil {
return msg, nil
}
case _, ok := <-waitTmoChan:
waitTmoChan = nil
if ok {
return nil, nmxutil.NewRspTimeoutError(
"RxCoap() timed out")
}
case err, ok := <-s.errChan:
if !ok {
continue
}
if err == errTimeout {
continue
}
return nil, err
case <-s.stopChan:
return nil, fmt.Errorf("Session closed")
}
}
}