red-pd.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) 2000  International Computer Science Institute
  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 ACIRI, the AT&T 
  17.  *      Center for Internet Research at ICSI (the International Computer
  18.  *      Science Institute).
  19.  * 4. Neither the name of ACIRI nor of ICSI may be used
  20.  *    to endorse or promote products derived from this software without
  21.  *    specific prior written permission.
  22.  *
  23.  * THIS SOFTWARE IS PROVIDED BY ICSI AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL ICSI OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  *
  35.  * @(#) $Header: /cvsroot/nsnam/ns-2/queue/red-pd.h,v 1.4 2001/01/10 23:30:14 sfloyd Exp $ (ACIRI)
  36.  */
  37. #ifndef ns_red_pd_h
  38. #define ns_red_pd_h
  39. #include "red.h"
  40. #include "flowmon.h"
  41. class REDQueue;
  42. class RedPDFlow;
  43. class RedPDQueue : public REDQueue {
  44.  public:
  45. RedPDQueue (const char * = "Drop", const char * = "Drop");
  46. int auto_;              // boolean to decide if automatic updates to rate estimates 
  47.                                          // are required
  48. int global_target_;     // boolean to decide if we have the same targetBW_ 
  49.                                          // for all the monitored flows
  50. double targetBW_;       // the global targetBW_ in bps
  51. int noMonitored_;       // number of monitored flows
  52. double unresponsive_penalty_;  //multiplicative penalty factor for flows marked unresponsive
  53.                                // they get dropped with probability $prob*unresponsive_penalty_
  54. double P_testFRp_;      // to test the FRP thing
  55. int noidle_; // boolean to decide if unresponsive flows
  56. //   should be dropped when queue is idle
  57.  
  58. void setFlowMon(FlowMon * flowMon) {
  59. flowMonitor_ = flowMon;
  60. }
  61. protected:
  62. int command(int argc, const char*const* argv);
  63. void reset();
  64. void enque(Packet* pkt);
  65. int off_ip_;
  66. FlowMon* flowMonitor_;        // the flowMonitor_ associated with the queue
  67. char medTraceType[20];        //the type of trace object for mon early drops
  68. NsObject * MEDTrace;          //the trace object for mon early drops
  69. double getP_monFlow(double current, double target) {
  70. if (current <= 0 || current < target) 
  71. return 0; //means don't drop
  72. // the surviving probability is target/current
  73. return 1 - (target/current);
  74. }
  75. };
  76.  
  77. class RedPDFlow : public Flow {
  78. public:
  79. //default values - no drops
  80. double targetBW_;                  // the target BW of this flow in bps
  81. double currentBW_;                 // the current BW of the flow  in bps
  82. int monitored_;                    // boolean: whether this flow is being monitored
  83. int unresponsive_;                 // boolean: whether this flow is responsive
  84. double monitorStartTime_;          // time when we started monitoring this flow
  85. double unresponsiveStartTime_;     // time when we declared this flow as unresponsive 
  86. double lastDropTime_;              // time when the last packet from this flow was dropped 
  87.                                    // actually the time when the currentBW_ exceeded targetBW_
  88. int count;                         // number of packets since last drop
  89. int auto_;                         // boolean: if rate estmation is going on
  90. RedPDFlow() : targetBW_(0), currentBW_(0),  
  91. monitored_(0), unresponsive_(0),
  92. monitorStartTime_(0), unresponsiveStartTime_(0), lastDropTime_(0), 
  93. count(0), auto_(0) {
  94. bind_bw("currentBW_", &currentBW_);
  95. bind_bw("targetBW_", &targetBW_);
  96. bind_bool("monitored_", &monitored_);
  97. bind_bool("unresponsive_", &unresponsive_);
  98. bind("lastDropTime_", &lastDropTime_);
  99. bind("monitorStartTime_", &monitorStartTime_);
  100. bind("unresponsiveStartTime_", &unresponsiveStartTime_);
  101. bind_bool("auto_", &auto_);
  102. }
  103. int monitored() {return monitored_; };
  104. int unresponsive() {return unresponsive_; };
  105. RedPDFlow(double target, double current) {
  106. targetBW_ = target;
  107. currentBW_ = current;
  108. };
  109. void set(double target, double current) {
  110. targetBW_ = target;
  111. currentBW_ = current;
  112. monitored_ = 1;
  113. };
  114. double getP_monFLow() {
  115. if (currentBW_ <= 0 || currentBW_ < targetBW_) 
  116. return 0; //means don't drop
  117. // the surviving probability is target/current
  118. return 1 - (targetBW_/currentBW_);
  119. };
  120. };
  121. #endif