#include <DumbTCP_old.h>
Public Member Functions | |
DumbTCP () | |
virtual | ~DumbTCP () |
virtual void | initialize () |
virtual void | established (bool active) |
virtual void | connectionClosed () |
virtual void | processTimer (cMessage *timer, TCPEventCode &event) |
virtual void | sendCommandInvoked () |
virtual void | receivedOutOfOrderSegment () |
virtual void | receiveSeqChanged () |
virtual void | receivedDataAck (uint32 firstSeqAcked) |
virtual void | receivedDuplicateAck () |
virtual void | receivedAckForDataNotYetSent (uint32 seq) |
virtual void | ackSent () |
virtual void | dataSent (uint32 fromseq) |
virtual void | restartRexmitTimer () |
Protected Member Functions | |
virtual TCPStateVariables * | createStateVariables () |
Protected Attributes | |
DumbTCPStateVariables *& | state |
cMessage * | rexmitTimer |
A very-very basic TCPAlgorithm implementation, with hardcoded retransmission timeout and no other sophistication. It can be used to demonstrate what happened if there was no adaptive timeout calculation, delayed acks, silly window avoidance, congestion control, etc.
Definition at line 43 of file DumbTCP_old.h.
DumbTCP::DumbTCP | ( | ) |
Ctor
Definition at line 29 of file old/flavours/DumbTCP.cc.
: TCPAlgorithm(), state((DumbTCPStateVariables *&)TCPAlgorithm::state) { rexmitTimer = NULL; }
DumbTCP::~DumbTCP | ( | ) | [virtual] |
Definition at line 35 of file old/flavours/DumbTCP.cc.
{ // cancel and delete timers if (rexmitTimer) delete conn->getTcpMain()->cancelEvent(rexmitTimer); }
void DumbTCP::ackSent | ( | ) | [virtual] |
Called after we sent an ACK. This hook can be used to cancel the delayed-ACK timer.
Implements tcp_old::TCPAlgorithm.
Definition at line 113 of file old/flavours/DumbTCP.cc.
{ }
void DumbTCP::connectionClosed | ( | ) | [virtual] |
Called when the connection closes, it should cancel all running timers.
Implements tcp_old::TCPAlgorithm.
Definition at line 61 of file old/flavours/DumbTCP.cc.
{ conn->getTcpMain()->cancelEvent(rexmitTimer); }
virtual TCPStateVariables* tcp_old::DumbTCP::createStateVariables | ( | ) | [inline, protected, virtual] |
Creates and returns a DumbTCPStateVariables object.
Implements tcp_old::TCPAlgorithm.
Definition at line 52 of file DumbTCP_old.h.
{ return new DumbTCPStateVariables(); }
void DumbTCP::dataSent | ( | uint32 | fromseq | ) | [virtual] |
Called after we sent data. This hook can be used to schedule the retransmission timer, to start round-trip time measurement, etc. The argument is the seqno of the first byte sent.
Implements tcp_old::TCPAlgorithm.
Definition at line 117 of file old/flavours/DumbTCP.cc.
{ if (rexmitTimer->isScheduled()) conn->getTcpMain()->cancelEvent(rexmitTimer); conn->scheduleTimeout(rexmitTimer, REXMIT_TIMEOUT); }
void DumbTCP::established | ( | bool | active | ) | [virtual] |
Called when the connection is going to ESTABLISHED from SYN_SENT or SYN_RCVD. This is a place to initialize some variables (e.g. set cwnd to the MSS learned during connection setup). If we are on the active side, here we also have to finish the 3-way connection setup procedure by sending an ACK, possibly piggybacked on data.
Implements tcp_old::TCPAlgorithm.
Definition at line 50 of file old/flavours/DumbTCP.cc.
void DumbTCP::initialize | ( | ) | [virtual] |
Should be redefined to initialize the object: create timers, etc. This method is necessary because the TCPConnection ptr is not available in the constructor yet.
Reimplemented from tcp_old::TCPAlgorithm.
Definition at line 42 of file old/flavours/DumbTCP.cc.
{ TCPAlgorithm::initialize(); rexmitTimer = new cMessage("REXMIT"); rexmitTimer->setContextPointer(conn); }
void DumbTCP::processTimer | ( | cMessage * | timer, | |
TCPEventCode & | event | |||
) | [virtual] |
Place to process timers specific to this TCPAlgorithm class. TCPConnection will invoke this method on any timer (self-message) it doesn't recognize (that is, any timer other than the 2MSL, CONN-ESTAB and FIN-WAIT-2 timers).
Method may also change the event code (by default set to TCP_E_IGNORE) to cause the state transition of TCP FSM.
Implements tcp_old::TCPAlgorithm.
Definition at line 66 of file old/flavours/DumbTCP.cc.
{ if (timer!=rexmitTimer) throw cRuntimeError(timer, "unrecognized timer"); conn->retransmitData(); conn->scheduleTimeout(rexmitTimer, REXMIT_TIMEOUT); }
void DumbTCP::receivedAckForDataNotYetSent | ( | uint32 | seq | ) | [virtual] |
Called after we received an ACK for data not yet sent. According to RFC 793 this function should send an ACK.
Implements tcp_old::TCPAlgorithm.
Definition at line 107 of file old/flavours/DumbTCP.cc.
void DumbTCP::receivedDataAck | ( | uint32 | firstSeqAcked | ) | [virtual] |
Called after we received an ACK which acked some data (that is, we could advance snd_una). At this point the state variables (snd_una, snd_wnd) have already been updated. The argument firstSeqAcked is the previous snd_una value, that is, the number of bytes acked is (snd_una-firstSeqAcked). The dupack counter still reflects the old value (needed for Reno and NewReno); it'll be reset to 0 after this call returns.
Implements tcp_old::TCPAlgorithm.
Definition at line 95 of file old/flavours/DumbTCP.cc.
void DumbTCP::receivedDuplicateAck | ( | ) | [virtual] |
Called after we received a duplicate ACK (that is: ackNo==snd_una, no data in segment, segment doesn't carry window update, and also, we have unacked data). The dupack counter got already updated when calling this method (i.e. dupack==1 on first duplicate ACK.)
Implements tcp_old::TCPAlgorithm.
Definition at line 102 of file old/flavours/DumbTCP.cc.
void DumbTCP::receivedOutOfOrderSegment | ( | ) | [virtual] |
Called after receiving data which are in the window, but not at its left edge (seq!=rcv_nxt). This indicates that either segments got re-ordered in the way, or one segment was lost. RFC1122 and RFC2001 recommend sending an immediate ACK here (Fast Retransmit relies on that).
Implements tcp_old::TCPAlgorithm.
Definition at line 81 of file old/flavours/DumbTCP.cc.
void DumbTCP::receiveSeqChanged | ( | ) | [virtual] |
Called after rcv_nxt got advanced, either because we received in-sequence data ("text" in RFC 793 lingo) or a FIN. At this point, rcv_nxt has already been updated. This method should take care to send or schedule an ACK some time.
Implements tcp_old::TCPAlgorithm.
Definition at line 87 of file old/flavours/DumbTCP.cc.
void DumbTCP::restartRexmitTimer | ( | ) | [virtual] |
Restart REXMIT timer.
Implements tcp_old::TCPAlgorithm.
Definition at line 124 of file old/flavours/DumbTCP.cc.
{
// NO retransmit timer in dumb TCP
}
void DumbTCP::sendCommandInvoked | ( | ) | [virtual] |
Called after user sent TCP_C_SEND command to us.
Implements tcp_old::TCPAlgorithm.
Definition at line 75 of file old/flavours/DumbTCP.cc.
cMessage* tcp_old::DumbTCP::rexmitTimer [protected] |
Definition at line 48 of file DumbTCP_old.h.
Referenced by connectionClosed(), dataSent(), DumbTCP(), initialize(), processTimer(), and ~DumbTCP().
DumbTCPStateVariables*& tcp_old::DumbTCP::state [protected] |
Reimplemented from tcp_old::TCPAlgorithm.
Definition at line 46 of file DumbTCP_old.h.
Referenced by receivedDuplicateAck(), and receiveSeqChanged().