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

CBQueue Class Reference

Inheritance diagram for CBQueue:

Inheritance graph
[legend]
Collaboration diagram for CBQueue:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 CBQueue ()
void reset ()
void enque (Packet *)
void recv (Packet *, Handler *)
LinkDelaylink () const
CBQClasslevel (int n) const
Packetdeque ()
virtual int command (int argc, const char *const *argv)
virtual void addallot (int, double)
Packetpending_pkt () const
void sched ()
int toplevel ()
void toplevel_arrival (CBQClass *, double)
virtual void recv (Packet *p, const char *s)
virtual void updateStats (int queuesize)
void resume ()
int blocked () const
void unblock ()
void block ()
int limit ()
int length ()
int byteLength ()
virtual double utilization (void)
virtual void destroy ()
void enqueue (QueueElem< T > *e)
QueueElem< T > * dequeue ()
void detach (QueueElem< T > *e)
QueueElem< T > * getHead ()
int is_empty () const
int size () const
NsObjecttarget ()
virtual void drop (Packet *p)
virtual void recvOnly (Packet *)
virtual void delay_bind_init_all ()
virtual int delay_bind_dispatch (const char *varName, const char *localName, TclObject *tracer)
int isdebug () const
virtual void debug (const char *fmt,...)

Protected Types

enum  eligible_type_ { NONE, FORMAL, ANCESTORS, TOPLEVEL }

Protected Member Functions

int algorithm (const char *)
virtual int insert_class (CBQClass *)
int send_permitted (CBQClass *, double)
CBQClassfind_lender (CBQClass *, double)
void toplevel_departure (CBQClass *, double)
int eligible_formal (CBQClass *, double)
int eligible_ancestors (CBQClass *, double)
int eligible_toplevel (CBQClass *cl, double)
void utilUpdate (double int_begin, double int_end, int link_state)
virtual void drop (Packet *p, const char *s)
void send (Packet *p, Handler *h)
void handle (Event *)

Protected Attributes

Event intr_
CBQClasslast_lender_
Packetpending_pkt_
LinkDelaylink_
CBQClassactive_ [MAXPRIO]
CBQClasslevels_ [MAXLEVEL+1]
int maxprio_
int maxpkt_
int maxlevel_
int toplevel_
eligible_type_ eligible_
int qlim_
int blocked_
int unblock_on_resume_
QueueHandler qh_
PacketQueuepq_
double true_ave_
double total_time_
double last_change_
double old_util_
double util_weight_
QueueElem< T > * head_
QueueElem< T > * tail_
int size_
NsObjecttarget_
NsObjectdrop_
int debug_

Member Enumeration Documentation

enum CBQueue::eligible_type_ [protected]
 

Enumeration values:
NONE 
FORMAL 
ANCESTORS 
TOPLEVEL 

Definition at line 175 of file cbq.cc.

00175 { NONE, FORMAL, ANCESTORS, TOPLEVEL };


Constructor & Destructor Documentation

CBQueue::CBQueue  ) 
 

Definition at line 200 of file cbq.cc.

References active_, levels_, MAXLEVEL, maxpkt_, and NONE.

00200                  : last_lender_(NULL), pending_pkt_(NULL), link_(NULL),
00201         maxprio_(-1), maxpkt_(-1), maxlevel_(-1), toplevel_(MAXLEVEL),
00202 //      eligible_((eligible_type_)NULL)
00203         eligible_(NONE)
00204 {
00205         bind("maxpkt_", &maxpkt_);
00206         memset(active_, '\0', sizeof(active_));
00207         memset(levels_, '\0', sizeof(levels_));
00208 }


Member Function Documentation

virtual void CBQueue::addallot int  ,
double 
[inline, virtual]
 

Reimplemented in WRR_CBQueue.

Definition at line 146 of file cbq.cc.

Referenced by insert_class(), and CBQClass::newallot().

00146 { }

int CBQueue::algorithm const char *   )  [protected]
 

Definition at line 247 of file cbq.cc.

References ANCESTORS, eligible_, FORMAL, and TOPLEVEL.

Referenced by command().

00248 {
00249 
00250         if (*arg == '0' || (strcmp(arg, "ancestor-only") == 0)) {
00251 //              eligible_ = &eligible_ancestors;
00252                 eligible_ = ANCESTORS;
00253                 return (1);
00254         } else if (*arg == '1' || (strcmp(arg, "top-level") == 0)) {
00255 //              eligible_ = &eligible_toplevel;
00256                 eligible_ = TOPLEVEL;
00257                 return (1);
00258         } else if (*arg == '2' || (strcmp(arg, "formal") == 0)) {
00259 //              eligible_ = &eligible_formal;
00260                 eligible_ = FORMAL;
00261                 return (1);
00262         } else if (*arg == '3' || (strcmp(arg, "old-formal") == 0)) {
00263                 fprintf(stderr, "CBQ: old-formal LS not supported\n");
00264                 return (-1);
00265         }
00266         return (-1);
00267 }

template<class T>
void Queue< T >::block  )  [inline, inherited]
 

Definition at line 131 of file queue.h.

References Queue< T >::blocked_.

00131 { blocked_ = 1; }

template<class T>
int Queue< T >::blocked  )  const [inline, inherited]
 

Definition at line 129 of file queue.h.

References Queue< T >::blocked_.

Referenced by CBQClass::recv().

00129 { return (blocked_ == 1); }

template<class T>
int Queue< T >::byteLength  )  [inline, inherited]
 

Definition at line 135 of file queue.h.

References PacketQueue::byteLength(), and Queue< T >::pq_.

