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

(UNetUDP): check byte order

parent daae9e46
...@@ -14,16 +14,29 @@ ...@@ -14,16 +14,29 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#include <cstdint>
#include <endian.h>
#include "UDPPacket.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 namespace uniset
{ {
// ----------------------------------------------------------------------------- // ---------------------------------------------------------------------
using namespace std; using namespace std;
using namespace UniSetUDP; using namespace UniSetUDP;
// ----------------------------------------------------------------------------- // ---------------------------------------------------------------------
#define USE_CRC_TAB 1 // при расчёте использовать таблицы #define USE_CRC_TAB 1 // при расчёте использовать таблицы
// ------------------------------------------------------------------------- // ---------------------------------------------------------------------
#ifdef USE_CRC_TAB #ifdef USE_CRC_TAB
static unsigned short crc_16_tab[] = static unsigned short crc_16_tab[] =
{ {
...@@ -291,6 +304,37 @@ namespace uniset ...@@ -291,6 +304,37 @@ namespace uniset
memcpy(&m, &(p.data[i]), sizeof(UDPHeader)); memcpy(&m, &(p.data[i]), sizeof(UDPHeader));
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 ) if( m.magic != UniSetUDP::UNETUDP_MAGICNUM )
{ {
...@@ -326,6 +370,30 @@ namespace uniset ...@@ -326,6 +370,30 @@ namespace uniset
memcpy(m.d_dat, &(p.data[i]), sz); 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; return i + sz;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -337,5 +405,22 @@ namespace uniset ...@@ -337,5 +405,22 @@ namespace uniset
crc[2] = makeCRC( (unsigned char*)(d_dat), sizeof(d_dat) ); crc[2] = makeCRC( (unsigned char*)(d_dat), sizeof(d_dat) );
return makeCRC( (unsigned char*)(&crc), sizeof(crc) ); 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 } // end of namespace uniset
...@@ -40,12 +40,13 @@ namespace uniset ...@@ -40,12 +40,13 @@ namespace uniset
т.к. это не сильно актуально, пока не переделываю. т.к. это не сильно актуально, пока не переделываю.
*/ */
const uint32_t UNETUDP_MAGICNUM = 0x1337A1D; // идентификатор протокола const uint32_t UNETUDP_MAGICNUM = 0x133EF54; // идентификатор протокола
struct UDPHeader struct UDPHeader
{ {
UDPHeader() noexcept: magic(UNETUDP_MAGICNUM), num(0), nodeID(0), procID(0), dcount(0), acount(0) {} UDPHeader() noexcept;
uint32_t magic; uint32_t magic;
u_char _be_order; // 1 - BE byte order, 0 - LE byte order
size_t num; size_t num;
long nodeID; long nodeID;
long procID; 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