26 #include "ns3/assert.h"
28 #define BUFFER_FREE_LIST 1
105 inline void Next (
void);
109 inline void Prev (
void);
113 inline void Next (uint32_t delta);
117 inline void Prev (uint32_t delta);
132 bool IsEnd (
void)
const;
239 void Write (uint8_t
const*buffer, uint32_t size);
258 inline uint8_t
PeekU8 (
void);
266 inline uint8_t
ReadU8 (
void);
274 inline uint16_t
ReadU16 (
void);
347 void Read (uint8_t *buffer, uint32_t size);
420 bool Check (uint32_t i)
const;
490 inline uint32_t
GetSize (
void)
const;
501 uint8_t
const*
PeekData (
void)
const;
585 uint32_t
Serialize (uint8_t* buffer, uint32_t maxSize)
const;
595 uint32_t
Deserialize (
const uint8_t* buffer, uint32_t size);
603 void CopyData (std::ostream *os, uint32_t size)
const;
612 uint32_t
CopyData (uint8_t *buffer, uint32_t size)
const;
633 Buffer (uint32_t dataSize);
643 Buffer (uint32_t dataSize,
bool initialize);
793 #ifdef BUFFER_FREE_LIST
795 typedef std::vector<struct Buffer::Data*>
FreeList;
809 #include "ns3/assert.h"
826 m_current = m_dataStart;
831 m_current = m_dataEnd;
840 m_dataEnd = buffer->
m_end;
859 NS_ASSERT (m_current + delta <= m_dataEnd);
872 GetWriteErrorMessage ());
874 if (m_current < m_zeroStart)
881 m_data[m_current - (m_zeroEnd-m_zeroStart)] =
data;
890 GetWriteErrorMessage ());
891 if (m_current <= m_zeroStart)
893 std::memset (&(
m_data[m_current]),
data, len);
898 uint8_t *buffer = &
m_data[m_current - (m_zeroEnd-m_zeroStart)];
899 std::memset (buffer,
data, len);
908 GetWriteErrorMessage ());
910 if (m_current + 2 <= m_zeroStart)
912 buffer = &
m_data[m_current];
916 buffer = &
m_data[m_current - (m_zeroEnd - m_zeroStart)];
918 buffer[0] = (
data >> 8)& 0xff;
919 buffer[1] = (
data >> 0)& 0xff;
927 GetWriteErrorMessage ());
930 if (m_current + 4 <= m_zeroStart)
932 buffer = &
m_data[m_current];
936 buffer = &
m_data[m_current - (m_zeroEnd - m_zeroStart)];
938 buffer[0] = (
data >> 24)& 0xff;
939 buffer[1] = (
data >> 16)& 0xff;
940 buffer[2] = (
data >> 8)& 0xff;
941 buffer[3] = (
data >> 0)& 0xff;
949 if (m_current + 2 <= m_zeroStart)
951 buffer = &
m_data[m_current];
953 else if (m_current >= m_zeroEnd)
955 buffer = &
m_data[m_current - (m_zeroEnd - m_zeroStart)];
959 return SlowReadNtohU16 ();
973 if (m_current + 4 <= m_zeroStart)
975 buffer = &
m_data[m_current];
977 else if (m_current >= m_zeroEnd)
979 buffer = &
m_data[m_current - (m_zeroEnd - m_zeroStart)];
983 return SlowReadNtohU32 ();
1001 m_current < m_dataEnd,
1002 GetReadErrorMessage ());
1004 if (m_current < m_zeroStart)
1009 else if (m_current < m_zeroEnd)
1015 uint8_t
data =
m_data[m_current - (m_zeroEnd-m_zeroStart)];
1023 uint8_t ret = PeekU8 ();
1031 uint8_t byte0 = ReadU8 ();
1032 uint8_t byte1 = ReadU8 ();
1033 uint16_t
data = byte1;
1046 start.Write (*
this, end);
iterator in a Buffer instance
void WriteU64(uint64_t data)
void Write(uint8_t const *buffer, uint32_t size)
void Construct(const Buffer *buffer)
Initializes the iterator values.
void WriteU32(uint32_t data)
uint32_t m_dataEnd
offset in virtual bytes from the start of the data buffer to the end of the data which can be read by...
uint16_t ReadNtohU16(void)
void WriteHtonU64(uint64_t data)
void WriteHtolsbU16(uint16_t data)
uint32_t m_dataStart
offset in virtual bytes from the start of the data buffer to the start of the data which can be read ...
uint64_t ReadNtohU64(void)
uint32_t ReadLsbtohU32(void)
uint16_t CalculateIpChecksum(uint16_t size)
Calculate the checksum.
void WriteU8(uint8_t data)
uint8_t * m_data
a pointer to the underlying byte buffer.
uint32_t GetRemainingSize(void) const
void WriteHtolsbU32(uint32_t data)
uint32_t m_zeroEnd
offset in virtual bytes from the start of the data buffer to the end of the "virtual zero area".
bool Check(uint32_t i) const
Checks that the buffer position is not in the "virtual zero area".
uint32_t SlowReadNtohU32(void)
void Next(void)
go forward by one byte
void WriteU16(uint16_t data)
uint32_t m_current
offset in virtual bytes from the start of the data buffer to the current position represented by this...
void Read(uint8_t *buffer, uint32_t size)
void WriteHtolsbU64(uint64_t data)
void WriteHtonU16(uint16_t data)
uint16_t ReadLsbtohU16(void)
void Prev(void)
go backward by one byte
uint32_t m_zeroStart
offset in virtual bytes from the start of the data buffer to the start of the "virtual zero area".
std::string GetWriteErrorMessage(void) const
Returns an appropriate message indicating a write error.
uint64_t ReadLsbtohU64(void)
uint16_t SlowReadNtohU16(void)
bool CheckNoZero(uint32_t start, uint32_t end) const
Checks that the [start, end) is not in the "virtual zero area".
void WriteHtonU32(uint32_t data)
uint32_t GetDistanceFrom(Iterator const &o) const
std::string GetReadErrorMessage(void) const
Returns an appropriate message indicating a read error.
uint32_t GetSize(void) const
uint32_t ReadNtohU32(void)
automatically resized byte buffer
uint32_t GetInternalSize(void) const
Get the buffer real size.
uint32_t m_end
offset to the end of the data referenced by this Buffer instance from the start of m_data->m_data
bool CheckInternalState(void) const
Checks the internal buffer structures consistency.
Buffer CreateFragment(uint32_t start, uint32_t length) const
static FreeList * g_freeList
Buffer data container.
static struct Buffer::Data * Create(uint32_t size)
Create a buffer data storage.
static uint32_t g_maxSize
Max observed data size.
static struct LocalStaticDestructor g_localStaticDestructor
Local static destructor.
uint32_t m_zeroAreaEnd
offset to the end of the virtual zero area from the start of m_data->m_data
std::vector< struct Buffer::Data * > FreeList
Container for buffer data.
static void Deallocate(struct Buffer::Data *data)
Deallocate the buffer memory.
uint32_t m_maxZeroAreaStart
keep track of the maximum value of m_zeroAreaStart across the lifetime of a Buffer instance.
uint32_t GetSize(void) const
static uint32_t g_recommendedStart
location in a newly-allocated buffer where you should start writing data.
uint32_t GetInternalEnd(void) const
Get the buffer end position.
void CopyData(std::ostream *os, uint32_t size) const
Copy the specified amount of data from the buffer to the given output stream.
Buffer CreateFullCopy(void) const
Create a full copy of the buffer, including all the internal structures.
static struct Buffer::Data * Allocate(uint32_t reqSize)
Allocate a buffer data storage.
Buffer & operator=(Buffer const &o)
Assignment operator.
void RemoveAtEnd(uint32_t end)
void AddAtStart(uint32_t start)
void AddAtEnd(uint32_t end)
uint32_t GetSerializedSize(void) const
Return the number of bytes required for serialization.
void TransformIntoRealBuffer(void) const
Transform a "Virtual byte buffer" into a "Real byte buffer".
static void Recycle(struct Buffer::Data *data)
Recycle the buffer memory.
struct Data * m_data
the buffer data storage
Buffer::Iterator End(void) const
uint8_t const * PeekData(void) const
void Initialize(uint32_t zeroSize)
Initializes the buffer with a number of zeroes.
Buffer::Iterator Begin(void) const
uint32_t Deserialize(const uint8_t *buffer, uint32_t size)
void RemoveAtStart(uint32_t start)
uint32_t m_zeroAreaStart
offset to the start of the virtual zero area from the start of m_data->m_data
uint32_t Serialize(uint8_t *buffer, uint32_t maxSize) const
uint32_t m_start
offset to the start of the data referenced by this Buffer instance from the start of m_data->m_data
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
This data structure is variable-sized through its last member whose size is determined at allocation ...
uint8_t m_data[1]
The real data buffer holds at least one byte.
uint32_t m_dirtyEnd
offset from the start of the m_data field below to the end of the area in which user bytes were writt...
uint32_t m_count
The reference count of an instance of this data structure.
uint32_t m_size
the size of the m_data field below.
uint32_t m_dirtyStart
offset from the start of the m_data field below to the start of the area in which user bytes were wri...
Local static destructor structure.