00135 { return pq_->byteLength(); }   /* number of bytes *

Here is the call graph for this function:

int CBQueue::command int  argc,
const char *const *  argv
[virtual]
 

Reimplemented from Connector.

Reimplemented in WRR_CBQueue.

Definition at line 566 of file cbq.cc.

References algorithm(), Connector::command(), insert_class(), and link_.

Referenced by WRR_CBQueue::command().

00567 {
00568 
00569         Tcl& tcl = Tcl::instance();
00570         if (argc == 3) {
00571                 if (strcmp(argv[1], "insert-class") == 0) {
00572                         CBQClass *cl = (CBQClass*)TclObject::lookup(argv[2]);
00573                         if (cl == 0) {
00574                                 tcl.resultf("CBQ: no class object %s",
00575                                         argv[2]);
00576                                 return (TCL_ERROR);
00577                         }
00578                         if (insert_class(cl) < 0) {
00579                                 tcl.resultf("CBQ: trouble inserting class %s",
00580                                         argv[2]);
00581                                 return (TCL_ERROR);
00582                         }
00583                         return (TCL_OK);
00584                 }
00585                 if (strcmp(argv[1], "link") == 0) {
00586                         LinkDelay* del = (LinkDelay*)TclObject::lookup(argv[2]);
00587                         if (del == 0) {
00588                                 tcl.resultf("CBQ: no LinkDelay object %s",
00589                                         argv[2]);
00590                                 return(TCL_ERROR);
00591                         }
00592                         link_ = del;
00593                         return (TCL_OK);
00594                 }
00595                 if (strcmp(argv[1], "algorithm") == 0) {
00596                         if (algorithm(argv[2]) < 0)
00597                                 return (TCL_ERROR);
00598                         return (TCL_OK);
00599                 }
00600         }
00601         return (Queue::command(argc, argv));
00602 }

Here is the call graph for this function:

void NsObject::debug const char *  fmt,
... 
[virtual, inherited]
 

Definition at line 102 of file object.cc.

References NsObject::debug_.

00103 {
00104         if (!debug_)
00105                 return;
00106         va_list ap;
00107         va_start(ap, fmt);
00108         vprintf(fmt, ap);
00109 }

int NsObject::delay_bind_dispatch const char *  varName,
const char *  localName,
TclObject tracer
[virtual, inherited]
 

Reimplemented in BayFullTcpAgent, Agent, MPLSAddressClassifier, LDPAgent, FullTcpAgent, SackFullTcpAgent, RFC793eduTcpAgent, TcpSink, TcpAgent, and VegasTcpAgent.

Definition at line 63 of file object.cc.

References NsObject::debug_.

Referenced by MPLSAddressClassifier::delay_bind_dispatch(), and Agent::delay_bind_dispatch().

00064 {
00065         if (delay_bind_bool(varName, localName, "debug_", &debug_, tracer)) 
00066                 return TCL_OK;
00067         return TclObject::delay_bind_dispatch(varName, localName, tracer);
00068 }

void NsObject::delay_bind_init_all  )  [virtual, inherited]
 

Reimplemented in BayFullTcpAgent, Agent, MPLSAddressClassifier, LDPAgent, FullTcpAgent, SackFullTcpAgent, RFC793eduTcpAgent, TcpSink, TcpAgent, and VegasTcpAgent.

Definition at line 57 of file object.cc.

Referenced by MPLSAddressClassifier::delay_bind_init_all(), and Agent::delay_bind_init_all().

00058 {
00059         delay_bind_init_one("debug_");
00060 }

Packet * CBQueue::deque  )  [virtual]
 

Implements Queue< T >.

Reimplemented in WRR_CBQueue.

Definition at line 310 of file cbq.cc.

References active_, Scheduler::clock(), CBQClass::delayed(), CBQClass::demand(), Scheduler::instance(), CBQClass::lender_, maxprio_, CBQClass::peer_, pending_pkt_, CBQClass::permit_borrowing_, CBQClass::pri_, CBQClass::q_, Queue< T >::resume(), send_permitted(), toplevel(), toplevel_departure(), and CBQClass::update().

00311 {
00312 
00313         Scheduler& s = Scheduler::instance();
00314         double now = s.clock();
00315 
00316         CBQClass* first = NULL;
00317         CBQClass* eligible = NULL;
00318         CBQClass* cl;
00319         register int prio;
00320         Packet* rval;
00321 
00322         int none_found = 0;
00323 
00324         /*
00325          * prio runs from 0 .. maxprio_
00326          *
00327          * round-robin through all the classes at priority 'prio'
00328          *      if any class is ok to send, resume it's queue
00329          * go on to next lowest priority (higher prio nuber) and repeat
00330          * [lowest priority number is the highest priority]
00331          */
00332 
00333         for (prio = 0; prio <= maxprio_; prio++) {
00334                 // see if there is any class at this prio
00335                 if ((cl = active_[prio]) == NULL) {
00336                         // nobody at this prio level
00337                         continue;
00338                 }
00339 
00340                 // look for underlimit peer with something to send
00341                 do {
00342                         // anything to send?
00343                         if (cl->demand()) {
00344                                 if (first == NULL && cl->permit_borrowing_ && cl->lender_ != NULL)
00345                                         first = cl;
00346                                 if (send_permitted(cl, now)) {
00347                                         // ok to send
00348                                         eligible = cl;
00349                                         goto found;
00350                                 } else {
00351                                         // not ok right now
00352                                         cl->delayed(now);
00353                                 }
00354                         }
00355                         cl = cl->peer_; // move to next at same prio
00356                 } while (cl != active_[prio]);
00357         }
00358         // did not find anyone so let first go
00359         // eligible will be NULL at this point
00360         if (first != NULL) {
00361                 none_found = 1;
00362                 eligible = first;
00363         }
00364 
00365 found:
00366         if (eligible != NULL) {
00367                 active_[eligible->pri_] = eligible->peer_;
00368                 // eligible->q_->unblock();
00369                 eligible->q_->resume(); // fills in pending
00370                 if (pending_pkt_ && !none_found) {
00371                         eligible->update(pending_pkt_, now);
00372                         if (toplevel())
00373                                 toplevel_departure(eligible, now);
00374                 }
00375         }
00376         rval = pending_pkt_;
00377         pending_pkt_ = NULL;
00378 
00379         return (rval);
00380 }

