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

通讯编程

开发平台:

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. /*
  37.  * dsred.h
  38.  *
  39.  * The Positions of dsREDQueue, edgeQueue, and coreQueue in the Object Hierarchy.
  40.  *
  41.  * This class, i.e. "dsREDQueue", is positioned in the class hierarchy as follows:
  42.  *
  43.  *             Queue
  44.  *               |
  45.  *           dsREDQueue
  46.  *
  47.  *
  48.  *   This class stands for "Differentiated Services RED Queue".  Since the
  49.  * original RED does not support multiple parameters, and other functionality
  50.  * needed by a RED gateway in a Diffserv architecture, this class was created to
  51.  * support the desired functionality.  This class is then inherited by two more
  52.  * classes, moulding the old hierarchy as follows:
  53.  *
  54.  *
  55.  *             Queue
  56.  *               |
  57.  *           dsREDQueue
  58.  *           |        |
  59.  *     edgeQueue    coreQueue
  60.  *
  61.  *
  62.  * These child classes correspond to the "edge" and "core" routers in a Diffserv
  63.  * architecture.
  64.  *
  65.  */
  66. #ifndef dsred_h
  67. #define dsred_h
  68. #include "red.h" // need RED class specs (edp definition, for example)
  69. #include "queue.h" // need Queue class specs
  70. #include "dsredq.h"
  71. /* The dsRED class supports the creation of up to MAX_QUEUES physical queues at
  72. each network device, with up to MAX_PREC virtual queues in each queue. */ 
  73. #define MAX_QUEUES 8// maximum number of physical RED queues
  74. #define MAX_PREC 3 // maximum number of virtual RED queues in one physical queue
  75. #define MAX_CP 40 // maximum number of code points in a simulation
  76. #define MEAN_PKT_SIZE 1000  // default mean packet size, in bytes, needed for RED calculations
  77. enum schedModeType {schedModeRR, schedModeWRR, schedModeWIRR, schedModePRI};
  78. #define PKT_MARKED 3
  79. #define PKT_EDROPPED 2
  80. #define PKT_ENQUEUED 1
  81. #define PKT_DROPPED 0
  82. /*------------------------------------------------------------------------------
  83. struct phbParam
  84.     This struct is used to maintain entries for the PHB parameter table, used 
  85. to map a code point to a physical queue-virtual queue pair.
  86. ------------------------------------------------------------------------------*/
  87. struct phbParam {
  88.    int codePt_;
  89.    int queue_; // physical queue
  90.    int prec_; // virtual queue (drop precedence)
  91. };
  92. struct statType {
  93. long drops;       // per queue stats
  94. long edrops;
  95. long pkts;
  96. long valid_CP[MAX_CP];  // per CP stats
  97. long drops_CP[MAX_CP];
  98. long edrops_CP[MAX_CP];
  99. long pkts_CP[MAX_CP];
  100. };
  101. /*-----------------------------------------------------------------------------
  102. class dsREDQueue 
  103.     This class specifies the characteristics for a Diffserv RED router.
  104. -----------------------------------------------------------------------------*/
  105. class dsREDQueue : public Queue {
  106.  public:
  107.   dsREDQueue();
  108.   int command(int argc, const char*const* argv); // interface to ns scripts
  109.   
  110.  protected:
  111.   redQueue redq_[MAX_QUEUES]; // the physical queues at the router
  112.   NsObject* de_drop_; // drop_early target
  113.   statType stats; // used for statistics gatherings
  114.   int qToDq; // current queue to be dequeued in a round robin manner
  115.   int numQueues_; // the number of physical queues at the router
  116.   int numPrec;         // the number of virtual queues in each physical queue
  117.   phbParam phb_[MAX_CP]; // PHB table
  118.   int phbEntries;      // the current number of entries in the PHB table
  119.   int ecn_; // used for ECN (Explicit Congestion Notification)
  120.   LinkDelay* link_; // outgoing link
  121.   int schedMode;                  // the Queue Scheduling mode
  122.   int queueWeight[MAX_QUEUES];    // A queue weight per queue
  123.   double queueMaxRate[MAX_QUEUES];   // Maximum Rate for Priority Queueing
  124.   double queueAvgRate[MAX_QUEUES];   // Average Rate for Priority Queueing
  125.   double queueArrTime[MAX_QUEUES];   // Arrival Time for Priority Queueing
  126.   int slicecount[MAX_QUEUES];
  127.   int pktcount[MAX_QUEUES];
  128.   int wirrTemp[MAX_QUEUES];
  129.   unsigned char wirrqDone[MAX_QUEUES];
  130.   int queuesDone;
  131.   
  132.   void reset();
  133.   void edrop(Packet* p); // used so flowmonitor can monitor early drops
  134.   void enque(Packet *pkt); // enques a packet
  135.   Packet *deque(void); // deques a packet
  136.   int getCodePt(Packet *p); // given a packet, extract the code point marking from its header field
  137.   int selectQueueToDeque(); // round robin scheduling dequing algorithm
  138.   void lookupPHBTable(int codePt, int* queue, int* prec); // looks up queue and prec numbers corresponding to a code point
  139.   void addPHBEntry(int codePt, int queue, int prec); // edits phb entry in the table
  140.   void setNumPrec(int curPrec);
  141.   void setMREDMode(const char* mode, const char* queue);
  142.   void printStats(); // print various stats
  143.   double getStat(int argc, const char*const* argv);
  144.   void printPHBTable();  // print the PHB table
  145.   void setSchedularMode(const char* schedtype); // Sets the schedular mode
  146.   // Add a weigth to a WRR or WIRR queue
  147.   void addQueueWeights(int queueNum, int weight); 
  148.   // Add a maxRate to a PRI queue
  149.   void addQueueRate(int queueNum, int rate); 
  150.   void printWRRcount(); // print various stats
  151.   // apply meter to calculate average rate of a PRI queue
  152.   // Modified by xuanc(xuanc@isi.edu) Oct 18, 2001, 
  153.   // referring to the patch contributed by 
  154.   // Sergio Andreozzi <sergio.andreozzi@lut.fi>
  155.   void applyTSWMeter(int q_id, int pkt_size); 
  156. };
  157. #endif