void NetInterface::processPacket(const Address &sourceAddress, BitStream *pStream) { // Determine what to do with this packet: if(pStream->getBuffer()[0] & 0x80) // it's a protocol packet... { // if the LSB of the first byte is set, it's a game data packet // so pass it to the appropriate connection. // lookup the connection in the addressTable // if this packet causes a disconnection, keep the conn around until this function exits RefPtr<NetConnection> conn = findConnection(sourceAddress); if(conn) conn->readRawPacket(pStream); } else { // Otherwise, it's either a game info packet or a // connection handshake packet. U8 packetType; pStream->read(&packetType); if(packetType >= FirstValidInfoPacketId) handleInfoPacket(sourceAddress, packetType, pStream); else { // check if there's a connection already: switch(packetType) { case ConnectChallengeRequest: handleConnectChallengeRequest(sourceAddress, pStream); break; case ConnectChallengeResponse: handleConnectChallengeResponse(sourceAddress, pStream); break; case ConnectRequest: handleConnectRequest(sourceAddress, pStream); break; case ConnectReject: handleConnectReject(sourceAddress, pStream); break; case ConnectAccept: handleConnectAccept(sourceAddress, pStream); break; case Disconnect: handleDisconnect(sourceAddress, pStream); break; case Punch: handlePunch(sourceAddress, pStream); break; case ArrangedConnectRequest: handleArrangedConnectRequest(sourceAddress, pStream); break; } } } }
void NetInterface::processPacketReceiveEvent(NetAddress srcAddress, RawData packetData) { U32 dataSize = packetData.size; BitStream pStream(packetData.data, dataSize); // Determine what to do with this packet: if(packetData.data[0] & 0x01) // it's a protocol packet... { // if the LSB of the first byte is set, it's a game data packet // so pass it to the appropriate connection. // lookup the connection in the addressTable NetConnection *conn = NetConnection::lookup(&srcAddress); if(conn) conn->processRawPacket(&pStream); } else { // Otherwise, it's either a game info packet or a // connection handshake packet. U8 packetType; pStream.read(&packetType); NetAddress *addr = &srcAddress; if(packetType <= GameHeartbeat) handleInfoPacket(addr, packetType, &pStream); #ifdef GGC_PLUGIN else if (packetType == GGCPacket) { HandleGGCPacket(addr, (U8*)packetData.data, dataSize); } #endif else { // check if there's a connection already: switch(packetType) { case ConnectChallengeRequest: handleConnectChallengeRequest(addr, &pStream); break; case ConnectRequest: handleConnectRequest(addr, &pStream); break; case ConnectChallengeResponse: handleConnectChallengeResponse(addr, &pStream); break; case ConnectAccept: handleConnectAccept(addr, &pStream); break; case Disconnect: handleDisconnect(addr, &pStream); break; case ConnectReject: handleConnectReject(addr, &pStream); break; } } } }