#include <TCPSendQueue.h>
Inheritance diagram for TCPSendQueue:
There is another particularity about this class: as a retransmission queue, it stores bytes and not segments. TCP is a bytestream oriented protocol (sequence numbers refer to bytes and not to TPDUs as e.g. in ISO TP4), and the protocol doesn't rely on retransmitted segments having the same segment boundaries as the original segments. Some implementations store segments on the retransmission queue, and others store only the data bytes; RFCs explicitly allow both. (See e.g. RFC1122 p90, section 4.2.2.15, "IMPLEMENTATION" note).
To simulate a TCP that retains segment boundaries in retransmissions, the appropriate TCPAlgorithm class should remember where the segment boundaries were at the original transmission, and it should form identical segments when retransmitting. The createSegmentWithBytes() send queue method makes this possible.
This class is polymorphic because depending on where and how you use the TCP model you might have different ideas about "sending data" on a simulated connection.
You might want to:
Different TCPSendQueue subclasses can be written to accomodate different needs.
This class goes hand-in-hand with TCPReceiveQueue.
Public Member Functions | |
TCPSendQueue () | |
virtual | ~TCPSendQueue () |
virtual void | init (uint32 startSeq)=0 |
virtual void | enqueueAppData (cMessage *msg)=0 |
virtual uint32 | bufferEndSeq ()=0 |
ulong | bytesAvailable (uint32 fromSeq) |
virtual TCPSegment * | createSegmentWithBytes (uint32 fromSeq, ulong maxNumBytes)=0 |
virtual void | discardUpTo (uint32 seqNum)=0 |
virtual uint32 TCPSendQueue::bufferEndSeq | ( | ) | [pure virtual] |
Returns the sequence number of the last byte stored in the buffer plus one. (The first byte of the next send operation would get this sequence number.)
Implemented in TCPMsgBasedSendQueue, and TCPVirtualDataSendQueue.
Utility function: returns how many bytes are available in the queue, from (and including) the given sequence number.
00123 { 00124 uint32 bufEndSeq = bufferEndSeq(); 00125 return seqLess(fromSeq, bufEndSeq) ? bufEndSeq-fromSeq : 0; 00126 }
virtual TCPSegment* TCPSendQueue::createSegmentWithBytes | ( | uint32 | fromSeq, | |
ulong | maxNumBytes | |||
) | [pure virtual] |
Called when the TCP wants to send or retransmit data, it constructs a TCP segment which contains the data from the requested sequence number range. The actually returned segment may contain less then maxNumBytes bytes if the subclass wants to reproduce the original segment boundaries when retransmitting.
Implemented in TCPMsgBasedSendQueue, and TCPVirtualDataSendQueue.
virtual void TCPSendQueue::discardUpTo | ( | uint32 | seqNum | ) | [pure virtual] |
Tells the queue that bytes up to (but NOT including) seqNum have been transmitted and ACKed, so they can be removed from the queue.
Implemented in TCPMsgBasedSendQueue, and TCPVirtualDataSendQueue.
virtual void TCPSendQueue::enqueueAppData | ( | cMessage * | msg | ) | [pure virtual] |
Called on SEND app command, it inserts in the queue the data the user wants to send. Implementations of this abstract class will decide what this means: copying actual bytes, just increasing the "last byte queued" variable, or storing cMessage object(s). The msg object should not be referenced after this point (sendQueue may delete it.)
Implemented in TCPMsgBasedSendQueue, and TCPVirtualDataSendQueue.
virtual void TCPSendQueue::init | ( | uint32 | startSeq | ) | [pure virtual] |
Initialize the object. The startSeq parameter tells what sequence number the first byte of app data should get. This is usually ISS+1 because SYN consumes one byte in the sequence number space.
init() may be called more than once; every call flushes the existing contents of the queue.
Implemented in TCPMsgBasedSendQueue, and TCPVirtualDataSendQueue.