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