func()

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