Tcp sender buffer. More...
#include "tcp-tx-buffer.h"
Public Member Functions | |
TcpTxBuffer (uint32_t n=0) | |
Constructor. | |
~TcpTxBuffer () override | |
bool | Add (Ptr< Packet > p) |
Append a data packet to the end of the buffer. | |
void | AddRenoSack () |
Emulate SACKs for SACKless connection: account for a new dupack. | |
uint32_t | Available () const |
Returns the available capacity of this buffer. | |
uint32_t | BytesInFlight () const |
Return total bytes in flight. | |
TcpTxItem * | CopyFromSequence (uint32_t numBytes, const SequenceNumber32 &seq) |
Copy data from the range [seq, seq+numBytes) into a packet. | |
void | DeleteRetransmittedFlagFromHead () |
DeleteRetransmittedFlagFromHead. | |
void | DiscardUpTo (const SequenceNumber32 &seq, const Callback< void, TcpTxItem * > &beforeDelCb=m_nullCb) |
Discard data up to but not including this sequence number. | |
uint32_t | GetLost () const |
Get the number of segments that we believe are lost in the network. | |
uint32_t | GetRetransmitsCount () const |
Return the number of segments in the sent list that have been transmitted more than once, without acknowledgment. | |
uint32_t | GetSacked () const |
Get the number of segments that have been explicitly sacked by the receiver. | |
SequenceNumber32 | HeadSequence () const |
Get the sequence number of the buffer head. | |
bool | IsHeadRetransmitted () const |
Check if the head is retransmitted. | |
bool | IsLost (const SequenceNumber32 &seq) const |
Check if a segment is lost. | |
bool | IsRetransmittedDataAcked (const SequenceNumber32 &ack) const |
Checks whether the ack corresponds to retransmitted data. | |
bool | IsSackEnabled () const |
check whether SACK is used on the corresponding TCP socket | |
void | MarkHeadAsLost () |
Mark the head of the sent list as lost. | |
uint32_t | MaxBufferSize () const |
Get the maximum buffer size. | |
bool | NextSeg (SequenceNumber32 *seq, SequenceNumber32 *seqHigh, bool isRecovery) const |
Get the next sequence number to transmit, according to RFC 6675. | |
void | ResetLastSegmentSent () |
Take the last segment sent and put it back into the un-sent list (at the beginning) | |
void | ResetRenoSack () |
Reset the SACKs. | |
void | ResetSentList () |
Reset the sent list. | |
void | SetDupAckThresh (uint32_t dupAckThresh) |
Set the DupAckThresh. | |
void | SetHeadSequence (const SequenceNumber32 &seq) |
Set the head sequence of the buffer. | |
void | SetMaxBufferSize (uint32_t n) |
Set the maximum buffer size. | |
void | SetRWndCallback (Callback< uint32_t > rWndCallback) |
Set callback to obtain receiver window value. | |
void | SetSackEnabled (bool enabled) |
tell tx-buffer whether SACK is used on this TCP socket | |
void | SetSegmentSize (uint32_t segmentSize) |
Set the segment size. | |
void | SetSentListLost (bool resetSack=false) |
Set the entire sent list as lost (typically after an RTO) | |
uint32_t | Size () const |
Returns total number of bytes in this buffer. | |
uint32_t | SizeFromSequence (const SequenceNumber32 &seq) const |
Returns the number of bytes from the buffer in the range [seq, tailSequence) | |
SequenceNumber32 | TailSequence () const |
Get the sequence number of the buffer tail (plus one) | |
uint32_t | Update (const TcpOptionSack::SackList &list, const Callback< void, TcpTxItem * > &sackedCb=m_nullCb) |
Update the scoreboard. | |
Public Member Functions inherited from ns3::Object | |
Object () | |
Constructor. | |
~Object () override | |
Destructor. | |
void | AggregateObject (Ptr< Object > other) |
Aggregate two Objects together. | |
void | Dispose () |
Dispose of this Object. | |
AggregateIterator | GetAggregateIterator () const |
Get an iterator to the Objects aggregated to this one. | |
TypeId | GetInstanceTypeId () const override |
Get the most derived TypeId for this Object. | |
template<typename T > | |
Ptr< T > | GetObject () const |
Get a pointer to the requested aggregated Object. | |
template<> | |
Ptr< Object > | GetObject () const |
Specialization of () for objects of type ns3::Object. | |
template<typename T > | |
Ptr< T > | GetObject (TypeId tid) const |
Get a pointer to the requested aggregated Object by TypeId. | |
template<> | |
Ptr< Object > | GetObject (TypeId tid) const |
Specialization of (TypeId tid) for objects of type ns3::Object. | |
void | Initialize () |
Invoke DoInitialize on all Objects aggregated to this one. | |
bool | IsInitialized () const |
Check if the object has been initialized. | |
void | UnidirectionalAggregateObject (Ptr< Object > other) |
Aggregate an Object to another Object. | |
Public Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter > | |
SimpleRefCount () | |
Default constructor. | |
SimpleRefCount (const SimpleRefCount &o) | |
Copy constructor. | |
uint32_t | GetReferenceCount () const |
Get the reference count of the object. | |
SimpleRefCount & | operator= (const SimpleRefCount &o) |
Assignment operator. | |
void | Ref () const |
Increment the reference count. | |
void | Unref () const |
Decrement the reference count. | |
Public Member Functions inherited from ns3::ObjectBase | |
virtual | ~ObjectBase () |
Virtual destructor. | |
void | GetAttribute (std::string name, AttributeValue &value, bool permissive=false) const |
Get the value of an attribute, raising fatal errors if unsuccessful. | |
bool | GetAttributeFailSafe (std::string name, AttributeValue &value) const |
Get the value of an attribute without raising errors. | |
void | SetAttribute (std::string name, const AttributeValue &value) |
Set a single attribute, raising fatal errors if unsuccessful. | |
bool | SetAttributeFailSafe (std::string name, const AttributeValue &value) |
Set a single attribute without raising errors. | |
bool | TraceConnect (std::string name, std::string context, const CallbackBase &cb) |
Connect a TraceSource to a Callback with a context. | |
bool | TraceConnectWithoutContext (std::string name, const CallbackBase &cb) |
Connect a TraceSource to a Callback without a context. | |
bool | TraceDisconnect (std::string name, std::string context, const CallbackBase &cb) |
Disconnect from a TraceSource a Callback previously connected with a context. | |
bool | TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb) |
Disconnect from a TraceSource a Callback previously connected without a context. | |
Static Public Member Functions | |
static TypeId | GetTypeId () |
Get the type ID. | |
Static Public Member Functions inherited from ns3::Object | |
static TypeId | GetTypeId () |
Register this type. | |
Static Public Member Functions inherited from ns3::ObjectBase | |
static TypeId | GetTypeId () |
Get the type ID. | |
Private Types | |
typedef std::list< TcpTxItem * > | PacketList |
container for data stored in the buffer | |
Private Member Functions | |
uint32_t | BytesInFlightRFC () const |
Calculate the number of bytes in flight per RFC 6675. | |
void | ConsistencyCheck () const |
Check if the values of sacked, lost, retrans, are in sync with the sent list. | |
std::pair< TcpTxBuffer::PacketList::const_iterator, SequenceNumber32 > | FindHighestSacked () const |
Find the highest SACK byte. | |
TcpTxItem * | GetNewSegment (uint32_t numBytes) |
Get a block of data not transmitted yet and move it into SentList. | |
TcpTxItem * | GetPacketFromList (PacketList &list, const SequenceNumber32 &startingSeq, uint32_t numBytes, const SequenceNumber32 &requestedSeq, bool *listEdited=nullptr) const |
Get a block (which is returned as Packet) from a list. | |
TcpTxItem * | GetTransmittedSegment (uint32_t numBytes, const SequenceNumber32 &seq) |
Get a block of data previously transmitted. | |
bool | IsLostRFC (const SequenceNumber32 &seq, const PacketList::const_iterator &segment) const |
Decide if a segment is lost based on RFC 6675 algorithm. | |
void | MergeItems (TcpTxItem *t1, TcpTxItem *t2) const |
Merge two TcpTxItem. | |
void | RemoveFromCounts (TcpTxItem *item, uint32_t size) |
Remove the size specified from the lostOut, retrans, sacked count. | |
void | SplitItems (TcpTxItem *t1, TcpTxItem *t2, uint32_t size) const |
Split one TcpTxItem. | |
void | UpdateLostCount () |
Update the lost count. | |
Private Attributes | |
PacketList | m_appList |
Buffer for application data. | |
uint32_t | m_dupAckThresh {0} |
Duplicate Ack threshold from TcpSocketBase. | |
TracedValue< SequenceNumber32 > | m_firstByteSeq |
Sequence number of the first byte in data (SND.UNA) | |
std::pair< PacketList::const_iterator, SequenceNumber32 > | m_highestSack |
Highest SACK byte. | |
uint32_t | m_lostOut {0} |
Number of lost bytes. | |
uint32_t | m_maxBuffer |
Max number of data bytes in buffer (SND.WND) | |
bool | m_renoSack {false} |
Indicates if AddRenoSack was called. | |
uint32_t | m_retrans {0} |
Number of retransmitted bytes. | |
Callback< uint32_t > | m_rWndCallback |
Callback to obtain RCV.WND value. | |
uint32_t | m_sackedOut {0} |
Number of sacked bytes. | |
bool | m_sackEnabled {true} |
Indicates if SACK is enabled on this connection. | |
bool | m_sackSeen {false} |
Indicates if a SACK was received. | |
uint32_t | m_segmentSize {0} |
Segment size from TcpSocketBase. | |
PacketList | m_sentList |
Buffer for sent (but not acked) data. | |
uint32_t | m_sentSize |
Size of sent (and not discarded) segments. | |
uint32_t | m_size |
Size of all data in this buffer. | |
Static Private Attributes | |
static Callback< void, TcpTxItem * > | m_nullCb = MakeNullCallback<void, TcpTxItem*>() |
Null callback for an item. | |
Friends | |
std::ostream & | operator<< (std::ostream &os, const TcpTxBuffer &tcpTxBuf) |
Output operator. | |
Additional Inherited Members | |
Protected Member Functions inherited from ns3::Object | |
Object (const Object &o) | |
Copy an Object. | |
virtual void | DoDispose () |
Destructor implementation. | |
virtual void | DoInitialize () |
Initialize() implementation. | |
virtual void | NotifyNewAggregate () |
Notify all Objects aggregated to this one of a new Object being aggregated. | |
Protected Member Functions inherited from ns3::ObjectBase | |
void | ConstructSelf (const AttributeConstructionList &attributes) |
Complete construction of ObjectBase; invoked by derived classes. | |
virtual void | NotifyConstructionCompleted () |
Notifier called once the ObjectBase is fully constructed. | |
Related Symbols inherited from ns3::ObjectBase | |
static TypeId | GetObjectIid () |
Ensure the TypeId for ObjectBase gets fully configured to anchor the inheritance tree properly. | |
Tcp sender buffer.
The class keeps track of all data that the application wishes to transmit to the other end. When the data is acknowledged, it is removed from the buffer. The buffer has a maximum size, and data is not saved if the amount exceeds the limit. Packets can be added to the class through the method Add(). An important thing to remember is that all the data managed is strictly sequential. It can be divided into blocks, but all the data follow a strict ordering. That order is managed through SequenceNumber.
In other words, this buffer contains numbered bytes (e.g., 1,2,3), and the class is allowed to return only ordered (using "<" as operator) subsets (e.g. 1,2 or 2,3 or 1,2,3).
The data structure underlying this is composed by two distinct packet lists. The first (SentList) is initially empty, and it contains the packets returned by the method CopyFromSequence. The second (AppList) is initially empty, and it contains the packets coming from the applications, but that are not transmitted yet as segments. To discover how the chunks are managed and retrieved from these lists, check CopyFromSequence documentation.
The head of the data is represented by m_firstByteSeq, and it is returned by HeadSequence(). The last byte is returned by TailSequence(). In this class, we also store the size (in bytes) of the packets inside the SentList in the variable m_sentSize.
The SACK information is usually saved in a data structure referred as scoreboard. In this implementation, the scoreboard is developed on top of the existing classes. In particular, instead of keeping raw pointers to packets in TcpTxBuffer we added the capability to store some flags associated with every segment sent. This is done through the use of the class TcpTxItem: instead of storing a list of packets, we store a list of TcpTxItem. Each item has different flags (check the corresponding documentation) and maintaining the scoreboard is a matter of travelling the list and set the SACK flag on the corresponding segment sent.
An item (that represent a segment in flight) is not considered in flight anymore when it is marked lost or sacked. A sacked item represents an item which is received by the other end, but it is still impossible to delete from the list because other pieces are missing at the other end. A lost item never reached the other end, and retransmission is probably needed. Other properties are retransmitted, that indicates if an item was retransmitted, and the sequence number of the first byte of the packet. When a segment is sent for the first time, only the sequence number is set, and all the remaining properties are set to false. If an item is explicitly sacked by the receiver, we mark it as such. Each time we receive updated sack information from the other end, we perform a check to evaluate the segments that can be lost (
Since this class manages all the output segments and the scoreboard, we can do calculations about the number of bytes in flights. Earlier versions of this class used algorithms copied from RFC 6675. They were inefficient because they required a complete walk into the list of sent segments each time a simple question, such as "Is this sequence lost?" or "How many bytes are in flight?". Therefore, the class has been updated keeping in consideration the RFCs (including RFC 4898) and the Linux operating system. As a reference, we kept the older methods for calculating the bytes in flight and if a segment is lost, renaming them as "RFC" version of the methods. To have a look how the calculations are made, please see BytesInFlight method.
After the sender receives a new SACK block, it updates the amount of segment that it considers as lost, following the specifications made in RFC 6675 (for more detail please see the method UpdateLostCount). In case of SACKless connection, the TcpSocketImplementation should provide hints through the MarkHeadAsLost and AddRenoSack methods.
Definition at line 112 of file tcp-tx-buffer.h.
|
private |
container for data stored in the buffer
Definition at line 403 of file tcp-tx-buffer.h.
ns3::TcpTxBuffer::TcpTxBuffer | ( | uint32_t | n = 0 | ) |
Constructor.
n | initial Sequence number to be transmitted |
Definition at line 49 of file tcp-tx-buffer.cc.
References m_rWndCallback, and ns3::MakeNullCallback().
|
override |
Definition at line 58 of file tcp-tx-buffer.cc.
References ns3::Packet::GetSize(), m_appList, ns3::TcpTxItem::m_packet, m_sentList, m_sentSize, and m_size.
Append a data packet to the end of the buffer.
p | The packet to be appended to the Tx buffer |
Definition at line 171 of file tcp-tx-buffer.cc.
References Available(), m_appList, m_firstByteSeq, m_size, NS_LOG_FUNCTION, and NS_LOG_LOGIC.
Referenced by TcpTxBufferTestCase::TestMergeItemsWhenGetTransmittedSegment(), and TcpRateLinuxWithBufferTest::TestWithSackBlocks().
void ns3::TcpTxBuffer::AddRenoSack | ( | ) |
Emulate SACKs for SACKless connection: account for a new dupack.
The method walk the list of the sent segment until it finds a segment that was not accounted in the sackedOut count. The head will never be included. To reset the information added with this function (e.g., after an RTO) please use ResetRenoSack.
The method DiscardUpTo, when invoked, will make sure to properly clean any flag on the discarded item. As example, if the implementation discard an item that is marked as sacked, the sackedOut count is decreased accordingly.
Definition at line 1370 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), m_highestSack, m_renoSack, m_sackedOut, m_sackEnabled, m_sackSeen, m_sentList, NS_ASSERT, NS_LOG_FUNCTION, and NS_LOG_INFO.
Referenced by DiscardUpTo().
uint32_t ns3::TcpTxBuffer::Available | ( | ) | const |
Returns the available capacity of this buffer.
Definition at line 118 of file tcp-tx-buffer.cc.
References m_maxBuffer, and m_size.
Referenced by Add().
uint32_t ns3::TcpTxBuffer::BytesInFlight | ( | ) | const |
Return total bytes in flight.
Counting packets in flight is pretty simple:
sentsize is SND.NXT-SND.UNA, retrans is the number of retransmitted segments. leftOut is the number of segment that left the network without being ACKed:
To see how we define the lost packets, look at the method UpdateLostCount.
Definition at line 1057 of file tcp-tx-buffer.cc.
References m_lostOut, m_retrans, m_sackedOut, m_sentSize, NS_ASSERT_MSG, and NS_LOG_INFO.
Referenced by TcpRateLinuxWithBufferTest::TestWithSackBlocks().
|
private |
Calculate the number of bytes in flight per RFC 6675.
Definition at line 1078 of file tcp-tx-buffer.cc.
References ns3::Packet::GetSize(), IsLostRFC(), m_firstByteSeq, m_lostOut, ns3::TcpTxItem::m_packet, m_retrans, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, m_sackedOut, m_sentList, m_sentSize, and NS_ASSERT_MSG.
|
private |
Check if the values of sacked, lost, retrans, are in sync with the sent list.
Definition at line 1413 of file tcp-tx-buffer.cc.
References m_lostOut, m_retrans, m_sackedOut, m_sentList, and NS_ASSERT_MSG.
Referenced by AddRenoSack(), CopyFromSequence(), DeleteRetransmittedFlagFromHead(), DiscardUpTo(), MarkHeadAsLost(), ResetLastSegmentSent(), SetSentListLost(), Update(), and UpdateLostCount().
TcpTxItem * ns3::TcpTxBuffer::CopyFromSequence | ( | uint32_t | numBytes, |
const SequenceNumber32 & | seq ) |
Copy data from the range [seq, seq+numBytes) into a packet.
In the following, we refer to the block [seq, seq+numBytes) simply as "block". We check the boundary of the block, and divide the possibilities in three cases:
The last case is when the block is partially transmitted and partially not transmitted. We trick this case by requesting the portion not transmitted from GetNewSegment, and then calling GetTransmittedSegment with the full block range.
numBytes | number of bytes to copy |
seq | start sequence number to extract |
Definition at line 212 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), CopyFromSequence(), ns3::TracedValue< T >::Get(), GetNewSegment(), GetTransmittedSegment(), ns3::SequenceNumber< NUMERIC_TYPE, SIGNED_TYPE >::GetValue(), m_firstByteSeq, ns3::TcpTxItem::m_lastSent, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, m_sentSize, ns3::TcpTxItem::m_startSeq, ns3::Simulator::Now(), NS_ABORT_MSG_IF, NS_ABORT_MSG_UNLESS, NS_ASSERT, NS_ASSERT_MSG, NS_LOG_DEBUG, NS_LOG_FUNCTION, and SizeFromSequence().
Referenced by CopyFromSequence(), DiscardUpTo(), TcpTxBufferTestCase::TestMergeItemsWhenGetTransmittedSegment(), and TcpRateLinuxWithBufferTest::TestWithSackBlocks().
void ns3::TcpTxBuffer::DeleteRetransmittedFlagFromHead | ( | ) |
DeleteRetransmittedFlagFromHead.
Definition at line 1323 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), m_retrans, m_sentList, m_sentSize, and NS_LOG_FUNCTION.
void ns3::TcpTxBuffer::DiscardUpTo | ( | const SequenceNumber32 & | seq, |
const Callback< void, TcpTxItem * > & | beforeDelCb = m_nullCb ) |
Discard data up to but not including this sequence number.
seq | The first sequence number to maintain after discarding all the previous sequences. |
beforeDelCb | Callback invoked, if it is not null, before the deletion of an Item (because it was, probably, ACKed) |
Definition at line 656 of file tcp-tx-buffer.cc.
References AddRenoSack(), ConsistencyCheck(), CopyFromSequence(), ns3::Packet::CreateFragment(), ns3::TracedValue< T >::Get(), ns3::TcpTxItem::GetPacketCopy(), ns3::Packet::GetSize(), ns3::Callback< R, UArgs >::IsNull(), m_firstByteSeq, m_highestSack, ns3::TcpTxItem::m_lost, m_lostOut, ns3::TcpTxItem::m_packet, m_retrans, ns3::TcpTxItem::m_sacked, m_sackedOut, m_sackSeen, m_sentList, m_sentSize, m_size, ns3::TcpTxItem::m_startSeq, MarkHeadAsLost(), NS_ASSERT, NS_ASSERT_MSG, NS_LOG_DEBUG, NS_LOG_FUNCTION, NS_LOG_INFO, NS_LOG_LOGIC, pktSize, and RemoveFromCounts().
Referenced by TcpRateLinuxWithBufferTest::TestWithSackBlocks().
|
private |
Find the highest SACK byte.
Definition at line 348 of file tcp-tx-buffer.cc.
References ns3::Packet::GetSize(), m_firstByteSeq, ns3::TcpTxItem::m_packet, ns3::TcpTxItem::m_sacked, m_sentList, and NS_LOG_FUNCTION.
uint32_t ns3::TcpTxBuffer::GetLost | ( | ) | const |
Get the number of segments that we believe are lost in the network.
It is calculated in UpdateLostCount.
Definition at line 142 of file tcp-tx-buffer.cc.
References m_lostOut.
Get a block of data not transmitted yet and move it into SentList.
If the block is not yet transmitted, hopefully, seq is exactly the sequence number of the first byte of the first packet inside AppList. We extract the block from AppList and move it into the SentList, before returning the block itself. We manage possible fragmentation (or merges) inside AppList through GetPacketFromList.
numBytes | number of bytes to copy |
Definition at line 271 of file tcp-tx-buffer.cc.
References GetPacketFromList(), ns3::Packet::GetSize(), m_appList, m_firstByteSeq, ns3::TcpTxItem::m_packet, m_sentList, m_sentSize, ns3::TcpTxItem::m_startSeq, NS_ASSERT, NS_LOG_FUNCTION, and NS_LOG_INFO.
Referenced by CopyFromSequence().
|
private |
Get a block (which is returned as Packet) from a list.
This function extract a block [requestedSeq,numBytes) from the list, which starts at startingSeq.
The cases we need to manage are two, and they are depicted in the following image:
|------| |----| |----| list = | | --> | | --> | | |------| |----| |----| ^ ^ | ^ ^ | (1) seq | | seq + numBytes | | | | seq seq + numBytes (2)
The case 1 is easy to manage: the requested block is exactly a packet already stored. If one value (seq or seq + numBytes) does not align to a packet boundary, or when both values does not align (case 2), it is a bit more complex.
Basically, we have two possible operations:
and we reduce case (2) to case (1) through sequentially applying fragment or merge. For instance:
|------| | | |------| ^ ^ ^ ^ | | | | start | | | | | end seq | seq + numBytes
To reduce to case (1), we need to perform two fragment operations:
After these operations, the requested block is exactly the resulting packet. Merge operation is required when the requested block span over two (or more) existing packets.
While this could be extremely slow in the worst possible scenario (one big packet which is split in small packets for transmission, and merged for re-transmission) that scenario is unlikely during a TCP transmission (since MSS can change, but it is stable, and retransmissions do not happen for each segment).
list | List to extract block from |
startingSeq | Starting sequence of the list |
numBytes | Bytes to extract, starting from requestedSeq |
requestedSeq | Requested sequence |
listEdited | output parameter which indicates if the list has been edited |
Definition at line 390 of file tcp-tx-buffer.cc.
References GetPacketFromList(), ns3::GetSize(), m_firstByteSeq, ns3::TcpTxItem::m_packet, m_sentList, ns3::TcpTxItem::m_startSeq, MergeItems(), NS_ASSERT, NS_ASSERT_MSG, NS_FATAL_ERROR, NS_LOG_FUNCTION, NS_LOG_INFO, NS_LOG_WARN, and SplitItems().
Referenced by GetNewSegment(), GetPacketFromList(), and GetTransmittedSegment().
uint32_t ns3::TcpTxBuffer::GetRetransmitsCount | ( | ) | const |
Return the number of segments in the sent list that have been transmitted more than once, without acknowledgment.
This method is to support the retransmits count for determining PipeSize in NewReno-style TCP.
Definition at line 136 of file tcp-tx-buffer.cc.
References m_retrans.
uint32_t ns3::TcpTxBuffer::GetSacked | ( | ) | const |
Get the number of segments that have been explicitly sacked by the receiver.
Definition at line 148 of file tcp-tx-buffer.cc.
References m_sackedOut.
|
private |
Get a block of data previously transmitted.
This is clearly a retransmission, and if everything is going well, the block requested is matching perfectly with another one requested in the past. If not, fragmentation or merge are required. We manage both inside GetPacketFromList.
numBytes | number of bytes to copy |
seq | sequence requested |
Definition at line 295 of file tcp-tx-buffer.cc.
References GetPacketFromList(), ns3::Packet::GetSize(), m_firstByteSeq, ns3::TcpTxItem::m_packet, m_retrans, ns3::TcpTxItem::m_retrans, m_sentList, m_sentSize, NS_ASSERT, and NS_LOG_FUNCTION.
Referenced by CopyFromSequence().
|
static |
Get the type ID.
Definition at line 29 of file tcp-tx-buffer.cc.
References m_firstByteSeq, ns3::MakeTraceSourceAccessor(), and ns3::TypeId::SetParent().
SequenceNumber32 ns3::TcpTxBuffer::HeadSequence | ( | ) | const |
Get the sequence number of the buffer head.
Definition at line 76 of file tcp-tx-buffer.cc.
References m_firstByteSeq.
bool ns3::TcpTxBuffer::IsHeadRetransmitted | ( | ) | const |
Check if the head is retransmitted.
Definition at line 1310 of file tcp-tx-buffer.cc.
References m_sentList, m_sentSize, and NS_LOG_FUNCTION.
bool ns3::TcpTxBuffer::IsLost | ( | const SequenceNumber32 & | seq | ) | const |
Check if a segment is lost.
It does a check on the flags to determine if the segment has to be considered as lost for an external class
seq | sequence to check |
Definition at line 917 of file tcp-tx-buffer.cc.
References m_highestSack, m_sentList, NS_LOG_FUNCTION, and NS_LOG_INFO.
|
private |
Decide if a segment is lost based on RFC 6675 algorithm.
seq | Sequence |
segment | Iterator to the sequence |
Definition at line 1139 of file tcp-tx-buffer.cc.
References m_dupAckThresh, m_highestSack, ns3::TcpTxItem::m_lost, ns3::TcpTxItem::m_packet, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, m_segmentSize, m_sentList, NS_LOG_FUNCTION, and NS_LOG_INFO.
Referenced by BytesInFlightRFC().
bool ns3::TcpTxBuffer::IsRetransmittedDataAcked | ( | const SequenceNumber32 & | ack | ) | const |
Checks whether the ack corresponds to retransmitted data.
ack | ACK number received |
Definition at line 640 of file tcp-tx-buffer.cc.
References ns3::TcpTxItem::m_packet, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, m_sentList, ns3::TcpTxItem::m_startSeq, and NS_LOG_FUNCTION.
bool ns3::TcpTxBuffer::IsSackEnabled | ( | ) | const |
check whether SACK is used on the corresponding TCP socket
Definition at line 106 of file tcp-tx-buffer.cc.
References m_sackEnabled.
void ns3::TcpTxBuffer::MarkHeadAsLost | ( | ) |
Mark the head of the sent list as lost.
Definition at line 1341 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), m_lostOut, m_retrans, m_sackedOut, and m_sentList.
Referenced by DiscardUpTo(), and TcpTxBufferTestCase::TestMergeItemsWhenGetTransmittedSegment().
uint32_t ns3::TcpTxBuffer::MaxBufferSize | ( | ) | const |
Get the maximum buffer size.
Definition at line 94 of file tcp-tx-buffer.cc.
References m_maxBuffer.
Merge two TcpTxItem.
Merge t2 in t1. It consists in copying the lastSent field if t2 is more recent than t1. Retransmitted field is copied only if it set in t2 but not in t1. Sacked is copied only if it is true in both items.
t1 | first item |
t2 | second item |
Definition at line 577 of file tcp-tx-buffer.cc.
References ns3::Packet::AddAtEnd(), ns3::Packet::GetSize(), ns3::TcpTxItem::m_lastSent, ns3::TcpTxItem::m_lost, ns3::TcpTxItem::m_packet, m_retrans, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, NS_ASSERT, NS_ASSERT_MSG, NS_LOG_FUNCTION, and NS_LOG_INFO.
Referenced by GetPacketFromList().
bool ns3::TcpTxBuffer::NextSeg | ( | SequenceNumber32 * | seq, |
SequenceNumber32 * | seqHigh, | ||
bool | isRecovery ) const |
Get the next sequence number to transmit, according to RFC 6675.
seq | Next sequence number to transmit, based on the scoreboard information |
seqHigh | Maximum sequence number to transmit, based on SMSS and/or receiver window |
isRecovery | true if the socket congestion state is in recovery mode |
Definition at line 951 of file tcp-tx-buffer.cc.
References ns3::Packet::GetSize(), ns3::SequenceNumber< NUMERIC_TYPE, SIGNED_TYPE >::GetValue(), m_firstByteSeq, m_highestSack, ns3::TcpTxItem::m_lost, ns3::TcpTxItem::m_packet, ns3::TcpTxItem::m_retrans, m_rWndCallback, ns3::TcpTxItem::m_sacked, m_sackSeen, m_segmentSize, m_sentList, m_sentSize, ns3::TcpTxItem::m_startSeq, NS_LOG_FUNCTION, NS_LOG_INFO, and SizeFromSequence().
Remove the size specified from the lostOut, retrans, sacked count.
Used only in DiscardUpTo
item | Item that will be discarded |
size | size to remove (can be different from pktSize because of fragmentation) |
Definition at line 618 of file tcp-tx-buffer.cc.
References ns3::TcpTxItem::m_lost, m_lostOut, m_retrans, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, m_sackedOut, NS_ASSERT, NS_ASSERT_MSG, and NS_LOG_FUNCTION.
Referenced by DiscardUpTo().
void ns3::TcpTxBuffer::ResetLastSegmentSent | ( | ) |
Take the last segment sent and put it back into the un-sent list (at the beginning)
Definition at line 1243 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), ns3::Packet::GetSize(), m_appList, ns3::TcpTxItem::m_packet, m_retrans, ns3::TcpTxItem::m_retrans, m_sentList, m_sentSize, and NS_LOG_FUNCTION.
void ns3::TcpTxBuffer::ResetRenoSack | ( | ) |
Reset the SACKs.
Reset the Scoreboard from all SACK information. This method also works in case the SACKs are set by the Update method.
Definition at line 1198 of file tcp-tx-buffer.cc.
References m_highestSack, m_sackedOut, m_sackSeen, m_sentList, and NS_LOG_FUNCTION.
void ns3::TcpTxBuffer::ResetSentList | ( | ) |
Reset the sent list.
Definition at line 1220 of file tcp-tx-buffer.cc.
References m_appList, m_highestSack, ns3::TcpTxItem::m_lost, m_lostOut, m_retrans, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, m_sackedOut, m_sackSeen, m_sentList, m_sentSize, and NS_LOG_FUNCTION.
void ns3::TcpTxBuffer::SetDupAckThresh | ( | uint32_t | dupAckThresh | ) |
Set the DupAckThresh.
dupAckThresh | the threshold |
Definition at line 124 of file tcp-tx-buffer.cc.
References m_dupAckThresh.
Referenced by TcpRateLinuxWithBufferTest::TestWithSackBlocks().
void ns3::TcpTxBuffer::SetHeadSequence | ( | const SequenceNumber32 & | seq | ) |
Set the head sequence of the buffer.
Set the head (m_firstByteSeq) to seq. Supposed to be called only when the connection is just set up and we did not send any data out yet.
seq | The sequence number of the head byte |
Definition at line 154 of file tcp-tx-buffer.cc.
References m_firstByteSeq, m_highestSack, m_sackSeen, m_sentList, NS_ASSERT, and NS_LOG_FUNCTION.
Referenced by TcpTxBufferTestCase::TestMergeItemsWhenGetTransmittedSegment(), and TcpRateLinuxWithBufferTest::TestWithSackBlocks().
void ns3::TcpTxBuffer::SetMaxBufferSize | ( | uint32_t | n | ) |
Set the maximum buffer size.
n | Tx window size (in bytes) |
Definition at line 100 of file tcp-tx-buffer.cc.
References m_maxBuffer.
Set callback to obtain receiver window value.
rWndCallback | receiver window callback |
Definition at line 1213 of file tcp-tx-buffer.cc.
References m_rWndCallback, and NS_LOG_FUNCTION.
void ns3::TcpTxBuffer::SetSackEnabled | ( | bool | enabled | ) |
tell tx-buffer whether SACK is used on this TCP socket
enabled | whether sack is used |
Definition at line 112 of file tcp-tx-buffer.cc.
References m_sackEnabled.
void ns3::TcpTxBuffer::SetSegmentSize | ( | uint32_t | segmentSize | ) |
Set the segment size.
segmentSize | the segment size |
Definition at line 130 of file tcp-tx-buffer.cc.
References m_segmentSize, and segmentSize.
Referenced by TcpTxBufferTestCase::TestMergeItemsWhenGetTransmittedSegment(), and TcpRateLinuxWithBufferTest::TestWithSackBlocks().
void ns3::TcpTxBuffer::SetSentListLost | ( | bool | resetSack = false | ) |
Set the entire sent list as lost (typically after an RTO)
Used to set all the sent list as lost, so the bytes in flight is not counting them as in flight, but we will continue to use SACK information for recovering the timeout.
Moreover, reset the retransmit flag for every item.
resetSack | True if the function should reset the SACK flags. |
Definition at line 1262 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), m_highestSack, m_lostOut, m_retrans, m_sackedOut, m_sackSeen, m_sentList, m_sentSize, NS_ASSERT_MSG, NS_LOG_FUNCTION, and NS_LOG_INFO.
uint32_t ns3::TcpTxBuffer::Size | ( | ) | const |
Returns total number of bytes in this buffer.
Definition at line 88 of file tcp-tx-buffer.cc.
References m_size.
uint32_t ns3::TcpTxBuffer::SizeFromSequence | ( | const SequenceNumber32 & | seq | ) | const |
Returns the number of bytes from the buffer in the range [seq, tailSequence)
seq | initial sequence number |
Definition at line 195 of file tcp-tx-buffer.cc.
References NS_LOG_ERROR, NS_LOG_FUNCTION, and TailSequence().
Referenced by CopyFromSequence(), and NextSeg().
Split one TcpTxItem.
Move "size" bytes from t2 into t1, copying all the fields. Adjust the starting sequence of each item.
t1 | first item |
t2 | second item |
size | Size to split |
Definition at line 370 of file tcp-tx-buffer.cc.
References ns3::Packet::CreateFragment(), ns3::TcpTxItem::m_lastSent, ns3::TcpTxItem::m_lost, ns3::TcpTxItem::m_packet, ns3::TcpTxItem::m_retrans, ns3::TcpTxItem::m_sacked, ns3::TcpTxItem::m_startSeq, NS_ASSERT, NS_LOG_FUNCTION, NS_LOG_INFO, and ns3::Packet::RemoveAtStart().
Referenced by GetPacketFromList().
SequenceNumber32 ns3::TcpTxBuffer::TailSequence | ( | ) | const |
Get the sequence number of the buffer tail (plus one)
Definition at line 82 of file tcp-tx-buffer.cc.
References m_firstByteSeq, and m_size.
Referenced by SizeFromSequence().
uint32_t ns3::TcpTxBuffer::Update | ( | const TcpOptionSack::SackList & | list, |
const Callback< void, TcpTxItem * > & | sackedCb = m_nullCb ) |
Update the scoreboard.
list | list of SACKed blocks |
sackedCb | Callback invoked, if it is not null, when a segment has been SACKed by the receiver. |
Definition at line 773 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), ns3::Callback< R, UArgs >::IsNull(), m_firstByteSeq, m_highestSack, m_lostOut, m_sackedOut, m_sackSeen, m_sentList, m_sentSize, NS_ASSERT, NS_ASSERT_MSG, NS_LOG_FUNCTION, NS_LOG_INFO, pktSize, and UpdateLostCount().
Referenced by TcpRateLinuxWithBufferTest::TestWithSackBlocks().
|
private |
Update the lost count.
Reset lost to 0, then walk the sent list looking for lost segments. We have two possible algorithms for detecting lost packets:
The {New}Reno cases, for now, are managed in TcpSocketBase through the call to MarkHeadAsLost. This function is, therefore, called after a SACK option has been received, and updates the lost count. It can be probably optimized by not walking the entire list, but a subset.
Definition at line 868 of file tcp-tx-buffer.cc.
References ConsistencyCheck(), ns3::Packet::GetSize(), m_dupAckThresh, m_highestSack, ns3::TcpTxItem::m_lost, m_lostOut, ns3::TcpTxItem::m_packet, ns3::TcpTxItem::m_sacked, m_sentList, NS_LOG_FUNCTION, and NS_LOG_INFO.
Referenced by Update().
|
friend |
Output operator.
os | The output stream. |
tcpTxBuf | the TcpTxBuffer to print. |
Definition at line 1456 of file tcp-tx-buffer.cc.
|
private |
Buffer for application data.
Definition at line 594 of file tcp-tx-buffer.h.
Referenced by ~TcpTxBuffer(), Add(), GetNewSegment(), ResetLastSegmentSent(), and ResetSentList().
|
private |
Duplicate Ack threshold from TcpSocketBase.
Definition at line 609 of file tcp-tx-buffer.h.
Referenced by IsLostRFC(), SetDupAckThresh(), and UpdateLostCount().
|
private |
Sequence number of the first byte in data (SND.UNA)
Definition at line 602 of file tcp-tx-buffer.h.
Referenced by Add(), BytesInFlightRFC(), CopyFromSequence(), DiscardUpTo(), FindHighestSacked(), GetNewSegment(), GetPacketFromList(), GetTransmittedSegment(), GetTypeId(), HeadSequence(), NextSeg(), SetHeadSequence(), TailSequence(), and Update().
|
private |
Highest SACK byte.
Definition at line 603 of file tcp-tx-buffer.h.
Referenced by AddRenoSack(), DiscardUpTo(), IsLost(), IsLostRFC(), NextSeg(), ResetRenoSack(), ResetSentList(), SetHeadSequence(), SetSentListLost(), Update(), and UpdateLostCount().
|
private |
Number of lost bytes.
Definition at line 605 of file tcp-tx-buffer.h.
Referenced by BytesInFlight(), BytesInFlightRFC(), ConsistencyCheck(), DiscardUpTo(), GetLost(), MarkHeadAsLost(), RemoveFromCounts(), ResetSentList(), SetSentListLost(), Update(), and UpdateLostCount().
|
private |
Max number of data bytes in buffer (SND.WND)
Definition at line 596 of file tcp-tx-buffer.h.
Referenced by Available(), MaxBufferSize(), and SetMaxBufferSize().
|
staticprivate |
Null callback for an item.
Definition at line 615 of file tcp-tx-buffer.h.
|
private |
Indicates if AddRenoSack was called.
Definition at line 611 of file tcp-tx-buffer.h.
Referenced by AddRenoSack().
|
private |
Number of retransmitted bytes.
Definition at line 607 of file tcp-tx-buffer.h.
Referenced by BytesInFlight(), BytesInFlightRFC(), ConsistencyCheck(), DeleteRetransmittedFlagFromHead(), DiscardUpTo(), GetRetransmitsCount(), GetTransmittedSegment(), MarkHeadAsLost(), MergeItems(), RemoveFromCounts(), ResetLastSegmentSent(), ResetSentList(), and SetSentListLost().
Callback to obtain RCV.WND value.
Definition at line 599 of file tcp-tx-buffer.h.
Referenced by TcpTxBuffer(), NextSeg(), and SetRWndCallback().
|
private |
Number of sacked bytes.
Definition at line 606 of file tcp-tx-buffer.h.
Referenced by AddRenoSack(), BytesInFlight(), BytesInFlightRFC(), ConsistencyCheck(), DiscardUpTo(), GetSacked(), MarkHeadAsLost(), RemoveFromCounts(), ResetRenoSack(), ResetSentList(), SetSentListLost(), and Update().
|
private |
Indicates if SACK is enabled on this connection.
Definition at line 612 of file tcp-tx-buffer.h.
Referenced by AddRenoSack(), IsSackEnabled(), and SetSackEnabled().
|
private |
Indicates if a SACK was received.
Definition at line 613 of file tcp-tx-buffer.h.
Referenced by AddRenoSack(), DiscardUpTo(), NextSeg(), ResetRenoSack(), ResetSentList(), SetHeadSequence(), SetSentListLost(), and Update().
|
private |
Segment size from TcpSocketBase.
Definition at line 610 of file tcp-tx-buffer.h.
Referenced by IsLostRFC(), NextSeg(), and SetSegmentSize().
|
private |
Buffer for sent (but not acked) data.
Definition at line 595 of file tcp-tx-buffer.h.
Referenced by ~TcpTxBuffer(), AddRenoSack(), BytesInFlightRFC(), ConsistencyCheck(), DeleteRetransmittedFlagFromHead(), DiscardUpTo(), FindHighestSacked(), GetNewSegment(), GetPacketFromList(), GetTransmittedSegment(), IsHeadRetransmitted(), IsLost(), IsLostRFC(), IsRetransmittedDataAcked(), MarkHeadAsLost(), NextSeg(), ResetLastSegmentSent(), ResetRenoSack(), ResetSentList(), SetHeadSequence(), SetSentListLost(), Update(), and UpdateLostCount().
|
private |
Size of sent (and not discarded) segments.
Definition at line 598 of file tcp-tx-buffer.h.
Referenced by ~TcpTxBuffer(), BytesInFlight(), BytesInFlightRFC(), CopyFromSequence(), DeleteRetransmittedFlagFromHead(), DiscardUpTo(), GetNewSegment(), GetTransmittedSegment(), IsHeadRetransmitted(), NextSeg(), ResetLastSegmentSent(), ResetSentList(), SetSentListLost(), and Update().
|
private |
Size of all data in this buffer.
Definition at line 597 of file tcp-tx-buffer.h.
Referenced by ~TcpTxBuffer(), Add(), Available(), DiscardUpTo(), Size(), and TailSequence().