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

REDQueue Class Reference

#include <red.h>

Inheritance diagram for REDQueue:

Inheritance graph
[legend]
Collaboration diagram for REDQueue:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 REDQueue (const char *="Drop")
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,...)

Protected Member Functions

int command (int argc, const char *const *argv)
void enque (Packet *pkt)
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)
virtual void reportDrop (Packet *pkt)
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 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

REDQueue::REDQueue const char *  = "Drop"  ) 
 

Definition at line 96 of file red.cc.

References edp::adaptive, edp::alpha, edp::beta, edp::bottom, edp::bytes, edp::cautious, edv::cur_max_p, curq_, drop_front_, drop_rand_, drop_tail_, edp_, edv_, edp::feng_adaptive, edp::gentle, edp::idle_pktsize, edp::interval, edp::mark_p, edp::max_p_inv, edp::mean_pktsize, ns1_compat_, Queue< T >::pq_, print_edp(), print_edv(), q_, edp::q_w, qib_, edp::setbit, summarystats_, edp::targetdelay, edp::th_max_pkts, edp::th_min_pkts, edp::top, trace(), traceType, edv::v_ave, edv::v_prob1, and edp::wait.

00096                                      : link_(NULL), de_drop_(NULL), EDTrace(NULL), tchan_(0), idle_(1)
00097 {
00098         //      printf("Making trace type %s\n", trace);
00099         if (strlen(trace) >=20) {
00100                 printf("trace type too long - allocate more space to traceType in red.h and recompile\n");
00101                 exit(0);
00102         }
00103         strcpy(traceType, trace);
00104         bind_bool("bytes_", &edp_.bytes);           // boolean: use bytes?
00105         bind_bool("queue_in_bytes_", &qib_);        // boolean: q in bytes?
00106         //      _RENAMED("queue-in-bytes_", "queue_in_bytes_");
00107 
00108         bind("thresh_", &edp_.th_min_pkts);                 // minthresh
00109         bind("maxthresh_", &edp_.th_max_pkts);      // maxthresh
00110         bind("mean_pktsize_", &edp_.mean_pktsize);  // avg pkt size
00111         bind("idle_pktsize_", &edp_.idle_pktsize);  // avg pkt size for idles
00112         bind("q_weight_", &edp_.q_w);               // for EWMA
00113         bind("adaptive_", &edp_.adaptive);          // 1 for adaptive red
00114         bind("cautious_", &edp_.cautious);          // 1 for cautious marking
00115         bind("alpha_", &edp_.alpha);                // adaptive red param
00116         bind("beta_", &edp_.beta);                  // adaptive red param
00117         bind("interval_", &edp_.interval);          // adaptive red param
00118         bind("feng_adaptive_",&edp_.feng_adaptive); // adaptive red variant
00119         bind("targetdelay_", &edp_.targetdelay);    // target delay
00120         bind("top_", &edp_.top);                    // maximum for max_p        
00121         bind("bottom_", &edp_.bottom);              // minimum for max_p        
00122         bind_bool("wait_", &edp_.wait);
00123         bind("linterm_", &edp_.max_p_inv);
00124         bind("mark_p_", &edp_.mark_p);
00125         bind_bool("setbit_", &edp_.setbit);         // mark instead of drop
00126         bind_bool("gentle_", &edp_.gentle);         // increase the packet
00127                                                     // drop prob. slowly
00128                                                     // when ave queue
00129                                                     // exceeds maxthresh
00130 
00131         bind_bool("summarystats_", &summarystats_);
00132         bind_bool("drop_tail_", &drop_tail_);       // drop last pkt
00133         //      _RENAMED("drop-tail_", "drop_tail_");
00134 
00135         bind_bool("drop_front_", &drop_front_);     // drop first pkt
00136         //      _RENAMED("drop-front_", "drop_front_");
00137         
00138         bind_bool("drop_rand_", &drop_rand_);       // drop pkt at random
00139         //      _RENAMED("drop-rand_", "drop_rand_");
00140 
00141         bind_bool("ns1_compat_", &ns1_compat_);     // ns-1 compatibility
00142         //      _RENAMED("ns1-compat_", "ns1_compat_");
00143 
00144         bind("ave_", &edv_.v_ave);                  // average queue sie
00145         bind("prob1_", &edv_.v_prob1);              // dropping probability
00146         bind("curq_", &curq_);                      // current queue size
00147         bind("cur_max_p_", &edv_.cur_max_p);        // current max_p
00148         
00149 
00150         q_ = new PacketQueue();                     // underlying queue
00151         pq_ = q_;
00152         //reset();
00153 #ifdef notdef
00154         print_edp();
00155         print_edv();
00156 #endif
00157         
00158 }

