22 #ifndef TCP_TX_BUFFER_H
23 #define TCP_TX_BUFFER_H
25 #include "ns3/object.h"
26 #include "ns3/traced-value.h"
27 #include "ns3/sequence-number.h"
28 #include "ns3/nstime.h"
29 #include "ns3/tcp-option-sack.h"
30 #include "ns3/packet.h"
49 void Print (std::ostream &os)
const;
187 uint32_t
Size (
void)
const;
563 bool *listEdited =
nullptr)
const;
599 std::pair <TcpTxBuffer::PacketList::const_iterator, SequenceNumber32>
627 std::ostream &
operator<< (std::ostream & os, TcpTxBuffer
const & tcpTxBuf);
635 std::ostream &
operator<< (std::ostream & os, TcpTxItem
const & item);
Simulation virtual time values and global simulation resolution.
void AddRenoSack()
Emulate SACKs for SACKless connection: account for a new dupack.
bool m_retrans
Indicates if the segment is retransmitted.
uint32_t Size(void) const
Returns total number of bytes in this buffer.
uint32_t m_retrans
Number of retransmitted bytes.
TcpTxItem * GetTransmittedSegment(uint32_t numBytes, const SequenceNumber32 &seq)
Get a block of data previously transmitted.
void DiscardUpTo(const SequenceNumber32 &seq)
Discard data up to but not including this sequence number.
static Time Min()
Minimum representable Time.
bool NextSeg(SequenceNumber32 *seq, bool isRecovery) const
Get the next sequence number to transmit, according to RFC 6675.
uint32_t SizeFromSequence(const SequenceNumber32 &seq) const
Returns the number of bytes from the buffer in the range [seq, tailSequence)
void ResetLastSegmentSent()
Take the last segment sent and put it back into the un-sent list (at the beginning) ...
SequenceNumber32 HeadSequence(void) const
Get the sequence number of the buffer head.
void ConsistencyCheck() const
Check if the values of sacked, lost, retrans, are in sync with the sent list.
PacketList m_appList
Buffer for application data.
uint32_t m_lostOut
Number of lost bytes.
std::list< SackBlock > SackList
SACK list definition.
uint32_t MaxBufferSize(void) const
Get the maximum buffer size.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
void SplitItems(TcpTxItem *t1, TcpTxItem *t2, uint32_t size) const
Split one TcpTxItem.
void DeleteRetransmittedFlagFromHead()
DeleteRetransmittedFlagFromHead.
void RemoveFromCounts(TcpTxItem *item, uint32_t size)
Remove the size specified from the lostOut, retrans, sacked count.
void MergeItems(TcpTxItem *t1, TcpTxItem *t2) const
Merge two TcpTxItem.
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.
void UpdateLostCount()
Update the lost count.
uint32_t GetSeqSize(void) const
Get the size in the sequence number space.
Item that encloses the application packet and some flags for it.
uint32_t GetRetransmitsCount(void) const
Return the number of segments in the sent list that have been transmitted more than once...
TracedValue< SequenceNumber32 > m_firstByteSeq
Sequence number of the first byte in data (SND.UNA)
Time m_lastSent
Timestamp of the time at which the segment has been sent last time.
SequenceNumber32 m_startSeq
Sequence number of the item (if transmitted)
uint32_t m_sentSize
Size of sent (and not discarded) segments.
bool IsLost(const SequenceNumber32 &seq) const
Check if a segment is lost.
bool IsLostRFC(const SequenceNumber32 &seq, const PacketList::const_iterator &segment) const
Decide if a segment is lost based on RFC 6675 algorithm.
std::list< TcpTxItem * > PacketList
container for data stored in the buffer
uint32_t m_size
Size of all data in this buffer.
void SetMaxBufferSize(uint32_t n)
Set the maximum buffer size.
void SetSentListLost(bool resetSack=false)
Set the entire sent list as lost (typically after an RTO)
std::pair< PacketList::const_iterator, SequenceNumber32 > m_highestSack
Highest SACK byte.
uint32_t Available(void) const
Returns the available capacity of this buffer.
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
void ResetSentList()
Reset the sent list.
Ptr< Packet > m_packet
Application packet (can be null)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool Add(Ptr< Packet > p)
Append a data packet to the end of the buffer.
uint32_t m_sackedOut
Number of sacked bytes.
static TypeId GetTypeId(void)
Get the type ID.
void ResetRenoSack()
Reset the SACKs.
void SetDupAckThresh(uint32_t dupAckThresh)
Set the DupAckThresh.
void MarkHeadAsLost()
Mark the head of the sent list as lost.
bool Update(const TcpOptionSack::SackList &list)
Update the scoreboard.
void SetSegmentSize(uint32_t segmentSize)
Set the segment size.
bool IsHeadRetransmitted() const
Check if the head is retransmitted.
uint32_t m_dupAckThresh
Duplicate Ack threshold from TcpSocketBase.
uint32_t GetLost(void) const
Get the number of segments that we believe are lost in the network.
friend std::ostream & operator<<(std::ostream &os, TcpTxBuffer const &tcpTxBuf)
Output operator.
PacketList m_sentList
Buffer for sent (but not acked) data.
uint32_t BytesInFlightRFC() const
Calculate the number of bytes in flight per RFC 6675.
uint32_t m_maxBuffer
Max number of data bytes in buffer (SND.WND)
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.
uint32_t m_segmentSize
Segment size from TcpSocketBase.
A base class which provides memory management and object aggregation.
uint32_t BytesInFlight() const
Return total bytes in flight.
TcpTxBuffer(uint32_t n=0)
Constructor.
virtual ~TcpTxBuffer(void)
void Print(std::ostream &os) const
Print the time.
bool m_renoSack
Indicates if AddRenoSack was called.
bool m_sacked
Indicates if the segment has been SACKed.
a unique identifier for an interface.
uint32_t GetSacked(void) const
Get the number of segments that have been explicitly sacked by the receiver.
bool m_lost
Indicates if the segment has been lost (RTO)
SequenceNumber32 TailSequence(void) const
Get the sequence number of the buffer tail (plus one)
void SetHeadSequence(const SequenceNumber32 &seq)
Set the head sequence of the buffer.
Ptr< Packet > CopyFromSequence(uint32_t numBytes, const SequenceNumber32 &seq)
Copy data from the range [seq, seq+numBytes) into a packet.