func()

in nmxact/mtech_lora/mtech_lora_sesn.go [85:170]


func (s *LoraSesn) Open() error {
	if s.isOpen == true {
		return nmxutil.NewSesnAlreadyOpenError(
			"Attempt to open an already-open Lora session")
	}

	txvr, err := mgmt.NewTransceiver(s.cfg.TxFilter, s.cfg.RxFilter, false,
		s.cfg.MgmtProto, 3)
	if err != nil {
		return err
	}
	s.txvr = txvr
	s.stopChan = make(chan struct{})

	msgType := "rsp"
	if s.cfg.MgmtProto == sesn.MGMT_PROTO_COAP_SERVER {
		msgType = "req"
	}

	s.xport.Lock()

	msgKey := TgtPortKey(s.cfg.Lora.Addr, s.cfg.Lora.Port, msgType)
	s.msgListener = NewListener()
	err = s.xport.msgMap.AddListener(msgKey, s.msgListener)
	if err != nil {
		s.xport.Unlock()
		s.txvr.Stop()
		return err
	}

	if s.cfg.Lora.Addr != "" {
		msgKey, l := s.xport.reassMap.FindListener(s.cfg.Lora.Addr,
			s.cfg.Lora.Port, "reass")
		if l != nil {
			l.RefCnt++
		} else {
			msgKey = TgtPortKey(s.cfg.Lora.Addr, s.cfg.Lora.Port, "reass")
			l = NewListener()
			s.xport.reassMap.AddListener(msgKey, l)
		}
		s.reassListener = l

		tgtKey := TgtKey(s.cfg.Lora.Addr, "rx")
		s.tgtListener = NewListener()
		err = s.xport.tgtMap.AddListener(tgtKey, s.tgtListener)
		if err != nil {
			s.xport.Unlock()
			s.closeListeners()
			s.txvr.Stop()
			return err
		}
	}

	s.xport.Unlock()

	if s.cfg.MgmtProto == sesn.MGMT_PROTO_COAP_SERVER {
		s.isOpen = true
		return nil
	}
	s.wg.Add(1)
	go func() {
		defer s.wg.Done()
		defer s.closeListeners()

		for {
			select {
			case msg, ok := <-s.msgListener.MsgChan:
				if ok {
					s.txvr.DispatchCoap(msg)
				}
			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 <-s.stopChan:
				return
			}
		}
	}()
	s.isOpen = true
	return nil
}