make sure we return the right integer uid if the header of trailer was already registered.
This commit is contained in:
@@ -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 ()
|
||||
|
||||
@@ -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 <int N>
|
||||
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 <int N>
|
||||
const char *
|
||||
HistoryHeader<N>::GetUid (void)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << N << "HistoryHeader.ns3";
|
||||
return oss.str ().c_str ();
|
||||
}
|
||||
|
||||
template <int N>
|
||||
HistoryHeader<N>::HistoryHeader ()
|
||||
: m_ok (false)
|
||||
@@ -1181,6 +1191,7 @@ template <int N>
|
||||
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 <int N>
|
||||
const char *
|
||||
HistoryTrailer<N>::GetUid (void)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << N << "HistoryTrailer.ns3";
|
||||
return oss.str ().c_str ();
|
||||
}
|
||||
|
||||
|
||||
template <int N>
|
||||
HistoryTrailer<N>::HistoryTrailer ()
|
||||
: m_ok (false)
|
||||
|
||||
@@ -254,26 +254,26 @@ template <typename T>
|
||||
void
|
||||
PacketMetadata::AddHeader (T const &header, uint32_t size)
|
||||
{
|
||||
DoAddHeader (PacketPrinter::GetHeaderUid<T> (), size);
|
||||
DoAddHeader (PacketPrinter::GetHeaderUid<T> () << 1, size);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void
|
||||
PacketMetadata::RemoveHeader (T const &header, uint32_t size)
|
||||
{
|
||||
DoRemoveHeader (PacketPrinter::GetHeaderUid<T> (), size);
|
||||
DoRemoveHeader (PacketPrinter::GetHeaderUid<T> () << 1, size);
|
||||
}
|
||||
template <typename T>
|
||||
void
|
||||
PacketMetadata::AddTrailer (T const &trailer, uint32_t size)
|
||||
{
|
||||
DoAddTrailer (PacketPrinter::GetTrailerUid<T> (), size);
|
||||
DoAddTrailer (PacketPrinter::GetTrailerUid<T> () << 1, size);
|
||||
}
|
||||
template <typename T>
|
||||
void
|
||||
PacketMetadata::RemoveTrailer (T const &trailer, uint32_t size)
|
||||
{
|
||||
DoRemoveTrailer (PacketPrinter::GetTrailerUid<T> (), size);
|
||||
DoRemoveTrailer (PacketPrinter::GetTrailerUid<T> () << 1, size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -140,6 +140,7 @@ private:
|
||||
{
|
||||
DoPrintCallback printCallback;
|
||||
DoGetNameCallback getNameCallback;
|
||||
std::string uidString;
|
||||
bool isHeader;
|
||||
};
|
||||
typedef std::vector<struct PacketPrinter::Printer> 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<T>;
|
||||
chunk.getNameCallback = &PacketPrinter::DoGetName<T>;
|
||||
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<T>).GetImpl (),
|
||||
MakeCallback (&PacketPrinter::DoDefaultPrintFragment));
|
||||
|
||||
Reference in New Issue
Block a user