Here is the call graph for this function:

template<class T>
QueueElem<T>* Queue< T >::dequeue  )  [inline, inherited]
 

Definition at line 378 of file mcache.h.

References Queue< T >::head_, QueueElem< T >::next(), QueueElem< T >::next_, Queue< T >::size_, and Queue< T >::tail_.

Referenced by Queue< T >::detach(), and MediaServer::get_next_segment().

00378                                 {
00379                 QueueElem<T> *p = head_;
00380                 if (head_ != 0) 
00381                         head_ = head_->next();
00382                 if (head_ == 0)
00383                         tail_ = 0;
00384                 p->next_ = 0;
00385                 size_--;
00386                 if (size_ == 0) 
00387                         assert((head_ == 0) && (tail_ == 0));
00388                 return p;
00389         }

Here is the call graph for this function:

template<class T>
virtual void Queue< T >::destroy  )  [inline, virtual, inherited]
 

Definition at line 358 of file mcache.h.

References QueueElem< T >::data(), Queue< T >::head_, and QueueElem< T >::next().

00358                                {
00359                 QueueElem<T> *p = head_, *q;
00360                 while (p != NULL) {
00361                         q = p;
00362                         p = p->next();
00363                         delete q->data();
00364                         delete q;
00365                 }
00366                 head_ = NULL;
00367         }

Here is the call graph for this function:

template<class T>
void Queue< T >::detach QueueElem< T > *  e  )  [inline, inherited]
 

Definition at line 390 of file mcache.h.

References Queue< T >::dequeue(), Queue< T >::head_, QueueElem< T >::next_, Queue< T >::size_, and Queue< T >::tail_.

Referenced by MediaServer::command().

00390                                      {
00391                 assert(head_ != 0);
00392                 if (head_ == e) {
00393                         dequeue();
00394                         return;
00395                 }
00396                 QueueElem<T> *p = head_;
00397                 while (p != NULL) {
00398                         if (p->next_ != e)
00399                                 p = p->next_;
00400                         else
00401                                 break;
00402                 }
00403                 assert(p != NULL);
00404                 p->next_ = e->next_;
00405                 if (tail_ == e)
00406                         tail_ = p;
00407                 size_--;
00408                 if (size_ == 0) 
00409                         assert((head_ == 0) && (tail_ == 0));
00410         }

Here is the call graph for this function:

void Connector::drop Packet p,
const char *  s
[protected, virtual, inherited]
 

Definition at line 114 of file connector.cc.

References Connector::drop_, Packet::free(), and NsObject::recv().

00115 {
00116         if (drop_ != 0)
00117                 drop_->recv(p, s);
00118         else
00119                 Packet::free(p);
00120 }

Here is the call graph for this function:

void Connector::drop Packet p  )  [virtual, inherited]
 

Definition at line 106 of file connector.cc.

References Connector::drop_, Packet::free(), and NsObject::recv().

Referenced by DSRAgent::acceptRouteReply(), ARPTable::arpresolve(), JoBS::dropFront(), Vq::dropPacketForECN(), DSRAgent::dropSendBuff(), JoBS::dropTail(), dsREDQueue::edrop(), Vq::enque(), SRR::enque(), SimpleIntServ::enque(), SFQ::enque(), rtqueue::enque(), RIOQueue::enque(), REMQueue::enque(), REDQueue::enque(), RedPDQueue::enque(), PIQueue::enque(), Marker::enque(), GK::enque(), dsREDQueue::enque(), DRR::enque(), DropTail::enque(), Demarker::enque(), aodv_rqueue::enque(), toraAgent::forward(), AODV::forward(), LandmarkAgent::ForwardPacket(), DSDV_Agent::forwardPacket(), DSRAgent::getRouteForPacket(), Snoop::handle(), DSRAgent::handleFlowForwarding(), DSRAgent::handleForwarding(), DSDV_Agent::lost_link(), TCPTapAgent::processpkt(), CMUPriQueue::prq_enqueue(), rtqueue::purge(), imepAgent::purgeReXmitQ(), SessionTTLChecker::recv(), TTLChecker::recv(), toraAgent::recv(), FullTcpAgent::recv(), BayFullTcpAgent::recv(), TBF::recv(), SatLL::recv(), LL::recv(), GAFPartner::recv(), FloodAgent::recv(), Filter::recv(), DynamicLink::recv(), DSDV_Agent::recv(), AODV::recv(), AODV::recvError(), PriQueue::recvHighPriority(), AODV::recvReply(), toraAgent::reset(), Queue< T >::reset(), LinkDelay::reset(), AODV::rt_ll_failed(), AODV::rt_purge(), AODV::rt_resolve(), toraAgent::rtRoutePacket(), TCPTapAgent::sendpkt(), TapAgent::sendpkt(), IPTapAgent::sendpkt(), AODV::sendRequest(), SatLL::sendUp(), LL::sendUp(), PriQueue::Terminate(), DSRAgent::Terminate(), CMUPriQueue::Terminate(), ARPTable::Terminate(), and DSRAgent::undeliverablePkt().

00107 {
00108         if (drop_ != 0)
00109                 drop_->recv(p);
00110         else
00111                 Packet::free(p);
00112 }

Here is the call graph for this function:

int CBQueue::eligible_ancestors CBQClass ,
double 
[inline, protected]
 

Definition at line 178 of file cbq.cc.

Referenced by find_lender().

00178 { return (1); }

int CBQueue::eligible_formal CBQClass ,
double 
[protected]
 

