00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef ns_queue_monitor_h
00038 #define ns_queue_monitor_h
00039
00040 #include "config.h"
00041 #include "integrator.h"
00042 #include "connector.h"
00043 #include "packet.h"
00044 #include "flags.h"
00045
00046 class QueueMonitor : public TclObject {
00047 public:
00048 QueueMonitor() : bytesInt_(NULL), pktsInt_(NULL), delaySamp_(NULL),
00049 size_(0), pkts_(0),
00050 parrivals_(0), barrivals_(0),
00051 pdepartures_(0), bdepartures_(0),
00052 pdrops_(0), pmarks_(0), bdrops_(0),
00053 qs_pkts_(0), qs_bytes_(0), qs_drops_(0),
00054 keepRTTstats_(0), maxRTT_(1), numRTTs_(0), binsPerSec_(10),
00055 keepSeqnoStats_(0), maxSeqno_(1000),
00056 numSeqnos_(0), SeqnoBinSize_(1),
00057 srcId_(0), dstId_(0), channel_(0), channel1_(0),
00058 estimate_rate_(0),
00059 k_(0.1),
00060 estRate_(0.0),
00061 temp_size_(0) {
00062
00063 bind("size_", &size_);
00064 bind("pkts_", &pkts_);
00065 bind("parrivals_", &parrivals_);
00066 bind("barrivals_", &barrivals_);
00067 bind("pdepartures_", &pdepartures_);
00068 bind("bdepartures_", &bdepartures_);
00069 bind("pdrops_", &pdrops_);
00070 bind("pmarks_", &pmarks_);
00071 bind("bdrops_", &bdrops_);
00072
00073 bind("qs_pkts_", &qs_pkts_);
00074 bind("qs_bytes_", &qs_bytes_);
00075 bind("qs_drops_", &qs_drops_);
00076
00077 bind("first_pkt_", &first_pkt_);
00078 bind("last_pkt_", &last_pkt_);
00079
00080
00081 bind_bool("keepRTTstats_", &keepRTTstats_);
00082 bind("maxRTT_", &maxRTT_);
00083 bind("binsPerSec_", &binsPerSec_);
00084
00085
00086 bind_bool("keepSeqnoStats_", &keepSeqnoStats_);
00087 bind("maxSeqno_", &maxSeqno_);
00088 bind("SeqnoBinSize_", &SeqnoBinSize_);
00089
00090
00091 bind_bool("estimate_rate_", &estimate_rate_);
00092 bind("k_", &k_);
00093 bind("prevTime_", &prevTime_);
00094 bind("startTime_", &startTime_);
00095 bind("estRate_", &estRate_);
00096
00097 startTime_ = Scheduler::instance().clock();
00098 prevTime_ = startTime_;
00099 };
00100
00101 int size() const { return (size_); }
00102 int pkts() const { return (pkts_); }
00103 #if defined(HAVE_INT64)
00104 int64_t parrivals() const { return (parrivals_); }
00105 int64_t barrivals() const { return (barrivals_); }
00106 int64_t pdepartures() const { return (pdepartures_); }
00107 int64_t bdepartures() const { return (bdepartures_); }
00108 #else
00109 int parrivals() const { return (parrivals_); }
00110 int barrivals() const { return (barrivals_); }
00111 int pdepartures() const { return (pdepartures_); }
00112 int bdepartures() const { return (bdepartures_); }
00113 #endif
00114 int pdrops() const { return (pdrops_); }
00115 int pmarks() const { return (pmarks_); }
00116 int bdrops() const { return (bdrops_); }
00117
00118 int qs_pkts() const { return (qs_pkts_); }
00119 int qs_bytes() const { return (qs_bytes_); }
00120 int qs_drops() const { return (qs_drops_); }
00121
00122 double first_pkt() const { return (first_pkt_); }
00123
00124 void printRTTs();
00125 void printSeqnos();
00126 void printStats();
00127 virtual void in(Packet*);
00128 virtual void out(Packet*);
00129 virtual void drop(Packet*);
00130 virtual void edrop(Packet*) { abort(); };
00131 virtual int command(int argc, const char*const* argv);
00132 protected:
00133 Integrator *bytesInt_;
00134 Integrator *pktsInt_;
00135 Samples* delaySamp_;
00136 int size_;
00137 int pkts_;
00138
00139 #if defined(HAVE_INT64)
00140 int64_t parrivals_;
00141 int64_t barrivals_;
00142 int64_t pdepartures_;
00143 int64_t bdepartures_;
00144 #else
00145 int parrivals_;
00146 int barrivals_;
00147 int pdepartures_;
00148 int bdepartures_;
00149 #endif
00150 int pdrops_;
00151 int pmarks_;
00152 int bdrops_;
00153
00154 int qs_pkts_;
00155 int qs_bytes_;
00156 int qs_drops_;
00157
00158 double first_pkt_;
00159 double last_pkt_;
00160
00161 int keepRTTstats_;
00162 int maxRTT_;
00163 int numRTTs_;
00164 int binsPerSec_;
00165 int *RTTbins_;
00166
00167 int keepSeqnoStats_;
00168 int maxSeqno_;
00169 int numSeqnos_;
00170 int SeqnoBinSize_;
00171 int *SeqnoBins_;
00172
00173 int srcId_;
00174 int dstId_;
00175 Tcl_Channel channel_;
00176 Tcl_Channel channel1_;
00177
00178
00179
00180
00181
00182 public:
00183 int estimate_rate_;
00184 double k_;
00185 double estRate_;
00186 double prevTime_;
00187 double startTime_;
00188
00189 protected:
00190 int temp_size_;
00191
00192 void estimateRate(Packet *p);
00193 void keepRTTstats(Packet *p);
00194 void keepSeqnoStats(Packet *p);
00195 };
00196
00197 class SnoopQueue : public Connector {
00198 public:
00199 SnoopQueue() : qm_(0) {}
00200 int command(int argc, const char*const* argv) {
00201 if (argc == 3) {
00202 if (strcmp(argv[1], "set-monitor") == 0) {
00203 qm_ = (QueueMonitor*)
00204 TclObject::lookup(argv[2]);
00205 if (qm_ == NULL)
00206 return (TCL_ERROR);
00207 return (TCL_OK);
00208 }
00209 }
00210 return (Connector::command(argc, argv));
00211 }
00212 protected:
00213 QueueMonitor* qm_;
00214 };
00215
00216 class SnoopQueueIn : public SnoopQueue {
00217 public:
00218 void recv(Packet* p, Handler* h) {
00219 qm_->in(p);
00220 send(p, h);
00221 }
00222 };
00223
00224 class SnoopQueueOut : public SnoopQueue {
00225 public:
00226 void recv(Packet* p, Handler* h) {
00227 qm_->out(p);
00228 send(p, h);
00229 }
00230 };
00231
00232 class SnoopQueueDrop : public SnoopQueue {
00233 public:
00234 void recv(Packet* p, Handler* h) {
00235 qm_->drop(p);
00236 send(p, h);
00237 }
00238 };
00239
00240
00241
00242
00243
00244 class SnoopQueueTagger : public SnoopQueue {
00245 public:
00246 void recv(Packet* p, Handler* h) {
00247 qm_->in(p);
00248 send(p, h);
00249 }
00250 };
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 class EDQueueMonitor : public QueueMonitor {
00263 public:
00264 EDQueueMonitor() : ebdrops_(0), epdrops_(0), mon_ebdrops_(0), mon_epdrops_(0) {
00265 bind("ebdrops_", &ebdrops_);
00266 bind("epdrops_", &epdrops_);
00267 bind("mon_ebdrops_", &mon_ebdrops_);
00268 bind("mon_epdrops_", &mon_epdrops_);
00269 }
00270 void edrop(Packet* p) {
00271 hdr_cmn* hdr = hdr_cmn::access(p);
00272 ebdrops_ += hdr->size();
00273 epdrops_++;
00274
00275
00276 QueueMonitor::drop(p);
00277 }
00278
00279 void mon_edrop(Packet *p) {
00280 hdr_cmn* hdr = hdr_cmn::access(p);
00281 mon_ebdrops_ += hdr->size();
00282 mon_epdrops_++;
00283
00284 QueueMonitor::drop(p);
00285 }
00286
00287 int epdrops() const { return (epdrops_); }
00288 int ebdrops() const { return (ebdrops_); }
00289 int mon_epdrops() const { return (mon_epdrops_); }
00290 int mon_ebdrops() const { return (mon_ebdrops_); }
00291 protected:
00292 int ebdrops_;
00293 int epdrops_;
00294 int mon_ebdrops_;
00295 int mon_epdrops_;
00296 };
00297
00298 class SnoopQueueEDrop : public SnoopQueue {
00299 public:
00300 void recv(Packet* p, Handler* h) {
00301 qm_->edrop(p);
00302 send(p, h);
00303 }
00304 };
00305
00306
00307 #ifndef MAXFLOW
00308 #define MAXFLOW 32
00309 #endif
00310
00311
00312
00313
00314
00315
00316 class QueueMonitorCompat : public QueueMonitor {
00317 public:
00318 QueueMonitorCompat();
00319 void in(Packet*);
00320 void out(Packet*);
00321 void drop(Packet*);
00322 int command(int argc, const char*const* argv);
00323 protected:
00324 void flowstats(int flowid);
00325
00326 int pkts_[MAXFLOW];
00327 int bytes_[MAXFLOW];
00328 int drops_[MAXFLOW];
00329 Samples *flowstats_[MAXFLOW];
00330 };
00331
00332 #endif
00333