in nmxact/mgmt/transceiver.go [117:163]
func (t *Transceiver) txRxNmpAsync(txCb TxFn, req *nmp.NmpMsg, mtu int,
timeout time.Duration, ch chan nmp.NmpRsp, errc chan error) error {
nl, err := t.nd.AddListener(req.Hdr.Seq)
if err != nil {
return err
}
b, err := nmp.EncodeNmpPlain(req)
if err != nil {
return err
}
log.Debugf("Tx NMP async request: seq %d %s", req.Hdr.Seq, hex.Dump(b))
if t.isTcp == false && len(b) > mtu {
return fmt.Errorf("Request too big")
}
frags := nmxutil.Fragment(b, mtu)
for _, frag := range frags {
if err := txCb(frag); err != nil {
return err
}
}
// Now wait for NMP response.
go func() {
defer t.nd.RemoveListener(req.Hdr.Seq)
for {
select {
case err := <-nl.ErrChan:
errc <- err
return
case rsp := <-nl.RspChan:
ch <- rsp
return
case _, ok := <-nl.AfterTimeout(timeout):
if ok {
errc <- nmxutil.NewRspTimeoutError("NMP timeout")
return
}
}
}
}()
return nil
}