From ef2941417da57dcfd98a5897b6e5b96757e988fb Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Thu, 30 Dec 2010 11:09:57 -0800 Subject: [PATCH] bug 1029: fix endian issue in v4ping.cc --- src/applications/v4ping/v4ping.cc | 19 ++++++++++++++++--- src/applications/v4ping/v4ping.h | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/applications/v4ping/v4ping.cc b/src/applications/v4ping/v4ping.cc index 6b5f159f4..95a1aee85 100644 --- a/src/applications/v4ping/v4ping.cc +++ b/src/applications/v4ping/v4ping.cc @@ -124,12 +124,16 @@ V4Ping::Receive (Ptr socket) { uint32_t buf[m_size / 4]; uint32_t dataSize = echo.GetDataSize (); + uint32_t nodeId; + uint32_t appId; if (dataSize == sizeof(buf)) { echo.GetData ((uint8_t *)buf); + Read32 ((const uint8_t *) &buf[0], nodeId); + Read32 ((const uint8_t *) &buf[1], appId); - if (buf[0] == GetNode ()->GetId () && - buf[1] == GetApplicationId ()) + if (nodeId == GetNode ()->GetId () && + appId == GetApplicationId ()) { Time sendTime = i->second; NS_ASSERT (Simulator::Now () >= sendTime); @@ -154,8 +158,10 @@ V4Ping::Receive (Ptr socket) } } +// Writes data to buffer in little-endian format; least significant byte +// of data is at lowest buffer address void -V4Ping::Write32 (uint8_t *buffer, uint32_t data) +V4Ping::Write32 (uint8_t *buffer, const uint32_t data) { buffer[0] = (data >> 0) & 0xff; buffer[1] = (data >> 8) & 0xff; @@ -163,6 +169,13 @@ V4Ping::Write32 (uint8_t *buffer, uint32_t data) buffer[3] = (data >> 24) & 0xff; } +// Writes data from a little-endian formatted buffer to data +void +V4Ping::Read32 (const uint8_t *buffer, uint32_t &data) +{ + data = (buffer[3] << 24) + (buffer[2] << 16) + (buffer[1] << 8) + buffer[0]; +} + void V4Ping::Send () { diff --git a/src/applications/v4ping/v4ping.h b/src/applications/v4ping/v4ping.h index 3eb3e64b3..822ddd793 100644 --- a/src/applications/v4ping/v4ping.h +++ b/src/applications/v4ping/v4ping.h @@ -45,7 +45,8 @@ public: virtual ~V4Ping (); private: - void Write32 (uint8_t *buffer, uint32_t data); + void Write32 (uint8_t *buffer, const uint32_t data); + void Read32 (const uint8_t *buffer, uint32_t &data); // inherited from Application base class. virtual void StartApplication (void);