00001 /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */ 00002 /* 00003 * Copyright (c) 2000 International Computer Science Institute 00004 * All rights reserved. 00005 * 00006 * Redistribution and use in source and binary forms, with or without 00007 * modification, are permitted provided that the following conditions 00008 * are met: 00009 * 1. Redistributions of source code must retain the above copyright 00010 * notice, this list of conditions and the following disclaimer. 00011 * 2. Redistributions in binary form must reproduce the above copyright 00012 * notice, this list of conditions and the following disclaimer in the 00013 * documentation and/or other materials provided with the distribution. 00014 * 3. All advertising materials mentioning features or use of this software 00015 * must display the following acknowledgement: 00016 * This product includes software developed by ACIRI, the AT&T 00017 * Center for Internet Research at ICSI (the International Computer 00018 * Science Institute). 00019 * 4. Neither the name of ACIRI nor of ICSI may be used 00020 * to endorse or promote products derived from this software without 00021 * specific prior written permission. 00022 * 00023 * THIS SOFTWARE IS PROVIDED BY ICSI AND CONTRIBUTORS ``AS IS'' AND 00024 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00025 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00026 * ARE DISCLAIMED. IN NO EVENT SHALL ICSI OR CONTRIBUTORS BE LIABLE 00027 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00028 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00029 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00030 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00032 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00033 * SUCH DAMAGE. 00034 * 00035 */ 00036 00037 #ifndef ns_pushback_queue_h 00038 #define ns_pushback_queue_h 00039 00040 #include "red.h" 00041 #include "queue-monitor.h" 00042 #include "timer-handler.h" 00043 #include "pushback-constants.h" 00044 00045 class RateLimitSessionList; 00046 class RateEstimator; 00047 00048 class PushbackQueueTimer; 00049 class PushbackAgent; 00050 00051 class PushbackQueue: public REDQueue { 00052 00053 public: 00054 PushbackQueue( const char* const); 00055 00056 virtual void reportDrop(Packet *pkt); 00057 void enque(Packet *p); 00058 // Packet * deque() {return NULL;} 00059 00060 PushbackAgent * pushback_; 00061 int command(int, const char*const*); 00062 void timeout(int); 00063 double getBW(); 00064 double getRate(); 00065 double getDropRate(); 00066 int verbose_; 00067 00068 RateLimitSessionList * rlsList_; 00069 RateEstimator * rateEstimator_; 00070 00071 protected: 00072 int pushbackID_; 00073 int src_; 00074 int dst_; 00075 int rate_limiting_; 00076 EDQueueMonitor * qmon_; 00077 PushbackQueueTimer * timer_; 00078 00079 NsObject * RLDropTrace_; 00080 }; 00081 00082 class PushbackQueueTimer: public TimerHandler { 00083 00084 public: 00085 PushbackQueueTimer(PushbackQueue * queue) {queue_ = queue;} 00086 00087 virtual void 00088 expire(Event *e) { 00089 // printf("PBQTimer: expiry at %g\n", Scheduler::instance().clock()); 00090 queue_->timeout(0); 00091 } 00092 00093 protected: 00094 PushbackQueue * queue_; 00095 00096 00097 }; 00098 00099 #endif