Here is the call graph for this function:


Member Function Documentation

int REDQueue::bcount_  )  [inline, protected]
 

Definition at line 167 of file red.h.

References PacketQueue::byteLength(), and 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]
 

Definition at line 394 of file red.cc.

References 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]
 

Definition at line 370 of file red.cc.

Referenced by calculate_p(), and 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 REDQueue::command int  argc,
const char *const *  argv
[protected, virtual]
 

Reimplemented from Connector.

Reimplemented in PushbackQueue, and RedPDQueue.

Definition at line 692 of file red.cc.

References LinkDelay::bandwidth(), Connector::command(), de_drop_, NsObject::debug_, LinkDelay::delay(), edp::delay, edp_, EDTrace, initialize_params(), link_, edp::mean_pktsize, Queue< T >::pq_, print_summarystats(), edp::ptc, q_, edp::q_w, reset(), tchan_, edp::th_max_pkts, edp::th_min_pkts, and traceType.

Referenced by RedPDQueue::command(), and PushbackQueue::command().

00693 {
00694         Tcl& tcl = Tcl::instance();
00695         if (argc == 2) {
00696                 if (strcmp(argv[1], "reset") == 0) {
00697                         reset();
00698                         return (TCL_OK);
00699                 }
00700                 if (strcmp(argv[1], "early-drop-target") == 0) {
00701                         if (de_drop_ != NULL)
00702                                 tcl.resultf("%s", de_drop_->name());
00703                         return (TCL_OK);
00704                 }
00705                 if (strcmp(argv[1], "edrop-trace") == 0) {
00706                         if (EDTrace != NULL) {
00707                                 tcl.resultf("%s", EDTrace->name());
00708                                 if (debug_) 
00709                                         printf("edrop trace exists according to RED\n");
00710                         }
00711                         else {
00712                                 if (debug_)
00713                                         printf("edrop trace doesn't exist according to RED\n");
00714                                 tcl.resultf("0");
00715                         }
00716                         return (TCL_OK);
00717                 }
00718                 if (strcmp(argv[1], "trace-type") == 0) {
00719                         tcl.resultf("%s", traceType);
00720                         return (TCL_OK);
00721                 }
00722                 if (strcmp(argv[1], "printstats") == 0) {
00723                         print_summarystats();
00724                         return (TCL_OK);
00725                 }
00726         } 
00727         else if (argc == 3) {
00728                 // attach a file for variable tracing
00729                 if (strcmp(argv[1], "attach") == 0) {
00730                         int mode;
00731                         const char* id = argv[2];
00732                         tchan_ = Tcl_GetChannel(tcl.interp(), (char*)id, &mode);
00733                         if (tchan_ == 0) {
00734                                 tcl.resultf("RED: trace: can't attach %s for writing", id);
00735                                 return (TCL_ERROR);
00736                         }
00737                         return (TCL_OK);
00738                 }
00739                 // tell RED about link stats
00740                 if (strcmp(argv[1], "link") == 0) {
00741                         LinkDelay* del = (LinkDelay*)TclObject::lookup(argv[2]);
00742                         if (del == 0) {
00743                                 tcl.resultf("RED: no LinkDelay object %s",
00744                                         argv[2]);
00745                                 return(TCL_ERROR);
00746                         }
00747                         // set ptc now
00748                         link_ = del;
00749                         edp_.ptc = link_->bandwidth() /
00750                                 (8. * edp_.mean_pktsize);
00751                         edp_.delay = link_->delay();
00752                         if (
00753                           (edp_.q_w <= 0.0 || edp_.th_min_pkts == 0 ||
00754                                         edp_.th_max_pkts == 0))
00755                                 initialize_params();
00756                         return (TCL_OK);
00757                 }
00758                 if (strcmp(argv[1], "early-drop-target") == 0) {
00759                         NsObject* p = (NsObject*)TclObject::lookup(argv[2]);
00760                         if (p == 0) {
00761                                 tcl.resultf("no object %s", argv[2]);
00762                                 return (TCL_ERROR);
00763                         }
00764                         de_drop_ = p;
00765                         return (TCL_OK);
00766                 }
00767                 if (strcmp(argv[1], "edrop-trace") == 0) {
00768                         if (debug_) 
00769                                 printf("Ok, Here\n");
00770                         NsObject * t  = (NsObject *)TclObject::lookup(argv[2]);
00771                         if (debug_)  
00772                                 printf("Ok, Here too\n");
00773                         if (t == 0) {
00774                                 tcl.resultf("no object %s", argv[2]);
00775                                 return (TCL_ERROR);
00776                         }
00777                         EDTrace = t;
00778                         if (debug_)  
00779                                 printf("Ok, Here too too too %d\n", ((Trace *)EDTrace)->type_);
00780                         return (TCL_OK);
00781                 }
00782                 if (!strcmp(argv[1], "packetqueue-attach")) {
00783                         delete q_;
00784                         if (!(q_ = (PacketQueue*) TclObject::lookup(argv[2])))
00785                                 return (TCL_ERROR);
00786                         else {
00787                                 pq_ = q_;
00788                                 return (TCL_OK);
00789                         }
00790                 }
00791         }
00792         return (Queue::command(argc, argv));
00793 }

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]
 

