#include <gk.h>
Inheritance diagram for GK:


Public Member Functions | |
| GK (const char *) | |
| 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 | reset () |
| 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 |
| NsObject * | target () |
| 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 *) |
| Packet * | deque () |
| void | deque_vq () |
| void | trace (TracedVar *) |
| void | reset () |
| 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 | |
| LinkDelay * | link_ |
| PacketQueue * | q_ |
| int | drop_front_ |
| double | ecnlim_ |
| double | vq_len |
| double | c_ |
| int | mark_flag |
| double | prev_time |
| double | curr_time |
| int | mean_pktsize_ |
| TracedInt | curq_ |
| NsObject * | EDTrace |
| char | traceType [20] |
| Tcl_Channel | tchan_ |
| int | qlim_ |
| int | blocked_ |
| int | unblock_on_resume_ |
| QueueHandler | qh_ |
| PacketQueue * | pq_ |
| double | true_ave_ |
| double | total_time_ |
| double | last_change_ |
| double | old_util_ |
| double | util_weight_ |
| QueueElem< T > * | head_ |
| QueueElem< T > * | tail_ |
| int | size_ |
| NsObject * | target_ |
| NsObject * | drop_ |
| int | debug_ |
|
|
Definition at line 79 of file gk.cc. References curq_, drop_front_, ecnlim_, mark_flag, mean_pktsize_, Queue< T >::pq_, prev_time, q_, and vq_len.
00079 :link_(NULL), EDTrace(NULL), tchan_(0) 00080 { 00081 q_ = new PacketQueue; 00082 pq_ = q_; 00083 bind_bool("drop_front_", &drop_front_); 00084 bind("ecnlim_", &ecnlim_); 00085 bind("mean_pktsize_", &mean_pktsize_); 00086 bind("curq_", &curq_); 00087 vq_len = 0.0; 00088 prev_time = 0.0; 00089 mark_flag = 0; 00090 } |
|
|||||||||
|
Definition at line 131 of file queue.h. References Queue< T >::blocked_.
00131 { blocked_ = 1; }
|
|
|||||||||
|
Definition at line 129 of file queue.h. References Queue< T >::blocked_. Referenced by CBQClass::recv().
00129 { return (blocked_ == 1); }
|
|
|||||||||
|
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:

|
||||||||||||
|
Reimplemented from Connector. Definition at line 92 of file gk.cc. References c_, Connector::command(), link_, mean_pktsize_, Queue< T >::pq_, q_, and tchan_.
00092 {
00093 Tcl& tcl = Tcl::instance();
00094 if (argc == 3) {
00095 if (strcmp(argv[1], "link") == 0) {
00096 LinkDelay* del = (LinkDelay*)TclObject::lookup(argv[2]);
00097 if (del == 0) {
00098 return(TCL_ERROR);
00099 }
00100 // set capacity now
00101 link_ = del;
00102 c_ = del->bandwidth();
00103 c_ = c_ / (8.0 * mean_pktsize_);
00104 return (TCL_OK);
00105 }
00106 if (!strcmp(argv[1], "packetqueue-attach")) {
00107 delete q_;
00108 if (!(q_ = (PacketQueue*) TclObject::lookup(argv[2])))
00109 return (TCL_ERROR);
00110 else {
00111 pq_ = q_;
00112 return (TCL_OK);
00113 }
00114 }
00115 // attach a file for variable tracing
00116 if (strcmp(argv[1], "attach") == 0) {
00117 int mode;
00118 const char* id = argv[2];
00119 tchan_ = Tcl_GetChannel(tcl.interp(), (char*)id, &mode);
00120 if (tchan_ == 0) {
00121 tcl.resultf("Vq: trace: can't attach %s for writing", id);
00122 return (TCL_ERROR);
00123 }
00124 return (TCL_OK);
00125 }
00126 }
00127 return Queue::command(argc, argv);
00128 }
|
Here is the call graph for this function:

|
||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
|
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 }
|
|
|
Implements Queue< T >. Definition at line 163 of file gk.cc. References hdr_flags::access(), hdr_flags::ce(), Scheduler::clock(), curr_time, PacketQueue::deque(), deque_vq(), hdr_flags::ect(), Scheduler::instance(), PacketQueue::length(), mark_flag, and q_.
00164 {
00165 /* Check the status of the virtual queue. We do this to update the
00166 mark_flag. */
00167 curr_time = Scheduler::instance().clock();
00168 deque_vq();
00169
00170 /* If the Real queue has packets and the mark_flag is set, mark the
00171 outgoing packet. */
00172 if((q_->length() > 0) && (mark_flag == 1)){
00173 Packet *pp = q_->deque();
00174 hdr_flags* hf = hdr_flags::access(pp);
00175 if(hf->ect() == 1) // ECN capable flow
00176 hf->ce() = 1; // Mark the TCP Flow;
00177 return pp;
00178 }
00179 else return q_->deque();
00180 }
|
Here is the call graph for this function:

