1.1 --- a/src/applications/v4ping/v4ping.cc Mon Jun 08 16:44:21 2009 +0200
1.2 +++ b/src/applications/v4ping/v4ping.cc Mon Jun 08 16:45:13 2009 +0200
1.3 @@ -87,10 +87,11 @@
1.4 if (echo.GetSequenceNumber () == (m_seq - 1) &&
1.5 echo.GetIdentifier () == 0)
1.6 {
1.7 - Ptr<const Packet> data = echo.GetData ();
1.8 - if (data->GetSize () == 16)
1.9 + uint8_t data[16];
1.10 + uint32_t dataSize = echo.GetData (data);
1.11 + if (dataSize == 16)
1.12 {
1.13 - uint32_t *buf = (uint32_t *)data->PeekData ();
1.14 + uint32_t *buf = (uint32_t *)data;
1.15 if (buf[0] == GetNode ()->GetId () &&
1.16 buf[1] == GetApplicationId ())
1.17 {
2.1 --- a/src/internet-stack/icmpv4.cc Mon Jun 08 16:44:21 2009 +0200
2.2 +++ b/src/internet-stack/icmpv4.cc Mon Jun 08 16:45:13 2009 +0200
2.3 @@ -108,7 +108,9 @@
2.4 void
2.5 Icmpv4Echo::SetData (Ptr<const Packet> data)
2.6 {
2.7 - m_data = data->Copy ();
2.8 + uint32_t size = (data->GetSize ()>16)?16:data->GetSize();
2.9 + data->CopyData (m_data, size);
2.10 + m_dataSize = size;
2.11 }
2.12 uint16_t
2.13 Icmpv4Echo::GetIdentifier (void) const
2.14 @@ -120,10 +122,11 @@
2.15 {
2.16 return m_sequence;
2.17 }
2.18 -Ptr<const Packet>
2.19 -Icmpv4Echo::GetData (void) const
2.20 +uint32_t
2.21 +Icmpv4Echo::GetData (uint8_t data[16]) const
2.22 {
2.23 - return m_data->Copy ();
2.24 + memcpy (data, m_data, m_dataSize);
2.25 + return m_dataSize;
2.26 }
2.27
2.28
2.29 @@ -139,8 +142,14 @@
2.30 Icmpv4Echo::Icmpv4Echo ()
2.31 : m_identifier (0),
2.32 m_sequence (0),
2.33 - m_data (0)
2.34 -{}
2.35 + m_dataSize (0)
2.36 +{
2.37 + // make sure that thing is initialized to get initialized bytes
2.38 + for (uint8_t j = 0; j < 16; j++)
2.39 + {
2.40 + m_data[j] = 0;
2.41 + }
2.42 +}
2.43 Icmpv4Echo::~Icmpv4Echo ()
2.44 {}
2.45 TypeId
2.46 @@ -151,14 +160,14 @@
2.47 uint32_t
2.48 Icmpv4Echo::GetSerializedSize (void) const
2.49 {
2.50 - return 4 + m_data->GetSize ();
2.51 + return 4 + m_dataSize;
2.52 }
2.53 void
2.54 Icmpv4Echo::Serialize (Buffer::Iterator start) const
2.55 {
2.56 start.WriteHtonU16 (m_identifier);
2.57 start.WriteHtonU16 (m_sequence);
2.58 - start.Write (m_data->PeekData (), m_data->GetSize ());
2.59 + start.Write (m_data, m_dataSize);
2.60 }
2.61 uint32_t
2.62 Icmpv4Echo::Deserialize (Buffer::Iterator start)
2.63 @@ -166,11 +175,8 @@
2.64 m_identifier = start.ReadNtohU16 ();
2.65 m_sequence = start.ReadNtohU16 ();
2.66 NS_ASSERT (start.GetSize () >= 4);
2.67 - uint32_t size = start.GetSize () - 4;
2.68 - uint8_t *buffer = new uint8_t[size] ();
2.69 - start.Read (buffer, size);
2.70 - m_data = Create<Packet> (buffer, size);
2.71 - delete[] buffer;
2.72 + m_dataSize = start.GetSize () - 4;
2.73 + start.Read (m_data, m_dataSize);
2.74 return start.GetSize ();
2.75 }
2.76 void
3.1 --- a/src/internet-stack/icmpv4.h Mon Jun 08 16:44:21 2009 +0200
3.2 +++ b/src/internet-stack/icmpv4.h Mon Jun 08 16:45:13 2009 +0200
3.3 @@ -50,7 +50,7 @@
3.4 void SetData (Ptr<const Packet> data);
3.5 uint16_t GetIdentifier (void) const;
3.6 uint16_t GetSequenceNumber (void) const;
3.7 - Ptr<const Packet> GetData (void) const;
3.8 + uint32_t GetData (uint8_t payload[16]) const;
3.9
3.10
3.11 static TypeId GetTypeId (void);
3.12 @@ -64,7 +64,8 @@
3.13 private:
3.14 uint16_t m_identifier;
3.15 uint16_t m_sequence;
3.16 - Ptr<Packet> m_data;
3.17 + uint8_t m_data[16];
3.18 + uint32_t m_dataSize;
3.19 };
3.20
3.21 class Icmpv4DestinationUnreachable : public Header