in nmxact/mtech_lora/mtech_lora_sesn.go [393:438]
func (s *LoraSesn) 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.tgtListener == nil {
return nil, fmt.Errorf("RxCoap() only connected sessions")
}
waitTmoChan := time.After(opt.Timeout)
s.wg.Add(1)
defer s.wg.Done()
for {
select {
case data, ok := <-s.msgListener.MsgChan:
if !ok {
continue
}
msg, err := s.txvr.ProcessCoapReq(data)
if err != nil {
return nil, err
}
if msg != nil {
return msg, nil
}
case mtu, ok := <-s.tgtListener.MtuChan:
if ok {
if s.mtu != mtu {
log.Debugf("Setting mtu for %s %d", s.cfg.Lora.Addr, mtu)
}
s.mtu = mtu
}
case _, ok := <-waitTmoChan:
waitTmoChan = nil
if ok {
return nil, nmxutil.NewRspTimeoutError(
"RxCoap() timed out")
}
case <-s.stopChan:
return nil, fmt.Errorf("Session closed")
}
}
}