1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
/*
* Copyright (c) 2000 Nortel Networks
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Nortel Networks.
* 4. The name of the Nortel Networks may not be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY NORTEL AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL NORTEL OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Developed by: Farhan Shallwani, Jeremy Ethridge
* Peter Pieda, and Mandeep Baines
* Maintainer: Peter Pieda <ppieda@nortelnetworks.com>
*/
/*
* dsred.h
*
* The Positions of dsREDQueue, edgeQueue, and coreQueue in the Object Hierarchy.
*
* This class, i.e. "dsREDQueue", is positioned in the class hierarchy as follows:
*
* Queue
* |
* dsREDQueue
*
*
* This class stands for "Differentiated Services RED Queue". Since the
* original RED does not support multiple parameters, and other functionality
* needed by a RED gateway in a Diffserv architecture, this class was created to
* support the desired functionality. This class is then inherited by two more
* classes, moulding the old hierarchy as follows:
*
*
* Queue
* |
* dsREDQueue
* | |
* edgeQueue coreQueue
*
*
* These child classes correspond to the "edge" and "core" routers in a Diffserv
* architecture.
*
*/
#ifndef dsred_h
#define dsred_h
#include "red.h" // need RED class specs (edp definition, for example)
#include "queue.h" // need Queue class specs
#include "dsredq.h"
/* The dsRED class supports the creation of up to MAX_QUEUES physical queues at
each network device, with up to MAX_PREC virtual queues in each queue. */
#define MAX_QUEUES 8// maximum number of physical RED queues
#define MAX_PREC 3 // maximum number of virtual RED queues in one physical queue
#define MAX_CP 40 // maximum number of code points in a simulation
#define MEAN_PKT_SIZE 1000 // default mean packet size, in bytes, needed for RED calculations
enum schedModeType {schedModeRR, schedModeWRR, schedModeWIRR, schedModePRI};
#define PKT_MARKED 3
#define PKT_EDROPPED 2
#define PKT_ENQUEUED 1
#define PKT_DROPPED 0
/*------------------------------------------------------------------------------
struct phbParam
This struct is used to maintain entries for the PHB parameter table, used
to map a code point to a physical queue-virtual queue pair.
------------------------------------------------------------------------------*/
struct phbParam {
int codePt_;
int queue_; // physical queue
int prec_; // virtual queue (drop precedence)
};
struct statType {
long drops; // per queue stats
long edrops;
long pkts;
long valid_CP[MAX_CP]; // per CP stats
long drops_CP[MAX_CP];
long edrops_CP[MAX_CP];
long pkts_CP[MAX_CP];
};
/*-----------------------------------------------------------------------------
class dsREDQueue
This class specifies the characteristics for a Diffserv RED router.
-----------------------------------------------------------------------------*/
class dsREDQueue : public Queue {
public:
dsREDQueue();
int command(int argc, const char*const* argv); // interface to ns scripts
protected:
redQueue redq_[MAX_QUEUES]; // the physical queues at the router
NsObject* de_drop_; // drop_early target
statType stats; // used for statistics gatherings
int qToDq; // current queue to be dequeued in a round robin manner
int numQueues_; // the number of physical queues at the router
int numPrec; // the number of virtual queues in each physical queue
phbParam phb_[MAX_CP]; // PHB table
int phbEntries; // the current number of entries in the PHB table
int ecn_; // used for ECN (Explicit Congestion Notification)
LinkDelay* link_; // outgoing link
int schedMode; // the Queue Scheduling mode
int queueWeight[MAX_QUEUES]; // A queue weight per queue
double queueMaxRate[MAX_QUEUES]; // Maximum Rate for Priority Queueing
double queueAvgRate[MAX_QUEUES]; // Average Rate for Priority Queueing
double queueArrTime[MAX_QUEUES]; // Arrival Time for Priority Queueing
int slicecount[MAX_QUEUES];
int pktcount[MAX_QUEUES];
int wirrTemp[MAX_QUEUES];
unsigned char wirrqDone[MAX_QUEUES];
int queuesDone;
void reset();
void edrop(Packet* p); // used so flowmonitor can monitor early drops
void enque(Packet *pkt); // enques a packet
Packet *deque(void); // deques a packet
int getCodePt(Packet *p); // given a packet, extract the code point marking from its header field
int selectQueueToDeque(); // round robin scheduling dequing algorithm
void lookupPHBTable(int codePt, int* queue, int* prec); // looks up queue and prec numbers corresponding to a code point
void addPHBEntry(int codePt, int queue, int prec); // edits phb entry in the table
void setNumPrec(int curPrec);
void setMREDMode(const char* mode, const char* queue);
void printStats(); // print various stats
double getStat(int argc, const char*const* argv);
void printPHBTable(); // print the PHB table
void setSchedularMode(const char* schedtype); // Sets the schedular mode
// Add a weigth to a WRR or WIRR queue
void addQueueWeights(int queueNum, int weight);
// Add a maxRate to a PRI queue
void addQueueRate(int queueNum, int rate);
void printWRRcount(); // print various stats
// apply meter to calculate average rate of a PRI queue
// Modified by xuanc(xuanc@isi.edu) Oct 18, 2001,
// referring to the patch contributed by
// Sergio Andreozzi <sergio.andreozzi@lut.fi>
void applyTSWMeter(int q_id, int pkt_size);
};
#endif
|