21 #include "ns3/packet.h"    36     .SetGroupName (
"Internet")
    38     .AddTraceSource (
"NextRxSequence",
    39                      "Next sequence number expected (RCV.NXT)",
    41                      "ns3::SequenceNumber32TracedValueCallback")
    54   : m_nextRxSeq (
n), m_gotFin (false), m_size (0), m_maxBuffer (32768), m_availBytes (0)
   144   uint32_t pktSize = p->
GetSize ();
   147   NS_LOG_LOGIC (
"Add pkt " << p << 
" len=" << pktSize << 
" seq=" << headSeq
   155       if (maxSeq < tailSeq) tailSeq = maxSeq;
   156       if (tailSeq < headSeq) headSeq = tailSeq;
   160   while (i != 
m_data.end () && i->first <= tailSeq)
   163       if (lastByteSeq > headSeq)
   165           if (i->first > headSeq && lastByteSeq < tailSeq)
   167               m_size -= i->second->GetSize ();
   171           if (i->first <= headSeq)
   173               headSeq = lastByteSeq;
   175           if (lastByteSeq >= tailSeq)
   183   if (headSeq >= tailSeq)
   191       uint32_t length = 
static_cast<uint32_t
> (tailSeq - headSeq);
   235   return static_cast<uint32_t
> (
m_sackList.size ());
   245   current.first = head;
   246   current.second = tail;
   278   bool updated = 
false;
   279   TcpOptionSack::SackList::iterator it = 
m_sackList.begin ();
   291       if (begin.first == current.second)
   293           NS_ASSERT (current.first < begin.second);
   299       else if (begin.second == current.first)
   301           NS_ASSERT (begin.first < current.second);
   340   TcpOptionSack::SackList::iterator it;
   346       if (block.second <= seq)
   369   NS_LOG_LOGIC (
"Requested to extract " << extractSize << 
" bytes from TcpRxBuffer of size=" << 
m_size);
   370   if (extractSize == 0) 
return nullptr;  
   379       uint32_t pktSize = i->second->GetSize ();
   380       if (pktSize <= extractSize)
   382           outPkt->AddAtEnd (i->second);
   386           extractSize -= pktSize;
   390           outPkt->AddAtEnd (i->second->CreateFragment (0, extractSize));
   391           m_data[i->first + 
SequenceNumber32 (extractSize)] = i->second->CreateFragment (extractSize, pktSize - extractSize);
   398   if (outPkt->GetSize () == 0)
   404                              << 
", 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) 
SequenceNumber32 NextRxSequence(void) const
Get Next Rx Sequence number. 
#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. 
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
TracedValue< SequenceNumber32 > m_nextRxSeq
Seqnum of the first missing byte in data (RCV.NXT) 
std::list< SackBlock > SackList
SACK list definition. 
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet. 
#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. 
void SetFinSequence(const SequenceNumber32 &s)
Set the FIN Sequence number (i.e., the one closing the connection) 
SequenceNumber32 MaxRxSequence(void) const
Get the lowest sequence number that this TcpRxBuffer cannot accept. 
void ClearSackList(const SequenceNumber32 &seq)
Remove old blocks from the sack list. 
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source. 
uint32_t GetSackListSize() const
Get the size of Sack list. 
void IncNextRxSequence(void)
Increment the Next Sequence number. 
bool m_gotFin
Did I received FIN packet? 
void UpdateSackList(const SequenceNumber32 &head, const SequenceNumber32 &tail)
Update the sack list, with the block seq starting at the beginning. 
Rx reordering buffer for TCP. 
void SetNextRxSequence(const SequenceNumber32 &s)
Set the Next Sequence number. 
void SetMaxBufferSize(uint32_t s)
Set the Maximum buffer size. 
uint32_t Size(void) const
Get the actual buffer occupancy. 
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) 
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
std::pair< SequenceNumber32, SequenceNumber32 > SackBlock
SACK block definition. 
uint32_t m_size
Number of total data bytes in the buffer, not necessarily contiguous. 
TcpOptionSack::SackList m_sackList
Sack list (updated constantly) 
static TypeId GetTypeId(void)
Get the type ID. 
A base class which provides memory management and object aggregation. 
a unique identifier for an interface. 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
SequenceNumber< uint32_t, int32_t > SequenceNumber32
32 bit Sequence number. 
uint32_t MaxBufferSize(void) const
Get the Maximum buffer size. 
bool Finished(void)
Check if the buffer did receive all the data (and the connection is closed) 
uint32_t Available() const
Get the actual number of bytes available to be read. 
std::map< SequenceNumber32, Ptr< Packet > >::iterator BufIterator
container for data stored in the buffer 
TcpOptionSack::SackList GetSackList() const
Get the sack list.