no need to keep around a Ptr<Packet>

This commit is contained in:
Mathieu Lacage
2009-06-08 16:45:13 +02:00
parent 2ae6d337a3
commit b1dc85e1c7
3 changed files with 26 additions and 18 deletions

View File

@@ -108,7 +108,9 @@ Icmpv4Echo::SetSequenceNumber (uint16_t seq)
void
Icmpv4Echo::SetData (Ptr<const Packet> data)
{
m_data = data->Copy ();
uint32_t size = (data->GetSize ()>16)?16:data->GetSize();
data->CopyData (m_data, size);
m_dataSize = size;
}
uint16_t
Icmpv4Echo::GetIdentifier (void) const
@@ -120,10 +122,11 @@ Icmpv4Echo::GetSequenceNumber (void) const
{
return m_sequence;
}
Ptr<const Packet>
Icmpv4Echo::GetData (void) const
uint32_t
Icmpv4Echo::GetData (uint8_t data[16]) const
{
return m_data->Copy ();
memcpy (data, m_data, m_dataSize);
return m_dataSize;
}
@@ -139,8 +142,14 @@ Icmpv4Echo::GetTypeId (void)
Icmpv4Echo::Icmpv4Echo ()
: m_identifier (0),
m_sequence (0),
m_data (0)
{}
m_dataSize (0)
{
// make sure that thing is initialized to get initialized bytes
for (uint8_t j = 0; j < 16; j++)
{
m_data[j] = 0;
}
}
Icmpv4Echo::~Icmpv4Echo ()
{}
TypeId
@@ -151,14 +160,14 @@ Icmpv4Echo::GetInstanceTypeId (void) const
uint32_t
Icmpv4Echo::GetSerializedSize (void) const
{
return 4 + m_data->GetSize ();
return 4 + m_dataSize;
}
void
Icmpv4Echo::Serialize (Buffer::Iterator start) const
{
start.WriteHtonU16 (m_identifier);
start.WriteHtonU16 (m_sequence);
start.Write (m_data->PeekData (), m_data->GetSize ());
start.Write (m_data, m_dataSize);
}
uint32_t
Icmpv4Echo::Deserialize (Buffer::Iterator start)
@@ -166,11 +175,8 @@ Icmpv4Echo::Deserialize (Buffer::Iterator start)
m_identifier = start.ReadNtohU16 ();
m_sequence = start.ReadNtohU16 ();
NS_ASSERT (start.GetSize () >= 4);
uint32_t size = start.GetSize () - 4;
uint8_t *buffer = new uint8_t[size] ();
start.Read (buffer, size);
m_data = Create<Packet> (buffer, size);
delete[] buffer;
m_dataSize = start.GetSize () - 4;
start.Read (m_data, m_dataSize);
return start.GetSize ();
}
void

View File

@@ -50,7 +50,7 @@ public:
void SetData (Ptr<const Packet> data);
uint16_t GetIdentifier (void) const;
uint16_t GetSequenceNumber (void) const;
Ptr<const Packet> GetData (void) const;
uint32_t GetData (uint8_t payload[16]) const;
static TypeId GetTypeId (void);
@@ -64,7 +64,8 @@ public:
private:
uint16_t m_identifier;
uint16_t m_sequence;
Ptr<Packet> m_data;
uint8_t m_data[16];
uint32_t m_dataSize;
};
class Icmpv4DestinationUnreachable : public Header