queue.h
上传用户:sdhqmy
上传日期:2015-12-07
资源大小:63k
文件大小:5k
源码类别:

3G开发

开发平台:

C/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: /nfs/jade/vint/CVSROOT/ns-2/queue/queue.h,v 1.29 2002/01/01 00:04:53 sfloyd 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. //JUNGMIN
  43. class Mac802_11;
  44. //end of JUNGMIN
  45. class PacketQueue : public TclObject {
  46. public:
  47. PacketQueue() : head_(0), tail_(0), len_(0), bytes_(0) {}
  48. virtual int length() const { return (len_); }
  49. virtual int byteLength() const { return (bytes_); }
  50. virtual void enque(Packet* p) {
  51. if (!tail_) head_= tail_= p;
  52. else {
  53. tail_->next_= p;
  54. tail_= p;
  55. }
  56. tail_->next_= 0;
  57. ++len_;
  58. bytes_ += hdr_cmn::access(p)->size();
  59. }
  60. virtual Packet* deque() {
  61. if (!head_) return 0;
  62. Packet* p = head_;
  63. head_= p->next_; // 0 if p == tail_
  64. if (p == tail_) head_= tail_= 0;
  65. --len_;
  66. bytes_ -= hdr_cmn::access(p)->size();
  67. return p;
  68. }
  69. Packet* lookup(int n) {
  70. for (Packet* p = head_; p != 0; p = p->next_) {
  71. if (--n < 0)
  72. return (p);
  73. }
  74. return (0);
  75. }
  76. //JUNGMIN
  77. virtual int BuildQState(int* q_array, int size);
  78. //end of JUNGMIN
  79. /* remove a specific packet, which must be in the queue */
  80. virtual void remove(Packet*);
  81. /* Remove a packet, located after a given packet. Either could be 0. */
  82. void remove(Packet *, Packet *);
  83.         Packet* head() { return head_; }
  84. Packet* tail() { return tail_; }
  85. // MONARCH EXTNS
  86. virtual inline void enqueHead(Packet* p) {
  87.         if (!head_) tail_ = p;
  88.         p->next_ = head_;
  89. head_ = p;
  90. ++len_;
  91. bytes_ += hdr_cmn::access(p)->size();
  92. }
  93.         void resetIterator() {iter = head_;}
  94.         Packet* getNext() { 
  95.         if (!iter) return 0;
  96. Packet *tmp = iter; iter = iter->next_;
  97. return tmp;
  98. }
  99. protected:
  100. Packet* head_;
  101. Packet* tail_;
  102. int len_; // packet count
  103. int bytes_; // queue size in bytes
  104. // MONARCH EXTNS
  105. private:
  106. Packet *iter;
  107. };
  108. class Queue;
  109. class QueueHandler : public Handler {
  110. public:
  111. inline QueueHandler(Queue& q) : queue_(q) {}
  112. void handle(Event*);
  113. private:
  114. Queue& queue_;
  115. };
  116. class Queue : public Connector {
  117. public:
  118. virtual void enque(Packet*) = 0;
  119. virtual Packet* deque() = 0;
  120. virtual void recv(Packet*, Handler*);
  121. virtual void updateStats(int queuesize); 
  122. void resume();
  123. int blocked() const { return (blocked_ == 1); }
  124. void unblock() { blocked_ = 0; }
  125. void block() { blocked_ = 1; }
  126. int limit() { return qlim_; }
  127. int length() { return pq_->length(); } /* number of pkts currently in
  128.  * underlying packet queue */
  129. int byteLength() { return pq_->byteLength(); } /* number of bytes *
  130.  * currently in packet queue */
  131. //JUNGMIN
  132. void SetATIMWindow();
  133. void StartSendingATIM();
  134. void ContinueSendingATIM();
  135. void ResetATIMWindow(int status);  
  136. void set_wmac(Mac802_11* m);
  137. int ExtractMaximum(int*);
  138. void ResetQInfo();
  139. virtual int BuildQState(int* q_array, int size) { };
  140. virtual void ReturnPacket(Packet* p) { };
  141. //end of JUNGMIN
  142. protected:
  143. Queue();
  144. void reset();
  145. int qlim_; /* maximum allowed pkts in queue */
  146. int blocked_; /* blocked now? */
  147. int unblock_on_resume_; /* unblock q on idle? */
  148. QueueHandler qh_;
  149. PacketQueue *pq_; /* pointer to actual packet queue 
  150.  * (maintained by the individual disciplines
  151.  * like DropTail and RED). */
  152. double true_ave_; /* true long-term average queue size */
  153. double total_time_; /* total time average queue size compute for */
  154. //JUNGMIN
  155. int atim_window_;
  156. Mac802_11 *wmac_;
  157. int q_state_[MAX_NODES];
  158. int pre_atim_max_;
  159. int pre_atim_iter_;
  160. int pre_atim_;
  161. //end of JUNGMIN
  162. };
  163. #endif