Definition at line 464 of file cbq.cc.

References LEAF_LEVEL, level(), CBQClass::level_, CBQClass::level_peer_, levels_, and CBQClass::satisfied().

Referenced by find_lender().

00465 {
00466         int level;
00467         CBQClass *p;
00468 
00469         // check from leaf level to (cl->level - 1)
00470         for (level = LEAF_LEVEL; level < cl->level_; level++) {
00471                 p = levels_[level];
00472                 while (p != NULL) {
00473                         if (!p->satisfied(now))
00474                                 return (0);
00475                         p = p->level_peer_;
00476                 }
00477         }
00478         return (1);
00479 }

Here is the call graph for this function:

int CBQueue::eligible_toplevel CBQClass cl,
double 
[inline, protected]
 

Definition at line 179 of file cbq.cc.

References CBQClass::level_, and toplevel_.

Referenced by find_lender().

00179                                                         {
00180                 return(cl->level_ <= toplevel_);
00181         }

void CBQueue::enque Packet  )  [inline, virtual]
 

Implements Queue< T >.

Definition at line 140 of file cbq.cc.

References abort().

00140 { abort(); }

Here is the call graph for this function:

template<class T>
void Queue< T >::enqueue QueueElem< T > *  e  )  [inline, inherited]
 

Definition at line 369 of file mcache.h.

References QueueElem< T >::append(), Queue< T >::head_, Queue< T >::size_, and Queue< T >::tail_.

Referenced by MediaServer::command(), and MediaServer::get_next_segment().

00369                                       {
00370                 if (tail_ == 0)
00371                         head_ = tail_ = e;
00372                 else {
00373                         tail_->append(e);
00374                         tail_ = e;
00375                 }
00376                 size_++;
00377         }

Here is the call graph for this function:

CBQClass * CBQueue::find_lender CBQClass ,
double 
[protected]
 

Definition at line 413 of file cbq.cc.

References abort(), ANCESTORS, eligible_, eligible_ancestors(), eligible_formal(), eligible_toplevel(), FORMAL, CBQClass::lender_, CBQClass::level_, CBQClass::permit_borrowing_, TOPLEVEL, toplevel(), toplevel_, and CBQClass::undertime_.

Referenced by send_permitted().

00414 {
00415         if ((!cl->permit_borrowing_) || ((cl = cl->lender_) == NULL))
00416                 return (NULL);          // no ancestor to borrow from
00417 
00418         while (cl != NULL) {
00419                 // skip past overlimit ancestors
00420                 //      if using TL and we're above the TL limit
00421                 //      do early out
00422                 if (cl->undertime_ > now) {
00423                         if (toplevel() && cl->level_ > toplevel_)
00424                                 return (NULL);
00425                         cl = cl->lender_;
00426                         continue;
00427                 }
00428 
00429                 // found what may be an eligible
00430                 // lender, check using per-algorithm eligibility
00431                 // criteria
00432                 // XXX we explicitly invoke this indirect method with
00433                 // the "this" pointer because MS VC++ can't parse it
00434                 // without it...
00435 //              if ((this->*eligible_)(cl, now))
00436 //                      return (cl);
00437                 switch (eligible_) {
00438                 case TOPLEVEL:
00439                         if (eligible_toplevel(cl, now))
00440                                 return (cl);
00441                         break;
00442                 case ANCESTORS:
00443                         if (eligible_ancestors(cl, now))
00444                                 return (cl);
00445                         break;
00446                 case FORMAL:
00447                         if (eligible_formal(cl, now))
00448                                 return (cl);
00449                         break;
00450                 default:
00451                         fprintf(stderr, "Wrong eligible_\n");
00452                         abort();
00453                 }
00454                 cl = cl->lender_;
00455         }
00456         return (cl);
00457 }

Here is the call graph for this function:

template<class T>
QueueElem<T>* Queue< T >::getHead  )  [inline, inherited]
 

Definition at line 411 of file mcache.h.

References Queue< T >::head_.

Referenced by MediaServer::find_prefinfo().

00411 { return head_; }

void NsObject::handle Event  )  [protected, virtual, inherited]
 

Implements Handler.

Reimplemented in LinkDelay, LL, AckRecons, and Snoop.

Definition at line 91 of file object.cc.

References NsObject::recv().

00092 {
00093         recv((Packet*)e);
00094 }

Here is the call graph for this function:

int CBQueue::insert_class CBQClass  )  [protected, virtual]
 

Reimplemented in WRR_CBQueue.

Definition at line 486 of file cbq.cc.

References active_, addallot(), CBQClass::allotment_, LinkDelay::bandwidth(), CBQClass::cbq_, CBQClass::level_, CBQClass::level_peer_, levels_, link_, MAXLEVEL, maxlevel_, MAXPRIO, maxprio_, CBQClass::maxrate_, CBQClass::peer_, CBQClass::pri_, and CBQClass::q_.

Referenced by command(), and WRR_CBQueue::insert_class().

