| 110 | |
| 111 | |
| 112 | std::size_t CNetworkClient::ProcessInput(const void* data, std::size_t maxlength) |
| 113 | { |
| 114 | NETWORK_LOG(LL_TRACE, "Data: %p Max length: %u", data, maxlength); |
| 115 | |
| 116 | auto pData = reinterpret_cast<const TPacketSingleton*>(data); |
| 117 | if (maxlength < sizeof(TPacketSingleton)) |
| 118 | { |
| 119 | NETWORK_LOG(LL_CRI, "Packet size is so less!"); |
| 120 | return 0; |
| 121 | } |
| 122 | |
| 123 | NETWORK_LOG(LL_SYS, "Got Packet with magic: 0x%X id %d (%02x) size %u coming size %u", pData->pMagic, pData->uiPacketID, pData->uiPacketID, GetPacketCapacity(pData->uiPacketID), maxlength); |
| 124 | |
| 125 | // Magic value check |
| 126 | if (memcmp(pData->pMagic, gs_pNetworkMagicValue, sizeof(pData->pMagic))) |
| 127 | { |
| 128 | NETWORK_LOG(LL_CRI, "Unknown magic value: 0x%X", gs_pNetworkMagicValue); |
| 129 | return GetPacketCapacity(pData->uiPacketID); |
| 130 | } |
| 131 | |
| 132 | // ID check |
| 133 | auto handler = m_pHandlers.find(pData->uiPacketID); |
| 134 | if (handler == m_pHandlers.end()) |
| 135 | { |
| 136 | NETWORK_LOG(LL_CRI, "Unknown Packet with id %d (%02x) received", pData->uiPacketID, pData->uiPacketID); |
| 137 | return GetPacketCapacity(pData->uiPacketID); |
| 138 | } |
| 139 | |
| 140 | // Size check |
| 141 | auto ulCorrectSize = GetPacketCapacity(pData->uiPacketID); |
| 142 | if (ulCorrectSize != maxlength) |
| 143 | { |
| 144 | NETWORK_LOG(LL_CRI, "Packet size mismatch! Correct: %u Current: %u Packet: %d (%02x)", ulCorrectSize, maxlength, pData->uiPacketID, pData->uiPacketID); |
| 145 | return GetPacketCapacity(pData->uiPacketID); |
| 146 | } |
| 147 | |
| 148 | // Hash check |
| 149 | auto pCorrectHash = XXH32(data, maxlength - NET_CHECKSUM_LENGTH, NET_PACKET_HASH_MAGIC); |
| 150 | auto pCurrentHash = *(uint32_t*)((uint32_t)data + maxlength - NET_CHECKSUM_LENGTH); |
| 151 | |
| 152 | NETWORK_LOG(LL_SYS, "Hash: %p Correct hash: %p Eq: %d", pCurrentHash, pCorrectHash, pCurrentHash == pCorrectHash); |
| 153 | if (pCurrentHash != pCorrectHash) |
| 154 | { |
| 155 | NETWORK_LOG(LL_CRI, "Packet hash mismatch! Current: %p Correct: %p", pCurrentHash, pCorrectHash); |
| 156 | return GetPacketCapacity(pData->uiPacketID); |
| 157 | } |
| 158 | |
| 159 | // Build packet handler |
| 160 | std::size_t handlerResult = handler->second.second(data, ulCorrectSize); |
| 161 | NETWORK_LOG(LL_SYS, "handlerResult: %u data: %p length: %u", handlerResult, data, maxlength); |
| 162 | if (!handlerResult) |
| 163 | { |
| 164 | NETWORK_LOG(LL_CRI, "Handler result return NULL!"); |
| 165 | return GetPacketCapacity(pData->uiPacketID); |
| 166 | } |
| 167 | |
| 168 | return GetPacketCapacity(pData->uiPacketID); |
| 169 | } |
nothing calls this directly
no test coverage detected