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

PushbackQueue Class Reference

#include <pushback-queue.h>

Inheritance diagram for PushbackQueue:

Inheritance graph
[legend]
Collaboration diagram for PushbackQueue:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 PushbackQueue (const char *const)
virtual void reportDrop (Packet *pkt)
void enque (Packet *p)
int command (int, const char *const *)
void timeout (int)
double getBW ()
double getRate ()
double getDropRate ()
virtual void recv (Packet *, Handler *)
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,...)

Public Attributes

PushbackAgentpushback_
int verbose_
RateLimitSessionListrlsList_
RateEstimatorrateEstimator_

Protected Member Functions

virtual PacketpickPacketForECN (Packet *pkt)
virtual PacketpickPacketToDrop ()
Packetdeque ()
void initialize_params ()
void reset ()
void run_estimator (int nqueued, int m)
double estimator (int nqueued, int m, double ave, double q_w)
void updateMaxP (double new_ave, double now)
void updateMaxPFeng (double new_ave)
int drop_early (Packet *pkt)
double modify_p (double p, int count, int count_bytes, int bytes, int mean_pktsize, int wait, int size)
double calculate_p_new (double v_ave, double th_max, int gentle, double v_a, double v_b, double v_c, double v_d, double max_p)
double calculate_p (double v_ave, double th_max, int gentle, double v_a, double v_b, double v_c, double v_d, double max_p_inv)
void print_summarystats ()
int bcount_ ()
void trace (TracedVar *)
void print_edp ()
void print_edv ()
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

int pushbackID_
int src_
int dst_
int rate_limiting_
EDQueueMonitorqmon_
PushbackQueueTimertimer_
NsObjectRLDropTrace_
int summarystats_
LinkDelaylink_
int fifo_
PacketQueueq_
int qib_
NsObjectde_drop_
NsObjectEDTrace
char traceType [20]
Tcl_Channel tchan_
TracedInt curq_
int drop_tail_
int drop_front_
int drop_rand_
int ns1_compat_
edp edp_
int doubleq_
int dqthresh_
int idle_
double idletime_
edv edv_
int first_reset_
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_

Constructor & Destructor Documentation

PushbackQueue::PushbackQueue const char *  const  ) 
 

Definition at line 59 of file pushback-queue.cc.

References PushbackAgent::last_index_, pushback_, pushbackID_, rate_limiting_, rateEstimator_, TimerHandler::resched(), rlsList_, SUSTAINED_CONGESTION_PERIOD, timer_, PushbackAgent::verbose_, and verbose_.

00059                                                  : pushbackID_(-1), src_(-1), dst_(-1), 
00060   qmon_(NULL), RLDropTrace_(NULL) {
00061   
00062   pushback_ = (PushbackAgent *)TclObject::lookup(pba);
00063   if (pushback_ == NULL) {
00064     printf("Wrong Argument for Pushback Queue Constructor\n");
00065     exit(-1);
00066   }
00067   bind("pushbackID_", &pushbackID_);
00068   bind_bool("rate_limiting_", &rate_limiting_);
00069   verbose_ = pushback_->verbose_;
00070   
00071   timer_ = new PushbackQueueTimer(this);
00072   timer_->resched(SUSTAINED_CONGESTION_PERIOD);
00073 
00074   rateEstimator_=new RateEstimator();
00075   rlsList_ = new RateLimitSessionList();
00076   if (verbose_) printf("pushback queue instantiated %d\n",pushback_->last_index_);
00077   
00078 }

Here is the call graph for this function:


Member Function Documentation

int REDQueue::bcount_  )  [inline, protected, inherited]
 

Definition at line 167 of file red.h.

References PacketQueue::byteLength(), and REDQueue::q_.

00167 { return q_->byteLength(); };           

Here is the call graph for this function:

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:

double REDQueue::calculate_p double  v_ave,
double  th_max,
int  gentle,
double  v_a,
double  v_b,
double  v_c,
double  v_d,
double  max_p_inv
[protected, inherited]
 

Definition at line 394 of file red.cc.

References REDQueue::calculate_p_new().

Referenced by RIOQueue::drop_in_early(), and RIOQueue::drop_out_early().

00396 {
00397         double p = calculate_p_new(v_ave, th_max, gentle, v_a,
00398                 v_b, v_c, v_d, 1.0 / max_p_inv);
00399         return p;
00400 }

Here is the call graph for this function:

double REDQueue::calculate_p_new double  v_ave,
double  th_max,
int  gentle,
double  v_a,
double  v_b,
double  v_c,
double  v_d,
double  max_p
[protected, inherited]
 

Definition at line 370 of file red.cc.

Referenced by REDQueue::calculate_p(), and REDQueue::drop_early().

00372 {
00373         double p;
00374         if (gentle && v_ave >= th_max) {
00375                 // p ranges from max_p to 1 as the average queue
00376                 // size ranges from th_max to twice th_max 
00377                 p = v_c * v_ave + v_d;
00378         } else {
00379                 // p ranges from 0 to max_p as the average queue
00380                 // size ranges from th_min to th_max 
00381                 p = v_a * v_ave + v_b;
00382                 p *= max_p;
00383         }
00384         if (p > 1.0)
00385                 p = 1.0;
00386         return p;
00387 }

int PushbackQueue::command int  ,
const char *const * 
[virtual]
 

Reimplemented from REDQueue.

Definition at line 91 of file pushback-queue.cc.

References REDQueue::command(), NsObject::debug_, dst_, qmon_, RLDropTrace_, and src_.

