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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1990-1997 Regents of the University of California.
  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 the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  *
  35.  * Here is one set of parameters from one of my simulations:
  36.  * 
  37.  * ed [ q_weight=0.002 thresh=5 linterm=30 maxthresh=15
  38.  *         mean_pktsize=500 dropmech=random-drop queue-size=60
  39.  *         plot-file=none bytes=false doubleq=false dqthresh=50 
  40.  *    wait=true ]
  41.  * 
  42.  * 1/"linterm" is the max probability of dropping a packet. 
  43.  * There are different options that make the code
  44.  * more messy that it would otherwise be.  For example,
  45.  * "doubleq" and "dqthresh" are for a queue that gives priority to
  46.  *   small (control) packets, 
  47.  * "bytes" indicates whether the queue should be measured in bytes 
  48.  *   or in packets, 
  49.  * "dropmech" indicates whether the drop function should be random-drop 
  50.  *   or drop-tail when/if the queue overflows, and 
  51.  *   the commented-out Holt-Winters method for computing the average queue 
  52.  *   size can be ignored.
  53.  * "wait" indicates whether the gateway should wait between dropping
  54.  *   packets.
  55.  *
  56.  * @(#) $Header: /cvsroot/nsnam/ns-2/queue/red.h,v 1.45 2007/07/03 02:11:34 sallyfloyd Exp $ (LBL)
  57.  */
  58. #ifndef ns_red_h
  59. #define ns_red_h
  60. #include "queue.h"
  61. #include "trace.h"
  62. class LinkDelay;
  63. /*
  64.  * Early drop parameters, supplied by user
  65.  */
  66. struct edp {
  67. /*
  68.  * User supplied.
  69.  */
  70. int mean_pktsize; /* avg pkt size, linked into Tcl */
  71. int idle_pktsize; /* avg pkt size used during idle times */
  72. int bytes; /* true if queue in bytes, false if packets */
  73. int wait; /* true for waiting between dropped packets */
  74. int setbit; /* true to set congestion indication bit */
  75. int gentle; /* true to increases dropping prob. slowly *
  76.  * when ave queue exceeds maxthresh. */
  77. double th_min; /* minimum threshold of average queue size */
  78. double th_min_pkts; /* always maintained in packets */
  79. double th_max; /* maximum threshold of average queue size */
  80. double th_max_pkts;     /* always maintained in packets */
  81. double max_p_inv;       /* 1/max_p, for max_p = maximum prob.  */
  82.                         /* adaptive RED: the initial max_p_inv     */
  83. double mark_p; /* when p < mark_p, mark chosen packets */
  84. /* when p > mark_p, drop chosen packets */
  85.         int use_mark_p; /* use mark_p only for deciding when to drop, */
  86. /*   if queue is not full */
  87. /* Set use_mark_p true and set mark_p to 2.0 */
  88. /*   to always mark instead of drop */
  89. /*   when queue is not full */
  90. double q_w; /* queue weight given to cur q size sample */
  91. int adaptive; /* 0 for default RED */
  92. /* 1 for adaptive RED, adapting max_p */
  93. int cautious;           /* 0 for default RED */
  94.                                 /* 1 for not dropping/marking when the */
  95.                                 /*  instantaneous queue is much below the */
  96.                                 /*  average */
  97. double alpha;           /* adaptive RED: additive param for max_p */
  98. double beta;            /* adaptive RED: multip param for max_p */
  99. double interval; /* adaptive RED: interval for adaptations */
  100. double targetdelay;     /* adaptive RED: target queue size */
  101. double top; /* adaptive RED: upper bound for max_p */
  102. double bottom; /* adaptive RED: lower bound for max_p */
  103. /* 0 for automatic setting */
  104. int feng_adaptive; /* adaptive RED: Use the Feng et al. version */
  105. /*
  106.  * Computed as a function of user supplied paramters.
  107.  */
  108. double ptc; /* packet time constant in packets/second */
  109. double delay; /* link delay */
  110. };
  111. /*
  112.  * Early drop variables, maintained by RED
  113.  */
  114. struct edv {
  115. TracedDouble v_ave; /* average queue size */
  116. TracedDouble v_prob1; /* prob. of packet drop before "count". */
  117. double v_slope; /* used in computing average queue size */
  118. /* obsolete */
  119. double v_prob; /* prob. of packet drop */
  120. double v_a; /* v_prob = v_a * v_ave + v_b */
  121. double v_b;
  122. double v_c; /* used for "gentle" mode */
  123. double v_d; /* used for "gentle" mode */
  124. int count; /* # of packets since last drop */
  125. int count_bytes; /* # of bytes since last drop */
  126. int old; /* 0 when average queue first exceeds thresh */
  127. TracedDouble cur_max_p; //current max_p
  128. double lastset; /* adaptive RED: last time adapted */
  129. enum Status {Above, Below, Between}; // for use in Feng's Adaptive RED
  130. Status status;
  131. //edv() : v_ave(0.0), v_prob1(0.0), v_slope(0.0), v_prob(0.0),
  132. //v_a(0.0), v_b(0.0), v_c(0.0), v_d(0.0), count(0), 
  133. // count_bytes(0), old(0), cur_max_p(1.0) { }
  134. };
  135. class REDQueue : public Queue {
  136.  public:
  137. /* REDQueue();*/
  138. REDQueue(const char * = "Drop");
  139.  protected:
  140. void initParams();
  141. int command(int argc, const char*const* argv);
  142. void enque(Packet* pkt);
  143. virtual Packet *pickPacketForECN(Packet* pkt);
  144. virtual Packet *pickPacketToDrop();
  145. Packet* deque();
  146. void initialize_params();
  147. void reset();
  148. void run_estimator(int nqueued, int m); /* Obsolete */
  149. double estimator(int nqueued, int m, double ave, double q_w);
  150. void updateMaxP(double new_ave, double now);
  151. void updateMaxPFeng(double new_ave);
  152. int drop_early(Packet* pkt);
  153. double modify_p(double p, int count, int count_bytes, int bytes,
  154.    int mean_pktsize, int wait, int size);
  155.   double calculate_p_new(double v_ave, double th_max, int gentle, 
  156.   double v_a, double v_b, double v_c, double v_d, double max_p);
  157.   double calculate_p(double v_ave, double th_max, int gentle, 
  158.   double v_a, double v_b, double v_c, double v_d, double max_p_inv);
  159.         virtual void reportDrop(Packet *pkt) {}  //pushback
  160. void print_summarystats();
  161. int summarystats_; /* true to print true average queue size */
  162. LinkDelay* link_; /* outgoing link */
  163. int fifo_; /* fifo queue? */
  164.         PacketQueue *q_;  /* underlying (usually) FIFO queue */
  165. int bcount_() { return q_->byteLength(); };
  166. /* OBSOLETED - USE q_->byteLength() INSTEAD */
  167. int qib_; /* bool: queue measured in bytes? */
  168. NsObject* de_drop_; /* drop_early target */
  169. //added to be able to trace EDrop Objects - ratul
  170. //the other events - forced drop, enque and deque are traced by a different mechanism.
  171. NsObject * EDTrace;    //early drop trace
  172. char traceType[20];    //the preferred type for early drop trace. 
  173.                        //better be less than 19 chars long
  174. Tcl_Channel tchan_; /* place to write trace records */
  175. TracedInt curq_; /* current qlen seen by arrivals */
  176. void trace(TracedVar*); /* routine to write trace records */
  177. /*
  178.  * Static state.
  179.  */
  180. int drop_tail_; /* drop-tail */
  181. int drop_front_; /* drop-from-front */
  182. int drop_rand_; /* drop-tail, or drop random? */
  183. int ns1_compat_; /* for ns-1 compatibility, bypass a */
  184. /*   small bugfix */
  185. edp edp_; /* early-drop params */
  186. int doubleq_; /* for experiments with priority for small packets */
  187. int dqthresh_; /* for experiments with priority for small packets */
  188. /*
  189.  * Dynamic state.
  190.  */
  191. int idle_; /* queue is idle? */
  192. double idletime_; /* if so, since this time */
  193. edv edv_; /* early-drop variables */
  194. int first_reset_;       /* first time reset() is called */
  195. void print_edp(); // for debugging
  196. void print_edv(); // for debugging
  197. };
  198. #endif