Public Member Functions | Protected Member Functions | Protected Attributes

DumbTCP Class Reference

#include <DumbTCP.h>

Inheritance diagram for DumbTCP:
TCPAlgorithm

List of all members.

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 ()
virtual void rttMeasurementCompleteUsingTS (uint32 echoedTS)

Protected Member Functions

virtual TCPStateVariablescreateStateVariables ()

Protected Attributes

DumbTCPStateVariables *& state
cMessage * rexmitTimer

Detailed Description

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 42 of file DumbTCP.h.


Constructor & Destructor Documentation

DumbTCP::DumbTCP (  ) 

Ctor

Definition at line 28 of file flavours/DumbTCP.cc.

DumbTCP::~DumbTCP (  )  [virtual]

Definition at line 34 of file flavours/DumbTCP.cc.

{
    // cancel and delete timers
    if (rexmitTimer)
        delete conn->getTcpMain()->cancelEvent(rexmitTimer);
}


Member Function Documentation

void DumbTCP::ackSent (  )  [virtual]

Called after we sent an ACK. This hook can be used to cancel the delayed-ACK timer.

Implements TCPAlgorithm.

Definition at line 112 of file flavours/DumbTCP.cc.

{
}

void DumbTCP::connectionClosed (  )  [virtual]

Called when the connection closes, it should cancel all running timers.

Implements TCPAlgorithm.

Definition at line 60 of file flavours/DumbTCP.cc.

{
    conn->getTcpMain()->cancelEvent(rexmitTimer);
}

virtual TCPStateVariables* DumbTCP::createStateVariables (  )  [inline, protected, virtual]

Creates and returns a DumbTCPStateVariables object.

Implements TCPAlgorithm.

Definition at line 51 of file DumbTCP.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 TCPAlgorithm.

Definition at line 116 of file 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 TCPAlgorithm.

Definition at line 49 of file flavours/DumbTCP.cc.

{
    if (active)
    {
        // finish connection setup with ACK (possibly piggybacked on data)
        tcpEV << "Completing connection setup by sending ACK (possibly piggybacked on data)\n";
        if (!conn->sendData(false,65535))
            conn->sendAck();
    }
}

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 TCPAlgorithm.

Definition at line 41 of file 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 TCPAlgorithm.

Definition at line 65 of file 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 TCPAlgorithm.

Definition at line 106 of file flavours/DumbTCP.cc.

{
    tcpEV << "ACK acks something not yet sent, sending immediate ACK\n";
    conn->sendAck();
}

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 TCPAlgorithm.

Definition at line 94 of file flavours/DumbTCP.cc.

{
    // ack may have freed up some room in the window, try sending.
    // small segments also OK (Nagle off)
    conn->sendData(false,65535);
}

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 TCPAlgorithm.

Definition at line 101 of file flavours/DumbTCP.cc.

{
    tcpEV << "Duplicate ACK #" << state->dupacks << "\n";
}

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. RFC 1122 and RFC 2001 recommend sending an immediate ACK here (Fast Retransmit relies on that).

Implements TCPAlgorithm.

Definition at line 80 of file flavours/DumbTCP.cc.

{
    tcpEV << "Out-of-order segment, sending immediate ACK\n";
    conn->sendAck();
}

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 TCPAlgorithm.

Definition at line 86 of file flavours/DumbTCP.cc.

{
    // new data received, ACK immediately (more sophisticated algs should
    // wait a little to see if piggybacking is possible)
    tcpEV << "rcv_nxt changed to " << state->rcv_nxt << ", sending immediate ACK\n";
    conn->sendAck();
}

void DumbTCP::restartRexmitTimer (  )  [virtual]

Restart REXMIT timer.

Implements TCPAlgorithm.

Definition at line 123 of file flavours/DumbTCP.cc.

{
}

void DumbTCP::rttMeasurementCompleteUsingTS ( uint32  echoedTS  )  [virtual]

Converting uint32 echoedTS to simtime_t and calling rttMeasurementComplete() to update state vars with new measured RTT value.

Implements TCPAlgorithm.

Definition at line 127 of file flavours/DumbTCP.cc.

{
}

void DumbTCP::sendCommandInvoked (  )  [virtual]

Called after user sent TCP_C_SEND command to us.

Implements TCPAlgorithm.

Definition at line 74 of file flavours/DumbTCP.cc.

{
    // start sending
    conn->sendData(false,65535);
}


Member Data Documentation

cMessage* DumbTCP::rexmitTimer [protected]

Definition at line 47 of file DumbTCP.h.

Referenced by connectionClosed(), dataSent(), DumbTCP(), initialize(), processTimer(), and ~DumbTCP().

Reimplemented from TCPAlgorithm.

Definition at line 45 of file DumbTCP.h.

Referenced by receivedDuplicateAck(), and receiveSeqChanged().


The documentation for this class was generated from the following files: