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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- 
  2.  *
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  *      This product includes software developed by the MASH Research
  17.  *      Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  * 
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * @(#) $Header: /cvsroot/nsnam/ns-2/tools/queue-monitor.h,v 1.26 2005/07/13 03:51:33 tomh Exp $ (UCB)
  35.  */
  36. #ifndef ns_queue_monitor_h
  37. #define ns_queue_monitor_h
  38. #include "config.h"  // for int64_t
  39. #include "integrator.h"
  40. #include "connector.h"
  41. #include "packet.h"
  42. #include "flags.h"
  43. class QueueMonitor : public TclObject {
  44. public: 
  45. QueueMonitor() : bytesInt_(NULL), pktsInt_(NULL), delaySamp_(NULL),
  46. size_(0), pkts_(0),
  47. parrivals_(0), barrivals_(0),
  48. pdepartures_(0), bdepartures_(0),
  49. pdrops_(0), pmarks_(0), bdrops_(0), 
  50.  qs_pkts_(0), qs_bytes_(0), qs_drops_(0),
  51. keepRTTstats_(0), maxRTT_(1), numRTTs_(0), binsPerSec_(10),
  52. keepSeqnoStats_(0), maxSeqno_(1000), 
  53. numSeqnos_(0), SeqnoBinSize_(1),
  54. srcId_(0), dstId_(0), channel_(0), channel1_(0),
  55. estimate_rate_(0), 
  56. k_(0.1), 
  57. estRate_(0.0),
  58. temp_size_(0) {
  59. bind("size_", &size_);
  60. bind("pkts_", &pkts_);
  61. bind("parrivals_", &parrivals_);
  62. bind("barrivals_", &barrivals_);
  63. bind("pdepartures_", &pdepartures_);
  64. bind("bdepartures_", &bdepartures_);
  65. bind("pdrops_", &pdrops_);
  66. bind("pmarks_", &pmarks_);
  67. bind("bdrops_", &bdrops_);
  68. bind("qs_pkts_", &qs_pkts_);
  69. bind("qs_bytes_", &qs_bytes_);
  70. bind("qs_drops_", &qs_drops_);
  71. bind("first_pkt_", &first_pkt_);
  72. bind("last_pkt_", &last_pkt_);
  73. //for keeping RTT statistics
  74.                 bind_bool("keepRTTstats_", &keepRTTstats_);
  75. bind("maxRTT_", &maxRTT_);
  76. bind("binsPerSec_", &binsPerSec_);
  77. //for keeping sequence number statistics
  78.                 bind_bool("keepSeqnoStats_", &keepSeqnoStats_);
  79. bind("maxSeqno_", &maxSeqno_);
  80. bind("SeqnoBinSize_", &SeqnoBinSize_);
  81. //variable binding for flow rate estimation
  82. bind_bool("estimate_rate_", &estimate_rate_);
  83. bind("k_", &k_);
  84. bind("prevTime_", &prevTime_);
  85. bind("startTime_", &startTime_);
  86.   bind("estRate_", &estRate_);
  87. startTime_ = Scheduler::instance().clock();
  88. prevTime_  = startTime_;
  89. };
  90. int size() const { return (size_); }
  91. int pkts() const { return (pkts_); }
  92. #if defined(HAVE_INT64)
  93. int64_t parrivals() const { return (parrivals_); }
  94. int64_t barrivals() const { return (barrivals_); }
  95. int64_t pdepartures() const { return (pdepartures_); }
  96. int64_t bdepartures() const { return (bdepartures_); }
  97. #else /* no 64-bit integer */
  98. int parrivals() const { return (parrivals_); }
  99. int barrivals() const { return (barrivals_); }
  100. int pdepartures() const { return (pdepartures_); }
  101. int bdepartures() const { return (bdepartures_); }
  102. #endif
  103. int pdrops() const { return (pdrops_); }
  104. int pmarks() const { return (pmarks_); }
  105. int bdrops() const { return (bdrops_); }
  106. int qs_pkts() const { return (qs_pkts_); }
  107. int qs_bytes() const { return (qs_bytes_); }
  108. int qs_drops() const { return (qs_drops_); }
  109. double first_pkt() const { return (first_pkt_); }
  110. void printRTTs();
  111. void printSeqnos();
  112. void printStats();
  113. virtual void in(Packet*);
  114. virtual void out(Packet*);
  115. virtual void drop(Packet*);
  116. virtual void edrop(Packet*) { abort(); }; // not here
  117. virtual int command(int argc, const char*const* argv);
  118. protected:
  119. Integrator *bytesInt_; // q-size integrator (bytes)
  120. Integrator *pktsInt_; // q-size integrator (pkts)
  121. Samples* delaySamp_; // stat samples of q delay
  122. int size_; // current queue size (bytes)
  123. int pkts_; // current queue size (packets)
  124. // aggregate counters bytes/packets
  125. #if defined(HAVE_INT64)
  126. int64_t parrivals_;
  127. int64_t barrivals_;
  128. int64_t pdepartures_;
  129. int64_t bdepartures_;
  130. #else /* no 64-bit integer */
  131. int parrivals_;
  132. int barrivals_;
  133. int pdepartures_;
  134. int bdepartures_;
  135. #endif
  136. int pdrops_;
  137. int pmarks_;
  138. int bdrops_;
  139. int qs_pkts_; /* Number of Quick-Start packets */
  140. int qs_bytes_; /* Number of Quick-Start bytes */
  141. int qs_drops_; /* Number of dropped QS packets */
  142. double first_pkt_; /* Time of first packet arrival */
  143. double last_pkt_; /* Time of last packet arrival */
  144.         int keepRTTstats_; /* boolean - keeping RTT stats? */
  145. int maxRTT_; /* Max RTT to measure, in seconds */
  146. int numRTTs_; /* number of RTT measurements */
  147. int binsPerSec_; /* number of bins per second */
  148. int *RTTbins_; /* Number of RTTs in each bin */
  149.         int keepSeqnoStats_; /* boolean - keeping Seqno stats? */
  150. int maxSeqno_; /* Max Seqno to measure */
  151. int numSeqnos_; /* number of Seqno measurements */
  152. int SeqnoBinSize_; /* number of Seqnos per bin */
  153. int *SeqnoBins_; /* Number of Seqnos in each bin */
  154. int srcId_;
  155. int dstId_;
  156. Tcl_Channel channel_;
  157. Tcl_Channel channel1_;
  158. // the estimation of incoming rate using an exponential averaging algorithm due to Stoica
  159. // hence a lot of this stuff is inspired by csfq.cc(Stoica)
  160. // put in here so that it can be used to estimate the arrival rate for both whole queues as 
  161. // well as flows (Flow inherits from EDQueueMonitor);
  162. public:
  163. int estimate_rate_;           /* boolean - whether rate estimation is on or not */
  164. double k_;                    /* averaging interval for rate estimation in seconds*/
  165. double estRate_;              /* current flow's estimated rate in bps */
  166. double prevTime_;             /* time of last packet arrival */
  167. double startTime_;            /* time when the flow started */
  168. protected:
  169. int temp_size_;               /* keep track of packets that arrive at the same time */
  170. void estimateRate(Packet *p);
  171. void keepRTTstats(Packet *p);
  172. void keepSeqnoStats(Packet *p);
  173. };
  174. class SnoopQueue : public Connector {
  175. public: 
  176. SnoopQueue() : qm_(0) {}
  177. int command(int argc, const char*const* argv) {
  178. if (argc == 3) { 
  179. if (strcmp(argv[1], "set-monitor") == 0) {
  180. qm_ = (QueueMonitor*)
  181. TclObject::lookup(argv[2]);
  182. if (qm_ == NULL)
  183. return (TCL_ERROR);
  184. return (TCL_OK);
  185. }
  186. }
  187. return (Connector::command(argc, argv));
  188. }
  189.  protected:
  190. QueueMonitor* qm_;
  191. };
  192. class SnoopQueueIn : public SnoopQueue {
  193. public:
  194. void recv(Packet* p, Handler* h) {
  195. qm_->in(p);
  196. send(p, h);
  197. }
  198. };
  199. class SnoopQueueOut : public SnoopQueue {
  200. public:
  201. void recv(Packet* p, Handler* h) {
  202. qm_->out(p);
  203. send(p, h);
  204. }
  205. };
  206. class SnoopQueueDrop : public SnoopQueue {
  207. public:
  208. void recv(Packet* p, Handler* h) {
  209. qm_->drop(p);
  210. send(p, h);
  211. }
  212. };
  213. /* Tagger, Like a normal FlowMonitor, use SnoopQueueTagger
  214.  * to start it.
  215.  * By Yun Wang 
  216.  */
  217. class SnoopQueueTagger : public SnoopQueue {
  218. public:
  219.         void recv(Packet* p, Handler* h) {
  220.                 qm_->in(p);
  221.                 send(p, h);
  222.         }
  223. };
  224. /*
  225.  * "early drop" QueueMonitor.  Like a normal QueueMonitor,
  226.  * but also supports the notion of "early" drops
  227.  */
  228. /* 
  229.  * The mon* things added to make it work with redpd. 
  230.  * I tried more "elegant" ways -- but mulitple inheritance sucks !!.
  231.  * -ratul
  232.  */
  233. class EDQueueMonitor : public QueueMonitor {
  234. public:
  235. EDQueueMonitor() : ebdrops_(0), epdrops_(0), mon_ebdrops_(0), mon_epdrops_(0) {
  236. bind("ebdrops_", &ebdrops_);
  237. bind("epdrops_", &epdrops_);
  238. bind("mon_ebdrops_", &mon_ebdrops_);
  239. bind("mon_epdrops_", &mon_epdrops_);
  240. }
  241. void edrop(Packet* p) {
  242. hdr_cmn* hdr = hdr_cmn::access(p);
  243. ebdrops_ += hdr->size();
  244. epdrops_++;
  245. // remove later - ratul
  246. // printf("My epdrops = %dn",epdrops_);
  247. QueueMonitor::drop(p);
  248. }
  249. void mon_edrop(Packet *p) {
  250. hdr_cmn* hdr = hdr_cmn::access(p);
  251. mon_ebdrops_ += hdr->size();
  252. mon_epdrops_++;
  253. QueueMonitor::drop(p);
  254. }
  255. int epdrops() const { return (epdrops_); }
  256. int ebdrops() const { return (ebdrops_); }
  257. int mon_epdrops() const { return (mon_epdrops_); }
  258. int mon_ebdrops() const { return (mon_ebdrops_); }
  259. protected:
  260. int ebdrops_;
  261. int epdrops_;
  262. int mon_ebdrops_;
  263. int mon_epdrops_;
  264. };
  265. class SnoopQueueEDrop : public SnoopQueue {
  266. public:
  267. void recv(Packet* p, Handler* h) {
  268. qm_->edrop(p);
  269. send(p, h);
  270. }
  271. };
  272. #ifndef MAXFLOW
  273. #define MAXFLOW 32
  274. #endif
  275. /*
  276.  * a 'QueueMonitorCompat', which is used by the compat
  277.  * code to produce the link statistics available in ns-1
  278.  */
  279. class QueueMonitorCompat : public QueueMonitor {
  280. public:
  281. QueueMonitorCompat();
  282. void in(Packet*);
  283. void out(Packet*);
  284. void drop(Packet*);
  285. int command(int argc, const char*const* argv);
  286. protected:
  287. void flowstats(int flowid); /* create a flowstats structure */
  288. int pkts_[MAXFLOW];
  289. int bytes_[MAXFLOW];
  290. int drops_[MAXFLOW];
  291. Samples *flowstats_[MAXFLOW];
  292. };
  293. #endif