21 #include "ns3/packet.h"
22 #include "ns3/fatal-error.h"
24 #include "tcp-rx-buffer.h"
31 TcpRxBuffer::GetTypeId (
void)
33 static TypeId tid = TypeId (
"ns3::TcpRxBuffer")
35 .AddConstructor<TcpRxBuffer> ()
36 .AddTraceSource (
"NextRxSequence",
37 "Next sequence number expected (RCV.NXT)",
50 TcpRxBuffer::TcpRxBuffer (uint32_t n)
51 : m_nextRxSeq (n), m_gotFin (false), m_size (0), m_maxBuffer (32768), m_availBytes (0)
55 TcpRxBuffer::~TcpRxBuffer ()
60 TcpRxBuffer::NextRxSequence (
void)
const
66 TcpRxBuffer::SetNextRxSequence (
const SequenceNumber32& s)
72 TcpRxBuffer::MaxBufferSize (
void)
const
78 TcpRxBuffer::SetMaxBufferSize (uint32_t s)
84 TcpRxBuffer::Size (
void)
const
90 TcpRxBuffer::Available ()
const
96 TcpRxBuffer::IncNextRxSequence ()
107 TcpRxBuffer::MaxRxSequence (
void)
const
113 else if (m_data.size ())
115 return m_data.begin ()->first + SequenceNumber32 (m_maxBuffer);
117 return m_nextRxSeq + SequenceNumber32 (m_maxBuffer);
121 TcpRxBuffer::SetFinSequence (
const SequenceNumber32& s)
127 if (m_nextRxSeq == m_finSeq) ++m_nextRxSeq;
131 TcpRxBuffer::Finished (
void)
133 return (m_gotFin && m_finSeq < m_nextRxSeq);
141 uint32_t pktSize = p->
GetSize ();
144 NS_LOG_LOGIC (
"Add pkt " << p <<
" len=" << pktSize <<
" seq=" << headSeq
145 <<
", when NextRxSeq=" << m_nextRxSeq <<
", buffsize=" << m_size);
148 if (headSeq < m_nextRxSeq) headSeq = m_nextRxSeq;
151 SequenceNumber32 maxSeq = m_data.begin ()->first + SequenceNumber32 (m_maxBuffer);
152 if (maxSeq < tailSeq) tailSeq = maxSeq;
153 if (tailSeq < headSeq) headSeq = tailSeq;
156 BufIterator i = m_data.begin ();
157 while (i != m_data.end () && i->first <= tailSeq)
159 SequenceNumber32 lastByteSeq = i->first + SequenceNumber32 (i->second->GetSize ());
160 if (lastByteSeq > headSeq)
162 if (i->first > headSeq && lastByteSeq < tailSeq)
164 m_size -= i->second->GetSize ();
168 if (i->first <= headSeq)
170 headSeq = lastByteSeq;
172 if (lastByteSeq >= tailSeq)
180 if (headSeq >= tailSeq)
188 uint32_t length = tailSeq - headSeq;
193 NS_ASSERT (m_data.find (headSeq) == m_data.end ());
194 m_data [ headSeq ] = p;
198 for (BufIterator i = m_data.begin (); i != m_data.end (); ++i)
200 if (i->first < m_nextRxSeq)
204 else if (i->first > m_nextRxSeq)
208 m_nextRxSeq = i->first + SequenceNumber32 (i->second->GetSize ());
209 m_availBytes += i->second->GetSize ();
211 NS_LOG_LOGIC (
"Updated buffer occupancy=" << m_size <<
" nextRxSeq=" << m_nextRxSeq);
212 if (m_gotFin && m_nextRxSeq == m_finSeq)
224 uint32_t extractSize = std::min (maxSize, m_availBytes);
225 NS_LOG_LOGIC (
"Requested to extract " << extractSize <<
" bytes from TcpRxBuffer of size=" << m_size);
226 if (extractSize == 0)
return 0;
235 uint32_t pktSize = i->second->GetSize ();
236 if (pktSize <= extractSize)
238 outPkt->AddAtEnd (i->second);
241 m_availBytes -= pktSize;
242 extractSize -= pktSize;
246 outPkt->AddAtEnd (i->second->CreateFragment (0, extractSize));
247 m_data[i->first +
SequenceNumber32 (extractSize)] = i->second->CreateFragment (extractSize, pktSize - extractSize);
249 m_size -= extractSize;
250 m_availBytes -= extractSize;
254 if (outPkt->GetSize () == 0)
259 NS_LOG_LOGIC (
"Extracted " << outPkt->GetSize ( ) <<
" bytes, bufsize=" << m_size
260 <<
", num pkts in buffer=" << m_data.size ());
#define NS_LOG_FUNCTION(parameters)
bool Add(Ptr< Packet > p, TcpHeader const &tcph)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
#define NS_LOG_LOGIC(msg)
Ptr< Packet > Extract(uint32_t maxSize)
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)