docs: private void startInternal()
     throws SISessionUnavailableException, SISessionDroppedException,
            SIConnectionUnavailableException, SIConnectionDroppedException,
            SIResourceException, SIConnectionLostException,
            SIErrorException
     {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "startInternal");
        state = StateEnum.STARTED;
  
        // If there is a proxy queue registered, defer start
        // processing to it.  Otherwise send the start
        // flow to our peer ourselves.
        if (proxyQueue != null) proxyQueue.start();
        else
        {
           CommsByteBuffer request = getCommsByteBuffer();
  
           // Build Message Header
           request.putShort(getConnectionObjectID());
           request.putShort(getProxyID());
  
           // At this stage we would prefer to exchange the start to ensure that the
           // calls are correctly ordered at the server as the next call could be a
           // receive with a transaction - and that will be ordered seperately.
           // However, we only do this if we are >= FAP3.
           final HandshakeProperties props = getConversation().getHandshakeProperties();
           if (props.getFapLevel() >= JFapChannelConstants.FAP_VERSION_3)
           {
              // Pass on call to server
              CommsByteBuffer reply = jfapExchange(request,
                                                   JFapChannelConstants.SEG_START_SESS,
                                                   JFapChannelConstants.PRIORITY_MEDIUM,
                                                   true);
  
              try
              {
                 short err = reply.getCommandCompletionCode(JFapChannelConstants.SEG_START_SESS_R);
                 if (err != CommsConstants.SI_NO_EXCEPTION)
                 {
                    checkFor_SISessionUnavailableException(reply, err);
                    checkFor_SISessionDroppedException(reply, err);
                    checkFor_SIConnectionUnavailableException(reply, err);
                    checkFor_SIConnectionDroppedException(reply, err);
                    checkFor_SIResourceException(reply, err);
                    checkFor_SIConnectionLostException(reply, err);
                    checkFor_SIErrorException(reply, err);
                    defaultChecker(reply, err);
                 }
              }
              finally
              {
                 if (reply != null) reply.release();
              }
           }
           else
           {
              // Just send it instead
              jfapSend(request,
                       JFapChannelConstants.SEG_START_SESS,
                       JFapChannelConstants.PRIORITY_MEDIUM,
                       true,
                       ThrottlingPolicy.BLOCK_THREAD);
           }
        }
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "startInternal");
     }