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
}