|
|
Definition at line 183 of file gk.cc. References c_, curr_time, ecnlim_, mark_flag, prev_time, and vq_len. Referenced by deque(), and enque().
|
|
|||||||||
|
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().
|
Here is the call graph for this function:

|
|||||||||
|
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:

|
||||||||||
|
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:

|
||||||||||||
|
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:

|
Here is the call graph for this function:

|
|
Implements Queue< T >. Definition at line 130 of file gk.cc. References Scheduler::clock(), curq_, curr_time, PacketQueue::deque(), deque_vq(), Connector::drop(), drop_front_, ecnlim_, PacketQueue::enque(), Scheduler::instance(), PacketQueue::length(), mark_flag, prev_time, q_, Queue< T >::qlim_, PacketQueue::remove(), and vq_len.
00131 {
00132 q_->enque(p);
00133
00134 curr_time = Scheduler::instance().clock();
00135 /*Whenever a packet is enqueued, the actual length of the
00136 virtual queue is determined */
00137
00138 if(curr_time > prev_time){
00139 deque_vq();
00140 }
00141 /* Add the packet to the VQ */
00142 vq_len = vq_len + 1.0;
00143
00144 /* If the VQ overflows, set flag so that all packets may be marked
00145 till the VQ hits zero again. */
00146 if(vq_len > (ecnlim_ * qlim_)){
00147 mark_flag = 1; // Indicates that all outgoing packets has to be marked
00148 vq_len = vq_len - 1.0;
00149 }
00150
00151 if (q_->length() >= qlim_) {
00152 if (drop_front_) { /* remove from head of queue */
00153 Packet *pp = q_->deque();
00154 drop(pp);
00155 } else {
00156 q_->remove(p);
00157 drop(p);
00158 }
00159 }
00160 curq_ = q_->length();
00161 }
|
Here is the call graph for this function:

|
||||||||||
|
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().
|
Here is the call graph for this function:

|
|||||||||
|
Definition at line 411 of file mcache.h. References Queue< T >::head_. Referenced by MediaServer::find_prefinfo().
00411 { return head_; }
|
|
|
Implements Handler. Reimplemented in LinkDelay, LL, AckRecons, and Snoop. Definition at line 91 of file object.cc. References NsObject::recv().
|
Here is the call graph for this function:

|
|||||||||
|
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); }
|
|
|
Definition at line 61 of file object.h. References NsObject::debug_.
00061 { return debug_; }
|
|
|||||||||
|
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().
|
Here is the call graph for this function:

|
|||||||||
|
Definition at line 132 of file queue.h. References Queue< T >::qlim_. Referenced by dsREDQueue::reset(), and Snoop::snoop_data().
00132 { return qlim_; }
|
|
||||||||||||
|
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:

|
||||||||||||||||
|
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:

|
|
Reimplemented in Agent, and Trace. Definition at line 56 of file object.h. Referenced by Trace::recvOnly().
00056 {};
|
|
|||||||||
|
Reimplemented from NsObject. Reimplemented in dsREDQueue, CBQueue, DropTail, PIQueue, RedPDQueue, REDQueue, REMQueue, and RIOQueue. Definition at line 349 of file mcache.h. References Queue< T >::head_, and QueueElem< T >::next().
00349 {
00350 QueueElem<T> *p = head_, *q;
00351 while (p != NULL) {
00352 q = p;
00353 p = p->next();
00354 delete q;
00355 }
00356 head_ = NULL;
00357 }
|
Here is the call graph for this function:

|
|||||||||
|
Reimplemented from NsObject. Reimplemented in dsREDQueue, CBQueue, DropTail, PIQueue, RedPDQueue, REDQueue, REMQueue, and RIOQueue. Definition at line 174 of file queue.cc. References Queue< T >::deque(), Connector::drop(), Queue< T >::total_time_, and Queue< T >::true_ave_. Referenced by REDQueue::reset(), PIQueue::reset(), dsREDQueue::reset(), and DropTail::reset().
00175 {
00176 Packet* p;
00177 total_time_ = 0.0;
00178 true_ave_ = 0.0;
00179 while ((p = deque()) != 0)
00180 drop(p);
00181 }
|
Here is the call graph for this function:

|
|||||||||
|
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:

|
||||||||||||
|
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().
|
Here is the call graph for this function:

