diff --git a/samples/main-packet.cc b/samples/main-packet.cc index 777f95815..8eda7a475 100644 --- a/samples/main-packet.cc +++ b/samples/main-packet.cc @@ -7,8 +7,11 @@ using namespace ns3; /* A sample Header implementation */ -class MyHeader : public Header { +class MyHeader : public Header +{ public: + static const char *GetUid (void); + MyHeader (); virtual ~MyHeader (); @@ -24,6 +27,13 @@ private: uint16_t m_data; }; +const char * +MyHeader::GetUid (void) +{ + // make sure the string is really unique. + return "MyHeader.test.nsnam.org"; +} + MyHeader::MyHeader () {} MyHeader::~MyHeader () diff --git a/src/common/packet-metadata.cc b/src/common/packet-metadata.cc index c62b7d8f5..75117bd3c 100644 --- a/src/common/packet-metadata.cc +++ b/src/common/packet-metadata.cc @@ -977,7 +977,7 @@ PacketMetadata::DoPrint (const struct PacketMetadata::SmallItem *item, Buffer data, uint32_t offset, const PacketPrinter &printer, std::ostream &os) const { - uint32_t uid = item->typeUid & 0xfffffffe; + uint32_t uid = (item->typeUid & 0xfffffffe) >> 1; if (uid == 0) { // payload. @@ -1112,6 +1112,7 @@ template class HistoryHeader : public Header { public: + static const char *GetUid (void); HistoryHeader (); bool IsOk (void) const; private: @@ -1123,6 +1124,15 @@ private: bool m_ok; }; +template +const char * +HistoryHeader::GetUid (void) +{ + std::ostringstream oss; + oss << N << "HistoryHeader.ns3"; + return oss.str ().c_str (); +} + template HistoryHeader::HistoryHeader () : m_ok (false) @@ -1181,6 +1191,7 @@ template class HistoryTrailer : public Trailer { public: + static const char *GetUid (void); HistoryTrailer (); bool IsOk (void) const; private: @@ -1192,6 +1203,16 @@ private: bool m_ok; }; +template +const char * +HistoryTrailer::GetUid (void) +{ + std::ostringstream oss; + oss << N << "HistoryTrailer.ns3"; + return oss.str ().c_str (); +} + + template HistoryTrailer::HistoryTrailer () : m_ok (false) diff --git a/src/common/packet-metadata.h b/src/common/packet-metadata.h index be102a4d3..919f35e42 100644 --- a/src/common/packet-metadata.h +++ b/src/common/packet-metadata.h @@ -254,26 +254,26 @@ template void PacketMetadata::AddHeader (T const &header, uint32_t size) { - DoAddHeader (PacketPrinter::GetHeaderUid (), size); + DoAddHeader (PacketPrinter::GetHeaderUid () << 1, size); } template void PacketMetadata::RemoveHeader (T const &header, uint32_t size) { - DoRemoveHeader (PacketPrinter::GetHeaderUid (), size); + DoRemoveHeader (PacketPrinter::GetHeaderUid () << 1, size); } template void PacketMetadata::AddTrailer (T const &trailer, uint32_t size) { - DoAddTrailer (PacketPrinter::GetTrailerUid (), size); + DoAddTrailer (PacketPrinter::GetTrailerUid () << 1, size); } template void PacketMetadata::RemoveTrailer (T const &trailer, uint32_t size) { - DoRemoveTrailer (PacketPrinter::GetTrailerUid (), size); + DoRemoveTrailer (PacketPrinter::GetTrailerUid () << 1, size); } diff --git a/src/common/packet-printer.cc b/src/common/packet-printer.cc index 9ccda7668..b5a807d52 100644 --- a/src/common/packet-printer.cc +++ b/src/common/packet-printer.cc @@ -91,17 +91,17 @@ PacketPrinter::PrintChunk (uint32_t chunkUid, uint32_t size) const { RegisteredChunks *registeredChunks = PacketPrinter::GetRegisteredChunks (); - NS_ASSERT (chunkUid >= 1 && chunkUid/2 <= registeredChunks->size ()); + NS_ASSERT (chunkUid >= 1 && chunkUid <= registeredChunks->size ()); for (PrinterList::const_iterator i = m_printerList.begin (); i != m_printerList.end (); i++) { if (i->m_chunkUid == chunkUid) { - DoPrintCallback cb = (*registeredChunks)[chunkUid/2-1].printCallback; + DoPrintCallback cb = (*registeredChunks)[chunkUid-1].printCallback; cb (i->m_printer, start, os, packetUid, size); return; } } - DoGetNameCallback cb = (*registeredChunks)[chunkUid/2-1].getNameCallback; + DoGetNameCallback cb = (*registeredChunks)[chunkUid-1].getNameCallback; std::string name = cb (); struct PacketPrinter::FragmentInformation info; info.start = 0; @@ -120,8 +120,8 @@ PacketPrinter::PrintChunkFragment (uint32_t chunkUid, uint32_t fragmentEnd) const { RegisteredChunks *registeredChunks = PacketPrinter::GetRegisteredChunks (); - NS_ASSERT (chunkUid >= 1 && chunkUid/2 <= registeredChunks->size ()); - DoGetNameCallback cb = (*registeredChunks)[chunkUid/2-1].getNameCallback; + NS_ASSERT (chunkUid >= 1 && chunkUid <= registeredChunks->size ()); + DoGetNameCallback cb = (*registeredChunks)[chunkUid-1].getNameCallback; std::string name = cb (); struct PacketPrinter::FragmentInformation info; info.start = fragmentStart; @@ -217,16 +217,16 @@ bool PacketPrinter::IsTrailer (uint32_t uid) { RegisteredChunks *registeredChunks = PacketPrinter::GetRegisteredChunks (); - NS_ASSERT (uid >= 1 && uid/2 <= registeredChunks->size ()); - bool isHeader = (*registeredChunks)[uid/2-1].isHeader; + NS_ASSERT (uid >= 1 && uid <= registeredChunks->size ()); + bool isHeader = (*registeredChunks)[uid-1].isHeader; return !isHeader; } bool PacketPrinter::IsHeader (uint32_t uid) { RegisteredChunks *registeredChunks = PacketPrinter::GetRegisteredChunks (); - NS_ASSERT (uid >= 1 && uid/2 <= registeredChunks->size ()); - bool isHeader = (*registeredChunks)[uid/2-1].isHeader; + NS_ASSERT (uid >= 1 && uid <= registeredChunks->size ()); + bool isHeader = (*registeredChunks)[uid-1].isHeader; return isHeader; } diff --git a/src/common/packet-printer.h b/src/common/packet-printer.h index cd340545d..c79be0a3b 100644 --- a/src/common/packet-printer.h +++ b/src/common/packet-printer.h @@ -140,6 +140,7 @@ private: { DoPrintCallback printCallback; DoGetNameCallback getNameCallback; + std::string uidString; bool isHeader; }; typedef std::vector PrinterList; @@ -291,12 +292,22 @@ uint32_t PacketPrinter::AllocateUid (bool isHeader) { RegisteredChunks *chunks = PacketPrinter::GetRegisteredChunks (); + uint32_t j = 0; + for (RegisteredChunks::iterator i = chunks->begin (); i != chunks->end (); i++) + { + if (i->uidString == T::GetUid ()) + { + return j; + } + j++; + } RegisteredChunk chunk; chunk.printCallback = &PacketPrinter::DoPrint; chunk.getNameCallback = &PacketPrinter::DoGetName; chunk.isHeader = isHeader; + chunk.uidString = T::GetUid (); chunks->push_back (chunk); - uint32_t uid = chunks->size () * 2; + uint32_t uid = chunks->size (); PacketPrinter::PeekDefault ()->DoAddPrinter (uid, MakeCallback (&PacketPrinter::DoDefaultPrint).GetImpl (), MakeCallback (&PacketPrinter::DoDefaultPrintFragment));