add logging, cleanup AddAtEnd.
1.1 --- a/src/common/packet-metadata.cc Fri May 30 11:11:00 2008 -0700
1.2 +++ b/src/common/packet-metadata.cc Sat May 31 10:46:23 2008 -0700
1.3 @@ -350,6 +350,7 @@
1.4 void
1.5 PacketMetadata::UpdateTail (uint16_t written)
1.6 {
1.7 + NS_LOG_FUNCTION (this << written);
1.8 if (m_head == 0xffff)
1.9 {
1.10 NS_ASSERT (m_tail == 0xffff);
1.11 @@ -376,6 +377,7 @@
1.12 void
1.13 PacketMetadata::UpdateHead (uint16_t written)
1.14 {
1.15 + NS_LOG_FUNCTION (this << written);
1.16 if (m_head == 0xffff)
1.17 {
1.18 NS_ASSERT (m_tail == 0xffff);
1.19 @@ -401,6 +403,7 @@
1.20 uint16_t
1.21 PacketMetadata::AddSmall (const struct PacketMetadata::SmallItem *item)
1.22 {
1.23 + NS_LOG_FUNCTION (this << item->next << item->prev << item->typeUid << item->size << item->chunkUid);
1.24 NS_ASSERT (m_data != 0);
1.25 NS_ASSERT (m_used != item->prev && m_used != item->next);
1.26 uint32_t typeUidSize = GetUleb128Size (item->typeUid);
1.27 @@ -431,6 +434,9 @@
1.28 const PacketMetadata::SmallItem *item,
1.29 const PacketMetadata::ExtraItem *extraItem)
1.30 {
1.31 + NS_LOG_FUNCTION (this << next << prev <<
1.32 + item->next << item->prev << item->typeUid << item->size << item->chunkUid <<
1.33 + extraItem->fragmentStart << extraItem->fragmentEnd << extraItem->packetUid);
1.34 NS_ASSERT (m_data != 0);
1.35 uint32_t typeUid = ((item->typeUid & 0x1) == 0x1)?item->typeUid:item->typeUid+1;
1.36 NS_ASSERT (m_used != prev && m_used != next);
1.37 @@ -470,12 +476,32 @@
1.38 return n;
1.39 }
1.40
1.41 +/**
1.42 + * \param item the item data to write
1.43 + * \param extraItem the extra item data to write
1.44 + * \param available the number of bytes which can
1.45 + * be written without having to rewrite the buffer entirely.
1.46 + *
1.47 + * XXX: should rewrite the code below to avoid using
1.48 + * TryToAppend calls.
1.49 + */
1.50 void
1.51 PacketMetadata::ReplaceTail (PacketMetadata::SmallItem *item,
1.52 PacketMetadata::ExtraItem *extraItem,
1.53 uint32_t available)
1.54 {
1.55 + NS_LOG_FUNCTION (this <<
1.56 + item->next << item->prev << item->typeUid << item->size << item->chunkUid <<
1.57 + extraItem->fragmentStart << extraItem->fragmentEnd << extraItem->packetUid <<
1.58 + available);
1.59 +
1.60 NS_ASSERT (m_data != 0);
1.61 + if (m_tail + available == m_used &&
1.62 + m_used == m_data->m_dirtyEnd)
1.63 + {
1.64 + available = m_data->m_size - m_tail;
1.65 + }
1.66 +
1.67 if (available >= 14 &&
1.68 m_data->m_count == 1)
1.69 {
1.70 @@ -518,11 +544,18 @@
1.71 *this = h;
1.72 }
1.73
1.74 +/**
1.75 + * \param current the offset we should start reading the data from
1.76 + * \param item pointer to where we should store the data to return to the caller
1.77 + * \param extraItem pointer to where we should store the data to return to the caller
1.78 + * \returns the number of bytes read.
1.79 + */
1.80 uint32_t
1.81 PacketMetadata::ReadItems (uint16_t current,
1.82 struct PacketMetadata::SmallItem *item,
1.83 struct PacketMetadata::ExtraItem *extraItem) const
1.84 {
1.85 + NS_LOG_FUNCTION (this << current);
1.86 const uint8_t *buffer = &m_data->m_data[current];
1.87 item->next = buffer[0];
1.88 item->next |= (buffer[1]) << 8;
1.89 @@ -644,12 +677,12 @@
1.90 void
1.91 PacketMetadata::DoAddHeader (uint32_t uid, uint32_t size)
1.92 {
1.93 + NS_LOG_FUNCTION (this << uid << size);
1.94 if (!m_enable)
1.95 {
1.96 m_metadataSkipped = true;
1.97 return;
1.98 }
1.99 - NS_LOG_FUNCTION ("uid=" << uid << "size=" << size << "");
1.100
1.101 struct PacketMetadata::SmallItem item;
1.102 item.next = m_head;
1.103 @@ -665,12 +698,12 @@
1.104 PacketMetadata::RemoveHeader (const Header &header, uint32_t size)
1.105 {
1.106 uint32_t uid = header.GetInstanceTypeId ().GetUid () << 1;
1.107 + NS_LOG_FUNCTION (this << uid << size);
1.108 if (!m_enable)
1.109 {
1.110 m_metadataSkipped = true;
1.111 return;
1.112 }
1.113 - NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
1.114 struct PacketMetadata::SmallItem item;
1.115 struct PacketMetadata::ExtraItem extraItem;
1.116 uint32_t read = ReadItems (m_head, &item, &extraItem);
1.117 @@ -703,12 +736,12 @@
1.118 PacketMetadata::AddTrailer (const Trailer &trailer, uint32_t size)
1.119 {
1.120 uint32_t uid = trailer.GetInstanceTypeId ().GetUid () << 1;
1.121 + NS_LOG_FUNCTION (this << uid << size);
1.122 if (!m_enable)
1.123 {
1.124 m_metadataSkipped = true;
1.125 return;
1.126 }
1.127 - NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
1.128 struct PacketMetadata::SmallItem item;
1.129 item.next = 0xffff;
1.130 item.prev = m_tail;
1.131 @@ -723,12 +756,12 @@
1.132 PacketMetadata::RemoveTrailer (const Trailer &trailer, uint32_t size)
1.133 {
1.134 uint32_t uid = trailer.GetInstanceTypeId ().GetUid () << 1;
1.135 + NS_LOG_FUNCTION (this << uid << size);
1.136 if (!m_enable)
1.137 {
1.138 m_metadataSkipped = true;
1.139 return;
1.140 }
1.141 - NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
1.142 struct PacketMetadata::SmallItem item;
1.143 struct PacketMetadata::ExtraItem extraItem;
1.144 uint32_t read = ReadItems (m_tail, &item, &extraItem);
1.145 @@ -760,6 +793,7 @@
1.146 void
1.147 PacketMetadata::AddAtEnd (PacketMetadata const&o)
1.148 {
1.149 + NS_LOG_FUNCTION (this << &o);
1.150 if (!m_enable)
1.151 {
1.152 m_metadataSkipped = true;
1.153 @@ -767,46 +801,53 @@
1.154 }
1.155 if (m_tail == 0xffff)
1.156 {
1.157 + // We have no items so 'AddAtEnd' is
1.158 + // equivalent to self-assignment.
1.159 *this = o;
1.160 return;
1.161 }
1.162 NS_ASSERT (m_head != 0xffff && m_tail != 0xffff);
1.163
1.164 - uint16_t lastTail;
1.165 - lastTail = m_tail;
1.166 - struct PacketMetadata::SmallItem lastItem;
1.167 - PacketMetadata::ExtraItem lastExtraItem;
1.168 - uint32_t lastTailSize = ReadItems (m_tail, &lastItem, &lastExtraItem);
1.169 - if (m_tail + lastTailSize == m_used &&
1.170 - m_used == m_data->m_dirtyEnd)
1.171 + // We read the current tail because we are going to append
1.172 + // after this item.
1.173 + struct PacketMetadata::SmallItem tailItem;
1.174 + PacketMetadata::ExtraItem tailExtraItem;
1.175 + uint32_t tailSize = ReadItems (m_tail, &tailItem, &tailExtraItem);
1.176 +
1.177 + uint16_t current;
1.178 + struct PacketMetadata::SmallItem item;
1.179 + PacketMetadata::ExtraItem extraItem;
1.180 + o.ReadItems (o.m_head, &item, &extraItem);
1.181 + if (extraItem.packetUid == tailExtraItem.packetUid &&
1.182 + item.typeUid == tailItem.typeUid &&
1.183 + item.chunkUid == tailItem.chunkUid &&
1.184 + item.size == tailItem.size &&
1.185 + extraItem.fragmentStart == tailExtraItem.fragmentEnd)
1.186 {
1.187 - lastTailSize = m_data->m_size - m_tail;
1.188 + /* If the previous tail came from the same header as
1.189 + * the next item we want to append to our array, then,
1.190 + * we merge them and attempt to reuse the previous tail's
1.191 + * location.
1.192 + */
1.193 + tailExtraItem.fragmentEnd = extraItem.fragmentEnd;
1.194 + // XXX This call might be wrong.
1.195 + ReplaceTail (&tailItem, &tailExtraItem, tailSize);
1.196 + current = item.next;
1.197 + }
1.198 + else
1.199 + {
1.200 + current = o.m_head;
1.201 }
1.202
1.203 - uint16_t current = o.m_head;
1.204 + /* Now that we have merged our current tail with the head of the
1.205 + * next packet, we just append all items from the next packet
1.206 + * to the current packet.
1.207 + */
1.208 while (current != 0xffff)
1.209 {
1.210 - struct PacketMetadata::SmallItem item;
1.211 - PacketMetadata::ExtraItem extraItem;
1.212 o.ReadItems (current, &item, &extraItem);
1.213 - if (extraItem.packetUid == lastExtraItem.packetUid &&
1.214 - item.typeUid == lastItem.typeUid &&
1.215 - item.chunkUid == lastItem.chunkUid &&
1.216 - item.size == lastItem.size &&
1.217 - extraItem.fragmentStart == lastExtraItem.fragmentEnd)
1.218 - {
1.219 - // replace previous tail.
1.220 - lastExtraItem.fragmentEnd = extraItem.fragmentEnd;
1.221 - NS_ASSERT (m_tail == lastTail);
1.222 - // XXX This call might be wrong.
1.223 - ReplaceTail (&lastItem, &lastExtraItem, lastTailSize);
1.224 - }
1.225 - else
1.226 - {
1.227 - // append the extra items.
1.228 - uint16_t written = AddBig (0xffff, m_tail, &item, &extraItem);
1.229 - UpdateTail (written);
1.230 - }
1.231 + uint16_t written = AddBig (0xffff, m_tail, &item, &extraItem);
1.232 + UpdateTail (written);
1.233 if (current == o.m_tail)
1.234 {
1.235 break;
1.236 @@ -826,6 +867,7 @@
1.237 void
1.238 PacketMetadata::RemoveAtStart (uint32_t start)
1.239 {
1.240 + NS_LOG_FUNCTION (this << start);
1.241 if (!m_enable)
1.242 {
1.243 m_metadataSkipped = true;
1.244 @@ -891,6 +933,7 @@
1.245 void
1.246 PacketMetadata::RemoveAtEnd (uint32_t end)
1.247 {
1.248 + NS_LOG_FUNCTION (this << end);
1.249 if (!m_enable)
1.250 {
1.251 m_metadataSkipped = true;
1.252 @@ -1069,6 +1112,7 @@
1.253 uint32_t
1.254 PacketMetadata::GetSerializedSize (void) const
1.255 {
1.256 + NS_LOG_FUNCTION (this);
1.257 uint32_t totalSize = 0;
1.258 totalSize += 4;
1.259 if (!m_enable)
1.260 @@ -1105,6 +1149,7 @@
1.261 void
1.262 PacketMetadata::Serialize (Buffer::Iterator i, uint32_t size) const
1.263 {
1.264 + NS_LOG_FUNCTION (this);
1.265 uint32_t bytesWritten = 0;
1.266 i.WriteU32 (size);
1.267 bytesWritten += 4;
1.268 @@ -1160,6 +1205,7 @@
1.269 uint32_t
1.270 PacketMetadata::Deserialize (Buffer::Iterator i)
1.271 {
1.272 + NS_LOG_FUNCTION (this);
1.273 struct PacketMetadata::SmallItem item;
1.274 struct PacketMetadata::ExtraItem extraItem;
1.275 uint32_t totalSize = i.ReadU32 ();