func()

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
}