Implements Queue< T >.

Reimplemented in RIOQueue.

Definition at line 344 of file red.cc.

References PacketQueue::byteLength(), Scheduler::clock(), PacketQueue::deque(), idle_, idletime_, Scheduler::instance(), PacketQueue::length(), q_, qib_, 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(), 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]
 

Definition at line 441 of file red.cc.

References hdr_flags::access(), hdr_cmn::access(), PacketQueue::byteLength(), edp::bytes, calculate_p_new(), edp::cautious, hdr_flags::ce(), edv::count, edv::count_bytes, edv::cur_max_p, hdr_flags::ect(), edp_, edv_, edp::gentle, PacketQueue::length(), edp::mark_p, edp::mean_pktsize, modify_p(), pickPacketForECN(), pow(), edp::ptc, q_, edp::q_w, 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 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 REDQueue::enque Packet pkt  )  [protected, virtual]
 

Implements Queue< T >.

Reimplemented in PushbackQueue, RedPDQueue, and RIOQueue.

Definition at line 552 of file red.cc.

References hdr_cmn::access(), PacketQueue::byteLength(), edp::cautious, Scheduler::clock(), edv::count, edv::count_bytes, curq_, de_drop_, Connector::drop(), drop_early(), DTYPE_FORCED, DTYPE_NONE, DTYPE_UNFORCED, edp_, EDTrace, edv_, PacketQueue::enque(), estimator(), edp::gentle, idle_, edp::idle_pktsize, idletime_, Scheduler::instance(), PacketQueue::length(), edp::mean_pktsize, ns1_compat_, edv::old, pickPacketForECN(), pickPacketToDrop(), edp::ptc, q_, edp::q_w, qib_, Queue< T >::qlim_, NsObject::recv(), PacketQueue::remove(), reportDrop(), hdr_cmn::size(), summarystats_, edp::th_max, edp::th_min, Queue< T >::updateStats(), edv::v_ave, and edv::v_prob.

Referenced by RedPDQueue::enque(), and PushbackQueue::enque().

