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

通讯编程

开发平台:

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.  * @(#) $Header: /cvsroot/nsnam/ns-2/queue/rio.h,v 1.5 2000/07/04 01:59:31 sfloyd Exp $ (LBL)
  36.  */
  37. #ifndef ns_rio_h
  38. #define ns_rio_h
  39. #include "tclcl.h"
  40. #include "packet.h"
  41. #include "random.h"
  42. #include "flags.h"
  43. #include "delay.h"
  44. #include "template.h"
  45. #include "red.h"
  46. /*
  47.  * Early drop parameters, supplied by user, for a subqueue.
  48.  */
  49. struct edp_rio {
  50. /*
  51.  * User supplied.
  52.  */
  53. int gentle;         /* when ave queue exceeds maxthresh. */
  54. double th_min; /* minimum threshold of average queue size */
  55. double th_max; /* maximum threshold of average queue size */
  56. double max_p_inv; /* 1/max_p, for max_p = maximum prob.  */
  57. };
  58. /*
  59.  * Early drop variables, maintained by RIO, for a subqueue.
  60.  */
  61. struct edv_rio {
  62.         /* added by Wenjia modified by Yun: a new set In packets */
  63.         double v_ave;         /* average In queue size */
  64. double v_prob1; /* prob. of packet drop before "count". */
  65.         double v_slope;       /* used in computing average queue size */
  66.         double v_r;
  67.         double v_prob;        /* prob. of packet drop */
  68.         double v_a;           /* v_prob = v_a * v_ave + v_b */
  69.         double v_b;
  70. double v_c;
  71. double v_d;
  72.         int count;           /* # of packets since last drop */
  73.         int count_bytes;     /* # of bytes since last drop */
  74.         int old;             /* 0 when average queue first exceeds thresh */
  75.         struct dlist* drops;
  76. edv_rio() : v_ave(0.0), v_prob1(0.0), v_slope(0.0), v_prob(0.0),
  77. v_a(0.0), v_b(0.0), count(0), count_bytes(0), old(0) { }
  78. };
  79. class REDQueue;
  80. class RIOQueue : public virtual REDQueue {
  81.  public:
  82. RIOQueue();
  83.  protected:
  84. void enque(Packet* pkt);
  85. Packet* deque();
  86. void reset();
  87. void run_out_estimator(int out, int total, int m);
  88. // int drop_early(Packet* pkt);
  89. int drop_in_early(Packet* pkt);
  90. int drop_out_early(Packet* pkt);
  91. /* added by Yun: In packets byte count */
  92. int in_len_; /* In Packets count */
  93. int in_bcount_; /* In packets byte count */
  94. void trace(TracedVar*); /* routine to write trace records */
  95. /*
  96.  * Static state.
  97.  */
  98. int priority_method_; /* 0 to leave priority field in header, */
  99. /*  1 to use flowid as priority.  */
  100. edp_rio edp_in_;  /* early-drop params for IN traffic */
  101. edp_rio edp_out_;        /* early-drop params for OUT traffic */
  102. /*
  103.  * Dynamic state.
  104.  */
  105. /* added by Wenjia noticed by Yun: to trace the idle */
  106. int in_idle_;
  107. double in_idletime_;
  108. edv_rio edv_in_; /* early-drop variables for IN traffic */
  109. edv_rio edv_out_;        /* early-drop variables for OUT traffic */ 
  110. void print_edp(); // for debugging
  111. void print_edv(); // for debugging
  112. };
  113. #endif