26 #include "ns3/assert.h"
28 #define noBUFFER_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;
145 inline void WriteU8 (uint8_t data);
153 inline void WriteU8 (uint8_t data, uint32_t len);
239 void Write (uint8_t
const*buffer, uint32_t size);
259 inline uint8_t
ReadU8 (
void);
267 inline uint16_t
ReadU16 (
void);
340 void Read (uint8_t *buffer, uint32_t size);
366 inline void Construct (
const Buffer *buffer);
367 bool CheckNoZero (uint32_t start, uint32_t end)
const;
368 bool Check (uint32_t i)
const;
369 uint16_t SlowReadNtohU16 (
void);
370 uint32_t SlowReadNtohU32 (
void);
371 std::string GetReadErrorMessage (
void)
const;
372 std::string GetWriteErrorMessage (
void)
const;
377 uint32_t m_zeroStart;
385 uint32_t m_dataStart;
403 inline uint32_t
GetSize (
void)
const;
414 uint8_t
const*
PeekData (
void)
const;
484 Buffer CreateFullCopy (
void)
const;
501 uint32_t
Serialize (uint8_t* buffer, uint32_t maxSize)
const;
511 uint32_t
Deserialize (
const uint8_t* buffer, uint32_t size);
513 int32_t GetCurrentStartOffset (
void)
const;
514 int32_t GetCurrentEndOffset (
void)
const;
522 void CopyData (std::ostream *os, uint32_t size)
const;
524 uint32_t
CopyData (uint8_t *buffer, uint32_t size)
const;
529 Buffer (uint32_t dataSize);
530 Buffer (uint32_t dataSize,
bool initialize);
559 uint32_t m_dirtyStart;
570 void TransformIntoRealBuffer (
void)
const;
571 bool CheckInternalState (
void)
const;
572 void Initialize (uint32_t zeroSize);
573 uint32_t GetInternalSize (
void)
const;
574 uint32_t GetInternalEnd (
void)
const;
577 static struct Buffer::Data *Allocate (uint32_t reqSize);
591 uint32_t m_maxZeroAreaStart;
602 uint32_t m_zeroAreaStart;
606 uint32_t m_zeroAreaEnd;
616 #ifdef BUFFER_FREE_LIST
617 typedef std::vector<struct Buffer::Data*> FreeList;
618 struct LocalStaticDestructor
620 ~LocalStaticDestructor ();
622 static uint32_t g_maxSize;
623 static FreeList *g_freeList;
624 static struct LocalStaticDestructor g_localStaticDestructor;
630 #include "ns3/assert.h"
635 Buffer::Iterator::Iterator ()
644 Buffer::Iterator::Iterator (Buffer
const*buffer)
647 m_current = m_dataStart;
649 Buffer::Iterator::Iterator (Buffer
const*buffer,
bool dummy)
652 m_current = m_dataEnd;
656 Buffer::Iterator::Construct (
const Buffer *buffer)
658 m_zeroStart = buffer->m_zeroAreaStart;
659 m_zeroEnd = buffer->m_zeroAreaEnd;
660 m_dataStart = buffer->m_start;
661 m_dataEnd = buffer->m_end;
662 m_data = buffer->m_data->m_data;
680 NS_ASSERT (m_current + delta <= m_dataEnd);
693 GetWriteErrorMessage ());
695 if (m_current < m_zeroStart)
697 m_data[m_current] = data;
702 m_data[m_current - (m_zeroEnd-m_zeroStart)] = data;
711 GetWriteErrorMessage ());
712 if (m_current <= m_zeroStart)
714 std::memset (&(m_data[m_current]), data, len);
719 uint8_t *buffer = &m_data[m_current - (m_zeroEnd-m_zeroStart)];
720 std::memset (buffer, data, len);
729 GetWriteErrorMessage ());
731 if (m_current + 2 <= m_zeroStart)
733 buffer = &m_data[m_current];
737 buffer = &m_data[m_current - (m_zeroEnd - m_zeroStart)];
739 buffer[0] = (data >> 8)& 0xff;
740 buffer[1] = (data >> 0)& 0xff;
748 GetWriteErrorMessage ());
751 if (m_current + 4 <= m_zeroStart)
753 buffer = &m_data[m_current];
757 buffer = &m_data[m_current - (m_zeroEnd - m_zeroStart)];
759 buffer[0] = (data >> 24)& 0xff;
760 buffer[1] = (data >> 16)& 0xff;
761 buffer[2] = (data >> 8)& 0xff;
762 buffer[3] = (data >> 0)& 0xff;
770 if (m_current + 2 <= m_zeroStart)
772 buffer = &m_data[m_current];
774 else if (m_current >= m_zeroEnd)
776 buffer = &m_data[m_current];
780 return SlowReadNtohU16 ();
794 if (m_current + 4 <= m_zeroStart)
796 buffer = &m_data[m_current];
798 else if (m_current >= m_zeroEnd)
800 buffer = &m_data[m_current];
804 return SlowReadNtohU32 ();
822 m_current <= m_dataEnd,
823 GetReadErrorMessage ());
825 if (m_current < m_zeroStart)
827 uint8_t data = m_data[m_current];
831 else if (m_current < m_zeroEnd)
838 uint8_t data = m_data[m_current - (m_zeroEnd-m_zeroStart)];
847 uint8_t byte0 = ReadU8 ();
848 uint8_t byte1 = ReadU8 ();
849 uint16_t data = byte1;
856 Buffer::Buffer (
Buffer const&o)
858 m_maxZeroAreaStart (o.m_zeroAreaStart),
859 m_zeroAreaStart (o.m_zeroAreaStart),
860 m_zeroAreaEnd (o.m_zeroAreaEnd),
871 return m_end - m_start;
uint16_t CalculateIpChecksum(uint16_t size)
Calculate the checksum.
void WriteHtonU64(uint64_t data)
void RemoveAtEnd(uint32_t end)
void RemoveAtStart(uint32_t start)
automatically resized byte buffer
uint64_t ReadNtohU64(void)
#define NS_ASSERT(condition)
uint32_t GetSerializedSize(void) const
uint32_t ReadNtohU32(void)
uint32_t GetDistanceFrom(Iterator const &o) const
iterator in a Buffer instance
uint32_t Deserialize(const uint8_t *buffer, uint32_t size)
void WriteU16(uint16_t data)
void WriteHtonU16(uint16_t data)
Buffer::Iterator End(void) const
uint8_t const * PeekData(void) const
void WriteU64(uint64_t data)
void CopyData(std::ostream *os, uint32_t size) const
Buffer::Iterator Begin(void) const
void Read(uint8_t *buffer, uint32_t size)
void WriteHtonU32(uint32_t data)
uint32_t GetSize(void) const
Buffer CreateFragment(uint32_t start, uint32_t length) const
bool AddAtEnd(uint32_t end)
void WriteHtolsbU16(uint16_t data)
#define NS_ASSERT_MSG(condition, message)
uint32_t Serialize(uint8_t *buffer, uint32_t maxSize) const
void WriteU8(uint8_t data)
void WriteHtolsbU64(uint64_t data)
static uint32_t g_recommendedStart
void Write(uint8_t const *buffer, uint32_t size)
uint16_t ReadLsbtohU16(void)
bool AddAtStart(uint32_t start)
uint64_t ReadLsbtohU64(void)
uint16_t ReadNtohU16(void)
void WriteU32(uint32_t data)
uint32_t GetSize(void) const
uint32_t ReadLsbtohU32(void)
void WriteHtolsbU32(uint32_t data)