docs: protected void cleanupConnection(Conversation conversation) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "cleanupConnection", conversation);
  
          ConversationState convState = (ConversationState) conversation.getAttachment();
          ServerSideConnection serverSideConn = ((ServerSideConnection) convState.getCommsConnection());
  
          // This may be null if the connection falls over before it has had time to get going
          if (serverSideConn != null)
              serverSideConn.failed(); // F206161.5
  
          // Now go through the object table looking for the SICoreConnection
          Object obj = null;
          for (int x = ConversationState.OBJECT_TABLE_ORIGIN;; x++) {
              try {
                  obj = convState.removeObject(x);
  
                  if (obj instanceof CATConnection) // D254870
                  {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                          SibTr.debug(this, tc, "Found a CATConnection at position " + x + " in object store");
  
                      CATConnection catConnection = (CATConnection) obj;
                      ServerLinkLevelState linkState = (ServerLinkLevelState) conversation.getLinkLevelAttachment();
  
                      // At this point we also need to attempt to clean up any global transactions that
                      // are in use by this connection
                      linkState.getTransactionTable().rollbackTxWithoutCompletionDirection(conversation); // D257768
  
                      // Start d192146
                      // We have found the connection. Now close him down.
                      SICoreConnection connection = catConnection.getSICoreConnection(); // D254870, D257768
                      connection.removeConnectionListener(linkState.getSICoreConnectionListener());
                      connection.close();
  
                      linkState.getSICoreConnectionListener().removeSICoreConnection(connection);
                      linkState.getSICoreConnectionTable().remove(conversation.getId());
                      linkState.getTransactionTable().removeTransactions(conversation, linkState.getDispatchableMap()); // D254870, D257768
                      // End d192146
                  }
              } catch (NoSuchElementException e) {
                  // No FFDC code needed
  
                  // We have reached a gap in the object table. We can only
                  // assume that we have already closed the connection.
                  break;
              } catch (SIException e) {
                  // Oops, we could not close down. Not alot we can do here
                  // except FFDC as we have no where else to put the error.
                  FFDCFilter.processException(e,
                                              CLASS_NAME + ".cleanupConnection",
                                              CommsConstants.SERVERTRANSPORTRECEIVELISTENER_ERROR_02,
                                              this);
  
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      SibTr.debug(this, tc, "Unable to close SI connection", e);
                  }
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "cleanupConnection");
      }