21 #include "ns3/packet.h"
22 #include "ns3/fatal-error.h"
37 .SetGroupName (
"Internet")
39 .AddTraceSource (
"NextRxSequence",
40 "Next sequence number expected (RCV.NXT)",
42 "ns3::SequenceNumber32TracedValueCallback")
55 : m_nextRxSeq (n), m_gotFin (false), m_size (0), m_maxBuffer (32768), m_availBytes (0)
145 uint32_t pktSize = p->
GetSize ();
148 NS_LOG_LOGIC (
"Add pkt " << p <<
" len=" << pktSize <<
" seq=" << headSeq
156 if (maxSeq < tailSeq) tailSeq = maxSeq;
157 if (tailSeq < headSeq) headSeq = tailSeq;
161 while (i !=
m_data.end () && i->first <= tailSeq)
163 SequenceNumber32 lastByteSeq = i->first +
SequenceNumber32 (i->second->GetSize ());
164 if (lastByteSeq > headSeq)
166 if (i->first > headSeq && lastByteSeq < tailSeq)
168 m_size -= i->second->GetSize ();
172 if (i->first <= headSeq)
174 headSeq = lastByteSeq;
176 if (lastByteSeq >= tailSeq)
184 if (headSeq >= tailSeq)
192 uint32_t length = tailSeq - headSeq;
202 for (
BufIterator i = m_data.begin (); i != m_data.end (); ++i)
228 uint32_t extractSize = std::min (maxSize,
m_availBytes);
229 NS_LOG_LOGIC (
"Requested to extract " << extractSize <<
" bytes from TcpRxBuffer of size=" <<
m_size);
230 if (extractSize == 0)
return 0;
239 uint32_t pktSize = i->second->GetSize ();
240 if (pktSize <= extractSize)
242 outPkt->AddAtEnd (i->second);
246 extractSize -= pktSize;
250 outPkt->AddAtEnd (i->second->CreateFragment (0, extractSize));
251 m_data[i->first +
SequenceNumber32 (extractSize)] = i->second->CreateFragment (extractSize, pktSize - extractSize);
258 if (outPkt->GetSize () == 0)
264 <<
", num pkts in buffer=" <<
m_data.size ());
uint32_t m_availBytes
Number of bytes available to read, i.e.
uint32_t m_maxBuffer
Upper bound of the number of data bytes in buffer (RCV.WND)
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
bool Add(Ptr< Packet > p, TcpHeader const &tcph)
Insert a packet into the buffer and update the availBytes counter to reflect the number of bytes read...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
TracedValue< SequenceNumber32 > m_nextRxSeq
Seqnum of the first missing byte in data (RCV.NXT)
uint32_t Available() const
Get the actual number of bytes available to be read.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
void SetFinSequence(const SequenceNumber32 &s)
Set the FIN Sequence number (i.e., the one closing the connection)
SequenceNumber32 NextRxSequence(void) const
Get Next Rx Sequence number.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
SequenceNumber32 MaxRxSequence(void) const
Get the lowest sequence number that this TcpRxBuffer cannot accept.
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
void IncNextRxSequence(void)
Increment the Next Sequence number.
bool m_gotFin
Did I received FIN packet?
class for the reordering buffer that keeps the data from lower layer, i.e.
void SetNextRxSequence(const SequenceNumber32 &s)
Set the Next Sequence number.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
void SetMaxBufferSize(uint32_t s)
Set the Maximum buffer size.
TcpRxBuffer(uint32_t n=0)
Constructor.
SequenceNumber32 m_finSeq
Seqnum of the FIN packet.
Ptr< Packet > Extract(uint32_t maxSize)
Extract data from the head of the buffer as indicated by nextRxSeq.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::map< SequenceNumber32, Ptr< Packet > > m_data
Corresponding data (may be null)
uint32_t MaxBufferSize(void) const
Get the Maximum buffer size.
uint32_t m_size
Number of total data bytes in the buffer, not necessarily contiguous.
static TypeId GetTypeId(void)
Get the type ID.
A base class which provides memory management and object aggregation.
uint32_t Size(void) const
Get the actual buffer occupancy.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
SequenceNumber< uint32_t, int32_t > SequenceNumber32
32 bit Sequence number.
bool Finished(void)
Check if the buffer did receive all the data (and the connection is closed)
std::map< SequenceNumber32, Ptr< Packet > >::iterator BufIterator
container for data stored in the buffer