00553 {
00554 
00555         /*
00556          * if we were idle, we pretend that m packets arrived during
00557          * the idle period.  m is set to be the ptc times the amount
00558          * of time we've been idle for
00559          */
00560 
00561         int m = 0;
00562         if (idle_) {
00563                 // A packet that arrives to an idle queue will never
00564                 //  be dropped.
00565                 double now = Scheduler::instance().clock();
00566                 /* To account for the period when the queue was empty. */
00567                 idle_ = 0;
00568                 // Use idle_pktsize instead of mean_pktsize, for
00569                 //  a faster response to idle times.
00570                 if (edp_.cautious == 3) {
00571                         double ptc = edp_.ptc * 
00572                            edp_.mean_pktsize / edp_.idle_pktsize;
00573                         m = int(ptc * (now - idletime_));
00574                 } else
00575                         m = int(edp_.ptc * (now - idletime_));
00576         }
00577 
00578         /*
00579          * Run the estimator with either 1 new packet arrival, or with
00580          * the scaled version above [scaled by m due to idle time]
00581          */
00582         edv_.v_ave = estimator(qib_ ? q_->byteLength() : q_->length(), m + 1, edv_.v_ave, edp_.q_w);
00583         //printf("v_ave: %6.4f (%13.12f) q: %d)\n", 
00584         //      double(edv_.v_ave), double(edv_.v_ave), q_->length());
00585         if (summarystats_) {
00586                 /* compute true average queue size for summary stats */
00587                 Queue::updateStats(qib_?q_->byteLength():q_->length());
00588         }
00589 
00590         /*
00591          * count and count_bytes keeps a tally of arriving traffic
00592          * that has not been dropped (i.e. how long, in terms of traffic,
00593          * it has been since the last early drop)
00594          */
00595 
00596         hdr_cmn* ch = hdr_cmn::access(pkt);
00597         ++edv_.count;
00598         edv_.count_bytes += ch->size();
00599 
00600         /*
00601          * DROP LOGIC:
00602          *      q = current q size, ~q = averaged q size
00603          *      1> if ~q > maxthresh, this is a FORCED drop
00604          *      2> if minthresh < ~q < maxthresh, this may be an UNFORCED drop
00605          *      3> if (q+1) > hard q limit, this is a FORCED drop
00606          */
00607 
00608         register double qavg = edv_.v_ave;
00609         int droptype = DTYPE_NONE;
00610         int qlen = qib_ ? q_->byteLength() : q_->length();
00611         int qlim = qib_ ? (qlim_ * edp_.mean_pktsize) : qlim_;
00612 
00613         curq_ = qlen;   // helps to trace queue during arrival, if enabled
00614 
00615         if (qavg >= edp_.th_min && qlen > 1) {
00616                 if ((!edp_.gentle && qavg >= edp_.th_max) ||
00617                         (edp_.gentle && qavg >= 2 * edp_.th_max)) {
00618                         droptype = DTYPE_FORCED;
00619                 } else if (edv_.old == 0) {
00620                         /* 
00621                          * The average queue size has just crossed the
00622                          * threshold from below to above "minthresh", or
00623                          * from above "minthresh" with an empty queue to
00624                          * above "minthresh" with a nonempty queue.
00625                          */
00626                         edv_.count = 1;
00627                         edv_.count_bytes = ch->size();
00628                         edv_.old = 1;
00629                 } else if (drop_early(pkt)) {
00630                         droptype = DTYPE_UNFORCED;
00631                 }
00632         } else {
00633                 /* No packets are being dropped.  */
00634                 edv_.v_prob = 0.0;
00635                 edv_.old = 0;           
00636         }
00637         if (qlen >= qlim) {
00638                 // see if we've exceeded the queue size
00639                 droptype = DTYPE_FORCED;
00640         }
00641 
00642         if (droptype == DTYPE_UNFORCED) {
00643                 /* pick packet for ECN, which is dropping in this case */
00644                 Packet *pkt_to_drop = pickPacketForECN(pkt);
00645                 /* 
00646                  * If the packet picked is different that the one that just arrived,
00647                  * add it to the queue and remove the chosen packet.
00648                  */
00649                 if (pkt_to_drop != pkt) {
00650                         q_->enque(pkt);
00651                         q_->remove(pkt_to_drop);
00652                         pkt = pkt_to_drop; /* XXX okay because pkt is not needed anymore */
00653                 }
00654 
00655                 // deliver to special "edrop" target, if defined
00656                 if (de_drop_ != NULL) {
00657         
00658                 //trace first if asked 
00659                 // if no snoop object (de_drop_) is defined, 
00660                 // this packet will not be traced as a special case.
00661                         if (EDTrace != NULL) 
00662                                 ((Trace *)EDTrace)->recvOnly(pkt);
00663 
00664                         reportDrop(pkt);
00665                         de_drop_->recv(pkt);
00666                 }
00667                 else {
00668                         reportDrop(pkt);
00669                         drop(pkt);
00670                 }
00671         } else {
00672                 /* forced drop, or not a drop: first enqueue pkt */
00673                 q_->enque(pkt);
00674 
00675                 /* drop a packet if we were told to */
00676                 if (droptype == DTYPE_FORCED) {
00677                         /* drop random victim or last one */
00678                         pkt = pickPacketToDrop();
00679                         q_->remove(pkt);
00680                         reportDrop(pkt);
00681                         drop(pkt);
00682                         if (!ns1_compat_) {
00683                                 // bug-fix from Philip Liu, <phill@ece.ubc.ca>
00684                                 edv_.count = 0;
00685                                 edv_.count_bytes = 0;
00686                         }
00687                 }
00688         }
00689         return;
00690 }

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]
 

Definition at line 319 of file red.cc.

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

Referenced by RIOQueue::enque(), and 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:

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:

void REDQueue::initialize_params  )  [protected]
 

Definition at line 167 of file red.cc.

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

Referenced by command(), and 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]
 

Definition at line 406 of file red.cc.

Referenced by 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]
 

Reimplemented in SemanticREDQueue, and SemanticRIOQueue.

Definition at line 506 of file red.cc.

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

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

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

Reimplemented in SemanticREDQueue, and SemanticRIOQueue.

