File: dsred.h

package info (click to toggle)
ns2 2.35%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 78,796 kB
  • sloc: cpp: 172,923; tcl: 107,130; perl: 6,391; sh: 6,143; ansic: 5,846; makefile: 816; awk: 525; csh: 355
file content (175 lines) | stat: -rw-r--r-- 7,009 bytes parent folder | download | duplicates (8)
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