in nmxact/nmserial/serial_sesn.go [70:119]
func (s *SerialSesn) Open() error {
s.m.Lock()
if s.isOpen {
s.m.Unlock()
return nmxutil.NewSesnAlreadyOpenError(
"Attempt to open an already-open serial session")
}
txvr, err := mgmt.NewTransceiver(s.cfg.TxFilter, s.cfg.RxFilter, false,
s.cfg.MgmtProto, 3)
if err != nil {
s.m.Unlock()
return err
}
s.txvr = txvr
s.errChan = make(chan error)
s.msgChan = make(chan []byte, 16)
s.connChan = make(chan *SerialSesn, 4)
s.stopChan = make(chan struct{})
s.isOpen = true
s.m.Unlock()
if s.cfg.MgmtProto == sesn.MGMT_PROTO_COAP_SERVER {
return nil
}
s.wg.Add(1)
go func() {
defer s.wg.Done()
for {
select {
case msg, ok := <-s.msgChan:
if !ok {
continue
}
if s.cfg.MgmtProto == sesn.MGMT_PROTO_OMP {
s.txvr.DispatchCoap(msg)
} else if s.cfg.MgmtProto == sesn.MGMT_PROTO_NMP {
s.txvr.DispatchNmpRsp(msg)
}
case <-s.errChan:
// XXX pass it on
case <-s.stopChan:
return
}
}
}()
return nil
}