| 111 | |
| 112 | |
| 113 | std::size_t CNetworkServer::ProcessInput(std::shared_ptr <CNetworkPeer> peer, const void* data, std::size_t maxlength) |
| 114 | { |
| 115 | NETWORK_LOG(LL_SYS, "Peer: %s(%d) Data: %p Max length: %u", peer->GetIP().c_str(), peer->GetId(), data, maxlength); |
| 116 | |
| 117 | auto pData = reinterpret_cast<const TPacketSingleton*>(data); |
| 118 | if (maxlength < sizeof(TPacketSingleton)) |
| 119 | { |
| 120 | NETWORK_LOG(LL_CRI, "Packet size is so less!"); |
| 121 | return 0; |
| 122 | } |
| 123 | |
| 124 | NETWORK_LOG(LL_SYS, "Got Packet with magic: 0x%X id %d (%02x) size %u coming size %u received from Client %s (%d) at Phase: %d", |
| 125 | pData->pMagic, pData->uiPacketID, pData->uiPacketID, GetPacketCapacity(pData->uiPacketID), maxlength, peer->GetIP().c_str(), peer->GetId(), peer->GetPeerPhase()); |
| 126 | |
| 127 | // Magic value check |
| 128 | if (memcmp(pData->pMagic, gs_pNetworkMagicValue, sizeof(pData->pMagic))) |
| 129 | { |
| 130 | NETWORK_LOG(LL_CRI, "Unknown magic value: 0x%X", pData->pMagic); |
| 131 | return 0; |
| 132 | } |
| 133 | |
| 134 | // ID check |
| 135 | auto handler = m_pPacketHandlers.find(pData->uiPacketID); |
| 136 | if (handler == m_pPacketHandlers.end()) |
| 137 | { |
| 138 | NETWORK_LOG(LL_CRI, "Unknown Packet with id %d (%02x) received from client %s (%d)", pData->uiPacketID, pData->uiPacketID, peer->GetIP().c_str(), peer->GetId()); |
| 139 | return 0; |
| 140 | } |
| 141 | |
| 142 | // Size check |
| 143 | auto ulCorrectSize = GetPacketCapacity(pData->uiPacketID); |
| 144 | if (ulCorrectSize != maxlength) |
| 145 | { |
| 146 | NETWORK_LOG(LL_CRI, "Packet size mismatch! Correct: %u Current: %u Packet: %d (%02x)", ulCorrectSize, maxlength, pData->uiPacketID, pData->uiPacketID); |
| 147 | return 0; |
| 148 | } |
| 149 | |
| 150 | // Hash check |
| 151 | auto pCorrectHash = XXH32(data, maxlength - NET_CHECKSUM_LENGTH, NET_PACKET_HASH_MAGIC); |
| 152 | auto pCurrentHash = *(uint32_t*)((std::size_t)data + maxlength - NET_CHECKSUM_LENGTH); |
| 153 | |
| 154 | NETWORK_LOG(LL_SYS, "Hash: %p Correct hash: %p Eq: %d", pCurrentHash, pCorrectHash, pCurrentHash == pCorrectHash); |
| 155 | if (pCurrentHash != pCorrectHash) |
| 156 | { |
| 157 | NETWORK_LOG(LL_CRI, "Packet hash mismatch! Current: %p Correct: %p", pCurrentHash, pCorrectHash); |
| 158 | return GetPacketCapacity(pData->uiPacketID); |
| 159 | } |
| 160 | |
| 161 | // Phase check |
| 162 | auto newPhase = PHASE_NULL; |
| 163 | auto peerPhase = peer->GetPeerPhase(); |
| 164 | if (peerPhase != PHASE_CHECK_COMPLETED) |
| 165 | { |
| 166 | auto bDestroyPeer = false; |
| 167 | if (peerPhase == PHASE_CONN_REQUEST) |
| 168 | { |
| 169 | if (pData->uiPacketID != HEADER_CS_CONN_INIT) |
| 170 | bDestroyPeer = true; |
no test coverage detected