docs: private void rcvTRMExchange(CommsByteBuffer request, Conversation conversation, int requestNumber,
                                  boolean allocatedFromBufferPool, boolean partOfExchange) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "rcvTRMExchange",
                          new Object[]
                          {
                           request,
                           conversation,
                           Integer.valueOf(requestNumber),
                           Boolean.valueOf(allocatedFromBufferPool),
                           Boolean.valueOf(partOfExchange)
                          });
  
          ConversationState convState = (ConversationState) conversation.getAttachment();
  
          TrmSingleton trm = TrmSingleton.getTrmSingleton();
          ComponentData cd = (ComponentData) trm.getComponentData();
          ClientConnection cc = (ClientConnection) convState.getCommsConnection();
  
          // There is a chance that we are the first conversation on a connection
          // and the ServerSideConnection will have already been created. If this is the
          // case use it.
          if (convState.getCommsConnection() == null) {
              cc = new ServerSideConnection(conversation);
              convState.setCommsConnection(cc);
          }
  
          try {
              byte[] trmRequestData = request.getRemaining();
              byte[] trmReplyData = cd.handShake(cc, trmRequestData);
  
              // Only save info about the connection if we got a connection
              if (cc.getSICoreConnection() != null) {
  
                  // First ensure inform MP to stop making lazy copies of messages
                  ((MPCoreConnection) cc.getSICoreConnection()).setMessageCopiedWhenSent(false);
                  ((MPCoreConnection) cc.getSICoreConnection()).setMessageCopiedWhenReceived(false);
  
                  // Add the connection object to the store
                  convState.addObject(cc);
  
                  // Send info of the connection to the client
                  sendConnectionInfo(conversation);
              } else {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      SibTr.debug(this, tc, "TRM did not allocate us a connection");
              }
  
              CommsByteBuffer reply = poolManager.allocate();
              reply.wrap(trmReplyData);
  
              conversation.send(reply,
                                JFapChannelConstants.SEG_TOPOLOGY,
                                requestNumber,
                                JFapChannelConstants.PRIORITY_HANDSHAKE,
                                true,
                                ThrottlingPolicy.BLOCK_THREAD,
                                null);
          } catch (ConversationStateFullException e) {
              FFDCFilter.processException(e,
                                          CLASS_NAME + ".rcvTRMExchange",
                                          CommsConstants.SERVERTRANSPORTRECEIVELISTENER_TRMEXCG_01,
                                          this);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(this, tc, e.getMessage(), e);
  
              StaticCATHelper.sendExceptionToClient(e,
                                                    CommsConstants.SERVERTRANSPORTRECEIVELISTENER_TRMEXCG_01,
                                                    conversation, requestNumber);
          } catch (SIException e) {
              FFDCFilter.processException(e,
                                          CLASS_NAME + ".rcvTRMExchange",
                                          CommsConstants.SERVERTRANSPORTRECEIVELISTENER_TRMEXCG_02,
                                          this);
  
              SibTr.error(tc, "COMMUNICATION_ERROR_SICO2019", e);
          }
  
          request.release(allocatedFromBufferPool);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "rcvTRMExchange");
      }