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

通讯编程

开发平台:

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. /*
  36.  * Based on PI controller described in:
  37.  * C. Hollot, V. Misra, D. Towsley and W. Gong. 
  38.  * On Designing Improved Controllers for AQM Routers
  39.  * Supporting TCP Flows, 
  40.  * INFOCOMM 2001. 
  41.  */
  42. #ifndef ns_pi_h
  43. #define ns_pi_h
  44. #undef setbit
  45. #include "queue.h"
  46. #include "trace.h"
  47. #include "timer-handler.h"
  48. #define DTYPE_NONE 0 /* ok, no drop */
  49. #define DTYPE_FORCED 1 /* a "forced" drop */
  50. #define DTYPE_UNFORCED 2 /* an "unforced" (random) drop */
  51. // Insert APPLE specific macro here
  52. //
  53. #if defined( __MACH__ ) && defined( __APPLE__ )
  54. #undef setbit
  55. #endif
  56. /*
  57.  * Early drop parameters, supplied by user
  58.  */
  59. struct edp_pi {
  60. /*
  61.  * User supplied.
  62.  */
  63. int mean_pktsize; /* avg pkt size, linked into Tcl */
  64. int bytes; /* true if queue in bytes, false if packets */
  65. int setbit; /* true to set congestion indication bit */
  66. double a, b;  /* parameters to pi controller */
  67. double w; /* sampling frequency (# of times per second) */ 
  68. double qref; /* desired queue size */
  69. edp_pi(): mean_pktsize(0), bytes(0), setbit(0), a(0.0), b(0.0), w(0.0), qref(0.0) { }
  70. };
  71. /*
  72.  * Early drop variables, maintained by PI
  73.  */
  74. struct edv_pi {
  75. TracedDouble v_prob; /* prob. of packet drop before "count". */
  76. int count; /* # of packets since last drop */
  77. int count_bytes; /* # of bytes since last drop */
  78. int qold;
  79. edv_pi() : v_prob(0.0), count(0), count_bytes(0), qold(0) { }
  80. };
  81. class LinkDelay;
  82. class PIQueue ; 
  83. class PICalcTimer : public TimerHandler {
  84. public:
  85. PICalcTimer(PIQueue *a) : TimerHandler() { a_ = a; }
  86. virtual void expire(Event *e);
  87. protected:
  88. PIQueue *a_;
  89. };
  90. class PIQueue : public Queue {
  91.  
  92.  friend class PICalcTimer;
  93.  public:
  94. PIQueue(const char * = "Drop");
  95.  protected:
  96. int command(int argc, const char*const* argv);
  97. void enque(Packet* pkt);
  98. virtual Packet *pickPacketForECN(Packet* pkt);
  99. virtual Packet *pickPacketToDrop();
  100. Packet* deque();
  101. void reset();
  102. int drop_early(Packet* pkt, int qlen);
  103.   double calculate_p();
  104. PICalcTimer CalcTimer;
  105. LinkDelay* link_; /* outgoing link */
  106. int fifo_; /* fifo queue? */
  107. PacketQueue *q_;  /* underlying (usually) FIFO queue */
  108. int qib_; /* bool: queue measured in bytes? */
  109. NsObject* de_drop_; /* drop_early target */
  110. //added to be able to trace EDrop Objects - ratul
  111. //the other events - forced drop, enque and deque are traced by a different mechanism.
  112. NsObject * EDTrace;    //early drop trace
  113. char traceType[20];    //the preferred type for early drop trace. 
  114.                        //better be less than 19 chars long
  115. Tcl_Channel tchan_; /* place to write trace records */
  116. TracedInt curq_; /* current qlen seen by arrivals */
  117. void trace(TracedVar*); /* routine to write trace records */
  118. edp_pi edp_; /* early-drop params */
  119. edv_pi edv_; /* early-drop variables */
  120. int first_reset_;       /* first time reset() is called */
  121. };
  122. #endif