--- a/src/common/chunk-registry.cc Sat Aug 04 13:28:17 2007 +0200
+++ b/src/common/chunk-registry.cc Sat Aug 04 14:10:49 2007 +0200
@@ -29,6 +29,31 @@
return &vec;
}
+std::string
+ChunkRegistry::GetUidStringFromUid (uint32_t uid)
+{
+ InfoVector *vec = GetInfoVector ();
+ NS_ASSERT (uid >= 1 && uid <= vec->size ());
+ Info info = (*vec)[uid - 1];
+ return info.uidString;
+}
+uint32_t
+ChunkRegistry::GetUidFromUidString (std::string uidString)
+{
+ uint32_t uid = 1;
+ InfoVector *vec = GetInfoVector ();
+ for (InfoVector::iterator i = vec->begin (); i != vec->end (); i++)
+ {
+ if (i->uidString == uidString)
+ {
+ return uid;
+ }
+ }
+ NS_FATAL_ERROR ("Trying to access a non-registered Header or Trailer: \"" << uidString << "\". "<<
+ "You could try calling NS_HEADER_ENSURE_REGISTER somewhere.");
+ return 0;
+}
+
uint8_t *
ChunkRegistry::GetStaticInstance (uint32_t uid)
{
--- a/src/common/chunk-registry.h Sat Aug 04 13:28:17 2007 +0200
+++ b/src/common/chunk-registry.h Sat Aug 04 14:10:49 2007 +0200
@@ -42,6 +42,8 @@
template <typename T>
static uint32_t GetTrailerUid (void);
+ static std::string GetUidStringFromUid (uint32_t uid);
+ static uint32_t GetUidFromUidString (std::string uidString);
static uint8_t *GetStaticInstance (uint32_t uid);
static uint32_t Deserialize (uint32_t uid, uint8_t *instance, Buffer::Iterator i);
static void Print (uint32_t uid, uint8_t *instance, std::ostream &os);
--- a/src/common/packet-metadata.cc Sat Aug 04 13:28:17 2007 +0200
+++ b/src/common/packet-metadata.cc Sat Aug 04 14:10:49 2007 +0200
@@ -1087,5 +1087,111 @@
}
}
+uint32_t
+PacketMetadata::GetSerializedSize (void) const
+{
+ uint32_t totalSize = 0;
+ totalSize += 4;
+ if (!m_enable)
+ {
+ return totalSize;
+ }
+ struct PacketMetadata::SmallItem item;
+ struct PacketMetadata::ExtraItem extraItem;
+ uint32_t current = m_head;
+ while (current != 0xffff)
+ {
+ ReadItems (current, &item, &extraItem);
+ uint32_t uid = (item.typeUid & 0xfffffffe) >> 1;
+ totalSize += 4 + ChunkRegistry::GetUidStringFromUid (uid).size () +
+ 1 + 4 + 2 + 4 + 4 + 4;
+ if (current == m_tail)
+ {
+ break;
+ }
+ NS_ASSERT (current != item.next);
+ current = item.next;
+ }
+ return totalSize;
+}
+void
+PacketMetadata::Serialize (Buffer::Iterator i, uint32_t size) const
+{
+ uint32_t bytesWritten = 0;
+ i.WriteU32 (size);
+ bytesWritten += 4;
+ struct PacketMetadata::SmallItem item;
+ struct PacketMetadata::ExtraItem extraItem;
+ uint32_t current = m_head;
+ while (current != 0xffff)
+ {
+ ReadItems (current, &item, &extraItem);
+ uint32_t uid = (item.typeUid & 0xfffffffe) >> 1;
+ std::string uidString = ChunkRegistry::GetUidStringFromUid (uid);
+ i.WriteU32 (uidString.size ());
+ bytesWritten += 4;
+ i.Write ((uint8_t *)uidString.c_str (), uidString.size ());
+ bytesWritten += uidString.size ();
+ uint8_t isBig = item.typeUid & 0x1;
+ i.WriteU8 (isBig);
+ bytesWritten += 1;
+ i.WriteU32 (item.size);
+ bytesWritten += 4;
+ i.WriteU16 (item.chunkUid);
+ bytesWritten += 2;
+ i.WriteU32 (extraItem.fragmentStart);
+ bytesWritten += 4;
+ i.WriteU32 (extraItem.fragmentEnd);
+ bytesWritten += 4;
+ i.WriteU32 (extraItem.packetUid);
+ bytesWritten += 4;
+ if (current == m_tail)
+ {
+ break;
+ }
+
+ NS_ASSERT (current != item.next);
+ current = item.next;
+ }
+ NS_ASSERT (bytesWritten == size);
+}
+uint32_t
+PacketMetadata::Deserialize (Buffer::Iterator i)
+{
+ struct PacketMetadata::SmallItem item;
+ struct PacketMetadata::ExtraItem extraItem;
+ uint32_t size = i.ReadU32 ();
+ size -= 4;
+ while (size > 0)
+ {
+ uint32_t uidStringSize = i.ReadU32 ();
+ size -= 4;
+ std::string uidString;
+ for (uint32_t j = 0; j < uidStringSize; j++)
+ {
+ uidString.push_back (i.ReadU8 ());
+ size --;
+ }
+ uint32_t uid = ChunkRegistry::GetUidFromUidString (uidString);
+ uint8_t isBig = i.ReadU8 ();
+ size --;
+ item.typeUid = (uid << 1) | isBig;
+ item.size = i.ReadU32 ();
+ size -= 4;
+ item.chunkUid = i.ReadU16 ();
+ size -= 2;
+ extraItem.fragmentStart = i.ReadU32 ();
+ size -= 4;
+ extraItem.fragmentEnd = i.ReadU32 ();
+ size -= 4;
+ extraItem.packetUid = i.ReadU32 ();
+ size -= 4;
+ uint32_t tmp = AddBig (0xffff, m_tail, &item, &extraItem);
+ UpdateTail (tmp);
+ }
+ return size;
+}
+
+
} // namespace ns3
--- a/src/common/packet-metadata.h Sat Aug 04 13:28:17 2007 +0200
+++ b/src/common/packet-metadata.h Sat Aug 04 14:10:49 2007 +0200
@@ -102,6 +102,10 @@
void Print (std::ostream &os, Buffer buffer, PacketPrinter const &printer) const;
+ uint32_t GetSerializedSize (void) const;
+ void Serialize (Buffer::Iterator i, uint32_t size) const;
+ uint32_t Deserialize (Buffer::Iterator i);
+
static void PrintStats (void);
private: