00001 #include "NativeFeatureIncludes.h"
00002 #if _RAKNET_SUPPORT_PacketLogger==1
00003
00004 #include "PacketLogger.h"
00005 #include "BitStream.h"
00006 #include "DS_List.h"
00007 #include "InternalPacket.h"
00008 #include "RakPeerInterface.h"
00009 #include "MessageIdentifiers.h"
00010 #include "StringCompressor.h"
00011 #include "RPCMap.h"
00012 #include "GetTime.h"
00013 #include <stdio.h>
00014 #include <string.h>
00015 #include <stdlib.h>
00016 #include "Itoa.h"
00017 #include <time.h>
00018 #include "SocketIncludes.h"
00019 #include "gettimeofday.h"
00020
00021 #ifdef _MSC_VER
00022 #pragma warning( push )
00023 #endif
00024
00025 PacketLogger::PacketLogger()
00026 {
00027 printId=true;
00028 printAcks=true;
00029 prefix[0]=0;
00030 suffix[0]=0;
00031 logDirectMessages=true;
00032 }
00033 PacketLogger::~PacketLogger()
00034 {
00035 }
00036 void PacketLogger::FormatLine(
00037 char* into, const char* dir, const char* type, unsigned int packet, unsigned int frame, unsigned char id
00038 , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
00039 unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
00040 {
00041 char numericID[16];
00042 const char* idToPrint = NULL;
00043 if(printId)
00044 {
00045 if (splitPacketCount>0)
00046 idToPrint="(SPLIT PACKET)";
00047 else
00048 idToPrint = IDTOString(id);
00049 }
00050
00051
00052
00053 if(idToPrint == NULL)
00054 {
00055 sprintf(numericID, "%5u", id);
00056 idToPrint = numericID;
00057 }
00058
00059 FormatLine(into, dir, type, packet, frame, idToPrint, bitLen, time, local, remote,splitPacketId,splitPacketIndex,splitPacketCount, orderingIndex);
00060 }
00061
00062 void PacketLogger::FormatLine(
00063 char* into, const char* dir, const char* type, unsigned int packet, unsigned int frame, const char* idToPrint
00064 , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
00065 unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
00066 {
00067 char str1[64], str2[62];
00068 local.ToString(true, str1);
00069 remote.ToString(true, str2);
00070 char localtime[128];
00071 GetLocalTime(localtime);
00072
00073 sprintf(into, "%s,%s%s,%s,%5u,%5u,%s,%u,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,%i,%i,%i,%i,%s,"
00074 , localtime
00075 , prefix
00076 , dir
00077 , type
00078 , packet
00079 , frame
00080 , idToPrint
00081 , bitLen
00082 , time
00083 , str1
00084 , str2
00085 , splitPacketId
00086 , splitPacketIndex
00087 , splitPacketCount
00088 , orderingIndex
00089 , suffix
00090 );
00091 }
00092 void PacketLogger::OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00093 {
00094 if (logDirectMessages==false)
00095 return;
00096
00097 char str[256];
00098 FormatLine(str, "Snd", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress, (unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
00099 AddToLog(str);
00100 }
00101
00102 void PacketLogger::LogHeader(void)
00103 {
00104
00105 AddToLog("Clock,S|R,Typ,Pckt#,Frm #,PktID,BitLn,Time ,Local IP:Port ,RemoteIP:Port,SPID,SPIN,SPCO,OI,Suffix,Miscellaneous\n");
00106 }
00107 void PacketLogger::OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00108 {
00109 if (logDirectMessages==false)
00110 return;
00111
00112 char str[256];
00113 FormatLine(str, "Rcv", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
00114 AddToLog(str);
00115 }
00116 void PacketLogger::OnReliabilityLayerPacketError(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00117 {
00118 char str[1024];
00119 FormatLine(str, "RcvErr", errorMessage, 0, 0, "", bitsUsed, RakNet::GetTime(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
00120 AddToLog(str);
00121 }
00122 void PacketLogger::OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNetTime time)
00123 {
00124 char str[256];
00125 char str1[64], str2[62];
00126 SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
00127 localSystemAddress.ToString(true, str1);
00128 remoteSystemAddress.ToString(true, str2);
00129 char localtime[128];
00130 GetLocalTime(localtime);
00131
00132 sprintf(str, "%s,Rcv,Ack,%i,,,,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,,,,,,"
00133 , localtime
00134 , messageNumber
00135 , (unsigned long long) time
00136 , str1
00137 , str2
00138 );
00139 AddToLog(str);
00140 }
00141 void PacketLogger::OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00142 {
00143 char str[256];
00144 char str1[64], str2[62];
00145 SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
00146 localSystemAddress.ToString(true, str1);
00147 remoteSystemAddress.ToString(true, str2);
00148 RakNetTime time = RakNet::GetTime();
00149 char localtime[128];
00150 GetLocalTime(localtime);
00151
00152 sprintf(str, "%s,Lcl,PBP,,,%s,%i,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,,,,,,"
00153 , localtime
00154 , BaseIDTOString(data[0])
00155 , bitsUsed
00156 , (unsigned long long) time
00157 , str1
00158 , str2
00159 );
00160 AddToLog(str);
00161 }
00162 void PacketLogger::OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNetTime time, int isSend)
00163 {
00164 char str[256];
00165 const char *sendTypes[] =
00166 {
00167 "Rcv",
00168 "Snd",
00169 "Err1",
00170 "Err2",
00171 "Err3",
00172 "Err4",
00173 "Err5",
00174 "Err6",
00175 };
00176 const char *sendType = sendTypes[isSend];
00177 SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
00178
00179 if (internalPacket->data[0]==ID_TIMESTAMP && internalPacket->data[sizeof(unsigned char)+sizeof(RakNetTime)]!=ID_RPC)
00180 {
00181 FormatLine(str, sendType, "Tms", internalPacket->reliableMessageNumber, frameNumber, internalPacket->data[1+sizeof(RakNetTime)], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00182 }
00183 else if (internalPacket->data[0]==ID_RPC || (internalPacket->dataBitLength>(sizeof(unsigned char)+sizeof(RakNetTime))*8 && internalPacket->data[0]==ID_TIMESTAMP && internalPacket->data[sizeof(unsigned char)+sizeof(RakNetTime)]==ID_RPC))
00184 {
00185 const char *uniqueIdentifier = rakPeerInterface->GetRPCString((const char*) internalPacket->data, internalPacket->dataBitLength, isSend==1 ? remoteSystemAddress : UNASSIGNED_SYSTEM_ADDRESS);
00186
00187 if (internalPacket->data[0]==ID_TIMESTAMP)
00188 FormatLine(str, sendType, "RpT", internalPacket->reliableMessageNumber, frameNumber, uniqueIdentifier, internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00189 else
00190 FormatLine(str, sendType, "Rpc", internalPacket->reliableMessageNumber, frameNumber, uniqueIdentifier, internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00191 }
00192 else
00193 {
00194 FormatLine(str, sendType, "Nrm", internalPacket->reliableMessageNumber, frameNumber, internalPacket->data[0], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00195 }
00196
00197 AddToLog(str);
00198 }
00199 void PacketLogger::AddToLog(const char *str)
00200 {
00201 WriteLog(str);
00202 }
00203 void PacketLogger::WriteLog(const char *str)
00204 {
00205 RAKNET_DEBUG_PRINTF("%s\n", str);
00206 }
00207 void PacketLogger::WriteMiscellaneous(const char *type, const char *msg)
00208 {
00209 char str[1024];
00210 char str1[64];
00211 SystemAddress localSystemAddress = rakPeerInterface->GetInternalID();
00212 localSystemAddress.ToString(true, str1);
00213 RakNetTime time = RakNet::GetTime();
00214 char localtime[128];
00215 GetLocalTime(localtime);
00216
00217 sprintf(str, "%s,Lcl,%s,,,,,%"PRINTF_64_BIT_MODIFIER"u,%s,,,,,,,%s"
00218 , localtime
00219 , type
00220 , (unsigned long long) time
00221 , str1
00222 , msg
00223 );
00224
00225 AddToLog(msg);
00226 }
00227 void PacketLogger::SetPrintID(bool print)
00228 {
00229 printId=print;
00230 }
00231 void PacketLogger::SetPrintAcks(bool print)
00232 {
00233 printAcks=print;
00234 }
00235 const char* PacketLogger::BaseIDTOString(unsigned char Id)
00236 {
00237 if (Id >= ID_USER_PACKET_ENUM)
00238 return 0;
00239
00240 const char *IDTable[((int)ID_USER_PACKET_ENUM)+1]=
00241 {
00242 "ID_INTERNAL_PING",
00243 "ID_PING",
00244 "ID_PING_OPEN_CONNECTIONS",
00245 "ID_CONNECTED_PONG",
00246 "ID_CONNECTION_REQUEST",
00247 "ID_SECURED_CONNECTION_RESPONSE",
00248 "ID_SECURED_CONNECTION_CONFIRMATION",
00249 "ID_RPC_MAPPING",
00250 "ID_DETECT_LOST_CONNECTIONS",
00251 "ID_OPEN_CONNECTION_REQUEST",
00252 "ID_OPEN_CONNECTION_REPLY",
00253 "ID_RPC",
00254 "ID_RPC_REPLY",
00255 "ID_OUT_OF_BAND_INTERNAL",
00256 "ID_CONNECTION_REQUEST_ACCEPTED",
00257 "ID_CONNECTION_ATTEMPT_FAILED",
00258 "ID_ALREADY_CONNECTED",
00259 "ID_NEW_INCOMING_CONNECTION",
00260 "ID_NO_FREE_INCOMING_CONNECTIONS",
00261 "ID_DISCONNECTION_NOTIFICATION",
00262 "ID_CONNECTION_LOST",
00263 "ID_RSA_PUBLIC_KEY_MISMATCH",
00264 "ID_CONNECTION_BANNED",
00265 "ID_INVALID_PASSWORD",
00266 "ID_INCOMPATIBLE_PROTOCOL_VERSION",
00267 "ID_IP_RECENTLY_CONNECTED",
00268 "ID_MODIFIED_PACKET",
00269 "ID_TIMESTAMP",
00270 "ID_PONG",
00271 "ID_ADVERTISE_SYSTEM",
00272 "ID_REMOTE_DISCONNECTION_NOTIFICATION",
00273 "ID_REMOTE_CONNECTION_LOST",
00274 "ID_REMOTE_NEW_INCOMING_CONNECTION",
00275 "ID_DOWNLOAD_PROGRESS",
00276 "ID_FILE_LIST_TRANSFER_HEADER",
00277 "ID_FILE_LIST_TRANSFER_FILE",
00278 "ID_FILE_LIST_REFERENCE_PUSH_ACK",
00279 "ID_DDT_DOWNLOAD_REQUEST",
00280 "ID_TRANSPORT_STRING",
00281 "ID_REPLICA_MANAGER_CONSTRUCTION",
00282 "ID_REPLICA_MANAGER_DESTRUCTION",
00283 "ID_REPLICA_MANAGER_SCOPE_CHANGE",
00284 "ID_REPLICA_MANAGER_SERIALIZE",
00285 "ID_REPLICA_MANAGER_DOWNLOAD_STARTED",
00286 "ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE",
00287 "ID_CONNECTION_GRAPH_REQUEST",
00288 "ID_CONNECTION_GRAPH_REPLY",
00289 "ID_CONNECTION_GRAPH_UPDATE",
00290 "ID_CONNECTION_GRAPH_NEW_CONNECTION",
00291 "ID_CONNECTION_GRAPH_CONNECTION_LOST",
00292 "ID_CONNECTION_GRAPH_DISCONNECTION_NOTIFICATION",
00293 "ID_ROUTE_AND_MULTICAST",
00294 "ID_RAKVOICE_OPEN_CHANNEL_REQUEST",
00295 "ID_RAKVOICE_OPEN_CHANNEL_REPLY",
00296 "ID_RAKVOICE_CLOSE_CHANNEL",
00297 "ID_RAKVOICE_DATA",
00298 "ID_AUTOPATCHER_GET_CHANGELIST_SINCE_DATE",
00299 "ID_AUTOPATCHER_CREATION_LIST",
00300 "ID_AUTOPATCHER_DELETION_LIST",
00301 "ID_AUTOPATCHER_GET_PATCH",
00302 "ID_AUTOPATCHER_PATCH_LIST",
00303 "ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR",
00304 "ID_AUTOPATCHER_FINISHED_INTERNAL",
00305 "ID_AUTOPATCHER_FINISHED",
00306 "ID_AUTOPATCHER_RESTART_APPLICATION",
00307 "ID_NAT_PUNCHTHROUGH_REQUEST",
00308 "ID_NAT_CONNECT_AT_TIME",
00309 "ID_NAT_GET_MOST_RECENT_PORT",
00310 "ID_NAT_CLIENT_READY",
00311 "ID_NAT_TARGET_NOT_CONNECTED",
00312 "ID_NAT_TARGET_UNRESPONSIVE",
00313 "ID_NAT_CONNECTION_TO_TARGET_LOST",
00314 "ID_NAT_ALREADY_IN_PROGRESS",
00315 "ID_NAT_PUNCHTHROUGH_FAILED",
00316 "ID_NAT_PUNCHTHROUGH_SUCCEEDED",
00317 "ID_DATABASE_QUERY_REQUEST",
00318 "ID_DATABASE_UPDATE_ROW",
00319 "ID_DATABASE_REMOVE_ROW",
00320 "ID_DATABASE_QUERY_REPLY",
00321 "ID_DATABASE_UNKNOWN_TABLE",
00322 "ID_DATABASE_INCORRECT_PASSWORD",
00323 "ID_READY_EVENT_SET",
00324 "ID_READY_EVENT_UNSET",
00325 "ID_READY_EVENT_ALL_SET",
00326 "ID_READY_EVENT_QUERY",
00327 "ID_LOBBY_GENERAL",
00328 "ID_AUTO_RPC_CALL",
00329 "ID_AUTO_RPC_REMOTE_INDEX",
00330 "ID_AUTO_RPC_UNKNOWN_REMOTE_INDEX",
00331 "ID_RPC_REMOTE_ERROR",
00332 "ID_FILE_LIST_REFERENCE_PUSH",
00333 "ID_READY_EVENT_FORCE_ALL_SET",
00334 "ID_ROOMS_EXECUTE_FUNC",
00335 "ID_ROOMS_LOGON_STATUS",
00336 "ID_ROOMS_HANDLE_CHANGE",
00337 "ID_LOBBY2_SEND_MESSAGE",
00338 "ID_LOBBY2_SERVER_ERROR",
00339 "ID_FCM2_NEW_HOST",
00340 "ID_FCM2_REQUEST_FCMGUID",
00341 "ID_FCM2_RESPOND_CONNECTION_COUNT",
00342 "ID_FCM2_INFORM_FCMGUID",
00343 "ID_UDP_PROXY_GENERAL",
00344 "ID_SQLite3_EXEC",
00345 "ID_SQLite3_UNKNOWN_DB",
00346 "ID_REPLICA_MANAGER_3_SERIALIZE_CONSTRUCTION_EXISTING",
00347 "ID_REPLICA_MANAGER_3_LOCAL_CONSTRUCTION_REJECTED",
00348 "ID_REPLICA_MANAGER_3_LOCAL_CONSTRUCTION_ACCEPTED",
00349 "ID_NAT_TYPE_DETECTION_REQUEST",
00350 "ID_NAT_TYPE_DETECTION_RESULT",
00351 "ID_SQLLITE_LOGGER",
00352 "ID_ROUTER_2_INTERNAL",
00353 "ID_ROUTER_2_FORWARDING_NO_PATH",
00354 "ID_ROUTER_2_REROUTED",
00355 "ID_TEAM_BALANCER_INTERNAL",
00356 "ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING",
00357 "ID_TEAM_BALANCER_TEAMS_LOCKED",
00358 "ID_TEAM_BALANCER_TEAM_ASSIGNED",
00359 "ID_LIGHTSPEED_INTEGRATION",
00360 "ID_RPC_4_PLUGIN",
00361 "ID_SND_RECEIPT_ACKED",
00362 "ID_SND_RECEIPT_LOSS",
00363 "ID_RESERVED_5",
00364 "ID_RESERVED_6",
00365 "ID_RESERVED_7",
00366 "ID_RESERVED_8",
00367 "ID_RESERVED_9",
00368 "ID_USER_PACKET_ENUM"
00369 };
00370
00371 return (char*)IDTable[Id];
00372 }
00373 const char* PacketLogger::UserIDTOString(unsigned char Id)
00374 {
00375
00376 static char str[256];
00377 Itoa(Id, str, 10);
00378 return (const char*) str;
00379 }
00380 const char* PacketLogger::IDTOString(unsigned char Id)
00381 {
00382 const char *out;
00383 out=BaseIDTOString(Id);
00384 if (out)
00385 return out;
00386 return UserIDTOString(Id);
00387 }
00388 void PacketLogger::SetPrefix(const char *_prefix)
00389 {
00390 strncpy(prefix, _prefix, 255);
00391 prefix[255]=0;
00392 }
00393 void PacketLogger::SetSuffix(const char *_suffix)
00394 {
00395 strncpy(suffix, _suffix, 255);
00396 suffix[255]=0;
00397 }
00398 void PacketLogger::GetLocalTime(char buffer[128])
00399 {
00400 #if defined(_WIN32) && !defined(__GNUC__) && !defined(__GCCXML__)
00401 time_t rawtime;
00402 struct timeval tv;
00403
00404 struct timezone tz;
00405 gettimeofday(&tv, &tz);
00406
00407 rawtime=tv.tv_sec;
00408
00409 struct tm * timeinfo;
00410 timeinfo = localtime ( &rawtime );
00411 strftime (buffer,128,"%x %X",timeinfo);
00412 char buff[32];
00413 sprintf(buff, ".%i", tv.tv_usec);
00414 strcat(buffer,buff);
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428 #else
00429 buffer[0]=0;
00430 #endif
00431 }
00432 void PacketLogger::SetLogDirectMessages(bool send)
00433 {
00434 logDirectMessages=send;
00435 }
00436
00437 #ifdef _MSC_VER
00438 #pragma warning( pop )
00439 #endif
00440
00441 #endif // _RAKNET_SUPPORT_*