A Discrete-Event Network Simulator
API
tcp-tx-buffer.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2010-2015 Adrian Sai-wah Tam
4  * Copyright (c) 2016 Natale Patriciello <natale.patriciello@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Original author: Adrian Sai-wah Tam <adrian.sw.tam@gmail.com>
20  */
21 
22 #ifndef TCP_TX_BUFFER_H
23 #define TCP_TX_BUFFER_H
24 
25 #include "ns3/object.h"
26 #include "ns3/traced-value.h"
27 #include "ns3/sequence-number.h"
28 #include "ns3/tcp-option-sack.h"
29 #include "ns3/tcp-tx-item.h"
30 
31 namespace ns3 {
32 class Packet;
33 
122 class TcpTxBuffer : public Object
123 {
124 public:
129  static TypeId GetTypeId (void);
134  TcpTxBuffer (uint32_t n = 0);
135  virtual ~TcpTxBuffer (void);
136 
137  // Accessors
138 
143  SequenceNumber32 HeadSequence (void) const;
144 
149  SequenceNumber32 TailSequence (void) const;
150 
155  uint32_t Size (void) const;
156 
161  uint32_t MaxBufferSize (void) const;
162 
167  void SetMaxBufferSize (uint32_t n);
168 
173  uint32_t Available (void) const;
174 
179  void SetDupAckThresh (uint32_t dupAckThresh);
180 
185  void SetSegmentSize (uint32_t segmentSize);
186 
196  uint32_t GetRetransmitsCount (void) const;
197 
204  uint32_t GetLost (void) const;
205 
210  uint32_t GetSacked (void) const;
211 
218  bool Add (Ptr<Packet> p);
219 
226  uint32_t SizeFromSequence (const SequenceNumber32& seq) const;
227 
248  TcpTxItem* CopyFromSequence (uint32_t numBytes, const SequenceNumber32& seq);
249 
257  void SetHeadSequence (const SequenceNumber32& seq);
258 
267  void DiscardUpTo (const SequenceNumber32& seq,
268  const Callback<void, TcpTxItem *> &beforeDelCb = m_nullCb);
269 
277  uint32_t Update (const TcpOptionSack::SackList &list,
278  const Callback<void, TcpTxItem *> &sackedCb = m_nullCb);
279 
291  bool IsLost (const SequenceNumber32 &seq) const;
292 
301  bool NextSeg (SequenceNumber32 *seq, SequenceNumber32 *seqHigh, bool isRecovery) const;
302 
319  uint32_t BytesInFlight () const;
320 
331  void SetSentListLost (bool resetSack = false);
332 
339  bool IsHeadRetransmitted () const;
340 
345 
350  void ResetSentList ();
351 
356  void ResetLastSegmentSent ();
357 
361  void MarkHeadAsLost ();
362 
375  void AddRenoSack ();
376 
383  void ResetRenoSack ();
384 
389  void SetRWndCallback (Callback<uint32_t> rWndCallback);
390 
391 private:
392  friend std::ostream & operator<< (std::ostream & os, TcpTxBuffer const & tcpTxBuf);
393 
394  typedef std::list<TcpTxItem*> PacketList;
395 
415  void UpdateLostCount ();
416 
425  void RemoveFromCounts (TcpTxItem *item, uint32_t size);
426 
433  bool IsLostRFC (const SequenceNumber32 &seq, const PacketList::const_iterator &segment) const;
434 
439  uint32_t BytesInFlightRFC () const;
440 
455  TcpTxItem* GetNewSegment (uint32_t numBytes);
456 
471  TcpTxItem* GetTransmittedSegment (uint32_t numBytes, const SequenceNumber32 &seq);
472 
544  uint32_t numBytes, const SequenceNumber32 &requestedSeq,
545  bool *listEdited = nullptr) const;
546 
557  void MergeItems (TcpTxItem *t1, TcpTxItem *t2) const;
558 
569  void SplitItems (TcpTxItem *t1, TcpTxItem *t2, uint32_t size) const;
570 
575  void ConsistencyCheck () const;
576 
581  std::pair <TcpTxBuffer::PacketList::const_iterator, SequenceNumber32>
582  FindHighestSacked () const;
583 
586  uint32_t m_maxBuffer;
587  uint32_t m_size;
588  uint32_t m_sentSize;
590 
592  std::pair <PacketList::const_iterator, SequenceNumber32> m_highestSack;
593 
594  uint32_t m_lostOut {0};
595  uint32_t m_sackedOut {0};
596  uint32_t m_retrans {0};
597 
598  uint32_t m_dupAckThresh {0};
599  uint32_t m_segmentSize {0};
600  bool m_renoSack {false};
601 
603 };
604 
611 std::ostream & operator<< (std::ostream & os, TcpTxBuffer const & tcpTxBuf);
612 
619 std::ostream & operator<< (std::ostream & os, TcpTxItem const & item);
620 
621 } // namespace ns3
622 
623 #endif /* TCP_TX_BUFFER_H */
Callback< uint32_t > m_rWndCallback
Callback to obtain RCV.WND value.
void AddRenoSack()
Emulate SACKs for SACKless connection: account for a new dupack.
uint32_t m_retrans
Number of retransmitted bytes.
Callback template class.
Definition: callback.h:1278
TcpTxItem * GetTransmittedSegment(uint32_t numBytes, const SequenceNumber32 &seq)
Get a block of data previously transmitted.
std::pair< TcpTxBuffer::PacketList::const_iterator, SequenceNumber32 > FindHighestSacked() const
Find the highest SACK byte.
void ResetLastSegmentSent()
Take the last segment sent and put it back into the un-sent list (at the beginning) ...
PacketList m_appList
Buffer for application data.
uint32_t m_lostOut
Number of lost bytes.
std::list< SackBlock > SackList
SACK list definition.
uint32_t GetRetransmitsCount(void) const
Return the number of segments in the sent list that have been transmitted more than once...
void DeleteRetransmittedFlagFromHead()
DeleteRetransmittedFlagFromHead.
void RemoveFromCounts(TcpTxItem *item, uint32_t size)
Remove the size specified from the lostOut, retrans, sacked count.
void UpdateLostCount()
Update the lost count.
Item that encloses the application packet and some flags for it.
Definition: tcp-tx-item.h:32
TracedValue< SequenceNumber32 > m_firstByteSeq
Sequence number of the first byte in data (SND.UNA)
uint32_t m_sentSize
Size of sent (and not discarded) segments.
void DiscardUpTo(const SequenceNumber32 &seq, const Callback< void, TcpTxItem *> &beforeDelCb=m_nullCb)
Discard data up to but not including this sequence number.
std::list< TcpTxItem * > PacketList
container for data stored in the buffer
void MergeItems(TcpTxItem *t1, TcpTxItem *t2) const
Merge two TcpTxItem.
uint32_t m_size
Size of all data in this buffer.
TcpTxItem * CopyFromSequence(uint32_t numBytes, const SequenceNumber32 &seq)
Copy data from the range [seq, seq+numBytes) into a packet.
Tcp sender buffer.
void SetRWndCallback(Callback< uint32_t > rWndCallback)
Set callback to obtain receiver window value.
void ConsistencyCheck() const
Check if the values of sacked, lost, retrans, are in sync with the sent list.
void SetMaxBufferSize(uint32_t n)
Set the maximum buffer size.
#define list
uint32_t SizeFromSequence(const SequenceNumber32 &seq) const
Returns the number of bytes from the buffer in the range [seq, tailSequence)
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.
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
Definition: angles.cc:42
void ResetSentList()
Reset the sent list.
uint32_t GetLost(void) const
Get the number of segments that we believe are lost in the network.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
SequenceNumber32 TailSequence(void) const
Get the sequence number of the buffer tail (plus one)
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.
SequenceNumber32 HeadSequence(void) const
Get the sequence number of the buffer head.
void MarkHeadAsLost()
Mark the head of the sent list as lost.
bool IsLostRFC(const SequenceNumber32 &seq, const PacketList::const_iterator &segment) const
Decide if a segment is lost based on RFC 6675 algorithm.
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 SetSegmentSize(uint32_t segmentSize)
Set the segment size.
void SplitItems(TcpTxItem *t1, TcpTxItem *t2, uint32_t size) const
Split one TcpTxItem.
uint32_t Size(void) const
Returns total number of bytes in this buffer.
uint32_t m_dupAckThresh
Duplicate Ack threshold from TcpSocketBase.
bool IsLost(const SequenceNumber32 &seq) const
Check if a segment is lost.
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 Update(const TcpOptionSack::SackList &list, const Callback< void, TcpTxItem *> &sackedCb=m_nullCb)
Update the scoreboard.
uint32_t m_maxBuffer
Max number of data bytes in buffer (SND.WND)
uint32_t Available(void) const
Returns the available capacity of this buffer.
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.
bool NextSeg(SequenceNumber32 *seq, SequenceNumber32 *seqHigh, bool isRecovery) const
Get the next sequence number to transmit, according to RFC 6675.
A base class which provides memory management and object aggregation.
Definition: object.h:87
bool IsHeadRetransmitted() const
Check if the head is retransmitted.
TcpTxBuffer(uint32_t n=0)
Constructor.
virtual ~TcpTxBuffer(void)
bool m_renoSack
Indicates if AddRenoSack was called.
a unique identifier for an interface.
Definition: type-id.h:58
uint32_t MaxBufferSize(void) const
Get the maximum buffer size.
uint32_t GetSacked(void) const
Get the number of segments that have been explicitly sacked by the receiver.
uint32_t BytesInFlight() const
Return total bytes in flight.
static Callback< void, TcpTxItem * > m_nullCb
Null callback for an item.
void SetHeadSequence(const SequenceNumber32 &seq)
Set the head sequence of the buffer.