• Main Page
  • Classes
  • Files
  • File List

/Users/yzchen/ns/ns-allinone-2.33/ns-2.33/tcp/tcp-abs.h

00001 /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
00002 
00003 /*
00004  * Copyright (C) 1999 by the University of Southern California
00005  * $Id: tcp-abs.h,v 1.2 2005/08/25 18:58:12 johnh Exp $
00006  *
00007  * This program is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU General Public License,
00009  * version 2, as published by the Free Software Foundation.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License along
00017  * with this program; if not, write to the Free Software Foundation, Inc.,
00018  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00019  *
00020  *
00021  * The copyright of this module includes the following
00022  * linking-with-specific-other-licenses addition:
00023  *
00024  * In addition, as a special exception, the copyright holders of
00025  * this module give you permission to combine (via static or
00026  * dynamic linking) this module with free software programs or
00027  * libraries that are released under the GNU LGPL and with code
00028  * included in the standard release of ns-2 under the Apache 2.0
00029  * license or under otherwise-compatible licenses with advertising
00030  * requirements (or modified versions of such code, with unchanged
00031  * license).  You may copy and distribute such a system following the
00032  * terms of the GNU GPL for this module and the licenses of the
00033  * other code concerned, provided that you include the source code of
00034  * that other code when and as the GNU GPL requires distribution of
00035  * source code.
00036  *
00037  * Note that people who make modified versions of this module
00038  * are not obligated to grant this special exception for their
00039  * modified versions; it is their choice whether to do so.  The GNU
00040  * General Public License gives permission to release a modified
00041  * version without this exception; this exception also makes it
00042  * possible to release a modified version which carries forward this
00043  * exception.
00044  *
00045  */
00046 
00047 /* 
00048  * Contributed by Polly Huang (USC/ISI), http://www-scf.usc.edu/~bhuang
00049  * @(#) $Header: /cvsroot/nsnam/ns-2/tcp/tcp-abs.h,v 1.2 2005/08/25 18:58:12 johnh Exp $ (LBL)";
00050  */
00051 
00052 #include "agent.h"
00053 #include "fsm.h"
00054 
00055 class AbsTcpAgent;
00056 
00057 class AbsTcpTimer : public TimerHandler {
00058 public: 
00059         AbsTcpTimer(AbsTcpAgent *a) : TimerHandler() { a_ = a; }
00060 protected:
00061         AbsTcpAgent *a_;
00062         void expire(Event *e);
00063 };
00064 
00065 class AbsTcpAgent : public Agent {
00066 public:
00067         AbsTcpAgent();
00068         void timeout();
00069         void sendmsg(int pktcnt);
00070         void advanceby(int pktcnt);
00071         void start();
00072         void send_batch();
00073         void drop(int seqno);
00074         void finish();
00075         void recv(Packet* pkt, Handler*);
00076         void output(int seqno);
00077         inline int& flowid() { return fid_; }
00078         int command(int argc, const char*const* argv);
00079 protected:
00080         double rtt_;
00081         FSMState* current_;
00082         int offset_;
00083         int seqno_lb_;                // seqno when finishing last batch
00084         int connection_size_;
00085         AbsTcpTimer timer_;
00086         int rescheduled_;
00087         void cancel_timer() {
00088                 timer_.force_cancel();
00089         }
00090         void set_timer(double time) {
00091                 timer_.resched(time);
00092         }
00093 
00094 };
00095 
00096 
00097 class AbsTcpTahoeAckAgent : public AbsTcpAgent {
00098 public:
00099         AbsTcpTahoeAckAgent();
00100 };
00101 
00102 class AbsTcpRenoAckAgent : public AbsTcpAgent {
00103 public:
00104         AbsTcpRenoAckAgent();
00105 };
00106 
00107 class AbsTcpTahoeDelAckAgent : public AbsTcpAgent {
00108 public:
00109         AbsTcpTahoeDelAckAgent();
00110 };
00111 
00112 class AbsTcpRenoDelAckAgent : public AbsTcpAgent {
00113 public:
00114         AbsTcpRenoDelAckAgent();
00115 };
00116 
00117 //AbsTcpSink
00118 class AbsTcpSink : public Agent {
00119 public:
00120         AbsTcpSink();
00121         void recv(Packet* pkt, Handler*);
00122 protected:
00123 };
00124 
00125 
00126 class AbsDelAckSink;
00127 
00128 class AbsDelayTimer : public TimerHandler {
00129 public:
00130         AbsDelayTimer(AbsDelAckSink *a) : TimerHandler() { a_ = a; }
00131 protected:
00132         void expire(Event *e);
00133         AbsDelAckSink *a_;
00134 };
00135 
00136 class AbsDelAckSink : public AbsTcpSink {
00137 public:
00138         AbsDelAckSink();
00139         void recv(Packet* pkt, Handler*);
00140         void timeout();
00141 protected:
00142         Packet* save_;          /* place to stash packet while delaying */
00143         double interval_;
00144         AbsDelayTimer delay_timer_;
00145 };
00146 
00147 // Dropper Class
00148 class Dropper {
00149 public:
00150         AbsTcpAgent* agent_;
00151         Dropper* next_;
00152 };
00153 
00154 class DropTargetAgent : public Connector {
00155 public:
00156         DropTargetAgent();
00157         void recv(Packet* pkt, Handler*);
00158         void insert_tcp(AbsTcpAgent* tcp);
00159         static DropTargetAgent& instance() {
00160                 return (*instance_);           // general access to TahoeAckFSM
00161         }
00162 protected:
00163         Dropper* dropper_list_;
00164         static DropTargetAgent* instance_;
00165 };

Generated on Tue Aug 10 2010 16:16:08 for ns-2.33 by  doxygen 1.7.1