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

📄 mac-802_11.cc

📁 在网络仿真模拟工具下实现MAC层802.11DCF协议
💻 CC
📖 第 1 页 / 共 4 页
字号:
	transmit(pktRTS_, timeout);  	return 0;}intMac802_11::check_pktTx(){	struct hdr_mac802_11 *mh;	double timeout;		assert(mhBackoff_.busy() == 0);	if(pktTx_ == 0)		return -1;	mh = HDR_MAC802_11(pktTx_);       	//int len = HDR_CMN(pktTx_)->size();//-ak-----------//	printf("chckpkt TX \n");	switch(mh->dh_fc.fc_subtype) {	case MAC_Subtype_Data:		if(! is_idle()) {			// change wrt Mike's code			//sendRTS(ETHER_ADDR(mh->dh_da));			sendRTS(ETHER_ADDR(mh->dh_ra));			inc_cw();			mhBackoff_.start(cw_, is_idle());			return 0;		}		// change wrt Mike's code		//SET_TX_STATE(MAC_SEND);		/*if((u_int32_t)ETHER_ADDR(mh->dh_da) != MAC_BROADCAST)			timeout = txtime(pktTx_)				+ DSSS_MaxPropagationDelay		// XXX				+ sifs_				+ txtime(ETHER_ACK_LEN, basicRate_)				+ DSSS_MaxPropagationDelay;		*/// XXX		setTxState(MAC_SEND);               if((u_int32_t)ETHER_ADDR(mh->dh_ra) != MAC_BROADCAST)                        timeout = txtime(pktTx_)                                + DSSS_MaxPropagationDelay              // XXX                               + phymib_.getSIFS()                               + txtime(phymib_.getACKlen(), basicRate_)                               + DSSS_MaxPropagationDelay;             // XXX		else			timeout = txtime(pktTx_);		break;	default:		fprintf(stderr, "check_pktTx:Invalid MAC Control subtype\n");		//printf("pktRTS:%x, pktCTS/ACK:%x, pktTx:%x\n",pktRTS_, pktCTRL_,pktTx_);		exit(1);	}	// change wrt Mike's code        //TRANSMIT(pktTx_, timeout);	transmit(pktTx_, timeout);	return 0;}/*void  Mac802_11::sendSCANREQ(int dst)  {  Packet *p = Packet::alloc();  hdr_cmn* ch = HDR_CMN(p);  struct probereq_frame *pbr = (struct probereq_frame*)p->access(hdr_mac::offset_);  assert(pktTx_);  assert(pktRTS_ == 0);      ch->uid() = 0;  ch->ptype() = PT_MAC;  // change wrt Mike's code  //ch->size() = ETHER_RTS_LEN;  ch->size() = phymib_.getRTSlen();  ch->iface() = -2;  ch->error() = 0;    bzero(srf, MAC_HDR_LEN);    pbr->preq_fc.fc_protocol_version = MAC_ProtocolVersion;  pbr->preq_fc.fc_type       = MAC_Type_Management;  pbr->preq_fc.fc_subtype    = MAC_Subtype_ProbeReq;  pbr->preq_fc.fc_to_ds      = 0;  pbr->preq_fc.fc_from_ds    = 0;  pbr->preq_fc.fc_more_frag  = 0;  pbr->preq_fc.fc_retry      = 0;  pbr->preq_fc.fc_pwr_mgt    = 0;    //rf->rf_duration = RTS_DURATION(pktTx_);  STORE4BYTE(&dst, (srf->rf_ra));    /*  store rts tx time *//*      ch->txtime() = txtime(ch->size(), basicRate_);	STORE4BYTE(&index_, (srf->rf_ta));*//* calculate rts duration field */// change wrt Mike's code/*  pbr->rf_duration = usec(sifs_  + txtime(ETHER_CTS_LEN, basicRate_)  + sifs_  + txtime(pktTx_)  + sifs_  + txtime(ETHER_ACK_LEN, basicRate_));*//*  pbr->preq_duration = usec(phymib_.getSIFS()  + txtime(phymib_.getCTSlen(), basicRate_)  + phymib_.getSIFS()  + txtime(pktTx_)  + phymib_.getSIFS()  + txtime(phymib_.getACKlen(), basicRate_));    pktRTS_ = p;    }*//* * Low-level transmit functions that actually place the packet onto * the channel. */voidMac802_11::sendRTS(int dst){	Packet *p = Packet::alloc();	hdr_cmn* ch = HDR_CMN(p);	struct rts_frame *rf = (struct rts_frame*)p->access(hdr_mac::offset_);		assert(pktTx_);	assert(pktRTS_ == 0);	/*	 *  If the size of the packet is larger than the	 *  RTSThreshold, then perform the RTS/CTS exchange.	 *	 *  XXX: also skip if destination is a broadcast	 */	// change wrt Mike's code	/*if( (u_int32_t) HDR_CMN(pktTx_)->size() < macmib_->RTSThreshold ||	    (u_int32_t) dst == MAC_BROADCAST) {*/	if( (u_int32_t) HDR_CMN(pktTx_)->size() < macmib_.getRTSThreshold() ||            (u_int32_t) dst == MAC_BROADCAST) {		Packet::free(p);		//p = 0;		return;	}	ch->uid() = 0;	ch->ptype() = PT_MAC;	// change wrt Mike's code	//ch->size() = ETHER_RTS_LEN;	ch->size() = phymib_.getRTSlen();	ch->iface() = -2;	ch->error() = 0;	bzero(rf, MAC_HDR_LEN);	rf->rf_fc.fc_protocol_version = MAC_ProtocolVersion; 	rf->rf_fc.fc_type	= MAC_Type_Control; 	rf->rf_fc.fc_subtype	= MAC_Subtype_RTS; 	rf->rf_fc.fc_to_ds	= 0; 	rf->rf_fc.fc_from_ds	= 0; 	rf->rf_fc.fc_more_frag	= 0; 	rf->rf_fc.fc_retry	= 0; 	rf->rf_fc.fc_pwr_mgt	= 0; 	rf->rf_fc.fc_more_data	= 0; 	rf->rf_fc.fc_wep	= 0; 	rf->rf_fc.fc_order	= 0;	//rf->rf_duration = RTS_DURATION(pktTx_);	STORE4BYTE(&dst, (rf->rf_ra));		/* store rts tx time */ 	ch->txtime() = txtime(ch->size(), basicRate_);		STORE4BYTE(&index_, (rf->rf_ta));			/* calculate rts duration field */		// change wrt Mike's code	/*	rf->rf_duration = usec(sifs_			       + txtime(ETHER_CTS_LEN, basicRate_)			       + sifs_			       + txtime(pktTx_)			       + sifs_			       + txtime(ETHER_ACK_LEN, basicRate_));	*/	   rf->rf_duration = usec(phymib_.getSIFS()                              + txtime(phymib_.getCTSlen(), basicRate_)                              + phymib_.getSIFS()                               + txtime(pktTx_)                              + phymib_.getSIFS()                              + txtime(phymib_.getACKlen(), basicRate_));	pktRTS_ = p;}voidMac802_11::sendCTS(int dst, double rts_duration){	Packet *p = Packet::alloc();	hdr_cmn* ch = HDR_CMN(p);	struct cts_frame *cf = (struct cts_frame*)p->access(hdr_mac::offset_);	assert(pktCTRL_ == 0);	ch->uid() = 0;	ch->ptype() = PT_MAC;	// change wrt Mike's code	//ch->size() = ETHER_CTS_LEN;	ch->size() = phymib_.getCTSlen();	ch->iface() = -2;	ch->error() = 0;	//ch->direction() = hdr_cmn::DOWN;	bzero(cf, MAC_HDR_LEN);	cf->cf_fc.fc_protocol_version = MAC_ProtocolVersion;	cf->cf_fc.fc_type	= MAC_Type_Control;	cf->cf_fc.fc_subtype	= MAC_Subtype_CTS; 	cf->cf_fc.fc_to_ds	= 0; 	cf->cf_fc.fc_from_ds	= 0; 	cf->cf_fc.fc_more_frag	= 0; 	cf->cf_fc.fc_retry	= 0; 	cf->cf_fc.fc_pwr_mgt	= 0; 	cf->cf_fc.fc_more_data	= 0; 	cf->cf_fc.fc_wep	= 0; 	cf->cf_fc.fc_order	= 0;		//cf->cf_duration = CTS_DURATION(rts_duration);	STORE4BYTE(&dst, (cf->cf_ra));		/* store cts tx time */	ch->txtime() = txtime(ch->size(), basicRate_);		/* calculate cts duration */	// change wrt Mike's code	/*cf->cf_duration = usec(sec(rts_duration)			       - sifs_			       - txtime(ETHER_CTS_LEN, basicRate_));*/	cf->cf_duration = usec(sec(rts_duration)                              - phymib_.getSIFS()                              - txtime(phymib_.getCTSlen(), basicRate_));		pktCTRL_ = p;	}voidMac802_11::sendACK(int dst){	Packet *p = Packet::alloc();	hdr_cmn* ch = HDR_CMN(p);	struct ack_frame *af = (struct ack_frame*)p->access(hdr_mac::offset_);	assert(pktCTRL_ == 0);	ch->uid() = 0;	ch->ptype() = PT_MAC;	// CHANGE WRT Mike's code	//ch->size() = ETHER_ACK_LEN;	ch->size() = phymib_.getACKlen();	ch->iface() = -2;	ch->error() = 0;		bzero(af, MAC_HDR_LEN);	af->af_fc.fc_protocol_version = MAC_ProtocolVersion; 	af->af_fc.fc_type	= MAC_Type_Control; 	af->af_fc.fc_subtype	= MAC_Subtype_ACK; 	af->af_fc.fc_to_ds	= 0; 	af->af_fc.fc_from_ds	= 0; 	af->af_fc.fc_more_frag	= 0; 	af->af_fc.fc_retry	= 0; 	af->af_fc.fc_pwr_mgt	= 0; 	af->af_fc.fc_more_data	= 0; 	af->af_fc.fc_wep	= 0; 	af->af_fc.fc_order	= 0;	//af->af_duration = ACK_DURATION();	STORE4BYTE(&dst, (af->af_ra));	/* store ack tx time */ 	ch->txtime() = txtime(ch->size(), basicRate_);		/* calculate ack duration */ 	af->af_duration = 0;			pktCTRL_ = p;}voidMac802_11::sendDATA(Packet *p){	hdr_cmn* ch = HDR_CMN(p);	struct hdr_mac802_11* dh = HDR_MAC802_11(p);	assert(pktTx_ == 0);	/*	 * Update the MAC header	 */	// change wrt Mike's code	//ch->size() += ETHER_HDR_LEN11;	ch->size() += phymib_.getHdrLen11();	dh->dh_fc.fc_protocol_version = MAC_ProtocolVersion;	dh->dh_fc.fc_type       = MAC_Type_Data;	dh->dh_fc.fc_subtype    = MAC_Subtype_Data;	//printf(".....p = %x, mac-subtype-%d\n",p,dh->dh_fc.fc_subtype);		dh->dh_fc.fc_to_ds      = 0;	dh->dh_fc.fc_from_ds    = 0;	dh->dh_fc.fc_more_frag  = 0;	dh->dh_fc.fc_retry      = 0;	dh->dh_fc.fc_pwr_mgt    = 0;	dh->dh_fc.fc_more_data  = 0;	dh->dh_fc.fc_wep        = 0;	dh->dh_fc.fc_order      = 0;	/* store data tx time */ 	ch->txtime() = txtime(ch->size(), dataRate_);// change wrt Mike's code//	if((u_int32_t)ETHER_ADDR(dh->dh_da) != MAC_BROADCAST) {	if((u_int32_t)ETHER_ADDR(dh->dh_ra) != MAC_BROADCAST) {		/* store data tx time for unicast packets */		ch->txtime() = txtime(ch->size(), dataRate_);				//dh->dh_duration = DATA_DURATION();		// chnage wrt Mike's code		//dh->dh_duration = usec(txtime(ETHER_ACK_LEN, basicRate_) 				       //+ sifs_);		dh->dh_duration = usec(txtime(phymib_.getACKlen(), basicRate_)                                      + phymib_.getSIFS());	} else {		/* store data tx time for broadcast packets (see 9.6) */		ch->txtime() = txtime(ch->size(), basicRate_);				dh->dh_duration = 0;	}	pktTx_ = p;}/* ======================================================================   Retransmission Routines   ====================================================================== */voidMac802_11::RetransmitRTS(){	assert(pktTx_);	assert(pktRTS_);	assert(mhBackoff_.busy() == 0);// change wrt Mike's code//	macmib_->RTSFailureCount++;	macmib_.RTSFailureCount++;	ssrc_ += 1;			// STA Short Retry Count// change wrt Mike's code//	if(ssrc_ >= macmib_->ShortRetryLimit) {			if(ssrc_ >= macmib_.getShortRetryLimit()) {		discard(pktRTS_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktRTS_ = 0;		/* tell the callback the send operation failed 		   before discarding the packet */		hdr_cmn *ch = HDR_CMN(pktTx_);		if (ch->xmit_failure_) {                        /*                         *  Need to remove the MAC header so that                          *  re-cycled packets don't keep getting                         *  bigger.                         */			// change wrt Mike's code                        //ch->size() -= ETHER_HDR_LEN11;			ch->size() -= phymib_.getHdrLen11();                        ch->xmit_reason_ = XMIT_REASON_RTS;                        ch->xmit_failure_(pktTx_->copy(),                                          ch->xmit_failure_data_);                }		//printf("(%d)....discarding RTS:%x\n",index_,pktRTS_);		discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktTx_ = 0;		ssrc_ = 0;		rst_cw();	} else {		//printf("(%d)...retxing RTS:%x\n",index_,pktRTS_);		struct rts_frame *rf;		rf = (struct rts_frame*)pktRTS_->access(hdr_mac::offset_);		rf->rf_fc.fc_retry = 1;		inc_cw();		mhBackoff_.start(cw_, is_idle());	}}voidMac802_11::RetransmitDATA(){	struct hdr_cmn *ch;	struct hdr_mac802_11 *mh;// change wrt Mike's code//	u_int32_t *rcount, *thresh;	u_int32_t *rcount, thresh;	assert(mhBackoff_.busy() == 0);	assert(pktTx_);	assert(pktRTS_ == 0);	ch = HDR_CMN(pktTx_);	mh = HDR_MAC802_11(pktTx_);	/*	 *  Broadcast packets don't get ACKed and therefore	 *  are never retransmitted.	 */// change wrt Mike's code//	if((u_int32_t)ETHER_ADDR(mh->dh_da) == MAC_BROADCAST) {			if((u_int32_t)ETHER_ADDR(mh->dh_ra) == MAC_BROADCAST) {		Packet::free(pktTx_); pktTx_ = 0;		/*		 * Backoff at end of TX.		 */		rst_cw();		mhBackoff_.start(cw_, is_idle());		return;	}// change wrt Mike's code//	macmib_->ACKFailureCount++;	macmib_.ACKFailureCount++;	// chnage wrt Mike's code	/*	if((u_int32_t) ch->size() <= macmib_->RTSThreshold) {		rcount = &ssrc_;		thresh = &macmib_->ShortRetryLimit;	}	else {		rcount = &slrc_;		thresh = &macmib_->LongRetryLimit;	}*/	if((u_int32_t) ch->size() <= macmib_.getRTSThreshold()) {                rcount = &ssrc_;               thresh = macmib_.getShortRetryLimit();        }        else {                rcount = &slrc_;               thresh = macmib_.getLongRetryLimit();        }	(*rcount)++;// change wrt Mike's code	//if(*rcount > *thresh) {	//	macmib_->FailedCount++;	if(*rcount >= thresh) {		/* IEEE Spec section 9.2.3.5 says this should be greater than		   or equal */		macmib_.FailedCount++;		/* tell the callback the send operation failed 		   before discarding the packet */		hdr_cmn *ch = HDR_CMN(pktTx_);		if (ch->xmit_failure_) {			// change wrt Mike's code                        //ch->size() -= ETHER_HDR_LEN11;                        ch->size() -= phymib_.getHdrLen11();			ch->xmit_reason_ = XMIT_REASON_ACK;                        ch->xmit_failure_(pktTx_->copy(),                                          ch->xmit_failure_data_);                }		discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktTx_ = 0;		//printf("(%d)DATA discarded: count exceeded\n",index_);		*rcount = 0;		rst_cw();	}	else {		struct hdr_mac802_11 *dh;		dh = HDR_MAC802_11(pktTx_);		dh->dh_fc.fc_retry = 1;// change wrt Mike's code		//sendRTS(ETHER_ADDR(mh->dh_da));		sendRTS(ETHER_ADDR(mh->dh_ra));		//printf("(%d)retxing data:%x..sendRTS..\n",index_,pktTx_);		inc_cw();		mhBackoff_.start(cw_, is_idle());	}}/* ======================================================================   Incoming Packet Routines   ====================================================================== */voidMac802_11::send(Packet *p, Handler *h){	double rTime;	struct hdr_mac802_11* dh = HDR_MAC802_11(p);	/* 	 * drop the packet if the node is in sleep mode	 XXX sleep mode can't stop node from sending packets	 */	EnergyModel *em = netif_->node()->energy_model();	if (em && em->sleep()) {		em->set_node_sleep(0);		em->set_node_state(EnergyModel::INROUTE);	}		callback_ = h;	sendDATA(p);// change wrt Mike's code	//sendRTS(ETHER_ADDR(dh->dh_da));	sendRTS(ETHER_ADDR(dh->dh_ra));

⌨️ 快捷键说明

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