code: private void send(final TunnelingFeature tunnelingFeature)
  		throws KNXConnectionClosedException, KNXAckTimeoutException, InterruptedException {
  		if (layer == TunnelingLayer.BusMonitorLayer)
  			throw new IllegalStateException("send not permitted in busmonitor mode");
  		if (state < 0)
  			throw new IllegalStateException("in error state, send aborted");
  		if (state == CLOSED)
  			throw new KNXConnectionClosedException("send attempt on closed connection");
  
  //		sendWaitQueue.acquire(true);
  		final byte[] buf = PacketHelper.toPacket(tunnelingFeature);
  		try {
  			int attempt = 0;
  			for (; attempt < maxSendAttempts; ++attempt) {
  				logger.trace("sending {}, attempt {}", tunnelingFeature, attempt + 1);
  				updateState = false;
  
  				send(buf, dataEndpt);
  				internalState = ACK_PENDING;
  				// always forward this state to user
  				state = ACK_PENDING;
  				waitForStateChange(ACK_PENDING, responseTimeout);
  				if (internalState == ClientConnection.CEMI_CON_PENDING || internalState == OK)
  					break;
  			}
  			if (attempt == maxSendAttempts) {
  				final KNXAckTimeoutException e = new KNXAckTimeoutException("maximum send attempts, no service acknowledgment received");
  				close(CloseEvent.INTERNAL, "maximum send attempts", LogLevel.ERROR, e);
  				throw e;
  			}
  		}
  		catch (final InterruptedIOException e) {
  			throw new InterruptedException("interrupted I/O, " + e);
  		}
  		catch (final IOException e) {
  			close(CloseEvent.INTERNAL, "communication failure", LogLevel.ERROR, e);
  			throw new KNXConnectionClosedException("connection closed");
  		}
  		finally {
  			updateState = true;
  			setState(OK);
  		}
  	}
docs: pre-cond: there is no cEMI send in progress, cEMI frames use the ConnectionBase::sendWaitQueue