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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1990-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 Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    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/flowmon.h,v 1.2 2004/01/18 19:51:20 haldar Exp $ (LBL)
  35.  */
  36. /* File pulled out of flowmon.cc 
  37.  * Hopefully nothing would break as a result
  38.  * -ratul
  39.  */
  40. #ifndef ns_flowmon_h
  41. #define ns_flowmon_h
  42. #include <stdlib.h>
  43. #include "config.h"
  44. #include "queue-monitor.h"
  45. #include "classifier.h"
  46. #include "ip.h"
  47. #include "flags.h"
  48. #include "random.h"
  49. class Flow : public EDQueueMonitor {
  50. public:
  51. Flow() : src_(-1), dst_(-1), fid_(-1), type_(PT_NTYPE) {  
  52. bind("src_", (int *) &src_);
  53. bind("dst_", (int *) &dst_);
  54. bind("flowid_", (int *) &fid_);
  55. }
  56. nsaddr_t src() const { return (src_); }
  57. nsaddr_t dst() const { return (dst_); }
  58. int flowid() const { return (fid_); }
  59. packet_t ptype() const { return (type_); }
  60. void setfields(Packet *p) {
  61. hdr_ip* hdr = hdr_ip::access(p);
  62. hdr_cmn* chdr = hdr_cmn::access(p);
  63. src_ = hdr->saddr();
  64. dst_ = hdr->daddr();
  65. fid_ = hdr->flowid();
  66. type_ = chdr->ptype();
  67. }
  68. virtual void tagging(Packet *) {}
  69. protected:
  70. nsaddr_t src_;
  71. nsaddr_t dst_;
  72. int fid_;
  73. packet_t type_;
  74. };
  75. class TaggerTBFlow : public Flow {
  76. public:
  77. TaggerTBFlow() : target_rate_(0.0), time_last_sent_(0.0),
  78. total_in(0.0), total_out(0.0)
  79. {
  80. bind_bw("target_rate_", &target_rate_);
  81. bind("bucket_depth_", &bucket_depth_);
  82. bind("tbucket_", &tbucket_);
  83. // bind("off_flags_", &off_flags_);
  84. }
  85. void tagging(Packet *p) {
  86.     hdr_cmn* hdr = hdr_cmn::access(p);
  87.             double now = Scheduler::instance().clock();
  88.             double time_elapsed;
  89.             time_elapsed      = now - time_last_sent_;
  90.             tbucket_ += time_elapsed * target_rate_ / 8.0;
  91.             if (tbucket_ > bucket_depth_)
  92.                 tbucket_ = bucket_depth_;         /* never overflow */
  93.            if ((double)hdr->size_ < tbucket_ ) {
  94.     // ((hdr_flags*)p->access(off_flags_))->pri_=1; //Tag the packet as In.
  95.     (hdr_flags::access(p))->pri_=1;
  96.     tbucket_ -= hdr->size_;
  97.                 total_in += 1;
  98.             }
  99.            else {
  100.                 total_out += 1;
  101.            }
  102.     time_last_sent_ = now;
  103. }
  104. protected:
  105. /* User defined parameters */
  106. double target_rate_; //predefined flow rate in bytes/sec
  107. double bucket_depth_; //depth of the token bucket
  108. double  tbucket_;
  109. /* Dynamic state variables */
  110. double  time_last_sent_;
  111. double total_in;
  112. double total_out;
  113. // int  off_flags_;
  114. };
  115. /* TaggerTSWFlow will use Time Slide Window to check whehter the data flow 
  116.  * stays in the pre-set profile and mark it as In or Out accordingly.
  117.  * By Yun Wang, based on Wenjia's algorithm.
  118.  */
  119. class TaggerTSWFlow : public Flow {
  120. public:
  121. TaggerTSWFlow() : target_rate_(0.0), avg_rate_(0.0), 
  122. t_front_(0.0), total_in(0.0), total_out(0.0) 
  123. {
  124. bind_bw("target_rate_", &target_rate_);
  125. bind("win_len_", &win_len_);
  126. bind_bool("wait_", &wait_);
  127. // bind("off_flags_", &off_flags_);
  128. }
  129. void tagging(Packet *);
  130. void run_rate_estimator(Packet *p, double now){
  131.         hdr_cmn* hdr = hdr_cmn::access(p);
  132. double bytes_in_tsw = avg_rate_ * win_len_;
  133. double new_bytes    = bytes_in_tsw + hdr->size_;
  134. avg_rate_ = new_bytes / (now - t_front_ + win_len_);
  135. t_front_  = now;
  136. }
  137. protected:
  138. /* User-defined parameters. */
  139. double target_rate_; //predefined flow rate in bytes/sec
  140. double win_len_; //length of the slide window
  141. double avg_rate_; //average rate
  142. double t_front_;
  143. int count;
  144. int wait_;
  145. /* Counters for In/Out packets. */
  146. double  total_in;
  147. double  total_out;
  148. // int off_flags_;
  149. };
  150. /* Tagger performes like the queue monitor with a classifier
  151.  * to demux by flow and mark the packets based on the flow profile
  152.  */
  153. class Tagger : public EDQueueMonitor {
  154. public:
  155. Tagger() : classifier_(NULL), channel_(NULL) {}
  156. void in(Packet *);
  157. int command(int argc, const char*const* argv);
  158. protected:
  159.         void    dumpflows();
  160.         void    dumpflow(Tcl_Channel, Flow*);
  161.         void    fformat(Flow*);
  162.         char*   flow_list();
  163.         Classifier*     classifier_;
  164.         Tcl_Channel     channel_;
  165.         char    wrk_[2048];     // big enough to hold flow list
  166. };
  167. /*
  168.  * flow monitoring is performed like queue-monitoring with
  169.  * a classifier to demux by flow
  170.  * ---------------------------------------------------------
  171.  * mon_* stuff added to support monitored early drops - ratul
  172.  */
  173. class FlowMon : public EDQueueMonitor {
  174. public:
  175. FlowMon();
  176. void in(Packet*); // arrivals
  177. void out(Packet*); // departures
  178. void drop(Packet*); // all drops (incl 
  179. void edrop(Packet*); // "early" drops
  180. void mon_edrop(Packet*); // " monitored early" drops
  181. int command(int argc, const char*const* argv);
  182. //added by ratul
  183. void setClassifier(Classifier * classifier) {
  184.   classifier_ = classifier;
  185. }
  186. Flow * find(Packet* p) {
  187. return (Flow *)classifier_->find(p);
  188. }
  189. protected:
  190. void dumpflows();
  191. void dumpflow(Tcl_Channel, Flow*);
  192. void fformat(Flow*);
  193. char* flow_list();
  194. Classifier* classifier_;
  195. Tcl_Channel channel_;
  196. int enable_in_; // enable per-flow arrival state
  197. int enable_out_; // enable per-flow depart state
  198. int enable_drop_; // enable per-flow drop state
  199. int enable_edrop_; // enable per-flow edrop state
  200. int enable_mon_edrop_;  // enable per-flow mon_edrop state 
  201. //an excessive high value for large simulations using flow monitor 
  202. char wrk_[65536]; // big enough to hold flow list
  203. };
  204. #endif