00092 {
00093   Tcl& tcl = Tcl::instance();
00094   if (argc==2) {
00095           if (strcmp(argv[1], "rldrop-trace") == 0) {
00096                   if (RLDropTrace_ != NULL) {
00097                           tcl.resultf("%s", RLDropTrace_->name());
00098                   }
00099                   else {
00100                           tcl.resultf("0");
00101                   }
00102                   return (TCL_OK);
00103           }
00104           
00105   }
00106   else if (argc == 3) {
00107           if (strcmp(argv[1], "set-monitor") == 0) {
00108                   qmon_ = (EDQueueMonitor *)TclObject::lookup(argv[2]);
00109                   if (qmon_ == NULL) {
00110                           tcl.resultf("Got Invalid Queue Monitor\n");
00111                           return TCL_ERROR;
00112                   }
00113                   return TCL_OK;
00114           }
00115           else if (strcmp(argv[1], "rldrop-trace") == 0) {
00116                   
00117                   RLDropTrace_ = (NsObject *) TclObject::lookup(argv[2]);
00118                   if (RLDropTrace_ == NULL) {
00119                           if (debug_) printf("Error Attaching Trace\n");
00120                           return (TCL_ERROR);
00121                   }
00122                   if (debug_) 
00123                           printf("PBQ: RLDropTrace Set to %s\n", RLDropTrace_->name());
00124                   return (TCL_OK);
00125          }
00126   } else if (argc == 4) {
00127      if (strcmp(argv[1], "set-src-dst") == 0) {
00128        src_ = atoi(argv[2]);
00129        dst_ = atoi(argv[3]);
00130        if (src_ < 0 || dst_ < 0) {
00131          tcl.resultf("Got Invalid Source or Destination\n");
00132          return TCL_ERROR;
00133        }
00134        return TCL_OK;
00135      }
00136   } 
00137   
00138   return REDQueue::command(argc, argv);
00139 }

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 * REDQueue::deque  )  [protected, virtual, inherited]
 

Implements Queue< T >.

Reimplemented in RIOQueue.

Definition at line 344 of file red.cc.

References PacketQueue::byteLength(), Scheduler::clock(), PacketQueue::deque(), REDQueue::idle_, REDQueue::idletime_, Scheduler::instance(), PacketQueue::length(), REDQueue::q_, REDQueue::qib_, REDQueue::summarystats_, and Queue< T >::updateStats().

Referenced by RIOQueue::deque().

00345 {
00346         Packet *p;
00347         if (summarystats_ && &Scheduler::instance() != NULL) {
00348                 Queue::updateStats(qib_?q_->byteLength():q_->length());
00349         }
00350         p = q_->deque();
00351         if (p != 0) {
00352                 idle_ = 0;
00353         } else {
00354                 idle_ = 1;
00355                 // deque() may invoked by Queue::reset at init
00356                 // time (before the scheduler is instantiated).
00357                 // deal with this case
00358                 if (&Scheduler::instance() != NULL)
00359                         idletime_ = Scheduler::instance().clock();
00360                 else
00361                         idletime_ = 0.0;
00362         }
00363         return (p);
00364 }

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 REDQueue::drop_early Packet pkt  )  [protected, inherited]
 

Definition at line 441 of file red.cc.

References hdr_flags::access(), hdr_cmn::access(), PacketQueue::byteLength(), edp::bytes, REDQueue::calculate_p_new(), edp::cautious, hdr_flags::ce(), edv::count, edv::count_bytes, edv::cur_max_p, hdr_flags::ect(), REDQueue::edp_, REDQueue::edv_, edp::gentle, PacketQueue::length(), edp::mark_p, edp::mean_pktsize, REDQueue::modify_p(), REDQueue::pickPacketForECN(), pow(), edp::ptc, REDQueue::q_, edp::q_w, REDQueue::qib_, edp::setbit, hdr_cmn::size(), edp::th_max, Random::uniform(), edv::v_a, edv::v_ave, edv::v_b, edv::v_c, edv::v_d, edv::v_prob, edv::v_prob1, and edp::wait.

Referenced by REDQueue::enque().

00442 {
00443         hdr_cmn* ch = hdr_cmn::access(pkt);
00444 
00445         edv_.v_prob1 = calculate_p_new(edv_.v_ave, edp_.th_max, edp_.gentle, 
00446           edv_.v_a, edv_.v_b, edv_.v_c, edv_.v_d, edv_.cur_max_p);
00447         edv_.v_prob = modify_p(edv_.v_prob1, edv_.count, edv_.count_bytes,
00448           edp_.bytes, edp_.mean_pktsize, edp_.wait, ch->size());
00449 
00450         // drop probability is computed, pick random number and act
00451         if (edp_.cautious == 1) {
00452                  // Don't drop/mark if the instantaneous queue is much
00453                  //  below the average.
00454                  // For experimental purposes only.
00455                 int qsize = qib_?q_->byteLength():q_->length();
00456                 // pkts: the number of packets arriving in 50 ms
00457                 double pkts = edp_.ptc * 0.05;
00458                 double fraction = pow( (1-edp_.q_w), pkts);
00459                 // double fraction = 0.9;
00460                 if ((double) qsize < fraction * edv_.v_ave) {
00461                         // queue could have been empty for 0.05 seconds
00462                         // printf("fraction: %5.2f\n", fraction);
00463                         return (0);
00464                 }
00465         }
00466         double u = Random::uniform();
00467         if (edp_.cautious == 2) {
00468                 // Decrease the drop probability if the instantaneous
00469                 //   queue is much below the average.
00470                 // For experimental purposes only.
00471                 int qsize = qib_?q_->byteLength():q_->length();
00472                 // pkts: the number of packets arriving in 50 ms
00473                 double pkts = edp_.ptc * 0.05;
00474                 double fraction = pow( (1-edp_.q_w), pkts);
00475                 // double fraction = 0.9;
00476                 double ratio = qsize / (fraction * edv_.v_ave);
00477                 if (ratio < 1.0) {
00478                         // printf("ratio: %5.2f\n", ratio);
00479                         u *= 1.0 / ratio;
00480                 }
00481         }
00482         if (u <= edv_.v_prob) {
00483                 // DROP or MARK
00484                 edv_.count = 0;
00485                 edv_.count_bytes = 0;
00486                 hdr_flags* hf = hdr_flags::access(pickPacketForECN(pkt));
00487                 if (edp_.setbit && hf->ect() && edv_.v_prob1 < edp_.mark_p) { 
00488                         hf->ce() = 1;   // mark Congestion Experienced bit
00489                         // Tell the queue monitor here - call emark(pkt)
00490                         return (0);     // no drop
00491                 } else {
00492                         return (1);     // drop
00493                 }
00494         }
00495         return (0);                     // no DROP/mark
00496 }

