fix fragment printing

Mathieu Lacage 2007-06-06 09:23:47 +02:00
parent 3e511d1457
commit e829515b02
2 changed files with 17 additions and 35 deletions

View File

@ -776,6 +776,7 @@ PacketHistory::ReadItems (uint16_t current,
extraItem->fragmentEnd = item->size; extraItem->fragmentEnd = item->size;
extraItem->packetUid = m_packetUid; extraItem->packetUid = m_packetUid;
} }
NS_ASSERT (buffer <= &m_data->m_data[m_data->m_size]);
} }
@ -1097,60 +1098,43 @@ PacketHistory::PrintDefault (std::ostream &os, Buffer buffer) const
} }
uint32_t uint32_t
PacketHistory::DoPrint (struct PacketHistory::SmallItem *item, uint8_t const*buffer, PacketHistory::DoPrint (struct PacketHistory::SmallItem *item, uint32_t current,
Buffer data, uint32_t offset, const PacketPrinter &printer, Buffer data, uint32_t offset, const PacketPrinter &printer,
std::ostream &os) const std::ostream &os) const
{ {
ReadSmall (item, &buffer); PacketHistory::ExtraItem extraItem;
bool isExtra = (item->typeUid & 0x1) == 0x1; ReadItems (current, item, &extraItem);
uint32_t uid = item->typeUid & 0xfffffffe; uint32_t uid = item->typeUid & 0xfffffffe;
uint32_t fragmentStart, fragmentEnd;
uint32_t packetUid;
if (isExtra)
{
PacketHistory::ExtraItem extraItem;
ReadExtra (&extraItem, &buffer);
fragmentStart = extraItem.fragmentStart;
fragmentEnd = extraItem.fragmentEnd;
packetUid = extraItem.packetUid;
}
else
{
fragmentStart = 0;
fragmentEnd = item->size;
packetUid = m_packetUid;
}
NS_ASSERT (buffer <= &m_data->m_data[m_data->m_size]);
if (uid == 0) if (uid == 0)
{ {
// payload. // payload.
printer.PrintPayload (os, packetUid, item->size, printer.PrintPayload (os, extraItem.packetUid, item->size,
fragmentStart, extraItem.fragmentStart,
fragmentEnd); extraItem.fragmentEnd);
} }
else if (fragmentStart != 0 && else if (extraItem.fragmentStart != 0 ||
fragmentEnd != item->size) extraItem.fragmentEnd != item->size)
{ {
printer.PrintChunkFragment (uid, os, packetUid, item->size, printer.PrintChunkFragment (uid, os, extraItem.packetUid, item->size,
fragmentStart, fragmentEnd); extraItem.fragmentStart, extraItem.fragmentEnd);
} }
else if (PacketPrinter::IsHeader (uid)) else if (PacketPrinter::IsHeader (uid))
{ {
ns3::Buffer::Iterator j = data.Begin (); ns3::Buffer::Iterator j = data.Begin ();
j.Next (offset); j.Next (offset);
printer.PrintChunk (uid, j, os, packetUid, item->size); printer.PrintChunk (uid, j, os, extraItem.packetUid, item->size);
} }
else if (PacketPrinter::IsTrailer (uid)) else if (PacketPrinter::IsTrailer (uid))
{ {
ns3::Buffer::Iterator j = data.End (); ns3::Buffer::Iterator j = data.End ();
j.Prev (data.GetSize () - (offset + item->size)); j.Prev (data.GetSize () - (offset + item->size));
printer.PrintChunk (uid, j, os, packetUid, item->size); printer.PrintChunk (uid, j, os, extraItem.packetUid, item->size);
} }
else else
{ {
NS_ASSERT (false); NS_ASSERT (false);
} }
return fragmentEnd - fragmentStart; return extraItem.fragmentEnd - extraItem.fragmentStart;
} }
uint32_t uint32_t
@ -1208,9 +1192,8 @@ PacketHistory::Print (std::ostream &os, Buffer data, const PacketPrinter &printe
uint32_t offset = 0; uint32_t offset = 0;
while (current != 0xffff) while (current != 0xffff)
{ {
uint8_t *buffer = &m_data->m_data[current];
struct PacketHistory::SmallItem item; struct PacketHistory::SmallItem item;
uint32_t realSize = DoPrint (&item, buffer, data, offset, printer, os); uint32_t realSize = DoPrint (&item, current, data, offset, printer, os);
offset += realSize; offset += realSize;
if (current == tail) if (current == tail)
{ {
@ -1227,9 +1210,8 @@ PacketHistory::Print (std::ostream &os, Buffer data, const PacketPrinter &printe
uint32_t offset = 0; uint32_t offset = 0;
while (current != 0xffff) while (current != 0xffff)
{ {
uint8_t *buffer = &m_data->m_data[current];
struct PacketHistory::SmallItem item; struct PacketHistory::SmallItem item;
uint32_t realSize = DoPrint (&item, buffer, data, offset, printer, os); uint32_t realSize = DoPrint (&item, current, data, offset, printer, os);
offset -= realSize; offset -= realSize;
if (current == tail) if (current == tail)
{ {

View File

@ -113,7 +113,7 @@ private:
void ReadExtra (struct PacketHistory::ExtraItem *item, const uint8_t **pBuffer) const; void ReadExtra (struct PacketHistory::ExtraItem *item, const uint8_t **pBuffer) const;
void Reserve (uint32_t n); void Reserve (uint32_t n);
void ReserveCopy (uint32_t n); void ReserveCopy (uint32_t n);
uint32_t DoPrint (struct PacketHistory::SmallItem *item, uint8_t const*buffer, uint32_t DoPrint (struct PacketHistory::SmallItem *item, uint32_t current,
Buffer data, uint32_t offset, const PacketPrinter &printer, Buffer data, uint32_t offset, const PacketPrinter &printer,
std::ostream &os) const; std::ostream &os) const;
uint32_t GetTotalSize (void) const; uint32_t GetTotalSize (void) const;