mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-04 17:57:47 +00:00
Merge pull request #897 from hkAlice/align-packet-boundary
[3.x] 8-byte packet data alignment;
This commit is contained in:
commit
947af534f6
2 changed files with 50 additions and 15 deletions
|
@ -90,11 +90,6 @@ namespace Sapphire::Network::Packets
|
||||||
setTargetActor( targetActorId );
|
setTargetActor( targetActorId );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t getSize() const
|
|
||||||
{
|
|
||||||
return m_segHdr.size;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual std::vector< uint8_t > getData() const
|
virtual std::vector< uint8_t > getData() const
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
|
@ -104,6 +99,7 @@ namespace Sapphire::Network::Packets
|
||||||
/** The segment header */
|
/** The segment header */
|
||||||
FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr;
|
FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr;
|
||||||
uint16_t m_segmentType;
|
uint16_t m_segmentType;
|
||||||
|
std::size_t m_alignedSize;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual size_t getContentSize()
|
virtual size_t getContentSize()
|
||||||
|
@ -124,6 +120,33 @@ namespace Sapphire::Network::Packets
|
||||||
return m_segmentType;
|
return m_segmentType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief gets current packet size
|
||||||
|
* @return packet size in bytes
|
||||||
|
*/
|
||||||
|
std::size_t getSize() const
|
||||||
|
{
|
||||||
|
return m_segHdr.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief gets aligned packet size
|
||||||
|
* @return packet size in bytes, to 8 byte %
|
||||||
|
*/
|
||||||
|
std::size_t getAlignedSize() const
|
||||||
|
{
|
||||||
|
return m_alignedSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief sets current packet size
|
||||||
|
* @param packet size in bytes
|
||||||
|
*/
|
||||||
|
void setSize( std::size_t packetSize )
|
||||||
|
{
|
||||||
|
m_segHdr.size = packetSize;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Sets the source actor id for this packet.
|
* @brief Sets the source actor id for this packet.
|
||||||
* @param actorId The source actor id.
|
* @param actorId The source actor id.
|
||||||
|
@ -169,6 +192,8 @@ namespace Sapphire::Network::Packets
|
||||||
// The size must be the sum of the segment header and the content
|
// The size must be the sum of the segment header and the content
|
||||||
m_segHdr.size = static_cast< uint32_t >( sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + getContentSize() );
|
m_segHdr.size = static_cast< uint32_t >( sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + getContentSize() );
|
||||||
m_segHdr.type = getSegmentType();
|
m_segHdr.type = getSegmentType();
|
||||||
|
|
||||||
|
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -200,6 +225,8 @@ namespace Sapphire::Network::Packets
|
||||||
|
|
||||||
memset( &m_ipcHdr, 0, ipcHdrSize );
|
memset( &m_ipcHdr, 0, ipcHdrSize );
|
||||||
m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType );
|
m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType );
|
||||||
|
|
||||||
|
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getContentSize() override
|
size_t getContentSize() override
|
||||||
|
@ -258,6 +285,7 @@ namespace Sapphire::Network::Packets
|
||||||
m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType );
|
m_ipcHdr.type = static_cast< WorldPackets::Server::ServerZoneIpcType >( m_data._ServerIpcType );
|
||||||
m_ipcHdr.timestamp = Common::Util::getTimeSeconds();
|
m_ipcHdr.timestamp = Common::Util::getTimeSeconds();
|
||||||
m_segHdr.size = sizeof( T ) + sizeof( FFXIVARR_IPC_HEADER ) + sizeof( FFXIVARR_PACKET_SEGMENT_HEADER );
|
m_segHdr.size = sizeof( T ) + sizeof( FFXIVARR_IPC_HEADER ) + sizeof( FFXIVARR_PACKET_SEGMENT_HEADER );
|
||||||
|
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -278,6 +306,7 @@ namespace Sapphire::Network::Packets
|
||||||
{
|
{
|
||||||
initialize();
|
initialize();
|
||||||
m_segHdr.size = size;
|
m_segHdr.size = size;
|
||||||
|
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
|
||||||
};
|
};
|
||||||
|
|
||||||
FFXIVRawPacket( char* data, uint16_t size ) :
|
FFXIVRawPacket( char* data, uint16_t size ) :
|
||||||
|
@ -287,6 +316,7 @@ namespace Sapphire::Network::Packets
|
||||||
|
|
||||||
memcpy( &m_data[ 0 ], data + segmentHdrSize, size - segmentHdrSize );
|
memcpy( &m_data[ 0 ], data + segmentHdrSize, size - segmentHdrSize );
|
||||||
memcpy( &m_segHdr, data, segmentHdrSize );
|
memcpy( &m_segHdr, data, segmentHdrSize );
|
||||||
|
m_alignedSize = m_segHdr.size + ( m_segHdr.size % 8 );
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getContentSize() override
|
size_t getContentSize() override
|
||||||
|
|
|
@ -26,13 +26,13 @@ void Network::Packets::PacketContainer::addPacket( Network::Packets::FFXIVPacket
|
||||||
{
|
{
|
||||||
m_entryList.push_back( entry );
|
m_entryList.push_back( entry );
|
||||||
|
|
||||||
m_ipcHdr.size += static_cast< uint32_t >( entry->getSize() );
|
m_ipcHdr.size += static_cast< uint32_t >( entry->getAlignedSize() );
|
||||||
m_ipcHdr.count++;
|
m_ipcHdr.count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer )
|
void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer )
|
||||||
{
|
{
|
||||||
std::vector< uint8_t > tempBuffer( m_ipcHdr.size );
|
std::vector< uint8_t > tempBuffer( m_ipcHdr.size, 0 );
|
||||||
memset( &tempBuffer[ 0 ], 0, m_ipcHdr.size );
|
memset( &tempBuffer[ 0 ], 0, m_ipcHdr.size );
|
||||||
|
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
|
@ -43,14 +43,9 @@ void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >&
|
||||||
m_ipcHdr.timestamp = tick;
|
m_ipcHdr.timestamp = tick;
|
||||||
m_ipcHdr.unknown_20 = 1;
|
m_ipcHdr.unknown_20 = 1;
|
||||||
|
|
||||||
memcpy( &tempBuffer[ 0 ], &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) );
|
|
||||||
|
|
||||||
auto it = m_entryList.begin();
|
auto it = m_entryList.begin();
|
||||||
std::size_t offset = 0;
|
std::size_t offset = 0;
|
||||||
|
|
||||||
if( m_entryList.size() > 1 )
|
|
||||||
offset = 0;
|
|
||||||
|
|
||||||
for( ; it != m_entryList.end(); ++it )
|
for( ; it != m_entryList.end(); ++it )
|
||||||
{
|
{
|
||||||
auto pPacket = ( *it );
|
auto pPacket = ( *it );
|
||||||
|
@ -60,13 +55,23 @@ void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >&
|
||||||
pPacket->setTargetActor( m_segmentTargetOverride );
|
pPacket->setTargetActor( m_segmentTargetOverride );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get aligned and original packet data size for offset and copy
|
||||||
|
auto packetAlignedSize = pPacket->getAlignedSize();
|
||||||
|
auto packetOriginalSize = pPacket->getSize();
|
||||||
|
|
||||||
|
// set packet size in seg header to aligned size
|
||||||
|
pPacket->setSize( packetAlignedSize );
|
||||||
|
|
||||||
|
// copy packet data into buffer
|
||||||
auto data = pPacket->getData();
|
auto data = pPacket->getData();
|
||||||
memcpy( &tempBuffer[ 0 ] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[ 0 ], pPacket->getSize() );
|
memcpy( &tempBuffer[ 0 ] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[ 0 ], packetOriginalSize );
|
||||||
offset += pPacket->getSize();
|
|
||||||
|
offset += packetAlignedSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendBuffer.assign( &tempBuffer[ 0 ], &tempBuffer[ 0 ] + m_ipcHdr.size );
|
memcpy( &tempBuffer[ 0 ], &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) );
|
||||||
|
|
||||||
|
sendBuffer.assign( &tempBuffer[ 0 ], &tempBuffer[ 0 ] + m_ipcHdr.size );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Network::Packets::PacketContainer::toString()
|
std::string Network::Packets::PacketContainer::toString()
|
||||||
|
|
Loading…
Add table
Reference in a new issue