📄 lbf.cc
字号:
is now. */#include "bt-core.h"static class LBFClass : public TclClass {public: LBFClass() : TclClass ("LBF") {} TclObject* create(int,const char*const*) { return (new LBF()); }}class_lbf;LBF::LBF() :tokens_(0),th_(this),sh_(this), firsttime_(1){ inputQ_=new PacketQueue(); blockedQ_ = new PacketQueue(); bind("conn_handle_",&conn_handle_);} void LBF::setParameters (flowSpec* qos){ if (qos->token_rate <= 0) { tokenRate_ = -1.0; peak_bw_ = 1e+8; } else { tokenRate_ = 1000*(qos->token_rate); bucket_ = qos->token_bucket; tokens_ = (double)bucket_; qlength_ = qos->input_qlen; peak_bw_ = 1000*(qos->peak_bw); }}void LBF::recv(Packet *p, Handler *){ hdr_cmn* ch = HDR_CMN(p); int size = ch->size()<<3; Scheduler& s = Scheduler::instance(); if (tokenRate_ < 0.0) { // by-pass token bucket blockedQ_->enque(p); if (blockedQ_->length() == 1) s.schedule(&sh_, &send_ev_, size/peak_bw_); return; } int len = inputQ_->length(); if (len && len < qlength_) { inputQ_->enque(p); return; } else if (len >= qlength_) { drop(p); return; } if (firsttime_) { lastupdate_ = s.clock(); firsttime_ = 0; } else updatetokens(); if (tokens_ >= size) { blockedQ_->enque(p); tokens_ -= size; //printf("DEBUG: Tokens decremented %e, clock %e, CH %d\n", tokens_, s.clock(), conn_handle_); if (blockedQ_->length() == 1) s.schedule(&sh_, &send_ev_, size/peak_bw_); } else { if (qlength_) { inputQ_->enque(p); s.schedule(&th_, p, (size - tokens_)/tokenRate_); } else { drop(p); } }}void LBF::release(){ Scheduler& s = Scheduler::instance(); Packet *p=inputQ_->deque(); updatetokens(); hdr_cmn* ch = HDR_CMN(p); int size = ch->size()<<3; blockedQ_->enque(p); if (blockedQ_->length() == 1) s.schedule(&sh_, &send_ev_, size/peak_bw_); //tokens_ -= size; tokens_ = 0.0; //printf("DEBUG: Tokens decremented %e, clock %e, CH %d\n", tokens_, s.clock(), conn_handle_); if (inputQ_->length()) { p=inputQ_->head(); hdr_cmn* ch = HDR_CMN(p); size = ch->size()<<3; s.schedule(&th_, p, (size-tokens_)/tokenRate_); }}void LBF::updatetokens(void){ Scheduler& s = Scheduler::instance(); tokens_ += (s.clock()-lastupdate_)*tokenRate_; tokens_ = (tokens_ > bucket_) ? bucket_ : tokens_; lastupdate_ = s.clock(); //printf("DEBUG: Updated tokens %e, clock %e CH %d\n", tokens_, s.clock(), conn_handle_);}voidTokenHandler::handle (Event* e){ lbf_->release();}void SendHandler::handle (Event* e){ Scheduler& s = Scheduler::instance(); Packet* p = lbf_->blockedQ_->deque(); hdr_cmn* hdr = HDR_CMN(p); lbf_->downtarget_->recv(p,lbf_); //printf("DEBUG:SIZE: %d LBF released packet, clock %e, CH %d\n", hdr->size(), s.clock(), lbf_->conn_handle_); if (p = lbf_->blockedQ_->head()) { hdr_cmn* ch = HDR_CMN(p); int pktsize = ch->size()<<3; s.schedule(this, e, pktsize/lbf_->peak_bw_); } else if (lbf_->inputQ_->length() == 0) { L2CAP* up = (L2CAP*)(lbf_->uptarget_); up->callback(lbf_->conn_handle_); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -