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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2000 Nortel Networks
  3.  * All rights reserved.
  4.  * 
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *      This product includes software developed by Nortel Networks.
  16.  * 4. The name of the Nortel Networks may not be used
  17.  *    to endorse or promote products derived from this software without
  18.  *    specific prior written permission.
  19.  * 
  20.  * THIS SOFTWARE IS PROVIDED BY NORTEL AND CONTRIBUTORS ``AS IS'' AND
  21.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED.  IN NO EVENT SHALL NORTEL OR CONTRIBUTORS BE LIABLE
  24.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30.  * SUCH DAMAGE.
  31.  *
  32.  * Developed by: Farhan Shallwani, Jeremy Ethridge
  33.  *               Peter Pieda, and Mandeep Baines
  34.  * Maintainer: Peter Pieda <ppieda@nortelnetworks.com>
  35.  */
  36. #ifndef dsredq_h
  37. #define dsredq_h
  38. //#include "dsred.h"
  39. // maximum number of virtual RED queues in one physical queue
  40. #define MAX_PREC 3
  41. enum mredModeType {rio_c, rio_d, wred, dropTail};
  42. // struct qParam
  43. //   This structure specifies the parameters needed to be maintained for 
  44. //   each RED queue.
  45. struct qParam {
  46.   edp edp_; // early drop parameters (see red.h)
  47.   edv edv_; // early drop variables (see red.h)
  48.   int qlen; // actual (not weighted) queue length in packets
  49.   double idletime_; // needed to calculate avg queue
  50.   bool idle_; // needed to calculate avg queue
  51. };
  52. // class redQueue
  53. //    This class provides specs for one physical queue.
  54. class redQueue {
  55.  public:
  56.   int numPrec; // the current number of precedence levels (or virtual queues)
  57.   int qlim;
  58.   mredModeType mredMode;
  59.   redQueue();
  60.   // configures one virtual RED queue
  61.   void config(int prec, int argc, const char*const* argv);
  62.   void initREDStateVar(void); // initializes RED state variables
  63.   // Updates a virtual queue's length after dequeueing
  64.   void updateVREDLen(int);
  65.   //sets idle_ flag to 0
  66.   // Patch contributed by Thilo Wagner <wagner@panasonic.de>
  67.   void updateIdleFlag(int);
  68.   // updates RED variables after enqueueing/dequing a packet
  69.   void updateREDStateVar(int prec);
  70.   // enques packets into a physical queue
  71.   int enque(Packet *pkt, int prec, int ecn);
  72.   Packet* deque(void); // deques packets
  73.   double getWeightedLength();
  74.   int getRealLength(void); // queries length of a physical queue
  75.   // sets packet time constant values
  76.   //(needed for calc. avgQSize) for each virtual queue
  77.   // queries average length of a virtual queue
  78.   double getWeightedLength_v(int prec); 
  79.   // queries length of a virtual queue
  80.   int getRealLength_v(int prec); 
  81.   void setPTC(double outLinkBW);
  82.   // sets mean packet size (needed to calculate avg. queue size)
  83.   void setMPS(int mps);
  84.   
  85.  private:
  86.   // underlying FIFO queue
  87.   PacketQueue *q_;
  88.   // used to maintain parameters for each of the virtual queues
  89.   qParam qParam_[MAX_PREC];
  90.   // to calculate avg. queue size of a virtual queue
  91.   void calcAvg(int prec, int m); 
  92.   
  93. };
  94. #endif