00487 {
00488         p->cbq_ = this;
00489 
00490         /*
00491          * Add to circularly-linked list "active_"
00492          *    of peers for the given priority.
00493          */
00494 
00495         if (p->pri_ < 0 || p->pri_ > (MAXPRIO-1)) {
00496                 fprintf(stderr, "CBQ class %s has invalid pri %d\n",
00497                         p->name(), p->pri_);
00498                 return (-1);
00499         }
00500 
00501         if (p->q_ != NULL) {
00502                 // only leaf nodes (which have associated queues)
00503                 // are scheduled
00504                 if (active_[p->pri_] != NULL) {
00505                         p->peer_ = active_[p->pri_]->peer_;
00506                         active_[p->pri_]->peer_ = p;
00507                 } else {
00508                         p->peer_ = p;
00509                         active_[p->pri_] = p;
00510                 }
00511                 if (p->pri_ > maxprio_)
00512                         maxprio_ = p->pri_;
00513         }
00514 
00515         /*
00516          * Compute maxrate from allotment.
00517          * convert to bytes/sec
00518          *      and store the highest prio# we've seen
00519          */
00520 
00521         if (p->allotment_ < 0.0 || p->allotment_ > 1.0) {
00522                 fprintf(stderr, "CBQ class %s has invalid allot %f\n",
00523                         p->name(), p->allotment_);
00524                 return (-1);
00525         }
00526 
00527         if (link_ == NULL) {
00528                 fprintf(stderr, "CBQ obj %s has no link!\n", name());
00529                 return (-1);
00530         }
00531         if (link_->bandwidth() <= 0.0) {
00532                 fprintf(stderr, "CBQ obj %s has invalid link bw %f on link %s\n",
00533                         name(), link_->bandwidth(), link_->name());
00534                 return (-1);
00535         }
00536 
00537         p->maxrate_ = p->allotment_ * (link_->bandwidth() / 8.0);
00538         addallot(p->pri_, p->allotment_);
00539 
00540         /*
00541          * Add to per-level list
00542          *      and store the highest level# we've seen
00543          */
00544 
00545         if (p->level_ <= 0 || p->level_ > MAXLEVEL) {
00546                 fprintf(stderr, "CBQ class %s has invalid level %d\n",
00547                         p->name(), p->level_);
00548                 return (-1);
00549         }
00550 
00551         p->level_peer_ = levels_[p->level_];
00552         levels_[p->level_] = p;
00553         if (p->level_ > maxlevel_)
00554                 maxlevel_ = p->level_;
00555 
00556         /*
00557          * Check that parent and borrow linkage are acyclic.
00558          */
00559 #ifdef notdef
00560         check_for_cycles(CBQClass::parent);
00561         check_for_cycles(CBQClass::borrow);
00562 #endif
00563         return 0;
00564 }

Here is the call graph for this function:

template<class T>
int Queue< T >::is_empty  )  const [inline, inherited]
 

Definition at line 412 of file mcache.h.

References Queue< T >::size_.

Referenced by MediaServer::command(), and MediaServer::get_next_segment().

00412 { return (size_ == 0); }

int NsObject::isdebug  )  const [inline, inherited]
 

Definition at line 61 of file object.h.

References NsObject::debug_.

00061 { return debug_; }

template<class T>
int Queue< T >::length  )  [inline, inherited]
 

Reimplemented in DRR, and SRR.

Definition at line 133 of file queue.h.

References PacketQueue::length(), and Queue< T >::pq_.

Referenced by REMQueue::run_updaterule(), Snoop::snoop_data(), and JoBS::updateStats().

