Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

drop-tail.cc

Go to the documentation of this file.
00001 /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
00002 /*
00003  * Copyright (c) 1994 Regents of the University of California.
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 the Computer Systems
00017  *      Engineering Group at Lawrence Berkeley Laboratory.
00018  * 4. Neither the name of the University nor of the Laboratory may be used
00019  *    to endorse or promote products derived from this software without
00020  *    specific prior written permission.
00021  *
00022  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00023  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00024  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00025  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00026  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00027  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00028  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00029  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00030  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00031  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00032  * SUCH DAMAGE.
00033  */
00034 
00035 #ifndef lint
00036 static const char rcsid[] =
00037     "@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/queue/drop-tail.cc,v 1.15 2003/01/16 19:02:54 sfloyd Exp $ (LBL)";
00038 #endif
00039 
00040 #include "drop-tail.h"
00041 
00042 static class DropTailClass : public TclClass {
00043  public:
00044         DropTailClass() : TclClass("Queue/DropTail") {}
00045         TclObject* create(int, const char*const*) {
00046                 return (new DropTail);
00047         }
00048 } class_drop_tail;
00049 
00050 void DropTail::reset()
00051 {
00052         Queue::reset();
00053 }
00054 
00055 int 
00056 DropTail::command(int argc, const char*const* argv) {
00057 
00058         if (argc==2) {
00059                 if (strcmp(argv[1], "printstats") == 0) {
00060                         print_summarystats();
00061                         return (TCL_OK);
00062                 }
00063         }
00064         if (argc == 3) {
00065                 if (!strcmp(argv[1], "packetqueue-attach")) {
00066                         delete q_;
00067                         if (!(q_ = (PacketQueue*) TclObject::lookup(argv[2])))
00068                                 return (TCL_ERROR);
00069                         else {
00070                                 pq_ = q_;
00071                                 return (TCL_OK);
00072                         }
00073                 }
00074         }
00075         return Queue::command(argc, argv);
00076 }
00077 
00078 /*
00079  * drop-tail
00080  */
00081 void DropTail::enque(Packet* p)
00082 {
00083         if (summarystats) {
00084                 Queue::updateStats(qib_?q_->byteLength():q_->length());
00085         }
00086 
00087         int qlimBytes = qlim_ * mean_pktsize_;
00088         if ((!qib_ && (q_->length() + 1) >= qlim_) ||
00089         (qib_ && (q_->byteLength() + hdr_cmn::access(p)->size()) >= qlimBytes)){
00090                 // if the queue would overflow if we added this packet...
00091                 if (drop_front_) { /* remove from head of queue */
00092                         q_->enque(p);
00093                         Packet *pp = q_->deque();
00094                         drop(pp);
00095                 } else {
00096                         drop(p);
00097                 }
00098         } else {
00099                 q_->enque(p);
00100         }
00101 }
00102 
00103 Packet* DropTail::deque()
00104 {
00105         if (summarystats && &Scheduler::instance() != NULL) {
00106                 Queue::updateStats(qib_?q_->byteLength():q_->length());
00107         }
00108         return q_->deque();
00109 }
00110 
00111 void DropTail::print_summarystats()
00112 {
00113         //double now = Scheduler::instance().clock();
00114         printf("True average queue: %5.3f", true_ave_);
00115         if (qib_)
00116                 printf(" (in bytes)");
00117         printf(" time: %5.3f\n", total_time_);
00118 }

Generated on Tue Apr 20 12:14:14 2004 for NS2.26SourcesOriginal by doxygen 1.3.3