Here is the call graph for this function:

void PushbackQueue::enque Packet p  )  [virtual]
 

Reimplemented from REDQueue.

Definition at line 193 of file pushback-queue.cc.

References PacketQueue::byteLength(), NsObject::debug_, dst_, REDQueue::edp_, REDQueue::edv_, REDQueue::enque(), PacketQueue::enqueHead(), RateEstimator::estimateRate(), RateLimitSessionList::filter(), Packet::free(), getDropRate(), HDR_CMN, PacketQueue::length(), EDQueueMonitor::mon_edrop(), RateLimitSessionList::noSessions_, PT_PUSHBACK, hdr_cmn::ptype(), hdr_cmn::ptype_, REDQueue::q_, REDQueue::qib_, qmon_, rateEstimator_, RLDropTrace_, rlsList_, src_, TARGET_DROPRATE, edp::th_min, edv::v_ave, and verbose_.

00193                               {
00194 
00195   hdr_cmn * hdr = HDR_CMN(p);
00196 
00197   if (debug_) 
00198     printf("In queue enque with ptype %d %d\n", hdr->ptype(), PT_PUSHBACK);
00199 
00200   if (hdr->ptype_ == PT_PUSHBACK) {
00201           if (verbose_) printf("PBQ:(%d:%d). Got a pushback packet.\n",src_, dst_);
00202           q_->enqueHead(p);
00203           return;
00204   }
00205 
00206   int dropped = 0;
00207   //set lowDemand to 0 to switch off the low-demand feature.
00208   int qlen = qib_ ? q_->byteLength() : q_->length();
00209   int lowDemand = (edv_.v_ave < edp_.th_min || qlen < 1 || getDropRate() < 0.1*TARGET_DROPRATE );
00210   //  lowDemand = 0;
00211   
00212   //this would 
00213   // 1. check to see if a packet belongs to any of the aggregate being rate-limited
00214   // 2. if yes, log the packet and 
00215   // 3. drop it if necessary (based on rate-limiting dynamics).
00216   // 4. dropped = 1, if dropped.
00217   if (rlsList_->noSessions_) 
00218     dropped = rlsList_->filter(p, lowDemand);
00219   
00220   if (dropped) {
00221     //first trace the monitored early drop
00222           if (RLDropTrace_!= NULL) 
00223                   ((Trace *)RLDropTrace_)->recvOnly(p);
00224                   
00225           qmon_->mon_edrop(p);
00226           
00227           //this is buggy. 
00228           //this drop is not recorded by any other monitor attached to the link.
00229           Packet::free(p);
00230           return;
00231   }
00232   
00233   //estimate rate only for enqued packets (insignificant bw of pushback messages).
00234   //also counts packet not dropped because of low demand (minor effects to overall demand calculations I believe).
00235   rateEstimator_->estimateRate(p);
00236   REDQueue::enque(p);
00237 
00238 }

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:

double REDQueue::estimator int  nqueued,
int  m,
double  ave,
double  q_w
[protected, inherited]
 

Definition at line 319 of file red.cc.

References edp::adaptive, Scheduler::clock(), REDQueue::edp_, REDQueue::edv_, edp::feng_adaptive, Scheduler::instance(), edp::interval, edv::lastset, REDQueue::updateMaxP(), and REDQueue::updateMaxPFeng().

Referenced by RIOQueue::enque(), and REDQueue::enque().

00320 {
00321         double new_ave, old_ave;
00322 
00323         new_ave = ave;
00324         while (--m >= 1) {
00325                 new_ave *= 1.0 - q_w;
00326         }
00327         old_ave = new_ave;
00328         new_ave *= 1.0 - q_w;
00329         new_ave += q_w * nqueued;
00330         
00331         double now = Scheduler::instance().clock();
00332         if (edp_.adaptive == 1) {
00333                 if (edp_.feng_adaptive == 1)
00334                         updateMaxPFeng(new_ave);
00335                 else if (now > edv_.lastset + edp_.interval)
00336                         updateMaxP(new_ave, now);
00337         }
00338         return new_ave;
00339 }

Here is the call graph for this function:

double PushbackQueue::getBW  ) 
 

Definition at line 247 of file pushback-queue.cc.

References LinkDelay::bandwidth(), and REDQueue::link_.

Referenced by getDropRate(), and PushbackAgent::pushbackRefresh().

00247                      { 
00248   return link_->bandwidth(); 
00249 }

Here is the call graph for this function:

double PushbackQueue::getDropRate  ) 
 

Definition at line 252 of file pushback-queue.cc.

References RateEstimator::estRate_, getBW(), and rateEstimator_.

Referenced by enque(), and timeout().

00252                            {
00253   if (rateEstimator_->estRate_ < getBW()) {
00254     return 0;
00255   } else {
00256     return 1 - getBW()/rateEstimator_->estRate_;
00257   }
00258 }

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_; }

double PushbackQueue::getRate  ) 
 

Definition at line 242 of file pushback-queue.cc.

References RateEstimator::estRate_, and rateEstimator_.

Referenced by PushbackAgent::pushbackRefresh().

00242                        {
00243   return rateEstimator_->estRate_; 
00244 }

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:

void REDQueue::initialize_params  )  [protected, inherited]
 

Definition at line 167 of file red.cc.

