diff --git a/src/common/Network/CommonNetwork.h b/src/common/Network/CommonNetwork.h index fbebcf31..a6901f2e 100644 --- a/src/common/Network/CommonNetwork.h +++ b/src/common/Network/CommonNetwork.h @@ -137,10 +137,11 @@ struct FFXIVARR_PACKET_RAW */ enum FFXIVARR_SEGMENT_TYPE { + SEGMENTTYPE_SESSIONINIT = 1, SEGMENTTYPE_IPC = 3, - SEGMENTTYPE_RESPONSE = 7, - SEGMENTTYPE_KEEPALIVE = 8, - SEGMENTTYPE_ENCRYPTIONHANDSHAKE = 9, + SEGMENTTYPE_KEEPALIVE = 7, + //SEGMENTTYPE_RESPONSE = 8, + SEGMENTTYPE_ENCRYPTIONINIT = 9, }; /** diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index 7a6fe489..c9ee97fe 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -14,6 +14,12 @@ #include "CommonNetwork.h" #include "PacketDef/Ipcs.h" +#include +#include +#include + +extern Core::Framework g_fw; + namespace Core { namespace Network { namespace Packets { @@ -186,6 +192,13 @@ public: memcpy( &m_segHdr, &rawPacket.segHdr, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); memcpy( &m_data, &rawPacket.data[0] + ipcHdrSize, copySize ); + auto log = g_fw.get< Core::Logger >(); + if( log ) + { + log->debug( "rawpacket size" + std::to_string( rawPacket.segHdr.size ) + "\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &rawPacket.data[0] ), rawPacket.segHdr.size ) ); + log->debug( "T size " + std::to_string( sizeof( T ) ) + "\n" + Util::binaryToHexDump( reinterpret_cast< uint8_t* >( &m_data ), sizeof( T ) ) ); + } + memset( &m_ipcHdr, 0, ipcHdrSize ); m_ipcHdr.type = static_cast< ServerZoneIpcType >( m_data._ServerIpcType ); } diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 55a87f7f..61bed5b7 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -14,8 +14,8 @@ struct FFXIVIpcGmCommand1 : FFXIVIpcBasePacket< GMCommand1 > /* 0000 */ uint32_t commandId; /* 0004 */ uint32_t param1; /* 0008 */ uint32_t param2; - /* 000C */ char unknown_C[28]; - /* 0028 */ uint32_t param3; + /* 000C */ uint8_t unknown_C[0xC]; + /* 0018 */ uint32_t param3; }; } diff --git a/src/servers/sapphire_lobby/GameConnection.cpp b/src/servers/sapphire_lobby/GameConnection.cpp index c5cc7ed0..8c402d3e 100644 --- a/src/servers/sapphire_lobby/GameConnection.cpp +++ b/src/servers/sapphire_lobby/GameConnection.cpp @@ -483,7 +483,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: switch( inPacket.segHdr.type ) { - case 9: // Encryption init + case SEGMENTTYPE_ENCRYPTIONINIT: // Encryption init { std::string key_phrase( reinterpret_cast< char* >( &inPacket.data[36] ) ); generateEncryptionKey( *reinterpret_cast< uint32_t* >( &inPacket.data[100] ), key_phrase ); @@ -501,13 +501,13 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: } - case 3: // game packet + case SEGMENTTYPE_IPC: // game packet { g_log.info( "GamePacket [" + std::to_string( inPacket.segHdr.type ) + "]" ); handleGamePacket( inPacket ); break; } - case 7: // keep alive + case SEGMENTTYPE_KEEPALIVE: // keep alive { uint32_t id = *reinterpret_cast< uint32_t* >( &inPacket.data[0] ); uint32_t timeStamp = *reinterpret_cast< uint32_t* >( &inPacket.data[4] ); diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index d29022e5..b0e78bfa 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -211,7 +211,7 @@ void Core::Network::GameConnection::handleZonePacket( Core::Network::Packets::FF pLog->debug( sessionStr + " Undefined Zone IPC : Unknown ( " + boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( opcode ) ) + " )" ); - //pLog->debug( "\n" + pPacket.toString() ); + pLog->debug( "Dump:\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &pPacket.data[0] ), pPacket.segHdr.size ) ); } } @@ -381,7 +381,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: { switch( inPacket.segHdr.type ) { - case 1: + case SEGMENTTYPE_SESSIONINIT: { char* id = ( char* ) &( inPacket.data[4] ); uint32_t playerId = boost::lexical_cast< uint32_t >( id ); @@ -445,12 +445,12 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: break; } - case 3: // game packet + case SEGMENTTYPE_IPC: // game packet { queueInPacket( inPacket ); break; } - case 7: // keep alive + case SEGMENTTYPE_KEEPALIVE: // keep alive { uint32_t id = *( uint32_t* ) &inPacket.data[0]; uint32_t timeStamp = *( uint32_t* ) &inPacket.data[4];