/****************************************************************************************************
 * @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;
}
Example #2
0
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);		
	}
}