References edp::delay, REDQueue::edp_, edp::ptc, edp::q_w, edp::targetdelay, edp::th_max_pkts, and edp::th_min_pkts.

Referenced by REDQueue::command(), and REDQueue::reset().

00168 {
00169 /*
00170  * If q_weight=0, set it to a reasonable value of 1-exp(-1/C)
00171  * This corresponds to choosing q_weight to be of that value for
00172  * which the packet time constant -1/ln(1-q_weight) per default RTT 
00173  * of 100ms is an order of magnitude more than the link capacity, C.
00174  *
00175  * If q_weight=-1, then the queue weight is set to be a function of
00176  * the bandwidth and the link propagation delay.  In particular, 
00177  * the default RTT is assumed to be three times the link delay and 
00178  * transmission delay, if this gives a default RTT greater than 100 ms. 
00179  *
00180  * If q_weight=-2, set it to a reasonable value of 1-exp(-10/C).
00181  */
00182         if (edp_.q_w == 0.0) {
00183                 edp_.q_w = 1.0 - exp(-1.0/edp_.ptc);
00184         } else if (edp_.q_w == -1.0) {
00185                 double rtt = 3.0*(edp_.delay+1.0/edp_.ptc);
00186                 //printf("delay: %5.4f rtt: %5.4f\n", edp_.delay, rtt);
00187                 if (rtt < 0.1) 
00188                         rtt = 0.1;
00189                 edp_.q_w = 1.0 - exp(-1.0/(10*rtt*edp_.ptc));
00190         } else if (edp_.q_w == -2.0) {
00191                 edp_.q_w = 1.0 - exp(-10.0/edp_.ptc);
00192         }
00193 
00194         // printf("ptc: %7.5f bandwidth: %5.3f pktsize: %d\n", edp_.ptc, link_->bandwidth(), edp_.mean_pktsize);
00195         // printf("th_min_pkts: %7.5f th_max_pkts: %7.5f\n", edp_.th_min_pkts, edp_.th_max);
00196         if (edp_.th_min_pkts == 0) {
00197                 edp_.th_min_pkts = 5.0;
00198                 // set th_min_pkts to half of targetqueue, if this is greater
00199                 //  than 5 packets.
00200                 double targetqueue = edp_.targetdelay * edp_.ptc;
00201                 if (edp_.th_min_pkts < targetqueue / 2.0 )
00202                         edp_.th_min_pkts = targetqueue / 2.0 ;
00203         }
00204         if (edp_.th_max_pkts == 0) 
00205                 edp_.th_max_pkts = 3.0 * edp_.th_min_pkts;
00206         //printf("th_min_pkts: %7.5f th_max_pkts: %7.5f\n", edp_.th_min_pkts, edp_.th_max);
00207         //printf("q_w: %7.5f\n", edp_.q_w);
00208 }

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:

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_; }

double REDQueue::modify_p double  p,
int  count,
int  count_bytes,
int  bytes,
int  mean_pktsize,
int  wait,
int  size
[protected, inherited]
 

Definition at line 406 of file red.cc.

Referenced by REDQueue::drop_early(), RIOQueue::drop_in_early(), RIOQueue::drop_out_early(), and RedPDQueue::enque().

00408 {
00409         double count1 = (double) count;
00410         if (bytes)
00411                 count1 = (double) (count_bytes/mean_pktsize);
00412         if (wait) {
00413                 if (count1 * p < 1.0)
00414                         p = 0.0;
00415                 else if (count1 * p < 2.0)
00416                         p /= (2 - count1 * p);
00417                 else
00418                         p = 1.0;
00419         } else {
00420                 if (count1 * p < 1.0)
00421                         p /= (1.0 - count1 * p);
00422                 else
00423                         p = 1.0;
00424         }
00425         if (bytes && p < 1.0) {
00426                 p = p * size / mean_pktsize;
00427         }
00428         if (p > 1.0)
00429                 p = 1.0;
00430         return p;
00431 }

Packet * REDQueue::pickPacketForECN Packet pkt  )  [protected, virtual, inherited]
 

Reimplemented in SemanticREDQueue, and SemanticRIOQueue.

Definition at line 506 of file red.cc.

Referenced by REDQueue::drop_early(), RIOQueue::drop_in_early(), RIOQueue::drop_out_early(), RIOQueue::enque(), and REDQueue::enque().

00507 {
00508         return pkt; /* pick the packet that just arrived */
00509 }

Packet * REDQueue::pickPacketToDrop  )  [protected, virtual, inherited]
 

Reimplemented in SemanticREDQueue, and SemanticRIOQueue.

Definition at line 517 of file red.cc.

References REDQueue::drop_front_, REDQueue::drop_rand_, Random::integer(), PacketQueue::length(), PacketQueue::lookup(), min, and REDQueue::q_.

Referenced by RIOQueue::enque(), and REDQueue::enque().

00518 {
00519         int victim;
00520 
00521         if (drop_front_)
00522                 victim = min(1, q_->length()-1);
00523         else if (drop_rand_)
00524                 victim = Random::integer(q_->length());
00525         else                    /* default is drop_tail_ */
00526                 victim = q_->length() - 1;
00527 
00528         return(q_->lookup(victim)); 
00529 }

Here is the call graph for this function:

void REDQueue::print_edp  )  [protected, inherited]
 

Reimplemented in RIOQueue.

Definition at line 835 of file red.cc.

References edp::bytes, edv::cur_max_p, REDQueue::edp_, REDQueue::edv_, REDQueue::idletime_, edp::mean_pktsize, edp::ptc, edp::q_w, Queue< T >::qlim_, edp::setbit, edp::th_max, edp::th_min, and edp::wait.

Referenced by RIOQueue::print_edp(), and REDQueue::REDQueue().

00836 {
00837         printf("mean_pktsz: %d\n", edp_.mean_pktsize); 
00838         printf("bytes: %d, wait: %d, setbit: %d\n",
00839                 edp_.bytes, edp_.wait, edp_.setbit);
00840         printf("minth: %f, maxth: %f\n", edp_.th_min, edp_.th_max);
00841         printf("max_p: %f, qw: %f, ptc: %f\n",
00842                 (double) edv_.cur_max_p, edp_.q_w, edp_.ptc);
00843         printf("qlim: %d, idletime: %f\n", qlim_, idletime_);
00844         printf("=========\n");
00845 }

void REDQueue::print_edv  )  [protected, inherited]
 

Reimplemented in RIOQueue.

Definition at line 847 of file red.cc.

References REDQueue::edv_, edv::v_a, and edv::v_b.

Referenced by RIOQueue::print_edv(), and REDQueue::REDQueue().

00848 {
00849         printf("v_a: %f, v_b: %f\n", edv_.v_a, edv_.v_b);
00850 }

void REDQueue::print_summarystats  )  [protected, inherited]
 

Definition at line 852 of file red.cc.

References REDQueue::qib_, Queue< T >::total_time_, and Queue< T >::true_ave_.

Referenced by REDQueue::command().

00853 {
00854         //double now = Scheduler::instance().clock();
00855         printf("True average queue: %5.3f", true_ave_);
00856         if (qib_) 
00857                 printf(" (in bytes)");
00858         printf(" time: %5.3f\n", total_time_);
00859 }

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:

template<class T>
void Queue< T >::recv Packet ,
Handler
[virtual, inherited]
 

Reimplemented from Connector.

Reimplemented in CBQueue, FQ, and PriQueue.

Definition at line 101 of file queue.cc.

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

Referenced by PriQueue::recv().

00102 {
00103         double now = Scheduler::instance().clock();
00104         enque(p);
00105         if (!blocked_) {
00106                 /*
00107                  * We're not blocked.  Get a packet and send it on.
00108                  * We perform an extra check because the queue
00109                  * might drop the packet even if it was
00110                  * previously empty!  (e.g., RED can do this.)
00111                  */
00112                 p = deque();
00113                 if (p != 0) {
00114                         utilUpdate(last_change_, now, blocked_);
00115                         last_change_ = now;
00116                         blocked_ = 1;
00117                         target_->recv(p, &qh_);
00118                 }
00119         }
00120 }

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 PushbackQueue::reportDrop Packet pkt  )  [virtual]
 

Reimplemented from REDQueue.

Definition at line 81 of file pushback-queue.cc.

References NsObject::debug_, dst_, pushback_, pushbackID_, rate_limiting_, PushbackAgent::reportDrop(), and src_.

00081                                    {
00082   if (debug_) 
00083     printf("PBQ:(%d:%d) rate limiting = %d\n", src_, dst_, rate_limiting_);
00084   
00085   if (rate_limiting_) 
00086     pushback_->reportDrop(pushbackID_, p);
00087   
00088 }

Here is the call graph for this function:

void REDQueue::reset  )  [protected, virtual, inherited]
 

Reimplemented from Queue< T >.

Reimplemented in RedPDQueue, and RIOQueue.

Definition at line 210 of file red.cc.

References LinkDelay::bandwidth(), Scheduler::clock(), edv::count, edv::count_bytes, edv::cur_max_p, NsObject::debug_, REDQueue::edp_, REDQueue::edv_, edp::gentle, REDQueue::idle_, REDQueue::idletime_, REDQueue::initialize_params(), Scheduler::instance(), edv::lastset, REDQueue::link_, edp::max_p_inv, edp::mean_pktsize, edv::old, edp::ptc, REDQueue::qib_, Queue< T >::reset(), edp::th_max, edp::th_max_pkts, edp::th_min, edp::th_min_pkts, edv::v_a, edv::v_ave, edv::v_b, edv::v_c, edv::v_d, and edv::v_slope.

Referenced by REDQueue::command(), RIOQueue::reset(), and RedPDQueue::reset().

00211 {
00212         
00213         //printf("3: th_min_pkts: %5.2f\n", edp_.th_min_pkts); 
00214         /*
00215          * Compute the "packet time constant" if we know the
00216          * link bandwidth.  The ptc is the max number of (avg sized)
00217          * pkts per second which can be placed on the link.
00218          * The link bw is given in bits/sec, so scale mean psize
00219          * accordingly.
00220          */
00221         if (link_) {
00222                 edp_.ptc = link_->bandwidth() / (8. * edp_.mean_pktsize);
00223                 initialize_params();
00224         }
00225         if (edp_.th_max_pkts == 0) 
00226                 edp_.th_max_pkts = 3.0 * edp_.th_min_pkts;
00227         /*
00228          * If queue is measured in bytes, scale min/max thresh
00229          * by the size of an average packet (which is specified by user).
00230          */
00231         if (qib_) {
00232                 //printf("1: th_min in pkts: %5.2f mean_pktsize: %d \n", edp_.th_min_pkts, edp_.mean_pktsize); 
00233                 edp_.th_min = edp_.th_min_pkts * edp_.mean_pktsize;  
00234                 edp_.th_max = edp_.th_max_pkts * edp_.mean_pktsize;
00235                 //printf("2: th_min in bytes (if qib): %5.2f mean_pktsize: %d \n", edp_.th_min, edp_.mean_pktsize); 
00236         } else {
00237                 edp_.th_min = edp_.th_min_pkts;
00238                 edp_.th_max = edp_.th_max_pkts;
00239         }
00240          
00241         edv_.v_ave = 0.0;
00242         edv_.v_slope = 0.0;
00243         edv_.count = 0;
00244         edv_.count_bytes = 0;
00245         edv_.old = 0;
00246         edv_.v_a = 1 / (edp_.th_max - edp_.th_min);
00247         edv_.cur_max_p = 1.0 / edp_.max_p_inv;
00248         edv_.v_b = - edp_.th_min / (edp_.th_max - edp_.th_min);
00249         edv_.lastset = 0.0;
00250         if (edp_.gentle) {
00251                 edv_.v_c = ( 1.0 - edv_.cur_max_p ) / edp_.th_max;
00252                 edv_.v_d = 2 * edv_.cur_max_p - 1.0;
00253         }
00254 
00255         idle_ = 1;
00256         if (&Scheduler::instance() != NULL)
00257                 idletime_ = Scheduler::instance().clock();
00258         else
00259                 idletime_ = 0.0; /* sched not instantiated yet */
00260         
00261         if (debug_) 
00262                 printf("Doing a queue reset\n");
00263         Queue::reset();
00264         if (debug_) 
00265                 printf("Done queue reset\n");
00266 }

