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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) Xerox Corporation 1997. All rights reserved.
  4.  *  
  5.  * This program is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License as published by the
  7.  * Free Software Foundation; either version 2 of the License, or (at your
  8.  * option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * 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.  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18.  *
  19.  * Linking this file statically or dynamically with other modules is making
  20.  * a combined work based on this file.  Thus, the terms and conditions of
  21.  * the GNU General Public License cover the whole combination.
  22.  *
  23.  * In addition, as a special exception, the copyright holders of this file
  24.  * give you permission to combine this file with free software programs or
  25.  * libraries that are released under the GNU LGPL and with code included in
  26.  * the standard release of ns-2 under the Apache 2.0 license or under
  27.  * otherwise-compatible licenses with advertising requirements (or modified
  28.  * versions of such code, with unchanged license).  You may copy and
  29.  * distribute such a system following the terms of the GNU GPL for this
  30.  * file and the licenses of the other code concerned, provided that you
  31.  * include the source code of that other code when and as the GNU GPL
  32.  * requires distribution of source code.
  33.  *
  34.  * Note that people who make modified versions of this file are not
  35.  * obligated to grant this special exception for their modified versions;
  36.  * it is their choice whether to do so.  The GNU General Public License
  37.  * gives permission to release a modified version without this exception;
  38.  * this exception also makes it possible to release a modified version
  39.  * which carries forward this exception.
  40.  *
  41.  * This file contributed by Suchitra Raman <sraman@parc.xerox.com>, June 1997.
  42.  */
  43. #ifndef srm_topo_h
  44. #define srm_topo_h
  45. #include "scheduler.h"
  46. #include "random.h"
  47. #define tprintf(x) { 
  48. Scheduler &_s = Scheduler::instance(); 
  49. double _now = _s.clock(); 
  50. printf("%f : ", _now); 
  51. printf x;
  52. fflush(stdout);
  53. }              
  54. #define SRM_DATA 0
  55. #define SRM_RREQ 1
  56. #define SRM_PENDING_RREQ 2
  57. #define SRM_SUPPRESS 0
  58. #define SRM_NO_SUPPRESS 1
  59. #define SRM_NOIF -1
  60. /* 
  61.  * Events -- passed on from node to node 
  62.  */
  63. class SRM_Event : public Event {
  64.  public:
  65. SRM_Event(int s=0, int t=0, int i=0) : seqno_(s), iif_(i), type_(t) {}
  66. SRM_Event(SRM_Event *e);
  67. int seqno() { return seqno_; }
  68. int iif() { return iif_; }
  69. int type() { return type_; }
  70. void type(int t) { type_ = t; }
  71. void iif(int i) { iif_ = i; }
  72.  protected:
  73. int seqno_;
  74. int iif_;
  75. int type_;
  76. };
  77. /* 
  78.  * SRM_Request - Stored version of request to cancel when a similar
  79.  * request is heard. Right now, a request only has an ID.
  80.  * A real implementation would have a sequence range, if ADUs
  81.  * were stacked.
  82.  */
  83. class SRM_Request {
  84.  public:
  85. SRM_Request(SRM_Event *e) : event_(e), next_(0) {};
  86. ~SRM_Request();
  87. void cancel_timer();
  88. SRM_Event *event_;
  89. SRM_Request *next_;
  90. };
  91. /* 
  92.  * Light-weight node abstraction only to store SRM 
  93.  * protocol state information.
  94.  */
  95. class SrmNode : public Handler {
  96.  public:
  97. SrmNode() : id_(0), expected_(0), pending_(0) {}
  98. void id(int i) { id_ = i; }
  99. void handle(Event *);
  100. void send(SRM_Event *);
  101. void append(SRM_Event *);
  102. void remove(int , int);
  103.  protected:
  104. void sched_nack(int);
  105. void dump_packet(SRM_Event *e);
  106. int id_;
  107. int expected_;
  108. SRM_Request *pending_;
  109. };
  110. /*
  111.  * Interface -- Contains the node id of a node and 
  112.  * a pointer to the next Interface 
  113.  */
  114. class Interface {
  115.  public: 
  116. Interface(int in) : in_(in), next_(0) { }
  117. int in_;
  118. Interface *next_;
  119. };
  120. class Interface_List {
  121.  public: 
  122. Interface_List() : head_(0) { }
  123. ~Interface_List();
  124. void append(int in);
  125. Interface* head_;
  126. };
  127. /* 
  128.  * Topology -- Line, Tree, Star derived from this base class.
  129.  */
  130. class Topology *topology; 
  131. class Topology : public TclObject {
  132.  public:
  133. Topology(int nn, int src);
  134. ~Topology();
  135. virtual void flood(int, int) = 0;
  136. virtual Interface_List *oif(int node, int iif) = 0;
  137. int command(int argc, const char*const* argv);
  138. inline int idx() { return idx_; }
  139. SrmNode *node(int nn);
  140. virtual double backoff(int dst) = 0;
  141. inline double delay() { return delay_;}
  142. inline double D() { return D_;}
  143. virtual double delay(int src, int dst) = 0;
  144. int rtt_estimated() { return rtt_est_; }
  145.  protected:
  146. SrmNode *node_; 
  147. int idx_;
  148. int src_;
  149. double delay_;
  150. double D_;
  151. double frac_;
  152. double det_;
  153. double rand_;
  154. int rtt_est_;
  155. };
  156. /* 
  157.  * Line -- Chain with 'nn' nodes 
  158.  */
  159. class Line : public Topology {
  160.  public: 
  161. Line(int n, int src) : Topology(n, src) { 
  162. topology = this; 
  163. bind("c_", &c_);
  164. bind("alpha_", &alpha_);
  165. bind("beta_", &beta_);
  166. bind("c2func_", &c2func_);
  167. }
  168. void flood(int, int);
  169. Interface_List *oif(int node, int iif);
  170. double backoff(int dst);
  171. double delay(int src, int dst); 
  172.  protected:
  173. int src_;
  174. int c_;
  175. double alpha_;
  176. double beta_;
  177. int c2func_;
  178. };
  179. #define LOG  0
  180. #define SQRT 1
  181. #define LINEAR 2
  182. #define CONSTANT 3
  183. /* 
  184.  * BTree -- Binary Tree with 'nn' nodes 
  185.  */
  186. class BTree : public Topology {
  187.  public: 
  188. BTree(int n, int src) : Topology(n, src) { 
  189. topology = this; 
  190. bind("c_", &c_);
  191. bind("alpha_", &alpha_);
  192. bind("beta_", &beta_);
  193. bind("c2func_", &c2func_);
  194. }
  195. void flood(int, int);
  196. Interface_List *oif(int node, int iif);
  197. double backoff(int dst);
  198. double delay(int src, int dst); 
  199.  protected:
  200. int src_;
  201. int c_;
  202. double alpha_;
  203. double beta_;
  204. int c2func_;
  205. };
  206. /* 
  207.  * Star -- Complete graph with (nn-1) receivers and 1 sender 
  208.  * at a distance 'Delay_' from each receiver. 
  209.  */
  210. class Star : public Topology {
  211.  public:
  212. Star(int n, int src) : Topology(n, src) { 
  213. topology = this; 
  214. bind("c_", &c_);
  215. bind("alpha_", &alpha_);
  216. bind("beta_", &beta_);
  217. }
  218. void flood(int, int);
  219. Interface_List *oif(int node, int iif);
  220. double backoff(int dst);
  221. inline int c() { return c_; }
  222. double delay(int src, int dst); 
  223.  protected:
  224. int src_;
  225. int c_;
  226. double alpha_;
  227. double beta_;
  228. };
  229. #endif