⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lbf.cc

📁 NS2网络仿真软件是目前最为流行的网络仿真模拟软件
💻 CC
📖 第 1 页 / 共 2 页
字号:
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 + -