bool GdbSrvRspClient::ConfigRspSession()

in Exdi/exdigdbsrv/GdbSrvControllerLib/GdbSrvRspClient.cpp [830:905]


bool GdbSrvRspClient<TcpConnectorStream>::ConfigRspSession(_In_ const RSP_CONFIG_COMM_SESSION * pConfigData,
                                                           _In_ unsigned core)
{
    assert(m_pConnector != nullptr && pConfigData != nullptr);
    scoped_lock packetGuard(m_gdbSrvRspLock);

    bool configDone = true;
    bool isAllCores = (core == C_ALLCORES) ? true : false;
    memcpy(&s_LinkLayerConfigOptions, pConfigData, sizeof(s_LinkLayerConfigOptions));
    size_t totalNumberOfProcessorCores = m_pConnector->GetNumberOfConnections();
    for (size_t coreNumber = 0; coreNumber < totalNumberOfProcessorCores; ++coreNumber)
    {
        if (isAllCores || core == coreNumber)
        {
            TcpIpStream * pStream = m_pConnector->GetLinkLayerStreamEntry(coreNumber);
            assert(pStream != nullptr);

            //  Set the call back function
            if (pConfigData->pDisplayCommDataFunc != nullptr && pConfigData->pTextHandler != nullptr)
            {
                pStream->SetCallBackDisplayFunc(pConfigData->pDisplayCommDataFunc, pConfigData->pTextHandler);
            }

            //  Disable Nagle algorithm
            bool isNagleAlgorithmDisabled = true;
            if (pStream->SetOptions(IPPROTO_TCP, TCP_NODELAY, 
                                    reinterpret_cast<const char *>(&isNagleAlgorithmDisabled),
                                    sizeof(isNagleAlgorithmDisabled)) == SOCKET_ERROR)
            {
                configDone = false;
                break;
            }

            unsigned char ackFrequency = 1;
            long unsigned int bytesReturned = 0;
            if (pStream->SetWSAIoctl(SIO_TCP_SET_ACK_FREQUENCY, &ackFrequency, 
                                     sizeof(ackFrequency), nullptr, 0, &bytesReturned) == SOCKET_ERROR)
            {
                configDone = false;
                break;
            }

            //  Enable TCP keep alive packets, so we can check if the GdbServer is alive
            DWORD isKeepAlive = 1;
            if (pStream->SetOptions(SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<const char *>(&isKeepAlive),
                                    sizeof(isKeepAlive)) == SOCKET_ERROR)
            {
                configDone = false;
                break;
            }

            int resultRecv = 0;
            if (pConfigData->recvTimeout != 0)
            {
                resultRecv = pStream->SetOptions(SOL_SOCKET, SO_RCVTIMEO, 
                                                 reinterpret_cast<const char *>(&pConfigData->recvTimeout),
                                                 sizeof(pConfigData->recvTimeout));
            }

            int resultSend = 0;
            if (pConfigData->sendTimeout != 0)
            {
                resultSend = pStream->SetOptions(SOL_SOCKET, SO_SNDTIMEO, 
                                                 reinterpret_cast<const char *>(&pConfigData->sendTimeout),
                                                 sizeof(pConfigData->sendTimeout));
            }
            if (resultRecv == SOCKET_ERROR || resultSend == SOCKET_ERROR)
            {
                configDone = false;
                break;
            }

        }
    }
    return configDone;
}