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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1996-1997 The 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 Network Research
  17.  *  Group at Lawrence Berkeley National 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.  * @(#) $Header: /cvsroot/nsnam/ns-2/queue/queue.h,v 1.35 2005/01/13 18:33:48 haldar Exp $ (LBL)
  35.  */
  36. #ifndef ns_queue_h
  37. #define ns_queue_h
  38. #include "connector.h"
  39. #include "packet.h"
  40. #include "ip.h"
  41. class Packet;
  42. class PacketQueue : public TclObject {
  43. public:
  44. PacketQueue() : head_(0), tail_(0), len_(0), bytes_(0) {}
  45. virtual int length() const { return (len_); }
  46. virtual int byteLength() const { return (bytes_); }
  47. virtual Packet* enque(Packet* p) { // Returns previous tail
  48. Packet* pt = tail_;
  49. if (!tail_) head_= tail_= p;
  50. else {
  51. tail_->next_= p;
  52. tail_= p;
  53. }
  54. tail_->next_= 0;
  55. ++len_;
  56. bytes_ += hdr_cmn::access(p)->size();
  57. return pt;
  58. }
  59. virtual Packet* deque() {
  60. if (!head_) return 0;
  61. Packet* p = head_;
  62. head_= p->next_; // 0 if p == tail_
  63. if (p == tail_) head_= tail_= 0;
  64. --len_;
  65. bytes_ -= hdr_cmn::access(p)->size();
  66. return p;
  67. }
  68. Packet* lookup(int n) {
  69. for (Packet* p = head_; p != 0; p = p->next_) {
  70. if (--n < 0)
  71. return (p);
  72. }
  73. return (0);
  74. }
  75. /* remove a specific packet, which must be in the queue */
  76. virtual void remove(Packet*);
  77. /* Remove a packet, located after a given packet. Either could be 0. */
  78. void remove(Packet *, Packet *);
  79.         Packet* head() { return head_; }
  80. Packet* tail() { return tail_; }
  81. // MONARCH EXTNS
  82. virtual inline void enqueHead(Packet* p) {
  83.         if (!head_) tail_ = p;
  84.         p->next_ = head_;
  85. head_ = p;
  86. ++len_;
  87. bytes_ += hdr_cmn::access(p)->size();
  88. }
  89.         void resetIterator() {iter = head_;}
  90.         Packet* getNext() { 
  91.         if (!iter) return 0;
  92. Packet *tmp = iter; iter = iter->next_;
  93. return tmp;
  94. }
  95. protected:
  96. Packet* head_;
  97. Packet* tail_;
  98. int len_; // packet count
  99. int bytes_; // queue size in bytes
  100. // MONARCH EXTNS
  101. private:
  102. Packet *iter;
  103. };
  104. class Queue;
  105. class QueueHandler : public Handler {
  106. public:
  107. inline QueueHandler(Queue& q) : queue_(q) {}
  108. void handle(Event*);
  109. private:
  110. Queue& queue_;
  111. };
  112. class Queue : public Connector {
  113. public:
  114. virtual void enque(Packet*) = 0;
  115. virtual Packet* deque() = 0;
  116. virtual void recv(Packet*, Handler*);
  117. virtual void updateStats(int queuesize); 
  118. void resume();
  119. int blocked() const { return (blocked_ == 1); }
  120. void unblock() { blocked_ = 0; }
  121. void block() { blocked_ = 1; }
  122. int limit() { return qlim_; }
  123. int length() { return pq_->length(); } /* number of pkts currently in
  124.  * underlying packet queue */
  125. int byteLength() { return pq_->byteLength(); } /* number of bytes *
  126.  * currently in packet queue */
  127. /* mean utilization, decaying based on util_weight */
  128. virtual double utilization (void);
  129. /* max utilization over recent time period.
  130.    Returns the maximum of recent measurements stored in util_buf_*/
  131. double peak_utilization(void);
  132. virtual ~Queue();
  133. protected:
  134. Queue();
  135. void reset();
  136. int qlim_; /* maximum allowed pkts in queue */
  137. int blocked_; /* blocked now? */
  138. int unblock_on_resume_; /* unblock q on idle? */
  139. QueueHandler qh_;
  140. PacketQueue *pq_; /* pointer to actual packet queue 
  141.  * (maintained by the individual disciplines
  142.  * like DropTail and RED). */
  143. double true_ave_; /* true long-term average queue size */
  144. double total_time_; /* total time average queue size compute for */
  145. void utilUpdate(double int_begin, double int_end, int link_state);
  146. double last_change_;  /* time at which state changed/utilization measured */
  147. double old_util_;     /* current utilization */ 
  148. double util_weight_;  /* decay factor for measuring the link utilization */
  149. double util_check_intv_; /* interval for reseting the current
  150.     utilization measurements (seconds) */
  151. double period_begin_; /* time of starting the current utilization
  152.    measurement */
  153. double cur_util_; /* utilization during current time period */
  154. int buf_slot_; /* Currently active utilization buffer */
  155. double *util_buf_;    /* Buffer for recent utilization measurements */
  156. int util_records_; /* Number of recent utilization measurements
  157.    stored in memory. One slot in buffer holds
  158.    period of util_check_intv_ seconds. */
  159. // measuring #drops
  160. };
  161. #endif