in nmxact/mgmt/transceiver.go [165:209]
func (t *Transceiver) txRxOmp(txCb TxFn, req *nmp.NmpMsg, mtu int,
timeout time.Duration) (nmp.NmpRsp, error) {
nl, err := t.od.AddNmpListener(req.Hdr.Seq)
if err != nil {
return nil, err
}
defer t.od.RemoveNmpListener(req.Hdr.Seq)
var b []byte
if t.isTcp {
b, err = omp.EncodeOmpTcp(t.txFilter, req)
} else {
b, err = omp.EncodeOmpDgram(t.txFilter, req)
}
if err != nil {
return nil, err
}
log.Debugf("Tx OMP 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")
}
}
}
}