25 #include "ns3/packet.h"
26 #include "ns3/fatal-error.h"
29 #include "tcp-tx-buffer.h"
36 TcpTxBuffer::GetTypeId (
void)
38 static TypeId tid = TypeId (
"ns3::TcpTxBuffer")
40 .AddConstructor<TcpTxBuffer> ()
41 .AddTraceSource (
"UnackSequence",
42 "First unacknowledged sequence number (SND.UNA)",
55 TcpTxBuffer::TcpTxBuffer (uint32_t n)
56 : m_firstByteSeq (n), m_size (0), m_maxBuffer (32768), m_data (0)
60 TcpTxBuffer::~TcpTxBuffer (
void)
67 return m_firstByteSeq;
97 return m_maxBuffer - m_size;
105 << m_firstByteSeq <<
", availSize="<<
Available ());
110 m_data.push_back (p);
116 NS_LOG_LOGIC (
"Rejected. Not enough room to buffer packet.");
127 NS_LOG_LOGIC (
"HeadSeq=" << m_firstByteSeq <<
", lastSeq=" << lastSeq <<
", size=" << m_size <<
128 ", returns " << lastSeq - seq);
129 return lastSeq - seq;
139 return Create<Packet> ();
141 if (m_data.size () == 0)
143 return Create<Packet> (s);
147 uint32_t offset = seq - m_firstByteSeq.Get ();
149 uint32_t pktSize = 0;
150 bool beginFound =
false;
153 NS_LOG_LOGIC (
"There are " << m_data.size () <<
" number of packets in buffer");
154 for (BufIterator i = m_data.begin (); i != m_data.end (); ++i)
157 pktSize = (*i)->GetSize ();
160 if (count + pktSize > offset)
162 NS_LOG_LOGIC (
"First byte found in packet #" << pktCount <<
" at buffer offset " << count
163 <<
", packet len=" << pktSize);
165 uint32_t packetOffset = offset - count;
166 uint32_t fragmentLength = count + pktSize - offset;
167 if (fragmentLength >= s)
169 return (*i)->CreateFragment (packetOffset, s);
178 else if (count + pktSize >= offset + s)
180 NS_LOG_LOGIC (
"Last byte found in packet #" << pktCount <<
" at buffer offset " << count
181 <<
", packet len=" << pktSize);
182 uint32_t fragmentLength = offset + s - count;
190 NS_LOG_LOGIC (
"Appending to output the packet #" << pktCount <<
" of offset " << count <<
" len=" << pktSize);
204 m_firstByteSeq = seq;
211 NS_LOG_LOGIC (
"current data size=" << m_size <<
", headSeq=" << m_firstByteSeq <<
", maxBuffer=" << m_maxBuffer
212 <<
", numPkts=" << m_data.size ());
214 if (m_firstByteSeq >= seq)
return;
217 uint32_t offset = seq - m_firstByteSeq.Get ();
220 BufIterator i = m_data.begin ();
221 while (i != m_data.end ())
223 if (offset > (*i)->GetSize ())
225 pktSize = (*i)->GetSize ();
228 m_firstByteSeq += pktSize;
229 i = m_data.erase (i);
230 NS_LOG_LOGIC (
"Removed one packet of size " << pktSize <<
", offset=" << offset);
234 pktSize = (*i)->GetSize () - offset;
235 *i = (*i)->CreateFragment (offset, pktSize);
237 m_firstByteSeq += offset;
238 NS_LOG_LOGIC (
"Fragmented one packet by size " << offset <<
", new size=" << pktSize);
245 m_firstByteSeq = seq;
247 NS_LOG_LOGIC (
"size=" << m_size <<
" headSeq=" << m_firstByteSeq <<
" maxBuffer=" << m_maxBuffer
248 <<
" numPkts="<< m_data.size ());
uint32_t Size(void) const
#define NS_LOG_FUNCTION(parameters)
void DiscardUpTo(const SequenceNumber32 &seq)
uint32_t SizeFromSequence(const SequenceNumber32 &seq) const
SequenceNumber32 HeadSequence(void) const
#define NS_ASSERT(condition)
uint32_t MaxBufferSize(void) const
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
void AddAtEnd(Ptr< const Packet > packet)
#define NS_LOG_LOGIC(msg)
void SetMaxBufferSize(uint32_t n)
uint32_t Available(void) const
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
bool Add(Ptr< Packet > p)
SequenceNumber32 TailSequence(void) const
void SetHeadSequence(const SequenceNumber32 &seq)
Ptr< Packet > CopyFromSequence(uint32_t numBytes, const SequenceNumber32 &seq)