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;
}