|
|||||||||
|
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_; }
|
|
|
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_; }
|
|
|
Definition at line 203 of file gk.cc. References Scheduler::clock(), Scheduler::instance(), and tchan_.
00204 {
00205 char wrk[500], *p;
00206
00207 if ((p = strstr(v->name(), "curq")) == NULL) {
00208 fprintf(stderr, "Vq:unknown trace var %s\n", v->name());
00209 return;
00210 }
00211
00212 if (tchan_) {
00213 int n;
00214 double t = Scheduler::instance().clock();
00215 // XXX: be compatible with nsv1 RED trace entries
00216 if (*p == 'c') {
00217 sprintf(wrk, "Q %g %d", t, int(*((TracedInt*) v)));
00218 } else {
00219 sprintf(wrk, "%c %g %g", *p, t, double(*((TracedDouble*) v)));
00220 }
00221 n = strlen(wrk);
00222 wrk[n] = '\n';
00223 wrk[n+1] = 0;
00224 (void)Tcl_Write(tchan_, wrk, n+1);
00225 }
00226 return;
00227 }
|
Here is the call graph for this function:

|
|||||||||
|
Definition at line 130 of file queue.h. References Queue< T >::blocked_.
00130 { blocked_ = 0; }
|
|
||||||||||
|
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:

|
||||||||||
|
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:

|
||||||||||||||||||||
|
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().
|
|
|||||
|
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(). |
|
|
Definition at line 58 of file gk.h. Referenced by command(), and deque_vq(). |
|
|
|
|
|
Definition at line 61 of file gk.h. Referenced by deque(), deque_vq(), and enque(). |
|
|
Reimplemented in FECModel, FloodAgent, and LandmarkAgent. Definition at line 66 of file object.h. Referenced by REDQueue::command(), RedPDQueue::command(), PushbackQueue::command(), NsObject::debug(), NsObject::delay_bind_dispatch(), RedPDQueue::enque(), PushbackQueue::enque(), NsObject::isdebug(), NsObject::NsObject(), TfrcAgent::recv(), PushbackQueue::reportDrop(), and REDQueue::reset(). |
|
|
Definition at line 57 of file connector.h. Referenced by Connector::command(), Connector::drop(), and ErrorModel::recv(). |
|
|
|
|
|
Definition at line 56 of file gk.h. Referenced by deque_vq(), enque(), and GK(). |
|
|
|
|
|||||
|
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(). |
|
|||||
|
Definition at line 154 of file queue.h. Referenced by Queue< T >::recv(), Queue< T >::resume(), and Queue< T >::utilization(). |
|
|
Definition at line 53 of file gk.h. Referenced by command(). |
|
|
Definition at line 59 of file gk.h. Referenced by deque(), deque_vq(), enque(), and GK(). |
|
|
|
|
|||||
|
Definition at line 155 of file queue.h. Referenced by Queue< T >::utilization(), and Queue< T >::utilUpdate(). |
|
|||||
|
|
Definition at line 60 of file gk.h. Referenced by deque_vq(), enque(), and GK(). |
|
|
|
|
|||||
|
Definition at line 145 of file queue.h. Referenced by Queue< T >::recv(), FQ::recv(), PriQueue::recvHighPriority(), Queue< T >::resume(), and CBQueue::sched(). |
|
|||||
|
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(), enque(), DropTail::enque(), Demarker::enque(), Queue< T >::limit(), RIOQueue::print_edp(), REDQueue::print_edp(), Queue< T >::Queue(), and PriQueue::recvHighPriority(). |
|
|||||
|
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(). |
|
|||||
|
Definition at line 416 of file mcache.h. Referenced by Queue< T >::dequeue(), Queue< T >::detach(), Queue< T >::enqueue(), and Queue< T >::Queue(). |
|
|
|
|
|
|||||
|
Definition at line 150 of file queue.h. Referenced by REDQueue::print_summarystats(), DropTail::print_summarystats(), Queue< T >::reset(), and Queue< T >::updateStats(). |
|
|
|
|
|||||
|
Definition at line 149 of file queue.h. Referenced by REDQueue::print_summarystats(), DropTail::print_summarystats(), Queue< T >::reset(), and Queue< T >::updateStats(). |
|
|||||
|
Definition at line 144 of file queue.h. Referenced by Queue< T >::Queue(), and Queue< T >::resume(). |
|
|||||
|
Definition at line 156 of file queue.h. Referenced by Queue< T >::Queue(), and Queue< T >::utilUpdate(). |
|
|
Definition at line 57 of file gk.h. Referenced by deque_vq(), enque(), and GK(). |
1.3.3