| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- /*
- * Copyright (c) 2014, Oculus VR, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- */
- #include "NativeFeatureIncludes.h"
- #if _RAKNET_SUPPORT_PacketLogger==1
- #include "PacketLogger.h"
- #include "BitStream.h"
- #include "DS_List.h"
- #include "InternalPacket.h"
- #include "RakPeerInterface.h"
- #include "MessageIdentifiers.h"
- #include "StringCompressor.h"
- #include "GetTime.h"
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "Itoa.h"
- #include <time.h>
- #include "SocketIncludes.h"
- #include "gettimeofday.h"
- #ifdef _MSC_VER
- #pragma warning( push )
- #endif
- using namespace RakNet;
- STATIC_FACTORY_DEFINITIONS(PacketLogger,PacketLogger);
- PacketLogger::PacketLogger()
- {
- printId=true;
- printAcks=true;
- prefix[0]=0;
- suffix[0]=0;
- logDirectMessages=true;
- }
- PacketLogger::~PacketLogger()
- {
- }
- void PacketLogger::FormatLine(
- char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame, unsigned char id
- , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
- unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
- {
- char numericID[16];
- const char* idToPrint = NULL;
- if(printId)
- {
- if (splitPacketCount>0 && splitPacketCount!=(unsigned int)-1)
- idToPrint="(SPLIT PACKET)";
- else
- idToPrint = IDTOString(id);
- }
- // If printId is false, idToPrint will be NULL, as it will
- // in the case of an unrecognized id. Testing printId for false
- // would just be redundant.
- if(idToPrint == NULL)
- {
- sprintf(numericID, "%5u", id);
- idToPrint = numericID;
- }
- FormatLine(into, dir, type, reliableMessageNumber, frame, idToPrint, bitLen, time, local, remote,splitPacketId,splitPacketIndex,splitPacketCount, orderingIndex);
- }
- void PacketLogger::FormatLine(
- char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame, const char* idToPrint
- , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
- unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
- {
- char str1[64], str2[62];
- local.ToString(true, str1);
- remote.ToString(true, str2);
- char localtime[128];
- GetLocalTime(localtime);
- char str3[64];
- if (reliableMessageNumber==(unsigned int)-1)
- {
- str3[0]='N';
- str3[1]='/';
- str3[2]='A';
- str3[3]=0;
- }
- else
- {
- sprintf(str3,"%5u",reliableMessageNumber);
- }
- sprintf(into, "%s,%s%s,%s,%s,%5u,%s,%u,%" PRINTF_64_BIT_MODIFIER "u,%s,%s,%i,%i,%i,%i,%s,"
- , localtime
- , prefix
- , dir
- , type
- , str3
- , frame
- , idToPrint
- , bitLen
- , time
- , str1
- , str2
- , splitPacketId
- , splitPacketIndex
- , splitPacketCount
- , orderingIndex
- , suffix
- );
- }
- void PacketLogger::OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
- {
- if (logDirectMessages==false)
- return;
- char str[256];
- FormatLine(str, "Snd", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTimeMS(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress, (unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
- AddToLog(str);
- }
- void PacketLogger::LogHeader(void)
- {
- // Last 5 are splitpacket id, split packet index, split packet count, ordering index, suffix
- AddToLog("Clock,S|R,Typ,Reliable#,Frm #,PktID,BitLn,Time ,Local IP:Port ,RemoteIP:Port,SPID,SPIN,SPCO,OI,Suffix,Miscellaneous\n");
- }
- void PacketLogger::OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
- {
- if (logDirectMessages==false)
- return;
- char str[256];
- FormatLine(str, "Rcv", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
- AddToLog(str);
- }
- void PacketLogger::OnReliabilityLayerNotification(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress, bool isError)
- {
- char str[1024];
- char *type;
- if (isError)
- type=(char*) "RcvErr";
- else
- type=(char*) "RcvWrn";
- FormatLine(str, type, errorMessage, 0, 0, "", bitsUsed, RakNet::GetTime(), rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
- AddToLog(str);
- RakAssert(isError==false);
- }
- void PacketLogger::OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time)
- {
- char str[256];
- char str1[64], str2[62];
- SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
- localSystemAddress.ToString(true, str1);
- remoteSystemAddress.ToString(true, str2);
- char localtime[128];
- GetLocalTime(localtime);
- sprintf(str, "%s,Rcv,Ack,%i,,,,%" PRINTF_64_BIT_MODIFIER "u,%s,%s,,,,,,"
- , localtime
- , messageNumber
- , (unsigned long long) time
- , str1
- , str2
- );
- AddToLog(str);
- }
- void PacketLogger::OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
- {
- char str[256];
- char str1[64], str2[62];
- SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
- localSystemAddress.ToString(true, str1);
- remoteSystemAddress.ToString(true, str2);
- RakNet::TimeMS time = RakNet::GetTimeMS();
- char localtime[128];
- GetLocalTime(localtime);
- sprintf(str, "%s,Lcl,PBP,,,%s,%i,%" PRINTF_64_BIT_MODIFIER "u,%s,%s,,,,,,"
- , localtime
- , BaseIDTOString(data[0])
- , bitsUsed
- , (unsigned long long) time
- , str1
- , str2
- );
- AddToLog(str);
- }
- void PacketLogger::OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time, int isSend)
- {
- char str[256];
- const char *sendTypes[] =
- {
- "Rcv",
- "Snd",
- "Err1",
- "Err2",
- "Err3",
- "Err4",
- "Err5",
- "Err6",
- };
- const char *sendType = sendTypes[isSend];
- SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
- unsigned int reliableMessageNumber;
- if (internalPacket->reliability==UNRELIABLE || internalPacket->reliability==UNRELIABLE_SEQUENCED || internalPacket->reliability==UNRELIABLE_WITH_ACK_RECEIPT)
- reliableMessageNumber=(unsigned int)-1;
- else
- reliableMessageNumber=internalPacket->reliableMessageNumber;
- if (internalPacket->data[0]==ID_TIMESTAMP)
- {
- FormatLine(str, sendType, "Tms", reliableMessageNumber, frameNumber, internalPacket->data[1+sizeof(RakNet::Time)], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
- }
- else
- {
- FormatLine(str, sendType, "Nrm", reliableMessageNumber, frameNumber, internalPacket->data[0], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
- }
- AddToLog(str);
- }
- void PacketLogger::AddToLog(const char *str)
- {
- WriteLog(str);
- }
- void PacketLogger::WriteLog(const char *str)
- {
- RAKNET_DEBUG_PRINTF("%s\n", str);
- }
- void PacketLogger::WriteMiscellaneous(const char *type, const char *msg)
- {
- char str[1024];
- char str1[64];
- SystemAddress localSystemAddress = rakPeerInterface->GetInternalID();
- localSystemAddress.ToString(true, str1);
- RakNet::TimeMS time = RakNet::GetTimeMS();
- char localtime[128];
- GetLocalTime(localtime);
- sprintf(str, "%s,Lcl,%s,,,,,%" PRINTF_64_BIT_MODIFIER "u,%s,,,,,,,%s"
- , localtime
- , type
- , (unsigned long long) time
- , str1
- , msg
- );
- AddToLog(msg);
- }
- void PacketLogger::SetPrintID(bool print)
- {
- printId=print;
- }
- void PacketLogger::SetPrintAcks(bool print)
- {
- printAcks=print;
- }
- const char* PacketLogger::BaseIDTOString(unsigned char Id)
- {
- if (Id >= ID_USER_PACKET_ENUM)
- return 0;
- const char *IDTable[((int)ID_USER_PACKET_ENUM)+1]=
- {
- "ID_CONNECTED_PING",
- "ID_UNCONNECTED_PING",
- "ID_UNCONNECTED_PING_OPEN_CONNECTIONS",
- "ID_CONNECTED_PONG",
- "ID_DETECT_LOST_CONNECTIONS",
- "ID_OPEN_CONNECTION_REQUEST_1",
- "ID_OPEN_CONNECTION_REPLY_1",
- "ID_OPEN_CONNECTION_REQUEST_2",
- "ID_OPEN_CONNECTION_REPLY_2",
- "ID_CONNECTION_REQUEST",
- "ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY",
- "ID_OUR_SYSTEM_REQUIRES_SECURITY",
- "ID_PUBLIC_KEY_MISMATCH",
- "ID_OUT_OF_BAND_INTERNAL",
- "ID_SND_RECEIPT_ACKED",
- "ID_SND_RECEIPT_LOSS",
- "ID_CONNECTION_REQUEST_ACCEPTED",
- "ID_CONNECTION_ATTEMPT_FAILED",
- "ID_ALREADY_CONNECTED",
- "ID_NEW_INCOMING_CONNECTION",
- "ID_NO_FREE_INCOMING_CONNECTIONS",
- "ID_DISCONNECTION_NOTIFICATION",
- "ID_CONNECTION_LOST",
- "ID_CONNECTION_BANNED",
- "ID_INVALID_PASSWORD",
- "ID_INCOMPATIBLE_PROTOCOL_VERSION",
- "ID_IP_RECENTLY_CONNECTED",
- "ID_TIMESTAMP",
- "ID_UNCONNECTED_PONG",
- "ID_ADVERTISE_SYSTEM",
- "ID_DOWNLOAD_PROGRESS",
- "ID_REMOTE_DISCONNECTION_NOTIFICATION",
- "ID_REMOTE_CONNECTION_LOST",
- "ID_REMOTE_NEW_INCOMING_CONNECTION",
- "ID_FILE_LIST_TRANSFER_HEADER",
- "ID_FILE_LIST_TRANSFER_FILE",
- "ID_FILE_LIST_REFERENCE_PUSH_ACK",
- "ID_DDT_DOWNLOAD_REQUEST",
- "ID_TRANSPORT_STRING",
- "ID_REPLICA_MANAGER_CONSTRUCTION",
- "ID_REPLICA_MANAGER_SCOPE_CHANGE",
- "ID_REPLICA_MANAGER_SERIALIZE",
- "ID_REPLICA_MANAGER_DOWNLOAD_STARTED",
- "ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE",
- "ID_RAKVOICE_OPEN_CHANNEL_REQUEST",
- "ID_RAKVOICE_OPEN_CHANNEL_REPLY",
- "ID_RAKVOICE_CLOSE_CHANNEL",
- "ID_RAKVOICE_DATA",
- "ID_AUTOPATCHER_GET_CHANGELIST_SINCE_DATE",
- "ID_AUTOPATCHER_CREATION_LIST",
- "ID_AUTOPATCHER_DELETION_LIST",
- "ID_AUTOPATCHER_GET_PATCH",
- "ID_AUTOPATCHER_PATCH_LIST",
- "ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR",
- "ID_AUTOPATCHER_CANNOT_DOWNLOAD_ORIGINAL_UNMODIFIED_FILES",
- "ID_AUTOPATCHER_FINISHED_INTERNAL",
- "ID_AUTOPATCHER_FINISHED",
- "ID_AUTOPATCHER_RESTART_APPLICATION",
- "ID_NAT_PUNCHTHROUGH_REQUEST",
- "ID_NAT_CONNECT_AT_TIME",
- "ID_NAT_GET_MOST_RECENT_PORT",
- "ID_NAT_CLIENT_READY",
- "ID_NAT_TARGET_NOT_CONNECTED",
- "ID_NAT_TARGET_UNRESPONSIVE",
- "ID_NAT_CONNECTION_TO_TARGET_LOST",
- "ID_NAT_ALREADY_IN_PROGRESS",
- "ID_NAT_PUNCHTHROUGH_FAILED",
- "ID_NAT_PUNCHTHROUGH_SUCCEEDED",
- "ID_READY_EVENT_SET",
- "ID_READY_EVENT_UNSET",
- "ID_READY_EVENT_ALL_SET",
- "ID_READY_EVENT_QUERY",
- "ID_LOBBY_GENERAL",
- "ID_RPC_REMOTE_ERROR",
- "ID_RPC_PLUGIN",
- "ID_FILE_LIST_REFERENCE_PUSH",
- "ID_READY_EVENT_FORCE_ALL_SET",
- "ID_ROOMS_EXECUTE_FUNC",
- "ID_ROOMS_LOGON_STATUS",
- "ID_ROOMS_HANDLE_CHANGE",
- "ID_LOBBY2_SEND_MESSAGE",
- "ID_LOBBY2_SERVER_ERROR",
- "ID_FCM2_NEW_HOST",
- "ID_FCM2_REQUEST_FCMGUID",
- "ID_FCM2_RESPOND_CONNECTION_COUNT",
- "ID_FCM2_INFORM_FCMGUID",
- "ID_FCM2_UPDATE_MIN_TOTAL_CONNECTION_COUNT",
- "ID_FCM2_VERIFIED_JOIN_START",
- "ID_FCM2_VERIFIED_JOIN_CAPABLE",
- "ID_FCM2_VERIFIED_JOIN_FAILED",
- "ID_FCM2_VERIFIED_JOIN_ACCEPTED",
- "ID_FCM2_VERIFIED_JOIN_REJECTED",
- "ID_UDP_PROXY_GENERAL",
- "ID_SQLite3_EXEC",
- "ID_SQLite3_UNKNOWN_DB",
- "ID_SQLLITE_LOGGER",
- "ID_NAT_TYPE_DETECTION_REQUEST",
- "ID_NAT_TYPE_DETECTION_RESULT",
- "ID_ROUTER_2_INTERNAL",
- "ID_ROUTER_2_FORWARDING_NO_PATH",
- "ID_ROUTER_2_FORWARDING_ESTABLISHED",
- "ID_ROUTER_2_REROUTED",
- "ID_TEAM_BALANCER_INTERNAL",
- "ID_TEAM_BALANCER_REQUESTED_TEAM_FULL",
- "ID_TEAM_BALANCER_REQUESTED_TEAM_LOCKED",
- "ID_TEAM_BALANCER_TEAM_REQUESTED_CANCELLED",
- "ID_TEAM_BALANCER_TEAM_ASSIGNED",
- "ID_LIGHTSPEED_INTEGRATION",
- "ID_XBOX_LOBBY",
- "ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_SUCCESS",
- "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_SUCCESS",
- "ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_FAILURE",
- "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_FAILURE",
- "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT",
- "ID_TWO_WAY_AUTHENTICATION_NEGOTIATION",
- "ID_CLOUD_POST_REQUEST",
- "ID_CLOUD_RELEASE_REQUEST",
- "ID_CLOUD_GET_REQUEST",
- "ID_CLOUD_GET_RESPONSE",
- "ID_CLOUD_UNSUBSCRIBE_REQUEST",
- "ID_CLOUD_SERVER_TO_SERVER_COMMAND",
- "ID_CLOUD_SUBSCRIPTION_NOTIFICATION",
- "ID_LIB_VOICE",
- "ID_RELAY_PLUGIN",
- "ID_NAT_REQUEST_BOUND_ADDRESSES",
- "ID_NAT_RESPOND_BOUND_ADDRESSES",
- "ID_FCM2_UPDATE_USER_CONTEXT",
- "ID_RESERVED_3",
- "ID_RESERVED_4",
- "ID_RESERVED_5",
- "ID_RESERVED_6",
- "ID_RESERVED_7",
- "ID_RESERVED_8",
- "ID_RESERVED_9",
- "ID_USER_PACKET_ENUM"
- };
- return (char*)IDTable[Id];
- }
- const char* PacketLogger::UserIDTOString(unsigned char Id)
- {
- // Users should override this
- static char str[256];
- Itoa(Id, str, 10);
- return (const char*) str;
- }
- const char* PacketLogger::IDTOString(unsigned char Id)
- {
- const char *out;
- out=BaseIDTOString(Id);
- if (out)
- return out;
- return UserIDTOString(Id);
- }
- void PacketLogger::SetPrefix(const char *_prefix)
- {
- strncpy(prefix, _prefix, 255);
- prefix[255]=0;
- }
- void PacketLogger::SetSuffix(const char *_suffix)
- {
- strncpy(suffix, _suffix, 255);
- suffix[255]=0;
- }
- void PacketLogger::GetLocalTime(char buffer[128])
- {
- #if defined(_WIN32) && !defined(__GNUC__) && !defined(__GCCXML__)
- time_t rawtime;
- struct timeval tv;
- // If you get an arror about an incomplete type, just delete this file
- struct timezone tz;
- gettimeofday(&tv, &tz);
- // time ( &rawtime );
- rawtime=tv.tv_sec;
- struct tm * timeinfo;
- timeinfo = localtime ( &rawtime );
- strftime (buffer,128,"%x %X",timeinfo);
- char buff[32];
- sprintf(buff, ".%i", tv.tv_usec);
- strcat(buffer,buff);
- // Commented version puts the time first
- /*
- struct tm * timeinfo;
- timeinfo = localtime ( &rawtime );
- strftime (buffer,128,"%X",timeinfo);
- char buff[32];
- sprintf(buff, ".%i ", tv.tv_usec);
- strcat(buffer,buff);
- char buff2[32];
- strftime (buff2,32,"%x",timeinfo);
- strcat(buffer,buff2);
- */
- #else
- buffer[0]=0;
- #endif
- }
- void PacketLogger::SetLogDirectMessages(bool send)
- {
- logDirectMessages=send;
- }
- #ifdef _MSC_VER
- #pragma warning( pop )
- #endif
- #endif // _RAKNET_SUPPORT_*
|