Commit 6dd7a92b authored by Pavel Vainerman's avatar Pavel Vainerman

(UNetUDP): check byte order

parent daae9e46
......@@ -14,16 +14,29 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// -------------------------------------------------------------------------
#include <cstdint>
#include <endian.h>
#include "UDPPacket.h"
// -------------------------------------------------------------------------
#if INTPTR_MAX == INT64_MAX
#define LE_TO_H(x) le64toh(x)
#define BE_TO_H(x) be64toh(x)
#elif INTPTR_MAX == INT32_MAX
#define LE_TO_H(x) le32toh(x)
#define BE_TO_H(x) be32toh(x)
#else
#error UNET: Unknown pointer size
#endif
// -------------------------------------------------------------------------
namespace uniset
{
// -----------------------------------------------------------------------------
// ---------------------------------------------------------------------
using namespace std;
using namespace UniSetUDP;
// -----------------------------------------------------------------------------
// ---------------------------------------------------------------------
#define USE_CRC_TAB 1 // при расчёте использовать таблицы
// -------------------------------------------------------------------------
// ---------------------------------------------------------------------
#ifdef USE_CRC_TAB
static unsigned short crc_16_tab[] =
{
......@@ -291,6 +304,37 @@ namespace uniset
memcpy(&m, &(p.data[i]), sizeof(UDPHeader));
i += sizeof(UDPHeader);
// byte order from packet
u_char be_order = m._be_order;
if( be_order )
{
m.magic = BE_TO_H(m.magic);
m.num = BE_TO_H(m.num);
m.procID = BE_TO_H(m.procID);
m.nodeID = BE_TO_H(m.nodeID);
m.dcount = BE_TO_H(m.dcount);
m.acount = BE_TO_H(m.acount);
}
else
{
m.magic = LE_TO_H(m.magic);
m.num = LE_TO_H(m.num);
m.procID = LE_TO_H(m.procID);
m.nodeID = LE_TO_H(m.nodeID);
m.dcount = LE_TO_H(m.dcount);
m.acount = LE_TO_H(m.acount);
}
// set host byte order
#if __BYTE_ORDER == __LITTLE_ENDIAN
m._be_order = 0;
#elif __BYTE_ORDER == __BIG_ENDIAN
m. be_order = 1;
#else
#error UNET(getMessage): Unknown byte order!
#endif
// проверяем наш ли пакет..
if( m.magic != UniSetUDP::UNETUDP_MAGICNUM )
{
......@@ -326,6 +370,30 @@ namespace uniset
memcpy(m.d_dat, &(p.data[i]), sz);
// CONVERT DATA TO HOST BYTE ORDER
// -------------------------------
for( size_t n = 0; n < m.acount; n++ )
{
if( be_order )
{
m.a_dat[n].id = BE_TO_H(m.a_dat[n].id);
m.a_dat[n].val = BE_TO_H(m.a_dat[n].val);
}
else
{
m.a_dat[n].id = LE_TO_H(m.a_dat[n].id);
m.a_dat[n].val = LE_TO_H(m.a_dat[n].val);
}
}
for( size_t n = 0; n < m.dcount; n++ )
{
if( be_order )
m.d_id[n] = BE_TO_H(m.d_id[n]);
else
m.d_id[n] = LE_TO_H(m.d_id[n]);
}
return i + sz;
}
// -----------------------------------------------------------------------------
......@@ -337,5 +405,22 @@ namespace uniset
crc[2] = makeCRC( (unsigned char*)(d_dat), sizeof(d_dat) );
return makeCRC( (unsigned char*)(&crc), sizeof(crc) );
}
UDPHeader::UDPHeader() noexcept
: magic(UNETUDP_MAGICNUM)
#if __BYTE_ORDER == __LITTLE_ENDIAN
, _be_order(0)
#elif __BYTE_ORDER == __BIG_ENDIAN
, _be_order(1)
#else
#error UNET: Unknown byte order!
#endif
, num(0)
, nodeID(0)
, procID(0)
, dcount(0)
, acount(0)
{}
// -----------------------------------------------------------------------------
} // end of namespace uniset
......@@ -40,12 +40,13 @@ namespace uniset
т.к. это не сильно актуально, пока не переделываю.
*/
const uint32_t UNETUDP_MAGICNUM = 0x1337A1D; // идентификатор протокола
const uint32_t UNETUDP_MAGICNUM = 0x133EF54; // идентификатор протокола
struct UDPHeader
{
UDPHeader() noexcept: magic(UNETUDP_MAGICNUM), num(0), nodeID(0), procID(0), dcount(0), acount(0) {}
UDPHeader() noexcept;
uint32_t magic;
u_char _be_order; // 1 - BE byte order, 0 - LE byte order
size_t num;
long nodeID;
long procID;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment