/**************************************************************************************************** * @fn ParseHostInterfacePkt * Top level parser for Host interface Packets. * Depending on packet type & data sizes, the individual parsers are called. * * @param [OUT]pOut - Sensor structure that will return the parsed values * @param [IN]pPacket - Packet buffer containing the packet to parse * @param [OUT]pPktSizeByType - Size of the packet as determined by its type and other parameters * @param [IN]pktBufferSize - Size of the packet buffer provided. Sensor Data packet buffer can * have multiple HIF packets. In case of Sensor Control packets, the buffer is expected * to contain only one packet. * * @return OSP_STATUS_OK or Error code enum corresponding to the error encountered * ***************************************************************************************************/ int32_t ParseHostInterfacePkt( LocalPacketTypes_t *pOut, const uint8_t *pPacket, uint16_t *pPktSizeByType, uint16_t pktBufferSize ) { uint8_t pktID; int32_t errCode; /* Sanity checks - CRC, Buffer, Version */ if ((pOut == NULL) || (pPktSizeByType == NULL)) { return SET_ERROR( OSP_STATUS_NULL_POINTER ); } errCode = CheckPacketSanity( pPacket ); if (errCode != OSP_STATUS_OK) { return errCode; } /* ========== Packet handling ========== */ /* 1. Identify Packet type */ pktID = GetPacketID(pPacket); pOut->PacketID = pktID; switch (pktID) { case PKID_SENSOR_DATA: case PKID_SENSOR_TEST_DATA: /* Parse a single HIF packet from the given packet buffer and return the size of the packet parsed * pktBufferSize must be >= HIF packet to be parsed */ /* Incoming buffer size check */ if (pktBufferSize < MIN_HIF_SENSOR_DATA_PKT_SZ) { *pPktSizeByType = pktBufferSize; //This is useful for caller who maybe in a while loop return SET_ERROR( OSP_STATUS_BUFFER_TOO_SMALL ); } errCode = ParseSensorDataPacket( pOut, pPacket, pPktSizeByType, pktBufferSize ); break; case PKID_CONTROL_REQ_RD: case PKID_CONTROL_REQ_WR: case PKID_CONTROL_RESP: /* Incoming buffer size check */ if (pktBufferSize < MIN_HIF_CONTROL_PKT_SZ) { *pPktSizeByType = pktBufferSize; //This is useful for caller who maybe in a while loop return SET_ERROR( OSP_STATUS_BUFFER_TOO_SMALL ); } errCode = ParseControlPacket( pktID, pOut, pPacket, pPktSizeByType, pktBufferSize ); break; default: errCode = SET_ERROR( OSP_STATUS_INVALID_PACKETID); break; } return errCode; }
void CNetGame::UpdateNetwork() { Packet* p; unsigned char packetIdentifier; while(p=m_pRak->Receive()) { packetIdentifier = GetPacketID(p); //printf("Raw Packet ID: %u\n",packetIdentifier); switch(packetIdentifier) { case ID_NEW_INCOMING_CONNECTION: Packet_NewIncomingConnection(p); break; case ID_DISCONNECTION_NOTIFICATION: Packet_DisconnectionNotification(p); break; case ID_CONNECTION_LOST: Packet_ConnectionLost(p); break; case ID_MODIFIED_PACKET: Packet_ModifiedPacket(p); break; /* // Not in latest RakNet, so not going to support it. case ID_REMOTE_PORT_REFUSED: Packet_RemotePortRefused(p); break; */ case ID_PLAYER_SYNC: Packet_PlayerSync(p); break; case ID_VEHICLE_SYNC: Packet_VehicleSync(p); break; case ID_PASSENGER_SYNC: Packet_PassengerSync(p); break; case ID_SPECTATOR_SYNC: Packet_SpectatorSync(p); break; case ID_AIM_SYNC: Packet_AimSync(p); break; case ID_RCON_COMMAND: Packet_InGameRcon(p); break; case ID_STATS_UPDATE: Packet_StatsUpdate(p); break; case ID_WEAPONS_UPDATE: Packet_WeaponsUpdate(p); break; case ID_TRAILER_SYNC: Packet_TrailerSync(p); break; } m_pRak->DeallocatePacket(p); } }