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

📄 wireless-phy.cc

📁 运行于linux上的CIMS套件
💻 CC
字号:
/* -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*-  * * * Copyright (c) 1996 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the Computer Systems *	Engineering Group at Lawrence Berkeley Laboratory and the Daedalus *	research group at UC Berkeley. * 4. Neither the name of the University nor of the Laboratory may be used *    to endorse or promote products derived from this software without *    specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * Ported from CMU/Monarch's code, nov'98 -Padma Haldar.   wireless-phy.cc*/#include <math.h>#include <packet.h>#include <mobilenode.h>#include <phy.h>#include <propagation.h>#include <modulation.h>#include <omni-antenna.h>#include <wireless-phy.h>#include <packet.h>#include <ip.h>#include <agent.h>#include <trace.h>/* ======================================================================   WirelessPhy Interface   ====================================================================== */static class WirelessPhyClass: public TclClass {public:        WirelessPhyClass() : TclClass("Phy/WirelessPhy") {}        TclObject* create(int, const char*const*) {                return (new WirelessPhy);        }} class_WirelessPhy;WirelessPhy::WirelessPhy() : Phy(){	node_ = 0;	propagation_ = 0;	modulation_ = 0;	bandwidth_ = 2*1e6;                 // 100 kb	//	Pt_ = 16.267 * 1e-3;   // 16.267 mW for 100m range with TwoRay model	Pt_ = pow(10, 2.45) * 1e-3;         // 24.5 dbm, ~ 281.8mw	Pr_ = Pt_;	lambda_ = SPEED_OF_LIGHT / (914 * 1e6);  // 914 mHz	L_ = 1.0;	freq_ = -1.0;  /*   *  It sounds like 10db should be the capture threshold.   *   *  If a node is presently receiving a packet a a power level   *  Pa, and a packet at power level Pb arrives, the following   *  comparion must be made to determine whether or not capture   *  occurs:   *   *    10 * log(Pa) - 10 * log(Pb) > 10db   *   *  OR equivalently   *   *    Pa/Pb > 10.   *   */		CPThresh_ = 10.0;	CSThresh_ = 1.559e-11;	RXThresh_ = 3.652e-10;	//bind("CPThresh_", &CPThresh_);	//bind("CSThresh_", &CSThresh_);	//bind("RXThresh_", &RXThresh_);	//bind("bandwidth_", &bandwidth_);	//bind("Pt_", &Pt_);	//bind("freq_", &freq_);	//bind("L_", &L_);        bind("off_ip_", &off_ip_); //CIP  if (freq_ != -1.0)     { // freq was set by tcl code      lambda_ = SPEED_OF_LIGHT / freq_;    }}intWirelessPhy::command(int argc, const char*const* argv){  TclObject *obj;      if(argc == 3) {	  if (strcasecmp(argv[1], "setTxPower") == 0) {		  Pt_ = atof(argv[2]);		  return TCL_OK;	  }	  else if (strcasecmp(argv[1], "setRxPower") == 0) {		  Pr_ = atof(argv[2]);		  return TCL_OK;	  }          else if( (obj = TclObject::lookup(argv[2])) == 0) {		  fprintf(stderr, "WirelessPhy: %s lookup of %s failed\n", 			  argv[1], argv[2]);		  return TCL_ERROR;	  }	  if (strcmp(argv[1], "propagation") == 0) {		  assert(propagation_ == 0);		  propagation_ = (Propagation*) obj;		  return TCL_OK;	  }	  else if (strcasecmp(argv[1], "antenna") == 0) {		  ant_ = (Antenna*) obj;		  return TCL_OK;	  }	  else if (strcasecmp(argv[1], "node") == 0) {		  assert(node_ == 0);		  node_ = (MobileNode*) obj;		  return TCL_OK;	  }  }  return Phy::command(argc,argv);} void WirelessPhy::sendDown(Packet *p){	/*	 * Sanity Check	 */	assert(initialized());	        //CIP        if(node_->isMH == 1) {           MobileNode *tnode_ = p->txinfo_.getNode();           hdr_ip *iph = (hdr_ip *)p->access(off_ip_);           if(tnode_ != NULL) {              if(iph->daddr() != IP_BROADCAST) {                 if(tnode_->address_  == node_->oldBS) {		    Packet::free(p);                    return;                 }              }           }        }        //End of CIP	/*	 * Decrease node's energy	 */	if(node_->energy_model()) {		if ((node_->energy_model())->energy() > 0) {		    double txtime = (8. * hdr_cmn::access(p)->size()) / bandwidth_;		    node_->add_sndtime(txtime);		    (node_->energy_model())->DecrTxEnergy(txtime,Pt_);		    if ((node_->energy_model())->energy() <= 0) {			    node_->energy_model()->setenergy(0);			    node_->log_energy(0);		    }		} else {		     Packet::free(p);		     return;		}			}	/*	 *  Stamp the packet with the interface arguments	 */	p->txinfo_.stamp(node_, ant_->copy(), Pt_, lambda_);		// Send the packet	channel_->recv(p, this);}int WirelessPhy::sendUp(Packet *p){  /*   * Sanity Check   */	assert(initialized());  PacketStamp s;  double Pr;  int pkt_recvd = 0;  // if the node is in sleeping mode, drop the packet simply  if (node_->sleep()) {           pkt_recvd = 0;      goto DONE;  }  // if the energy goes to ZERO, drop the packet simply  if (node_->energy_model()) {       if ((node_->energy_model())->energy() <= 0) {	    pkt_recvd = 0;	    goto DONE;       }   }  if(propagation_) {    s.stamp(node_, ant_, 0, lambda_);        Pr = propagation_->Pr(&p->txinfo_, &s, this);        if (Pr < CSThresh_) {      pkt_recvd = 0;      goto DONE;    }    if (Pr < RXThresh_) {      /*       * We can detect, but not successfully receive       * this packet.       */      hdr_cmn *hdr = HDR_CMN(p);      hdr->error() = 1;#if DEBUG > 3      printf("SM %f.9 _%d_ drop pkt from %d low POWER %e/%e\n",	     Scheduler::instance().clock(), node_->index(),	     p->txinfo_.getNode()->index(),	     Pr,RXThresh);#endif    }  }  if(modulation_) {	  hdr_cmn *hdr = HDR_CMN(p);	  hdr->error() = modulation_->BitError(Pr);  }    /*   * The MAC layer must be notified of the packet reception   * now - ie; when the first bit has been detected - so that   * it can properly do Collision Avoidance / Detection.   */  pkt_recvd = 1;DONE:  p->txinfo_.getAntenna()->release();  //*RxPr = Pr;  /* WILD HACK: The following two variables are a wild hack.     They will go away in the next release...     They're used by the mac-802_11 object to determine     capture.  This will be moved into the net-if family of      objects in the future. */  p->txinfo_.RxPr = Pr;  p->txinfo_.CPThresh = CPThresh_;  /*   * Decrease energy if packet successfully received   */  if(pkt_recvd 	&& node_->energy_model()) {	  double rcvtime = (8. * hdr_cmn::access(p)->size()) / bandwidth_;	  // no way to reach here if the energy level < 0 	  node_->add_rcvtime(rcvtime);	  	  (node_->energy_model())->DecrRcvEnergy(rcvtime,Pr_);	  if ((node_->energy_model())->energy() <= 0) {  	  // saying node died	      node_->energy_model()->setenergy(0);	      node_->log_energy(0);	  }  }  return pkt_recvd;}voidWirelessPhy::dump(void) const{	Phy::dump();	fprintf(stdout,		"\tPt: %f, Gt: %f, Gr: %f, lambda: %f, L: %f\n",		Pt_, ant_->getTxGain(0,0,0,lambda_), ant_->getRxGain(0,0,0,lambda_), lambda_, L_);	fprintf(stdout, "\tbandwidth: %f\n", bandwidth_);	fprintf(stdout, "--------------------------------------------------\n");}

⌨️ 快捷键说明

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