Here is the call graph for this function:

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(), CBQueue::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 REDQueue::run_estimator int  nqueued,
int  m
[protected, inherited]
 

Definition at line 872 of file red.cc.

References REDQueue::edp_, REDQueue::edv_, edp::q_w, edv::v_ave, and edv::v_slope.

00873 {
00874         double f, f_sl, f_old;
00875 
00876         f = edv_.v_ave;
00877         f_sl = edv_.v_slope;
00878 #define RED_EWMA
00879 #ifdef RED_EWMA
00880         while (--m >= 1) {
00881                 f_old = f;
00882                 f *= 1.0 - edp_.q_w;
00883         }
00884         f_old = f;
00885         f *= 1.0 - edp_.q_w;
00886         f += edp_.q_w * nqueued;
00887 #endif
00888 #ifdef RED_HOLT_WINTERS
00889         while (--m >= 1) {
00890                 f_old = f;
00891                 f += f_sl;
00892                 f *= 1.0 - edp_.q_w;
00893                 f_sl *= 1.0 - 0.5 * edp_.q_w;
00894                 f_sl += 0.5 * edp_.q_w * (f - f_old);
00895         }
00896         f_old = f;
00897         f += f_sl;
00898         f *= 1.0 - edp_.q_w;
00899         f += edp_.q_w * nqueued;
00900         f_sl *= 1.0 - 0.5 * edp_.q_w;
00901         f_sl += 0.5 * edp_.q_w * (f - f_old);
00902 #endif
00903         edv_.v_ave = f;
00904         edv_.v_slope = f_sl;
00905 }

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:

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_; }

void PushbackQueue::timeout int   ) 
 

Definition at line 142 of file pushback-queue.cc.

References LinkDelay::bandwidth(), QueueMonitor::barrivals(), QueueMonitor::bdepartures(), QueueMonitor::bdrops(), PushbackAgent::calculateLowerBound(), dst_, RateEstimator::estRate_, getDropRate(), PushbackAgent::identifyAggregate(), Scheduler::instance(), REDQueue::link_, LOWER_BOUND_MODE, EDQueueMonitor::mon_ebdrops(), PushbackAgent::node_, Node::nodeid(), RateLimitSessionList::noMySessions(), pushback_, pushbackID_, qmon_, rate_limiting_, rateEstimator_, TimerHandler::resched(), PushbackAgent::resetDropLog(), rlsList_, src_, SUSTAINED_CONGESTION_DROPRATE, SUSTAINED_CONGESTION_PERIOD, timer_, and verbose_.

Referenced by PushbackQueueTimer::expire().

00142                                {
00143   
00144   int barrivals = qmon_->barrivals() - qmon_->mon_ebdrops();
00145   int bdrops = qmon_->bdrops() - qmon_->mon_ebdrops();
00146   int bdeps = qmon_->bdepartures();
00147 
00148   // an alternate way of calculating this is using the arrivals and drops from above, 
00149   // but the below is more accurate as RED avg queue takes time to come down and
00150   // hence drop rate goes down much slower.
00151   double dropRate1= getDropRate();
00152   double dropRate2= ((double)bdrops/barrivals);
00153 
00154   if (dropRate1 > 0 || dropRate2 > 0) {
00155           if (verbose_) 
00156                   printf("PBQ:(%d:%d) (%g) arrs %d  drops %d deps %d mdrops %d dr %g %g\n", 
00157                          src_, dst_, Scheduler::instance().clock(), 
00158                          barrivals*8, bdrops*8, bdeps*8, qmon_->mon_ebdrops()*8, dropRate1, dropRate2);
00159           fflush(stdout);
00160   }
00161   Tcl& tcl = Tcl::instance();
00162   tcl.evalf("%s reset",qmon_->name());
00163   
00164 
00165   if (rate_limiting_ && 
00166       dropRate1 >= SUSTAINED_CONGESTION_DROPRATE && 
00167       dropRate2 >= SUSTAINED_CONGESTION_DROPRATE/2) {
00168           if (verbose_) {
00169               printf("PBQ:(%d:%d) (%g) Arr: %d (%g) Drops: %d (%g %g) BW: %g\n", 
00170                      src_, dst_, Scheduler::instance().clock(), 
00171                      barrivals, rateEstimator_->estRate_, 
00172                      bdrops, dropRate1, dropRate2, link_->bandwidth());
00173               fflush(stdout);
00174           }
00175           
00176     // this function call would 
00177     //  1) start a rate limiting session, 
00178     //  2) insert it in the queues rate limiting session list.
00179     //  3) will also set up appropriate timers.
00180     pushback_->identifyAggregate(pushbackID_, rateEstimator_->estRate_, link_->bandwidth());
00181   }
00182   else if (rlsList_->noMySessions(pushback_->node_->nodeid()) && LOWER_BOUND_MODE == 1) {
00183       pushback_->calculateLowerBound(pushbackID_, rateEstimator_->estRate_);
00184   }
00185 
00186   //reset the drop history at the agent
00187   pushback_->resetDropLog(pushbackID_);
00188 
00189   timer_->resched(SUSTAINED_CONGESTION_PERIOD);
00190 }

Here is the call graph for this function:

void REDQueue::trace TracedVar *   )  [protected, inherited]
 

