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

📄 channel.cc

📁 thomson_mesh_modules_Enhanced Wireless Mesh Networking for ns-2 simulator
💻 CC
📖 第 1 页 / 共 2 页
字号:
			 rifp = (rnode->ifhead()).lh_first;			 for(; rifp; rifp = rifp->nextnode()){				 s.schedule(rifp, newp, propdelay);			 }		 }		 delete [] affectedNodes;	 }	 Packet::free(p);}voidWirelessChannel::addNodeToList(MobileNode *mn){	MobileNode *tmp;	// create list of mobilenodes for this channel	if (xListHead_ == NULL) {//		fprintf(stderr, "INITIALIZE THE LIST xListHead\n"); VIVEK_NEW		xListHead_ = mn;		xListHead_->nextX_ = NULL;		xListHead_->prevX_ = NULL;	} else {		for (tmp = xListHead_; tmp->nextX_ != NULL; tmp=tmp->nextX_);		tmp->nextX_ = mn;		mn->prevX_ = tmp;		mn->nextX_ = NULL;	}	numNodes_++;}voidWirelessChannel::removeNodeFromList(MobileNode *mn) {		MobileNode *tmp;	// Find node in list	for (tmp = xListHead_; tmp->nextX_ != NULL; tmp=tmp->nextX_) {		if (tmp == mn) {			if (tmp == xListHead_) {				xListHead_ = tmp->nextX_;				if (tmp->nextX_ != NULL)					tmp->nextX_->prevX_ = NULL;			} else if (tmp->nextX_ == NULL) 				tmp->prevX_->nextX_ = NULL;			else {				tmp->prevX_->nextX_ = tmp->nextX_;				tmp->nextX_->prevX_ = tmp->prevX_;			}			numNodes_--;			return;		}	}	fprintf(stderr, "Channel: node not found in list\n");}voidWirelessChannel::sortLists(void) {	bool flag = true;	MobileNode *m, *q;	sorted_ = true;	// VIVEK_NEW	fprintf(stderr, "SORTING LISTS ...");	/* Buble sort algorithm */	// SORT x-list	while(flag) {		flag = false;		m = xListHead_;		while (m != NULL){			if(m->nextX_ != NULL)				if ( m->X() > m->nextX_->X() ){					flag = true;					//delete_after m;					q = m->nextX_;					m->nextX_ = q->nextX_;					if (q->nextX_ != NULL)						q->nextX_->prevX_ = m;			    					//insert_before m;					q->nextX_ = m;					q->prevX_ = m->prevX_;					m->prevX_ = q;					if (q->prevX_ != NULL)						q->prevX_->nextX_ = q;					// adjust Head of List					if(m == xListHead_) 						xListHead_ = m->prevX_;				}			m = m -> nextX_;		}	}	//VIVEK_NEW	fprintf(stderr, "DONE!\n");}voidWirelessChannel::updateNodesList(class MobileNode *mn, double oldX) {		MobileNode* tmp;	double X = mn->X();	bool skipX=false;		if(!sorted_) {		sortLists();		return;	}		/* xListHead cannot be NULL here (they are created during creation of mobilenode) */		/***  DELETE ***/	// deleting mn from x-list	if(mn->nextX_ != NULL) {		if(mn->prevX_ != NULL){			if((mn->nextX_->X() >= X) && (mn->prevX_->X() <= X)) skipX = true; // the node doesn't change its position in the list			else{				mn->nextX_->prevX_ = mn->prevX_;				mn->prevX_->nextX_ = mn->nextX_;			}		}				else{			if(mn->nextX_->X() >= X) skipX = true; // skip updating the first element			else{				mn->nextX_->prevX_ = NULL;				xListHead_ = mn->nextX_;			}		}	}		else if(mn->prevX_ !=NULL){		if(mn->prevX_->X() <= X) skipX = true; // skip updating the last element		else mn->prevX_->nextX_ = NULL;	}		if ((mn->prevX_ == NULL) && (mn->nextX_ == NULL)) skipX = true; //skip updating if only one element in list		/*** INSERT ***/	//inserting mn in x-list	if(!skipX){		if(X > oldX){						for(tmp = mn; tmp->nextX_ != NULL && tmp->nextX_->X() < X; tmp = tmp->nextX_);			//fprintf(stdout,"Scanning the element addr %d X=%0.f, next addr %d X=%0.f\n", tmp, tmp->X(), tmp->nextX_, tmp->nextX_->X());			if(tmp->nextX_ == NULL) { 				//fprintf(stdout, "tmp->nextX_ is NULL\n");				tmp->nextX_ = mn;				mn->prevX_ = tmp;				mn->nextX_ = NULL;			} 			else{ 				//fprintf(stdout, "tmp->nextX_ is not NULL, tmp->nextX_->X()=%0.f\n", tmp->nextX_->X());				mn->prevX_ = tmp->nextX_->prevX_;				mn->nextX_ = tmp->nextX_;				tmp->nextX_->prevX_ = mn;  					tmp->nextX_ = mn;			} 		}		else{			for(tmp = mn; tmp->prevX_ != NULL && tmp->prevX_->X() > X; tmp = tmp->prevX_);				//fprintf(stdout,"Scanning the element addr %d X=%0.f, prev addr %d X=%0.f\n", tmp, tmp->X(), tmp->prevX_, tmp->prevX_->X());			if(tmp->prevX_ == NULL) {				//fprintf(stdout, "tmp->prevX_ is NULL\n");				tmp->prevX_ = mn;				mn->nextX_ = tmp;				mn->prevX_ = NULL;				xListHead_ = mn;			} 			else{				//fprintf(stdout, "tmp->prevX_ is not NULL, tmp->prevX_->X()=%0.f\n", tmp->prevX_->X());				mn->nextX_ = tmp->prevX_->nextX_;				mn->prevX_ = tmp->prevX_;				tmp->prevX_->nextX_ = mn;  					tmp->prevX_ = mn;					}		}	}}MobileNode **WirelessChannel::getAffectedNodes(MobileNode *mn, double radius,				  int *numAffectedNodes){	double xmin, xmax, ymin, ymax;	int n = 0;	MobileNode *tmp, **list, **tmpList;	if (xListHead_ == NULL) {		*numAffectedNodes=-1;		fprintf(stderr, "xListHead_ is NULL when trying to send!!!\n");		return NULL;	}		xmin = mn->X() - radius;	xmax = mn->X() + radius;	ymin = mn->Y() - radius;	ymax = mn->Y() + radius;		// First allocate as much as possibly needed	tmpList = new MobileNode*[numNodes_];		for(tmp = xListHead_; tmp != NULL; tmp = tmp->nextX_) tmpList[n++] = tmp;	for(int i = 0; i < n; ++i)		if(tmpList[i]->speed()!=0.0 && (Scheduler::instance().clock() -						tmpList[i]->getUpdateTime()) > XLIST_POSITION_UPDATE_INTERVAL )			tmpList[i]->update_position();	n=0;		for(tmp = mn; tmp != NULL && tmp->X() >= xmin; tmp=tmp->prevX_)		if(tmp->Y() >= ymin && tmp->Y() <= ymax){			tmpList[n++] = tmp;		}	for(tmp = mn->nextX_; tmp != NULL && tmp->X() <= xmax; tmp=tmp->nextX_){		if(tmp->Y() >= ymin && tmp->Y() <= ymax){			tmpList[n++] = tmp;		}	}		list = new MobileNode*[n];	memcpy(list, tmpList, n * sizeof(MobileNode *));	delete [] tmpList;         	*numAffectedNodes = n;	return list;} /* Only to be used with mobile nodes (WirelessPhy). * NS-2 at its current state support only a flat (non 3D) movement of nodes, * so we assume antenna heights do not change for the dureation of * a simulation. * Another assumption - all nodes have the same wireless interface, so that * the maximum distance, corresponding to CST (at max transmission power  * level) stays the same for all nodes. */voidWirelessChannel::calcHighestAntennaZ(Phy *tifp){       double highestZ = 0;       Phy *n;        for(n = ifhead_.lh_first; n; n = n->nextchnl()) {                   if(((WirelessPhy *)n)->getAntennaZ() > highestZ)                               highestZ = ((WirelessPhy *)n)->getAntennaZ();       }        highestAntennaZ_ = highestZ;       WirelessPhy *wifp = (WirelessPhy *)tifp;       distCST_ = wifp->getDist(wifp->getCSThresh(), wifp->getPt(), 1.0, 1.0,				highestZ , highestZ, wifp->getL(),				wifp->getLambda());       }	doubleWirelessChannel::get_pdelay(Node* tnode, Node* rnode){	// Scheduler	&s = Scheduler::instance();	MobileNode* tmnode = (MobileNode*)tnode;	MobileNode* rmnode = (MobileNode*)rnode;	double propdelay = 0;		propdelay = tmnode->propdelay(rmnode);	assert(propdelay >= 0.0);	if (propdelay == 0.0) {		/* if the propdelay is 0 b/c two nodes are on top of 		   each other, move them slightly apart -dam 7/28/98 */		propdelay = 2 * DBL_EPSILON;		//printf ("propdelay 0: %d->%d at %f\n",		//	tmnode->address(), rmnode->address(), s.clock());	}	return propdelay;}	// send()://  The packet occupies the channel for the transmission time, txtime//  If collision occur (>1 pkts overlap), corrupt all pkts involved//	by setting the error bit or discard them// int Channel::send(Packet* p, Phy *tifp)// {// 	// without collision, return 0// 	Scheduler& s = Scheduler::instance();// 	double now = s.clock();// 	// busy = time when the channel are still busy with earlier tx// 	double busy = max(txstop_, cwstop_);// 	// txstop = when the channel is no longer busy from this tx// 	txstop_ = max(busy, now + txtime);// 	// now < busy => collision// 	//	mark the pkt error bit, EF_COLLISION// 	//	drop if there is a drop target, drop_// 	if (now < busy) {// 		// if still transmit earlier packet, pkt_, then corrupt it// 		if (pkt_ && pkt_->time_ > now) {// 			hdr_cmn::access(pkt_)->error() |= EF_COLLISION;// 			if (drop_) {// 				s.cancel(pkt_);// 				drop(pkt_);// 				pkt_ = 0;// 			}// 		}// 		// corrupts the current packet p, and drop if drop_ exists// 		hdr_cmn::access(p)->error() |= EF_COLLISION;// 		if (drop_) {// 			drop(p);// 			return 1;// 		}// 	}// 	// if p was not dropped, call recv() or hand it to trace_ if present// 	pkt_ = p;// 	trace_ ? trace_->recv(p, 0) : recv(p, 0);// 	return 0;// }// contention()://  The MAC calls this Channel::contention() to enter contention period//  It determines when the contention window is over, cwstop_,//	and schedule a callback to the MAC for the actual send()// void Channel::contention(Packet* p, Handler* h)// {// 	Scheduler& s = Scheduler::instance();// 	double now = s.clock();// 	if (now > cwstop_) {// 		cwstop_ = now + delay_;// 		numtx_ = 0;// 	}// 	numtx_++;// 	s.schedule(h, p, cwstop_ - now);// }// jam()://  Jam the channel for a period txtime//  Some MAC protocols use this to let other MAC detect collisions// int Channel::jam(double txtime)// {// 	// without collision, return 0// 	double now = Scheduler::instance().clock();// 	if (txstop_ > now) {// 		txstop_ = max(txstop_, now + txtime);// 		return 1;// 	}// 	txstop_ = now + txtime;// 	return (now < cwstop_);// }// int DuplexChannel::send(Packet* p, double txtime)// {// 	double now = Scheduler::instance().clock();// 	txstop_ = now + txtime;// 	trace_ ? trace_->recv(p, 0) : recv(p, 0);// 	return 0;// }// void DuplexChannel::contention(Packet* p, Handler* h)// {// 	Scheduler::instance().schedule(h, p, delay_);// 	numtx_ = 1;// }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -