mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-27 14:57:44 +00:00
align packets in containers to 8 byte boundary;
This commit is contained in:
parent
a1e402de07
commit
f6acb8540d
2 changed files with 40 additions and 13 deletions
|
@ -90,11 +90,6 @@ namespace Sapphire::Network::Packets
|
|||
setTargetActor( targetActorId );
|
||||
}
|
||||
|
||||
std::size_t getSize() const
|
||||
{
|
||||
return m_segHdr.size;
|
||||
}
|
||||
|
||||
virtual std::vector< uint8_t > getData() const
|
||||
{
|
||||
return {};
|
||||
|
@ -124,6 +119,24 @@ namespace Sapphire::Network::Packets
|
|||
return m_segmentType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief gets current packet size
|
||||
* @return packet size in bytes
|
||||
*/
|
||||
std::size_t getSize() const
|
||||
{
|
||||
return m_segHdr.size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
* @param actorId The source actor id.
|
||||
|
|
|
@ -43,14 +43,9 @@ void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >&
|
|||
m_ipcHdr.timestamp = tick;
|
||||
m_ipcHdr.unknown_20 = 1;
|
||||
|
||||
memcpy( &tempBuffer[ 0 ], &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) );
|
||||
|
||||
auto it = m_entryList.begin();
|
||||
std::size_t offset = 0;
|
||||
|
||||
if( m_entryList.size() > 1 )
|
||||
offset = 0;
|
||||
|
||||
for( ; it != m_entryList.end(); ++it )
|
||||
{
|
||||
auto pPacket = ( *it );
|
||||
|
@ -60,13 +55,32 @@ void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >&
|
|||
pPacket->setTargetActor( m_segmentTargetOverride );
|
||||
}
|
||||
|
||||
auto validPacketDataSize = pPacket->getSize();
|
||||
|
||||
// check if packet is 8 byte aligned
|
||||
auto alignCheck = validPacketDataSize % 8;
|
||||
if( alignCheck != 0 )
|
||||
{
|
||||
// pad packet to boundary
|
||||
// resize is expensive
|
||||
tempBuffer.resize( tempBuffer.size() + alignCheck, 0 );
|
||||
|
||||
pPacket->setSize( validPacketDataSize + alignCheck );
|
||||
}
|
||||
|
||||
// copy packet data into buffer
|
||||
auto data = pPacket->getData();
|
||||
memcpy( &tempBuffer[ 0 ] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[ 0 ], pPacket->getSize() );
|
||||
offset += pPacket->getSize();
|
||||
memcpy( &tempBuffer[ 0 ] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[ 0 ], validPacketDataSize );
|
||||
|
||||
offset += validPacketDataSize + alignCheck;
|
||||
}
|
||||
|
||||
sendBuffer.assign( &tempBuffer[ 0 ], &tempBuffer[ 0 ] + m_ipcHdr.size );
|
||||
// buffer has possibly been resized for alignment
|
||||
m_ipcHdr.size = tempBuffer.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()
|
||||
|
|
Loading…
Add table
Reference in a new issue