Reimplemented in RIOQueue.

Definition at line 803 of file red.cc.

References Scheduler::clock(), Scheduler::instance(), and REDQueue::tchan_.

Referenced by REDQueue::REDQueue().

00804 {
00805         char wrk[500], *p;
00806 
00807         if (((p = strstr(v->name(), "ave")) == NULL) &&
00808             ((p = strstr(v->name(), "prob")) == NULL) &&
00809             ((p = strstr(v->name(), "curq")) == NULL) &&
00810             ((p = strstr(v->name(), "cur_max_p"))==NULL) ) {
00811                 fprintf(stderr, "RED:unknown trace var %s\n",
00812                         v->name());
00813                 return;
00814         }
00815 
00816         if (tchan_) {
00817                 int n;
00818                 double t = Scheduler::instance().clock();
00819                 // XXX: be compatible with nsv1 RED trace entries
00820                 if (strstr(v->name(), "curq") != NULL) {
00821                         sprintf(wrk, "Q %g %d", t, int(*((TracedInt*) v)));
00822                 } else {
00823                         sprintf(wrk, "%c %g %g", *p, t,
00824                                 double(*((TracedDouble*) v)));
00825                 }
00826                 n = strlen(wrk);
00827                 wrk[n] = '\n'; 
00828                 wrk[n+1] = 0;
00829                 (void)Tcl_Write(tchan_, wrk, n+1);
00830         }
00831         return; 
00832 }

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; }

void REDQueue::updateMaxP double  new_ave,
double  now
[protected, inherited]
 

Definition at line 297 of file red.cc.

References edp::alpha, edp::beta, edp::bottom, edv::cur_max_p, REDQueue::edp_, REDQueue::edv_, edv::lastset, edp::th_max, edp::th_min, and edp::top.

Referenced by REDQueue::estimator().

00298 {
00299         double part = 0.4*(edp_.th_max - edp_.th_min);
00300         // AIMD rule to keep target Q~1/2(th_min+th_max)
00301         if ( new_ave < edp_.th_min + part && edv_.cur_max_p > edp_.bottom) {
00302                 // we increase the average queue size, so decrease max_p
00303                 edv_.cur_max_p = edv_.cur_max_p * edp_.beta;
00304                 edv_.lastset = now;
00305         } else if (new_ave > edp_.th_max - part && edp_.top > edv_.cur_max_p ) {
00306                 // we decrease the average queue size, so increase max_p
00307                 double alpha = edp_.alpha;
00308                         if ( alpha > 0.25*edv_.cur_max_p )
00309                         alpha = 0.25*edv_.cur_max_p;
00310                 edv_.cur_max_p = edv_.cur_max_p + alpha;
00311                 edv_.lastset = now;
00312         } 
00313 }

void REDQueue::updateMaxPFeng double  new_ave  )  [protected, inherited]
 

Definition at line 274 of file red.cc.

References edv::Above, edp::alpha, edv::Below, edp::beta, edv::Between, edv::cur_max_p, REDQueue::edp_, REDQueue::edv_, edv::status, edp::th_max, and edp::th_min.

Referenced by REDQueue::estimator().

00275 {
00276         if ( edp_.th_min < new_ave && new_ave < edp_.th_max) {
00277                 edv_.status = edv_.Between;
00278         }
00279         if (new_ave < edp_.th_min && edv_.status != edv_.Below) {
00280                 edv_.status = edv_.Below;
00281                 edv_.cur_max_p = edv_.cur_max_p / edp_.alpha;
00282                 //double max = edv_.cur_max_p; double param = edp_.alpha;
00283                 //printf("max: %5.2f alpha: %5.2f\n", max, param);
00284         }
00285         if (new_ave > edp_.th_max && edv_.status != edv_.Above) {
00286                 edv_.status = edv_.Above;
00287                 edv_.cur_max_p = edv_.cur_max_p * edp_.beta;
00288                 //double max = edv_.cur_max_p; double param = edp_.alpha;
00289                 //printf("max: %5.2f beta: %5.2f\n", max, param);
00290         }
00291 }

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

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(), CBQueue::recv(), PriQueue::recvHighPriority(), Queue< T >::resume(), CBQueue::sched(), Queue< T >::unblock(), and Queue< T >::utilization().

TracedInt REDQueue::curq_ [protected, inherited]
 

Definition at line 179 of file red.h.

Referenced by RIOQueue::enque(), REDQueue::enque(), and REDQueue::REDQueue().

NsObject* REDQueue::de_drop_ [protected, inherited]
 

Definition at line 170 of file red.h.

Referenced by REDQueue::command(), RedPDQueue::command(), RIOQueue::enque(), and REDQueue::enque().

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(), command(), NsObject::debug(), NsObject::delay_bind_dispatch(), RedPDQueue::enque(), enque(), NsObject::isdebug(), NsObject::NsObject(), TfrcAgent::recv(), reportDrop(), and REDQueue::reset().

int REDQueue::doubleq_ [protected, inherited]
 

Definition at line 192 of file red.h.

int REDQueue::dqthresh_ [protected, inherited]
 

Definition at line 193 of file red.h.

NsObject* Connector::drop_ [protected, inherited]
 

Definition at line 57 of file connector.h.

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

int REDQueue::drop_front_ [protected, inherited]
 

Definition at line 186 of file red.h.

Referenced by REDQueue::pickPacketToDrop(), and REDQueue::REDQueue().

int REDQueue::drop_rand_ [protected, inherited]
 

Definition at line 187 of file red.h.

Referenced by REDQueue::pickPacketToDrop(), and REDQueue::REDQueue().

int REDQueue::drop_tail_ [protected, inherited]
 

Definition at line 185 of file red.h.

Referenced by REDQueue::REDQueue().

int PushbackQueue::dst_ [protected]
 

Definition at line 74 of file pushback-queue.h.

