make sure we return the right integer uid if the header of trailer was already registered.

This commit is contained in:
Mathieu Lacage
2007-08-03 10:39:55 +02:00
parent e672f9711f
commit 7298cd1110
5 changed files with 58 additions and 16 deletions

View File

@@ -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 ()

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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));