docs: private void sendToDiscriminators(VirtualConnection inVC, TCPReadRequestContext req, boolean errorOnRead) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "sendToDiscriminators");
          }
          boolean doAgain;
          req.setJITAllocateSize(0); // JIT Allocate was on for the initial read,
                                     // reset it
          TCPConnLink conn = ((TCPReadRequestContextImpl) req).getTCPConnLink();
          VirtualConnection vc = inVC;
          do {
              doAgain = false;
              int state;
              try {
                  state = tcpChannel.getDiscriminationProcess().discriminate(vc, req.getBuffers(), conn);
              } catch (DiscriminationProcessException dpe) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                      Tr.event(tc, "Exception occurred while discriminating data received from client " + req.getInterface().getRemoteAddress() + " "
                                   + req.getInterface().getRemotePort());
                  ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, new IOException("Discrimination failed " + dpe.getMessage()));
                  break;
              }
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Discrimination returned " + state);
              }
  
              if (state == DiscriminationProcess.SUCCESS) {
  
                  ConnectionReadyCallback cb = conn.getApplicationCallback();
                  // is cb is null, then connlink may have been destroyed by channel stop
                  // if so, nothing more needs to be done
                  if (cb != null) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled()) {
                          Tr.event(tc, "Calling application callback.ready method");
                      }
                      cb.ready(vc);
                  } else {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled()) {
                          Tr.event(tc, "No application callback found, closing connection");
                      }
                      ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);
                  }
              } else if (state == DiscriminationProcess.AGAIN) {
                  if (errorOnRead) { // error on first read, don't retry
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                          Tr.event(tc, "First read timed out, and more than one discriminator asked for more data" + req.getInterface().getRemoteAddress() + " "
                                       + req.getInterface().getRemotePort());
                      ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);
                  } else if (requestFull(req)) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                          Tr.event(tc, "Discrimination failed, no one claimed data even after 1 complete buffer presented - probably garbage passed in"
                                       + req.getInterface().getRemoteAddress()
                                       + " " + req.getInterface().getRemotePort());
                      ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);
  
                  } else {
                      vc = req.read(1, this, false, TCPRequestContext.USE_CHANNEL_TIMEOUT);
                      if (vc != null) {
                          doAgain = true;
                      }
  
                  }
              } else { // FAILURE
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                      Tr.event(tc, "Error occurred while discriminating data received from client " + req.getInterface().getRemoteAddress() + " "
                                   + req.getInterface().getRemotePort());
                  ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);
              }
          } while (doAgain);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "sendToDiscriminators");
          }
      }