00133 { return pq_->length(); }       /* number of pkts currently in

Here is the call graph for this function:

CBQClass* CBQueue::level int  n  )  const [inline]
 

Definition at line 143 of file cbq.cc.

References levels_.

Referenced by CBQClass::desc_with_demand(), and eligible_formal().

00143 { return levels_[n]; }

template<class T>
int Queue< T >::limit  )  [inline, inherited]
 

Definition at line 132 of file queue.h.

References Queue< T >::qlim_.

Referenced by dsREDQueue::reset(), and Snoop::snoop_data().

00132 { return qlim_; }

LinkDelay* CBQueue::link  )  const [inline]
 

Definition at line 142 of file cbq.cc.

References link_.

Referenced by CBQClass::newallot(), and CBQClass::update().

00142 { return (link_); }

Packet* CBQueue::pending_pkt  )  const [inline]
 

Definition at line 147 of file cbq.cc.

References pending_pkt_.

00147 { return (pending_pkt_); }

void NsObject::recv Packet p,
const char *  s
[virtual, inherited]
 

Reimplemented in CMUTrace.

Definition at line 96 of file object.cc.

References Packet::free().

00097 {
00098         Packet::free(p);
00099 }

Here is the call graph for this function:

void CBQueue::recv Packet ,
Handler
[virtual]
 

Reimplemented from Queue< T >.

Definition at line 228 of file cbq.cc.

References abort(), Queue< T >::blocked_, and pending_pkt_.

00229 {
00230 
00231         if (pending_pkt_ != NULL)
00232                 abort();
00233 
00234         blocked_ = 1;
00235         pending_pkt_ = p;
00236 }

Here is the call graph for this function:

virtual void NsObject::recvOnly Packet  )  [inline, virtual, inherited]
 

Reimplemented in Agent, and Trace.

Definition at line 56 of file object.h.

Referenced by Trace::recvOnly().

00056 {};

void CBQueue::reset  )  [virtual]
 

Reimplemented from Queue< T >.

Definition at line 239 of file cbq.cc.

00240 {
00241         // don't do anything
00242         // in particular, don't let Queue::reset() call
00243         // our deque() method
00244 }

template<class T>
void Queue< T >::resume  )  [inherited]
 

Definition at line 154 of file queue.cc.

References Queue< T >::blocked_, Scheduler::clock(), Queue< T >::deque(), Scheduler::instance(), Queue< T >::last_change_, Queue< T >::qh_, NsObject::recv(), Connector::target_, Queue< T >::unblock_on_resume_, and Queue< T >::utilUpdate().

Referenced by WRR_CBQueue::deque(), deque(), and QueueHandler::handle().

00155 {
00156         double now = Scheduler::instance().clock();
00157         Packet* p = deque();
00158         if (p != 0) {
00159                 target_->recv(p, &qh_);
00160         } else {
00161                 if (unblock_on_resume_) {
00162                         utilUpdate(last_change_, now, blocked_);
00163                         last_change_ = now;
00164                         blocked_ = 0;
00165                 }
00166                 else {
00167                         utilUpdate(last_change_, now, blocked_);
00168                         last_change_ = now;
00169                         blocked_ = 1;
00170                 }
00171         }
00172 }

Here is the call graph for this function:

void CBQueue::sched  ) 
 

Definition at line 215 of file cbq.cc.

References Queue< T >::blocked_, Scheduler::instance(), intr_, Queue< T >::qh_, and Scheduler::schedule().

Referenced by CBQClass::recv().

00216 {
00217         Scheduler& s = Scheduler::instance();
00218         blocked_ = 1;
00219         s.schedule(&qh_, &intr_, 0);
00220 }

Here is the call graph for this function:

void Connector::send Packet p,
Handler h
[inline, protected, inherited]
 

Reimplemented in Agent, and LinkDelay.

Definition at line 54 of file connector.h.

References NsObject::recv(), and Connector::target_.

Referenced by SessionTTLChecker::recv(), TTLChecker::recv(), DequeTrace::recv(), Trace::recv(), TraceIpMac::recv(), TraceIp::recv(), SatDequeTrace::recv(), SALink::recv(), SnoopQueueEDrop::recv(), SnoopQueueTagger::recv(), SnoopQueueDrop::recv(), SnoopQueueOut::recv(), SnoopQueueIn::recv(), PktCounter::recv(), NetworkInterface::recv(), MeasureMod::recv(), Filter::recv(), Connector::recv(), CMUTrace::recv(), CBQClass::recv(), and AddSR::recv().

00054 { target_->recv(p, h); }

Here is the call graph for this function:

int CBQueue::send_permitted CBQClass ,
double 
[protected]
 

Definition at line 390 of file cbq.cc.

References CBQClass::delayed_, find_lender(), last_lender_, CBQClass::permit_borrowing_, and CBQClass::undertime_.

Referenced by WRR_CBQueue::deque(), and deque().

00391 {
00392         if (cl->undertime_ < now) {
00393                 cl->delayed_ = 0;
00394                 last_lender_ = cl;
00395                 return (1);
00396         } else if (cl->permit_borrowing_ &&
00397                    (((cl = find_lender(cl, now)) != NULL))) {
00398                 last_lender_ = cl;
00399                 return (1);
00400         }
00401         return (0);
00402 }

Here is the call graph for this function:

template<class T>
int Queue< T >::size  )  const [inline, inherited]
 

Definition at line 413 of file mcache.h.

References Queue< T >::size_.

Referenced by JoBS::arvAccounting(), JoBS::assignRateDropsADC(), dsREDQueue::deque(), JoBS::dropFront(), JoBS::dropTail(), RedPDQueue::enque(), JoBS::enque(), MediaServer::get_next_segment(), JoBS::pickDroppedRLC(), and FQ::recv().

00413 { return size_; }

NsObject* Connector::target  )  [inline, inherited]
 

Definition at line 48 of file connector.h.

References Connector::target_.

Referenced by JoBS::assignRateDropsADC(), FQ::deque(), QSAgent::recv(), and MIPMHAgent::reg().

00048 { return target_; }

int CBQueue::toplevel  )  [inline]
 

Definition at line 149 of file cbq.cc.

References eligible_, and TOPLEVEL.

Referenced by WRR_CBQueue::deque(), deque(), find_lender(), and CBQClass::recv().

00149                                    {    // are we using toplevel?
00150 //              return (eligible_ == &eligible_toplevel);
00151                 return (eligible_ == TOPLEVEL);
00152         }

void CBQueue::toplevel_arrival CBQClass ,
double 
 

Definition at line 289 of file cbq.cc.

References CBQClass::lender_, CBQClass::permit_borrowing_, toplevel_, and CBQClass::undertime_.

Referenced by CBQClass::recv().

00290 {
00291         if (toplevel_ > 1) {
00292                 if (cl->undertime_ < now)
00293                         toplevel_ = 1;
00294                 else if (toplevel_ > 2 && cl->permit_borrowing_ && cl->lender_ != NULL) {
00295                         if (cl->lender_->undertime_ < now)
00296                                 toplevel_ = 2;
00297                 }
00298         }
00299 }

void CBQueue::toplevel_departure CBQClass ,
double 
[protected]
 

Definition at line 276 of file cbq.cc.

References last_lender_, CBQClass::level_, MAXLEVEL, QueueMonitor::pkts(), CBQClass::qmon_, toplevel_, and CBQClass::undertime_.

Referenced by WRR_CBQueue::deque(), and deque().

00277 {
00278         if (toplevel_ >= last_lender_->level_) {
00279                 if ((cl->qmon_->pkts() <= 1) ||
00280                     last_lender_->undertime_ > now) {
00281                         toplevel_ = MAXLEVEL;
00282                 } else {
00283                         toplevel_ = last_lender_->level_;
00284                 }
00285         }
00286 }

Here is the call graph for this function:

template<class T>
void Queue< T >::unblock  )  [inline, inherited]
 

Definition at line 130 of file queue.h.

References Queue< T >::blocked_.

00130 { blocked_ = 0; }

template<class T>
void Queue< T >::updateStats int  queuesize  )  [virtual, inherited]
 

Definition at line 141 of file queue.cc.

References Scheduler::clock(), Scheduler::instance(), Queue< T >::total_time_, and Queue< T >::true_ave_.

Referenced by REDQueue::deque(), DropTail::deque(), REDQueue::enque(), and DropTail::enque().

00142 {
00143         double now = Scheduler::instance().clock();
00144         double newtime = now - total_time_;
00145         if (newtime > 0.0) {
00146                 double oldave = true_ave_;
00147                 double oldtime = total_time_;
00148                 double newtime = now - total_time_;
00149                 true_ave_ = (oldtime * oldave + newtime * queuesize) /now;
00150                 total_time_ = now;
00151         }
00152 }

Here is the call graph for this function:

template<class T>
double Queue< T >::utilization void   )  [virtual, inherited]
 

Definition at line 130 of file queue.cc.

References Queue< T >::blocked_, Scheduler::clock(), Scheduler::instance(), Queue< T >::last_change_, Queue< T >::old_util_, and Queue< T >::utilUpdate().

Referenced by QSAgent::recv().

00131 {
00132         double now = Scheduler::instance().clock();
00133         
00134         utilUpdate(last_change_, now, blocked_);
00135         last_change_ = now;
00136 
00137         return old_util_;
00138                         
00139 }

Here is the call graph for this function:

template<class T>
void Queue< T >::utilUpdate double  int_begin,
double  int_end,
int  link_state
[protected, inherited]
 

Definition at line 122 of file queue.cc.

References Queue< T >::old_util_, and Queue< T >::util_weight_.

Referenced by Queue< T >::recv(), Queue< T >::resume(), and Queue< T >::utilization().

00122                                                                        {
00123 double decay;
00124 
00125         decay = exp(-util_weight_ * (int_end - int_begin));
00126         old_util_ = link_state + (old_util_ - link_state) * decay;
00127 
00128 }


Member Data Documentation

CBQClass* CBQueue::active_[MAXPRIO] [protected]
 

Definition at line 166 of file cbq.cc.

Referenced by CBQueue(), WRR_CBQueue::deque(), deque(), and insert_class().

template<class T>
int Queue< T >::blocked_ [protected, inherited]
 

Definition at line 143 of file queue.h.

Referenced by Queue< T >::block(), Queue< T >::blocked(), Queue< T >::Queue(), Queue< T >::recv(), FQ::recv(), recv(), PriQueue::recvHighPriority(), Queue< T >::resume(), sched(), Queue< T >::unblock(), and Queue< T >::utilization().

int NsObject::debug_ [protected, inherited]
 

Reimplemented in FECModel, FloodAgent, and LandmarkAgent.

Definition at line 66 of file object.h.

Referenced by REDQueue::command(), RedPDQueue::command(), PushbackQueue::command(), NsObject::debug(), NsObject::delay_bind_dispatch(), RedPDQueue::enque(), PushbackQueue::enque(), NsObject::isdebug(), NsObject::NsObject(), TfrcAgent::recv(), PushbackQueue::reportDrop(), and REDQueue::reset().

NsObject* Connector::drop_ [protected, inherited]
 

Definition at line 57 of file connector.h.

Referenced by Connector::command(), Connector::drop(), and ErrorModel::recv().

eligible_type_ CBQueue::eligible_ [protected]
 

Definition at line 176 of file cbq.cc.

Referenced by algorithm(), find_lender(), and toplevel().

template<class T>
QueueElem<T>* Queue< T >::head_ [protected, inherited]
 

Definition at line 416 of file mcache.h.

Referenced by Queue< T >::dequeue(), Queue< T >::destroy(), Queue< T >::detach(), Queue< T >::enqueue(), Queue< T >::getHead(), Queue< T >::Queue(), Queue< T >::reset(), and Queue< T >::~Queue().

Event CBQueue::intr_ [protected]
 

Definition at line 155 of file cbq.cc.

Referenced by sched().

template<class T>
double Queue< T >::last_change_ [protected, inherited]
 

Definition at line 154 of file queue.h.

Referenced by Queue< T >::recv(), Queue< T >::resume(), and Queue< T >::utilization().

CBQClass* CBQueue::last_lender_ [protected]
 

Definition at line 162 of file cbq.cc.

Referenced by send_permitted(), and toplevel_departure().

CBQClass* CBQueue::levels_[MAXLEVEL+1] [protected]
 

Definition at line 167 of file cbq.cc.

Referenced by CBQueue(), eligible_formal(), insert_class(), and level().

LinkDelay* CBQueue::link_ [protected]
 

Definition at line 164 of file cbq.cc.

Referenced by command(), insert_class(), and link().

int CBQueue::maxlevel_ [protected]
 

Definition at line 170 of file cbq.cc.

Referenced by insert_class().

int CBQueue::maxpkt_ [protected]
 

Definition at line 169 of file cbq.cc.

Referenced by CBQueue(), and WRR_CBQueue::setM().

int CBQueue::maxprio_ [protected]
 

Definition at line 168 of file cbq.cc.

Referenced by WRR_CBQueue::deque(), deque(), insert_class(), and WRR_CBQueue::setM().

template<class T>
double Queue< T >::old_util_ [protected, inherited]
 

Definition at line 155 of file queue.h.

Referenced by Queue< T >::utilization(), and Queue< T >::utilUpdate().

Packet* CBQueue::pending_pkt_ [protected]
 

Definition at line 163 of file cbq.cc.

Referenced by WRR_CBQueue::deque(), deque(), pending_pkt(), and recv().

template<class T>
PacketQueue* Queue< T >::pq_ [protected, inherited]
 

Definition at line 146 of file queue.h.

Referenced by Queue< T >::byteLength(), Vq::command(), REMQueue::command(), REDQueue::command(), PIQueue::command(), GK::command(), DropTail::command(), DropTail::DropTail(), GK::GK(), Queue< T >::length(), SemanticRIOQueue::pickPacketForECN(), SemanticREDQueue::pickPacketForECN(), SemanticRIOQueue::pickPacketToDrop(), SemanticREDQueue::pickPacketToDrop(), PIQueue::PIQueue(), REDQueue::REDQueue(), REMQueue::REMQueue(), and Vq::Vq().

template<class T>
QueueHandler Queue< T >::qh_ [protected, inherited]
 

Definition at line 145 of file queue.h.

Referenced by Queue< T >::recv(), FQ::recv(), PriQueue::recvHighPriority(), Queue< T >::resume(), and sched().

template<class T>
int Queue< T >::qlim_ [protected, inherited]
 

Definition at line 142 of file queue.h.

Referenced by Vq::checkPacketForECN(), Vq::enque(), SRR::enque(), RIOQueue::enque(), REMQueue::enque(), REDQueue::enque(), PIQueue::enque(), Marker::enque(), JoBS::enque(), GK::enque(), DropTail::enque(), Demarker::enque(), Queue< T >::limit(), RIOQueue::print_edp(), REDQueue::print_edp(), Queue< T >::Queue(), and PriQueue::recvHighPriority().

template<class T>
int Queue< T >::size_ [protected, inherited]
 

Definition at line 417 of file mcache.h.

Referenced by Queue< T >::dequeue(), Queue< T >::detach(), Queue< T >::enqueue(), Queue< T >::is_empty(), Queue< T >::Queue(), and Queue< T >::size().

template<class T>
QueueElem<T> * Queue< T >::tail_ [protected, inherited]
 

Definition at line 416 of file mcache.h.

Referenced by Queue< T >::dequeue(), Queue< T >::detach(), Queue< T >::enqueue(), and Queue< T >::Queue().

NsObject* Connector::target_ [protected, inherited]
 

Definition at line 56 of file connector.h.

Referenced by SRAgent::command(), SA_Agent::command(), IvsReceiver::command(), MultiFieldFilter::command(), Filter::command(), Connector::command(), DiffusionAgent::DiffusionAgent(), DSRAgent::DSRAgent(), PromotionTimer::expire(), FloodingAgent::FloodingAgent(), toraAgent::forward(), AODV::forward(), LandmarkAgent::ForwardPacket(), DSDV_Agent::forwardPacket(), SensorQueryAgent::generate_query(), DSDVTriggerHandler::handle(), AckRecons::handle(), DSRAgent::handlePacketReceipt(), DSDV_Agent::helper_callback(), AODV::initialized(), DSDV_Agent::lost_link(), OmniMcastAgent::OmniMcastAgent(), LandmarkAgent::periodic_callback(), LandmarkAgent::ProcessHierUpdate(), TCPTapAgent::processpkt(), IPTapAgent::processpkt(), CMUPriQueue::prq_enqueue(), CMUPriQueue::prq_resume(), DequeTrace::recv(), Trace::recv(), TraceIpMac::recv(), TraceIp::recv(), TBF::recv(), SRMAgent::recv(), SSMSRMAgent::recv(), SatDequeTrace::recv(), SAack_Agent::recv(), Queue< T >::recv(), PingResponder::recv(), MIPEncapsulator::recv(), LmsAgent::recv(), HackLossyLink::recv(), GAFPartner::recv(), FQ::recv(), FloodAgent::recv(), ErrorModel::recv(), DynamicLink::recv(), DumbAgent::recv(), DSRAgent::recv(), DelayModel::recv(), LinkDelay::recv(), CtrMcastDecap::recv(), CtrMcastEncap::recv(), CMUTrace::recv(), PriQueue::recvHighPriority(), Trace::recvOnly(), TapAgent::recvpkt(), Queue< T >::resume(), LinkDelay::send(), Connector::send(), Agent::send(), MIPBSAgent::send_ads(), SRMAgent::send_ctrl(), SSMSRMAgent::send_ctrl(), MFTPSndAgent::send_data(), LmsSender::send_dmcast(), LmsReceiver::send_dmcast(), LmsAgent::send_downstream(), SSMSRMAgent::send_glb_sess(), LmsSender::send_lms_pkt(), SSMSRMAgent::send_loc_sess(), MFTPRcvAgent::send_nak(), LmsReceiver::send_nak(), LmsReceiver::send_refresh(), SSMSRMAgent::send_rep_sess(), SRMAgent::send_sess(), MIPMHAgent::send_sols(), LmsSender::send_spm(), MFTPSndAgent::send_status_request(), LmsAgent::send_upstream(), LandmarkAgent::SendChangedTagListUpdate(), AODV::sendError(), AODV::sendHello(), UdpAgent::sendmsg(), SRMAgent::sendmsg(), SA_Agent::sendmsg(), RTPAgent::sendmsg(), LmsSender::sendmsg(), DSDV_Agent::sendOutBCastPkt(), SA_Agent::sendpkt(), rtProtoDV::sendpkt(), RTPAgent::sendpkt(), RTCPAgent::sendpkt(), IvsSource::sendpkt(), AODV::sendReply(), AODV::sendRequest(), LmsSender::solicit_naks(), Connector::target(), TBF::timeout(), and toraAgent::tora_output().

int CBQueue::toplevel_ [protected]
 

Definition at line 171 of file cbq.cc.

Referenced by eligible_toplevel(), find_lender(), toplevel_arrival(), and toplevel_departure().

template<class T>
double Queue< T >::total_time_ [protected, inherited]
 

Definition at line 150 of file queue.h.

Referenced by REDQueue::print_summarystats(), DropTail::print_summarystats(), Queue< T >::reset(), and Queue< T >::updateStats().

template<class T>
double Queue< T >::true_ave_ [protected, inherited]
 

Definition at line 149 of file queue.h.

Referenced by REDQueue::print_summarystats(), DropTail::print_summarystats(), Queue< T >::reset(), and Queue< T >::updateStats().

template<class T>
int Queue< T >::unblock_on_resume_ [protected, inherited]
 

Definition at line 144 of file queue.h.

Referenced by Queue< T >::Queue(), and Queue< T >::resume().

template<class T>
double Queue< T >::util_weight_ [protected, inherited]
 

Definition at line 156 of file queue.h.

Referenced by Queue< T >::Queue(), and Queue< T >::utilUpdate().


The documentation for this class was generated from the following file:
Generated on Tue Apr 20 12:35:26 2004 for NS2.26SourcesOriginal by doxygen 1.3.3