Definition at line 517 of file red.cc.

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

Referenced by RIOQueue::enque(), and 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]
 

Reimplemented in RIOQueue.

Definition at line 835 of file red.cc.

References edp::bytes, edv::cur_max_p, edp_, edv_, 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().

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]
 

Reimplemented in RIOQueue.

Definition at line 847 of file red.cc.

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

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

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

void REDQueue::print_summarystats  )  [protected]
 

Definition at line 852 of file red.cc.

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

Referenced by 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 {};

virtual void REDQueue::reportDrop Packet pkt  )  [inline, protected, virtual]
 

Reimplemented in PushbackQueue.

Definition at line 159 of file red.h.

Referenced by enque().

00159 {}  //pushback

void REDQueue::reset  )  [protected, virtual]
 

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_, edp_, edv_, edp::gentle, idle_, idletime_, initialize_params(), Scheduler::instance(), edv::lastset, link_, edp::max_p_inv, edp::mean_pktsize, edv::old, edp::ptc, 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 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]
 

Definition at line 872 of file red.cc.

References edp_, 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 REDQueue::trace TracedVar *   )  [protected]
 

Reimplemented in RIOQueue.

Definition at line 803 of file red.cc.

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

Referenced by 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]
 

Definition at line 297 of file red.cc.

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

Referenced by 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]
 

Definition at line 274 of file red.cc.

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

Referenced by 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 deque(), DropTail::deque(), 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]
 

Definition at line 179 of file red.h.

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

NsObject* REDQueue::de_drop_ [protected]
 

Definition at line 170 of file red.h.

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

int NsObject::debug_ [protected, inherited]
 

Reimplemented in FECModel, FloodAgent, and LandmarkAgent.

Definition at line 66 of file object.h.

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

int REDQueue::doubleq_ [protected]
 

Definition at line 192 of file red.h.

int REDQueue::dqthresh_ [protected]
 

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]
 

Definition at line 186 of file red.h.

Referenced by pickPacketToDrop(), and REDQueue().

int REDQueue::drop_rand_ [protected]
 

Definition at line 187 of file red.h.

Referenced by pickPacketToDrop(), and REDQueue().

int REDQueue::drop_tail_ [protected]
 

Definition at line 185 of file red.h.

Referenced by REDQueue().

edp REDQueue::edp_ [protected]
 

Definition at line 191 of file red.h.

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

NsObject* REDQueue::EDTrace [protected]
 

Definition at line 174 of file red.h.

Referenced by command(), and enque().

edv REDQueue::edv_ [protected]
 

Definition at line 200 of file red.h.

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

int REDQueue::fifo_ [protected]
 

Definition at line 164 of file red.h.

int REDQueue::first_reset_ [protected]
 

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]
 

Definition at line 198 of file red.h.

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

double REDQueue::idletime_ [protected]
 

Definition at line 199 of file red.h.

Referenced by deque(), RIOQueue::enque(), enque(), print_edp(), and 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]
 

Definition at line 163 of file red.h.

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

int REDQueue::ns1_compat_ [protected]
 

Definition at line 188 of file red.h.

Referenced by RIOQueue::enque(), enque(), and 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(), 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(), REMQueue::REMQueue(), and Vq::Vq().

PacketQueue* REDQueue::q_ [protected]
 

Definition at line 165 of file red.h.

Referenced by bcount_(), command(), deque(), drop_early(), RIOQueue::enque(), enque(), RedPDQueue::enque(), PushbackQueue::enque(), pickPacketToDrop(), and 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]
 

Definition at line 169 of file red.h.

Referenced by deque(), drop_early(), RIOQueue::enque(), enque(), RedPDQueue::enque(), PushbackQueue::enque(), print_summarystats(), REDQueue(), RIOQueue::reset(), and 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(), enque(), PIQueue::enque(), Marker::enque(), JoBS::enque(), GK::enque(), DropTail::enque(), Demarker::enque(), Queue< T >::limit(), RIOQueue::print_edp(), 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().

int REDQueue::summarystats_ [protected]
 

Definition at line 161 of file red.h.

Referenced by deque(), enque(), and 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]
 

Definition at line 178 of file red.h.

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

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

Definition at line 150 of file queue.h.

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

char REDQueue::traceType[20] [protected]
 

Definition at line 175 of file red.h.

Referenced by command(), and REDQueue().

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

Definition at line 149 of file queue.h.

Referenced by 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 files:
Generated on Tue Apr 20 13:13:42 2004 for NS2.26SourcesOriginal by doxygen 1.3.3