21 #include "ns3/assert.h"
26 #define LOG_INTERNAL_STATE(y) \
27 NS_LOG_LOGIC (y << "start="<<m_start<<", end="<<m_end<<", zero start="<<m_zeroAreaStart<< \
28 ", zero end="<<m_zeroAreaEnd<<", count="<<m_data->m_count<<", size="<<m_data->m_size<< \
29 ", dirty start="<<m_data->m_dirtyStart<<", dirty end="<<m_data->m_dirtyEnd)
38 memset (buffer, 0, size);
50 #ifdef BUFFER_FREE_LIST
68 #define MAGIC_DESTROYED (~(long) 0)
69 #define IS_UNINITIALIZED(x) (x == (Buffer::FreeList*)0)
70 #define IS_DESTROYED(x) (x == (Buffer::FreeList*)MAGIC_DESTROYED)
71 #define IS_INITIALIZED(x) (!IS_UNINITIALIZED (x) && !IS_DESTROYED (x))
72 #define DESTROYED ((Buffer::FreeList*)MAGIC_DESTROYED)
73 #define UNINITIALIZED ((Buffer::FreeList*)0)
76 struct Buffer::LocalStaticDestructor Buffer::g_localStaticDestructor;
78 Buffer::LocalStaticDestructor::~LocalStaticDestructor(void)
82 for (Buffer::FreeList::iterator i =
g_freeList->begin ();
124 struct Buffer::Data *data =
g_freeList->back ();
126 if (data->m_size >= dataSize)
161 uint32_t size = reqSize - 1 +
sizeof (
struct Buffer::Data);
162 uint8_t *b =
new uint8_t [size];
173 uint8_t *buf =
reinterpret_cast<uint8_t *
> (
data);
192 if (initialize ==
true)
214 m_start <= m_data->m_size &&
215 m_zeroAreaStart <= m_data->m_size;
217 bool ok =
m_data->
m_count > 0 && offsetsOk && dirtyOk && internalSizeOk;
221 ", " << (offsetsOk ?
"true" :
"false") <<
222 ", " << (dirtyOk ?
"true" :
"false") <<
223 ", " << (internalSizeOk ?
"true" :
"false") <<
" ");
302 if (
m_start >= start && !isDirty)
327 int32_t delta = start -
m_start;
463 else if (newStart <=
m_end)
481 m_zeroAreaStart =
m_end;
570 uint32_t sz =
sizeof (uint32_t)
582 uint32_t* p =
reinterpret_cast<uint32_t *
> (buffer);
588 if (size + 4 <= maxSize)
600 if (size + 4 <= maxSize)
603 *p++ = dataStartLength;
611 if (size + ((dataStartLength + 3) & (~3)) <= maxSize)
613 size += (dataStartLength + 3) & (~3);
615 p += (((dataStartLength + 3) & (~3))/4);
624 if (size + 4 <= maxSize)
627 *p++ = dataEndLength;
635 if (size + ((dataEndLength + 3) & (~3)) <= maxSize)
637 size += (dataEndLength + 3) & (~3);
639 p += (((dataEndLength + 3) & (~3))/4);
653 const uint32_t* p =
reinterpret_cast<const uint32_t *
> (buffer);
654 uint32_t sizeCheck = size-4;
657 uint32_t zeroDataLength = *p++;
665 uint32_t dataStartLength = *p++;
669 NS_ASSERT (sizeCheck >= dataStartLength);
670 Begin ().
Write (reinterpret_cast<uint8_t *> (const_cast<uint32_t *> (p)), dataStartLength);
671 p += (((dataStartLength+3)&(~3))/4);
672 sizeCheck -= ((dataStartLength+3)&(~3));
676 uint32_t dataEndLength = *p++;
682 tmp.
Prev (dataEndLength);
683 tmp.
Write (reinterpret_cast<uint8_t *> (const_cast<uint32_t *> (p)), dataEndLength);
684 p += (((dataEndLength+3)&(~3))/4);
685 sizeCheck -= ((dataEndLength+3)&(~3));
690 return (sizeCheck != 0) ? 0 : 1;
710 *
const_cast<Buffer *
> (
this) = tmp;
735 uint32_t left = tmpsize;
755 uint32_t originalSize = size;
765 uint32_t left = tmpsize;
782 return originalSize - size;
808 return m_current == m_dataEnd;
813 return m_current == m_dataStart;
820 for (uint32_t i = start; i < end; i++)
832 return i >= m_dataStart &&
833 !(i >= m_zeroStart && i < m_zeroEnd) &&
848 GetWriteErrorMessage ());
860 memset (&
m_data[m_current], 0, toCopy);
867 uint8_t *to = &
m_data[m_current];
868 memcpy (to, from, toCopy);
875 WriteU8 (data & 0xff);
877 WriteU8 (data & 0xff);
882 WriteU8 (data & 0xff);
884 WriteU8 (data & 0xff);
886 WriteU8 (data & 0xff);
888 WriteU8 (data & 0xff);
893 WriteU8 (data & 0xff);
895 WriteU8 (data & 0xff);
897 WriteU8 (data & 0xff);
899 WriteU8 (data & 0xff);
901 WriteU8 (data & 0xff);
903 WriteU8 (data & 0xff);
905 WriteU8 (data & 0xff);
907 WriteU8 (data & 0xff);
912 WriteU8 ((data >> 0) & 0xff);
913 WriteU8 ((data >> 8) & 0xff);
918 WriteU8 ((data >> 0) & 0xff);
919 WriteU8 ((data >> 8) & 0xff);
920 WriteU8 ((data >> 16) & 0xff);
921 WriteU8 ((data >> 24) & 0xff);
926 WriteU8 ((data >> 0) & 0xff);
927 WriteU8 ((data >> 8) & 0xff);
928 WriteU8 ((data >> 16) & 0xff);
929 WriteU8 ((data >> 24) & 0xff);
930 WriteU8 ((data >> 32) & 0xff);
931 WriteU8 ((data >> 40) & 0xff);
932 WriteU8 ((data >> 48) & 0xff);
933 WriteU8 ((data >> 56) & 0xff);
939 WriteU8 ((data >> 56) & 0xff);
940 WriteU8 ((data >> 48) & 0xff);
941 WriteU8 ((data >> 40) & 0xff);
942 WriteU8 ((data >> 32) & 0xff);
943 WriteU8 ((data >> 24) & 0xff);
944 WriteU8 ((data >> 16) & 0xff);
945 WriteU8 ((data >> 8) & 0xff);
946 WriteU8 ((data >> 0) & 0xff);
952 GetWriteErrorMessage ());
954 if (m_current <= m_zeroStart)
960 to = &
m_data[m_current - (m_zeroEnd - m_zeroStart)];
962 memcpy (to, buffer, size);
969 uint8_t byte0 = ReadU8 ();
970 uint8_t byte1 = ReadU8 ();
971 uint8_t byte2 = ReadU8 ();
972 uint8_t byte3 = ReadU8 ();
973 uint32_t data = byte3;
985 uint8_t byte0 = ReadU8 ();
986 uint8_t byte1 = ReadU8 ();
987 uint8_t byte2 = ReadU8 ();
988 uint8_t byte3 = ReadU8 ();
989 uint8_t byte4 = ReadU8 ();
990 uint8_t byte5 = ReadU8 ();
991 uint8_t byte6 = ReadU8 ();
992 uint8_t byte7 = ReadU8 ();
993 uint64_t data = byte7;
1014 uint16_t retval = 0;
1015 retval |= ReadU8 ();
1017 retval |= ReadU8 ();
1023 uint32_t retval = 0;
1024 retval |= ReadU8 ();
1026 retval |= ReadU8 ();
1028 retval |= ReadU8 ();
1030 retval |= ReadU8 ();
1036 uint64_t retval = 0;
1037 retval |= ReadU8 ();
1039 retval |= ReadU8 ();
1041 retval |= ReadU8 ();
1043 retval |= ReadU8 ();
1045 retval |= ReadU8 ();
1047 retval |= ReadU8 ();
1049 retval |= ReadU8 ();
1051 retval |= ReadU8 ();
1057 uint8_t byte0 = ReadU8 ();
1058 uint8_t byte1 = ReadU8 ();
1059 uint16_t data = byte1;
1067 uint8_t byte0 = ReadU8 ();
1068 uint8_t byte1 = ReadU8 ();
1069 uint8_t byte2 = ReadU8 ();
1070 uint8_t byte3 = ReadU8 ();
1071 uint32_t data = byte3;
1083 uint8_t byte0 = ReadU8 ();
1084 uint8_t byte1 = ReadU8 ();
1085 uint8_t byte2 = ReadU8 ();
1086 uint8_t byte3 = ReadU8 ();
1087 uint8_t byte4 = ReadU8 ();
1088 uint8_t byte5 = ReadU8 ();
1089 uint8_t byte6 = ReadU8 ();
1090 uint8_t byte7 = ReadU8 ();
1091 uint64_t data = byte7;
1112 for (uint32_t i = 0; i < size; i++)
1114 buffer[i] = ReadU8 ();
1121 return CalculateIpChecksum (size, 0);
1128 uint32_t sum = initialChecksum;
1130 for (
int j = 0; j < size/2; j++)
1137 sum = (sum & 0xffff) + (sum >> 16);
1144 return m_dataEnd - m_dataStart;
1151 std::string str =
"You have attempted to read beyond the bounds of the "
1152 "available buffer space. This usually indicates that a "
1153 "Header::Deserialize or Trailer::Deserialize method "
1154 "is trying to read data which was not written by "
1155 "a Header::Serialize or Trailer::Serialize method. "
1156 "In short: check the code of your Serialize and Deserialize "
1164 if (m_current < m_dataStart)
1166 str =
"You have attempted to write before the start of the available "
1167 "buffer space. This usually indicates that Trailer::GetSerializedSize "
1168 "returned a size which is too small compared to what Trailer::Serialize "
1169 "is actually using.";
1171 else if (m_current >= m_dataEnd)
1173 str =
"You have attempted to write after the end of the available "
1174 "buffer space. This usually indicates that Header::GetSerializedSize "
1175 "returned a size which is too small compared to what Header::Serialize "
1176 "is actually using.";
1180 NS_ASSERT (m_current >= m_zeroStart && m_current < m_zeroEnd);
1181 str =
"You have attempted to write inside the payload area of the "
1182 "buffer. This usually indicates that your Serialize method uses more "
1183 "buffer space than what your GetSerialized method returned.";