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

📄 mac-802_11.cc

📁 802.11的.cc文件
💻 CC
📖 第 1 页 / 共 3 页
字号:
		if (mhBackoff_.busy() == 0) {			hdr_cmn *ch = HDR_CMN(pktTx_);			struct hdr_mac802_11 *mh = HDR_MAC802_11(pktTx_);						if ((u_int32_t) ch->size() < macmib_.getRTSThreshold()			    || (u_int32_t) ETHER_ADDR(mh->dh_ra) == MAC_BROADCAST) {				if (bugFix_timer_) {					mhBackoff_.start(cw_, is_idle(), 							 phymib_.getDIFS());				}				else {					rTime = (Random::random() % cw_)						* phymib_.getSlotTime();					mhDefer_.start(phymib_.getDIFS() + 						       rTime);				}                        } else {				mhDefer_.start(phymib_.getSIFS());                        }		}	} else if(callback_) {		Handler *h = callback_;		callback_ = 0;		h->handle((Event*) 0);	}	setTxState(MAC_IDLE);}voidMac802_11::rx_resume(){	assert(pktRx_ == 0);	assert(mhRecv_.busy() == 0);	setRxState(MAC_IDLE);}/* ======================================================================   Timer Handler Routines   ====================================================================== */voidMac802_11::backoffHandler(){	if(pktCTRL_) {		assert(mhSend_.busy() || mhDefer_.busy());		return;	}	if(check_pktRTS() == 0)		return;	if(check_pktTx() == 0)		return;}voidMac802_11::deferHandler(){	assert(pktCTRL_ || pktRTS_ || pktTx_);	if(check_pktCTRL() == 0)		return;	assert(mhBackoff_.busy() == 0);	if(check_pktRTS() == 0)		return;	if(check_pktTx() == 0)		return;}voidMac802_11::navHandler(){	if(is_idle() && mhBackoff_.paused())		mhBackoff_.resume(phymib_.getDIFS());}voidMac802_11::recvHandler(){	recv_timer();}voidMac802_11::sendHandler(){	send_timer();}voidMac802_11::txHandler(){	if (EOTtarget_) {		assert(eotPacket_);		EOTtarget_->recv(eotPacket_, (Handler *) 0);		eotPacket_ = NULL;	}	tx_active_ = 0;}/* ======================================================================   The "real" Timer Handler Routines   ====================================================================== */voidMac802_11::send_timer(){	switch(tx_state_) {	/*	 * Sent a RTS, but did not receive a CTS.	 */	case MAC_RTS:		RetransmitRTS();		break;	/*	 * Sent a CTS, but did not receive a DATA packet.	 */	case MAC_CTS:		assert(pktCTRL_);		Packet::free(pktCTRL_); 		pktCTRL_ = 0;		break;	/*	 * Sent DATA, but did not receive an ACK packet.	 */	case MAC_SEND:		RetransmitDATA();		break;	/*	 * Sent an ACK, and now ready to resume transmission.	 */	case MAC_ACK:		assert(pktCTRL_);		Packet::free(pktCTRL_); 		pktCTRL_ = 0;		break;	case MAC_IDLE:		break;	default:		assert(0);	}	tx_resume();}/* ======================================================================   Outgoing Packet Routines   ====================================================================== */intMac802_11::check_pktCTRL(){	struct hdr_mac802_11 *mh;	double timeout;	if(pktCTRL_ == 0)		return -1;	if(tx_state_ == MAC_CTS || tx_state_ == MAC_ACK)		return -1;	mh = HDR_MAC802_11(pktCTRL_);							  	switch(mh->dh_fc.fc_subtype) {	/*	 *  If the medium is not IDLE, don't send the CTS.	 */	case MAC_Subtype_CTS:		if(!is_idle()) {			discard(pktCTRL_, DROP_MAC_BUSY); pktCTRL_ = 0;			return 0;		}		setTxState(MAC_CTS);		/*		 * timeout:  cts + data tx time calculated by		 *           adding cts tx time to the cts duration		 *           minus ack tx time -- this timeout is		 *           a guess since it is unspecified		 *           (note: mh->dh_duration == cf->cf_duration)		 */				 timeout = txtime(phymib_.getCTSlen(), basicRate_)                        + DSSS_MaxPropagationDelay                      // XXX                        + sec(mh->dh_duration)                        + DSSS_MaxPropagationDelay                      // XXX                       - phymib_.getSIFS()                       - txtime(phymib_.getACKlen(), basicRate_);		break;		/*		 * IEEE 802.11 specs, section 9.2.8		 * Acknowledments are sent after an SIFS, without regard to		 * the busy/idle state of the medium.		 */	case MAC_Subtype_ACK:				setTxState(MAC_ACK);		timeout = txtime(phymib_.getACKlen(), basicRate_);		break;	default:		fprintf(stderr, "check_pktCTRL:Invalid MAC Control subtype\n");		exit(1);	}	transmit(pktCTRL_, timeout);	return 0;}intMac802_11::check_pktRTS(){	struct hdr_mac802_11 *mh;	double timeout;	assert(mhBackoff_.busy() == 0);	if(pktRTS_ == 0) 		return -1;	mh = HDR_MAC802_11(pktRTS_); 	switch(mh->dh_fc.fc_subtype) {	case MAC_Subtype_RTS:		if(! is_idle()) {			inc_cw();			mhBackoff_.start(cw_, is_idle());			return 0;		}		setTxState(MAC_RTS);		timeout = txtime(phymib_.getRTSlen(), basicRate_)			+ DSSS_MaxPropagationDelay                      // XXX			+ phymib_.getSIFS()			+ txtime(phymib_.getCTSlen(), basicRate_)			+ DSSS_MaxPropagationDelay;		break;	default:		fprintf(stderr, "check_pktRTS:Invalid MAC Control subtype\n");		exit(1);	}	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_);	switch(mh->dh_fc.fc_subtype) {	case MAC_Subtype_Data:		if(! is_idle()) {			sendRTS(ETHER_ADDR(mh->dh_ra));			inc_cw();			mhBackoff_.start(cw_, is_idle());			return 0;		}		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");		exit(1);	}	transmit(pktTx_, timeout);	return 0;}/* * 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.	 */	if( (u_int32_t) HDR_CMN(pktTx_)->size() < macmib_.getRTSThreshold() ||            (u_int32_t) dst == MAC_BROADCAST) {		Packet::free(p);		return;	}	ch->uid() = 0;	ch->ptype() = PT_MAC;	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 */		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;	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 */	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() = 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	 */	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;		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_);	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 = 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);	macmib_.RTSFailureCount++;	ssrc_ += 1;			// STA Short Retry Count			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.                         */			ch->size() -= phymib_.getHdrLen11();                        ch->xmit_reason_ = XMIT_REASON_RTS;                        ch->xmit_failure_(pktTx_->copy(),                                          ch->xmit_failure_data_);                }		discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); 		pktTx_ = 0;		ssrc_ = 0;		rst_cw();	} else {		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;	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.	 */	if((u_int32_t)ETHER_ADDR(mh->dh_ra) == MAC_BROADCAST) {		Packet::free(pktTx_); 

⌨️ 快捷键说明

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