Referenced by command(), enque(), reportDrop(), and timeout().

edp REDQueue::edp_ [protected, inherited]
 

Definition at line 191 of file red.h.

Referenced by REDQueue::command(), REDQueue::drop_early(), RIOQueue::drop_in_early(), RIOQueue::drop_out_early(), RIOQueue::enque(), REDQueue::enque(), RedPDQueue::enque(), enque(), REDQueue::estimator(), REDQueue::initialize_params(), REDQueue::print_edp(), REDQueue::REDQueue(), RIOQueue::reset(), REDQueue::reset(), REDQueue::run_estimator(), REDQueue::updateMaxP(), and REDQueue::updateMaxPFeng().

NsObject* REDQueue::EDTrace [protected, inherited]
 

Definition at line 174 of file red.h.

Referenced by REDQueue::command(), and REDQueue::enque().

edv REDQueue::edv_ [protected, inherited]
 

Definition at line 200 of file red.h.

Referenced by REDQueue::drop_early(), RIOQueue::drop_out_early(), RIOQueue::enque(), REDQueue::enque(), RedPDQueue::enque(), enque(), REDQueue::estimator(), REDQueue::print_edp(), REDQueue::print_edv(), REDQueue::REDQueue(), REDQueue::reset(), REDQueue::run_estimator(), REDQueue::updateMaxP(), and REDQueue::updateMaxPFeng().

int REDQueue::fifo_ [protected, inherited]
 

Definition at line 164 of file red.h.

int REDQueue::first_reset_ [protected, inherited]
 

Definition at line 201 of file red.h.

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().

int REDQueue::idle_ [protected, inherited]
 

Definition at line 198 of file red.h.

Referenced by REDQueue::deque(), RIOQueue::enque(), REDQueue::enque(), and REDQueue::reset().

double REDQueue::idletime_ [protected, inherited]
 

Definition at line 199 of file red.h.

Referenced by REDQueue::deque(), RIOQueue::enque(), REDQueue::enque(), REDQueue::print_edp(), and REDQueue::reset().

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().

LinkDelay* REDQueue::link_ [protected, inherited]
 

Definition at line 163 of file red.h.

Referenced by REDQueue::command(), getBW(), REDQueue::reset(), and timeout().

int REDQueue::ns1_compat_ [protected, inherited]
 

Definition at line 188 of file red.h.

Referenced by RIOQueue::enque(), REDQueue::enque(), and REDQueue::REDQueue().

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().

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().

PushbackAgent* PushbackQueue::pushback_
 

Definition at line 60 of file pushback-queue.h.

Referenced by PushbackQueue(), reportDrop(), and timeout().

int PushbackQueue::pushbackID_ [protected]
 

Definition at line 72 of file pushback-queue.h.

Referenced by PushbackQueue(), reportDrop(), and timeout().

PacketQueue* REDQueue::q_ [protected, inherited]
 

Definition at line 165 of file red.h.

Referenced by REDQueue::bcount_(), REDQueue::command(), REDQueue::deque(), REDQueue::drop_early(), RIOQueue::enque(), REDQueue::enque(), RedPDQueue::enque(), enque(), REDQueue::pickPacketToDrop(), and REDQueue::REDQueue().

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 CBQueue::sched().

int REDQueue::qib_ [protected, inherited]
 

Definition at line 169 of file red.h.

Referenced by REDQueue::deque(), REDQueue::drop_early(), RIOQueue::enque(), REDQueue::enque(), RedPDQueue::enque(), enque(), REDQueue::print_summarystats(), REDQueue::REDQueue(), RIOQueue::reset(), and REDQueue::reset().

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().

EDQueueMonitor* PushbackQueue::qmon_ [protected]
 

Definition at line 76 of file pushback-queue.h.

Referenced by command(), enque(), and timeout().

int PushbackQueue::rate_limiting_ [protected]
 

Definition at line 75 of file pushback-queue.h.

Referenced by PushbackQueue(), reportDrop(), and timeout().

RateEstimator* PushbackQueue::rateEstimator_
 

Definition at line 69 of file pushback-queue.h.

Referenced by enque(), getDropRate(), getRate(), PushbackQueue(), and timeout().

NsObject* PushbackQueue::RLDropTrace_ [protected]
 

Definition at line 79 of file pushback-queue.h.

Referenced by command(), and enque().

RateLimitSessionList* PushbackQueue::rlsList_
 

Definition at line 68 of file pushback-queue.h.

Referenced by enque(), PushbackAgent::identifyAggregate(), PushbackAgent::processPushbackCancel(), PushbackAgent::processPushbackRefresh(), PushbackAgent::processPushbackRequest(), PushbackAgent::processPushbackStatus(), PushbackQueue(), PushbackAgent::pushbackRefresh(), and timeout().

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().

int PushbackQueue::src_ [protected]
 

Definition at line 73 of file pushback-queue.h.

Referenced by command(), enque(), reportDrop(), and timeout().

int REDQueue::summarystats_ [protected, inherited]
 

Definition at line 161 of file red.h.

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

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().

Tcl_Channel REDQueue::tchan_ [protected, inherited]
 

Definition at line 178 of file red.h.

Referenced by REDQueue::command(), RIOQueue::trace(), and REDQueue::trace().

PushbackQueueTimer* PushbackQueue::timer_ [protected]
 

Definition at line 77 of file pushback-queue.h.

Referenced by PushbackQueue(), and timeout().

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().

char REDQueue::traceType[20] [protected, inherited]
 

Definition at line 175 of file red.h.

Referenced by REDQueue::command(), and REDQueue::REDQueue().

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().

int PushbackQueue::verbose_
 

Definition at line 66 of file pushback-queue.h.

Referenced by enque(), PushbackQueue(), and timeout().


The documentation for this class was generated from the following files:
Generated on Tue Apr 20 13:09:33 2004 for NS2.26SourcesOriginal by doxygen 1.3.3