tcp-abs.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (C) 1999 by the University of Southern California
  4.  * $Id: tcp-abs.h,v 1.2 2005/08/25 18:58:12 johnh Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as 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 along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. /* 
  46.  * Contributed by Polly Huang (USC/ISI), http://www-scf.usc.edu/~bhuang
  47.  * @(#) $Header: /cvsroot/nsnam/ns-2/tcp/tcp-abs.h,v 1.2 2005/08/25 18:58:12 johnh Exp $ (LBL)";
  48.  */
  49. #include "agent.h"
  50. #include "fsm.h"
  51. class AbsTcpAgent;
  52. class AbsTcpTimer : public TimerHandler {
  53. public: 
  54.         AbsTcpTimer(AbsTcpAgent *a) : TimerHandler() { a_ = a; }
  55. protected:
  56.         AbsTcpAgent *a_;
  57.         void expire(Event *e);
  58. };
  59. class AbsTcpAgent : public Agent {
  60. public:
  61.         AbsTcpAgent();
  62.         void timeout();
  63.         void sendmsg(int pktcnt);
  64.         void advanceby(int pktcnt);
  65. void start();
  66. void send_batch();
  67. void drop(int seqno);
  68. void finish();
  69. void recv(Packet* pkt, Handler*);
  70. void output(int seqno);
  71. inline int& flowid() { return fid_; }
  72.         int command(int argc, const char*const* argv);
  73. protected:
  74. double rtt_;
  75. FSMState* current_;
  76. int offset_;
  77. int seqno_lb_;                // seqno when finishing last batch
  78. int connection_size_;
  79.         AbsTcpTimer timer_;
  80. int rescheduled_;
  81.         void cancel_timer() {
  82.                 timer_.force_cancel();
  83.         }
  84.         void set_timer(double time) {
  85.    timer_.resched(time);
  86. }
  87. };
  88. class AbsTcpTahoeAckAgent : public AbsTcpAgent {
  89. public:
  90.         AbsTcpTahoeAckAgent();
  91. };
  92. class AbsTcpRenoAckAgent : public AbsTcpAgent {
  93. public:
  94.         AbsTcpRenoAckAgent();
  95. };
  96. class AbsTcpTahoeDelAckAgent : public AbsTcpAgent {
  97. public:
  98.         AbsTcpTahoeDelAckAgent();
  99. };
  100. class AbsTcpRenoDelAckAgent : public AbsTcpAgent {
  101. public:
  102.         AbsTcpRenoDelAckAgent();
  103. };
  104. //AbsTcpSink
  105. class AbsTcpSink : public Agent {
  106. public:
  107.         AbsTcpSink();
  108.         void recv(Packet* pkt, Handler*);
  109. protected:
  110. };
  111. class AbsDelAckSink;
  112. class AbsDelayTimer : public TimerHandler {
  113. public:
  114.         AbsDelayTimer(AbsDelAckSink *a) : TimerHandler() { a_ = a; }
  115. protected:
  116.         void expire(Event *e);
  117.         AbsDelAckSink *a_;
  118. };
  119. class AbsDelAckSink : public AbsTcpSink {
  120. public:
  121.         AbsDelAckSink();
  122.         void recv(Packet* pkt, Handler*);
  123.         void timeout();
  124. protected:
  125.         Packet* save_;          /* place to stash packet while delaying */
  126.         double interval_;
  127.         AbsDelayTimer delay_timer_;
  128. };
  129. // Dropper Class
  130. class Dropper {
  131. public:
  132. AbsTcpAgent* agent_;
  133.         Dropper* next_;
  134. };
  135. class DropTargetAgent : public Connector {
  136. public:
  137.         DropTargetAgent();
  138.         void recv(Packet* pkt, Handler*);
  139.         void insert_tcp(AbsTcpAgent* tcp);
  140. static DropTargetAgent& instance() {
  141. return (*instance_);        // general access to TahoeAckFSM
  142. }
  143. protected:
  144. Dropper* dropper_list_;
  145. static DropTargetAgent* instance_;
  146. };