code: func (t *UDPv4) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) <-chan error {
  	req := &pingV4{
  		Version:    4,
  		From:       t.ourEndpoint(),
  		To:         makeEndpoint(toaddr, 0), // TODO: maybe use known TCP port from DB
  		Expiration: uint64(time.Now().Add(expiration).Unix()),
  	}
  	packet, hash, err := t.encode(t.priv, p_pingV4, req)
  	if err != nil {
  		errc := make(chan error, 1)
  		errc <- err
  		return errc
  	}
  	// Add a matcher for the reply to the pending reply queue. Pongs are matched if they
  	// reference the ping we're about to send.
  	errc := t.pending(toid, toaddr.IP, p_pongV4, func(p interface{}) (matched bool, requestDone bool) {
  		matched = bytes.Equal(p.(*pongV4).ReplyTok, hash)
  		if matched && callback != nil {
  			callback()
  		}
  		return matched, matched
  	})
  	// Send the packet.
  	t.localNode.UDPContact(toaddr)
  	t.write(toaddr, toid, req.name(), packet)
  	return errc
  }
docs: // sendPing sends a ping message to the given node and invokes the callback
  // when the reply arrives.