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

📄 802_11_mac.cc

📁 基于Oment++的无线传感器网络仿真
💻 CC
📖 第 1 页 / 共 3 页
字号:
			char a[255];			sprintf(a, " %f Got CTS  from %d and sent DATA , My node id = %d length of msgs queue = %d and length of fragments queue = %d \n", simTime(),((c802_11_Packet*)msg)->getHdr().SourceMACAddress, ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), m_QueueOfMessages.length(), m_QueueOfFragments.length() );			fputs(a,nw_pkt);			fclose(nw_pkt);		}	//	printf( "\n %f Sending DATA Kind is %d , and My node id = %d \n",simTime(), msg->kind(), ((CoOrdinatorBase*)pCoOrdinator)->getNodeId());				sendDelayed(pDataFragment,0.000654, "toBottomLayer");				/*sprintf(strMessage, "CTS Node SOURCE_ID  %d: Now sending data to %d...", ((c802_11_Packet*)pDataFragment)->getHdr().SourceMACAddress, ((c802_11_Packet*)pDataFragment)->getHdr().DestinationMACAddress);				recordScalar("SEND_DATA", strMessage);*/		}		// One for DATA and one for acknowledgement			//delete msg;			break;		}				case DATA:		{			if (false == CheckIfMessageIsForMe(msg) )   			{				/*sprintf(strMessage, "DATA received for %d -- Intermediate node, Setting NAVTime to: %f, CurrentNAVTimer: %f, Current Time: %f",((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), ((c802_11_Packet*)msg)->getHdr().timeForTransfer, m_NAVTimer, simTime());*/				//recordScalar("DATA_INTERMEDIATE", strMessage);				m_New_NAVTimer= ((c802_11_Packet*)msg)->getHdr().timeForTransfer;				if (0 != m_NAVTimer)				{									if( (tstamp_NAVTimer-simTime() ) < m_New_NAVTimer )					{					changeNAVTimer();					}				}				else					changeNAVTimer();					delete msg;						// If the NAV Timer is already scheduled, then update it accordingly...				break;			}//CHANGED 11 lines below				m_New_NAVTimer= ((c802_11_Packet*)msg)->getHdr().timeForTransfer;				if (0 != m_NAVTimer)				{									if( (tstamp_NAVTimer-simTime() ) < m_New_NAVTimer )					{					changeNAVTimer();					}				}				else										changeNAVTimer();							// send the acknowledgement back to the sender			c802_11_Packet *pMACMsg;			Create_ACK_Message(msg, &pMACMsg);			sendDelayed(pMACMsg,0.000306, "toBottomLayer");               /*	recordScalar("-----------------", "----------------------------------------------------------------------");			sprintf(strMessage, "DATA packet received for %d and now sending acknowledgement to %d.  CurrentNAVTimer: %f, Current Time: %f",((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), ((c802_11_Packet*)pMACMsg)->getHdr().DestinationMACAddress, m_NAVTimer, simTime());			recordScalar("DATA_MATCH_AND_SEND_ACK", strMessage);			recordScalar("-----------------", "----------------------------------------------------------------------");*/			// send the real data to the Network Layer                        cMessage *pNetMsg = (cMessage*)msg->getObject("Netw_Pkt");                        cMessage *pDupNetMsg = (cMessage*) pNetMsg->dup();			send(pDupNetMsg,"toTopLayer");			Header &NetHeader = ((BeaconPkt*)pNetMsg)->getHdr();				if( NetHeader.OriginSrc >= 0 && NetHeader.OriginSrc<no_of_nodes )			if(fWrite)			{				FILE *nw_pkt;				sprintf(fName,"mac/%s%d.txt", fileb, NetHeader.OriginSrc); 				nw_pkt = fopen(fName,"ab");				char a[255];				sprintf(a, "%f Got DATA from %d , My node id = %d msg->kind= %d \n", simTime(),((c802_11_Packet*)msg)->getHdr().SourceMACAddress, ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(),pNetMsg->kind() );				fputs(a,nw_pkt);				fclose(nw_pkt);			}			//delete msg;			break;		}		case ACK:		{			if (false == CheckIfMessageIsForMe(msg) ) { 						/*sprintf(strMessage, "ACK packet received for %d, setting NAVTIMER to %f, Current NAVTIMER is %f, Current Time: %f",((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), ((c802_11_Packet*)msg)->getHdr().timeForTransfer, m_NAVTimer, simTime());			recordScalar("ACK_RECV_INTERMEDIATE", strMessage);*/				m_New_NAVTimer= ((c802_11_Packet*)msg)->getHdr().timeForTransfer;					if (0 != m_NAVTimer)				{									if( (tstamp_NAVTimer-simTime() ) < m_New_NAVTimer )					{					changeNAVTimer();					}				}				else					changeNAVTimer();					delete msg;						break;			}				if(!m_QueueOfFragments.empty()){	        cMessage *pFrag = (cMessage*)m_QueueOfFragments.tail();				cMessage *network_msg = (cMessage*)pFrag->getObject("Netw_Pkt");			Header &NetHeader = ((BeaconPkt*)network_msg)->getHdr();							if( NetHeader.OriginSrc >= 0 && NetHeader.OriginSrc<no_of_nodes )		if(fWrite)		{		FILE *nw_pkt;		sprintf(fName,"mac/%s%d.txt", fileb, NetHeader.OriginSrc); 		nw_pkt = fopen(fName,"ab");		char a[255];		sprintf(a, " %f Got ACK  from %d  and My node id = %d  \n", simTime(),((c802_11_Packet*)msg)->getHdr().SourceMACAddress, ((CoOrdinatorBase*)pCoOrdinator)->getNodeId() );		fputs(a,nw_pkt);		fclose(nw_pkt);		}					m_QueueOfFragments.pop();		}//CHANGED		/*	m_NAVTimer = ((c802_11_Packet*)msg)->getHdr().timeForTransfer;			// If the NAV Timer is already scheduled, then update it accordingly...			if (true == m_pMsgNAVTimer->isScheduled()) {				cancelEvent(m_pMsgNAVTimer);			}			scheduleAt(simTime() + m_NAVTimer, m_pMsgNAVTimer);		*/			// Add code to send the remaining fragments of the same message...DO NOT send packets that were really not part of this packet...			// Meaning Do NOT SEND packets that are not generated by the same request from the Network Layer									if(  m_QueueOfFragments.length()>0 )			{					c802_11_Packet *pFragment     = (c802_11_Packet*)m_QueueOfFragments.tail();									if(  ( ((c802_11_Packet*)msg)->getHdr().DestinationMACAddress) == ( pFragment->getHdr().DestinationMACAddress ))				{ 					c802_11_Packet *pDataFragment = (c802_11_Packet*)pFragment->dup();					sendDelayed(pDataFragment, 0.000654, "toBottomLayer");								/*recordScalar("-----------------", "----------------------------------------------------------------------");				sprintf(strMessage, "ACK received for %d -- SENDER from %d and now sending the next fragment of data, NEW NAVTIMER: %f, current time: %f", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), ((c802_11_Packet*)msg)->getHdr().SourceMACAddress, m_NAVTimer, simTime());				recordScalar("ACK_RECV_AND_NEXT_FRAGMENT_SEND", strMessage);*/								}			} 			else {			/*	recordScalar("-----------------", "----------------------------------------------------------------------");				sprintf(strMessage, "ACK packet received for %d. Don't have any new fragments to transmit",((CoOrdinatorBase*)pCoOrdinator)->getNodeId());				recordScalar("ACK_RECV_AND_FINISH_TRANSMIT", strMessage);				recordScalar("-----------------", "----------------------------------------------------------------------");*/				//printf("IN ELSE OF LENGTH\n");			}			//nelete msg;			break;					}				default:		{			sprintf(strMessage, "Invalid message kind...%d", msg->kind());			break;		}				case BTS_TYPE:                {                        //printf(" BRDCAST case");                                                                                                                                                                                                                                                                                                                           if( 0 != m_NAVTimer)			{  /*recordScalar("DESTINATION MATCH_BUT_NAV_TIMER_NOT_ZERO", " Broadcast message but not sending to n/w layer  because NAVTimer is not zero");*/			delete msg;                                break;                        }                                                                                                                         //recordScalar( " BRDCAST MESSAGE MATCH AND SENDING TO N/W LAYER        ");                        cMessage *pNetMsg = (cMessage*)msg->getObject("Netw_Pkt");                        cMessage *pDupNetMsg = (cMessage*) pNetMsg->dup();                                                                                                                         Header &NetHeader = ((BeaconPkt*)pNetMsg)->getHdr();                        send(pDupNetMsg,"toTopLayer");                                                                                                                         /*sprintf(strMessage, "  CHECK HERE.................BRD_CAST packet RECEIVED for %d and   CurrentNAVTimer: %f, Current Time: %f from nodeId = %d \n",((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), m_NAVTimer, simTime(),NetHeader.srcNodeId);                                recordScalar("BRD_CAST REVEIVED AND SENT TO N/W LAYER", strMessage);*/                                                                                                                  break;                                  		}	}		return;}void MAC_802_11 :: changeNAVTimer(){	m_NAVTimer = m_New_NAVTimer;	if(m_pMsgNAVTimer->isScheduled() )	cancelEvent(m_pMsgNAVTimer);	tstamp_NAVTimer = simTime() +m_NAVTimer;	scheduleAt(tstamp_NAVTimer, m_pMsgNAVTimer);	if( m_pMsgBOffTimer->isScheduled() )	{						remainingBOffTime = tstamp_BOffTimer-simTime();		//printf(" Time = %f , NAVTIMER changed remainigBOffTime = %f My node id = %d\n",simTime(), remainingBOffTime, ((CoOrdinatorBase*)pCoOrdinator)->getNodeId() );		if (remainingBOffTime<=0.0)		{				//printf(" remainingBOffTime %f tstamp_BOffTimer %f simTime %f at NodeId =%d \n",remainingBOffTime,tstamp_BOffTimer,simTime(),((CoOrdinatorBase*)pCoOrdinator)->getNodeId());			remainingBOffTime=0.0;		}		else			Bflag=1;			cancelEvent(m_pMsgBOffTimer);	}}bool MAC_802_11::CheckIfMessageIsForMe(cMessage* msg){	// Add code to return true if it is a broadcast message	if ( ( ( (c802_11_Packet*)msg)->getHdr().DestinationMACAddress ==  ((CoOrdinatorBase*)pCoOrdinator)->getNodeId() )  || ( ( (c802_11_Packet*)msg)->getHdr().DestinationMACAddress ==  999999 ) )                                                                                                                                return true;        else                                return false;                }void MAC_802_11::handleMessage(cMessage *msg){	if (true == msg->isSelfMessage()) {		handleSelfMessage(msg);		return;	}	//printf("\n\t MAC_802_11::handleMessage Message received on %s!\n\n\n", (msg->arrivalGate())->fullName());	int arrivalGate = msg->arrivalGateId();	const int fromNetLayerGate = gate("fromTopLayer")->id();	const int fromPhyLayerGate = gate("fromBottomLayer")->id();	if(fromNetLayerGate == arrivalGate)		HandleMessageFromTopLayer(msg);	else if (fromPhyLayerGate == arrivalGate)	     {		if( ( true == CheckIfMessageIsForMe(msg)) && (msg->kind() == 10) ) // This collision check will be at this node when it gets 2 mssgs                        {                                                               // This checks collision only between 2 RTS messages and not brdcast                                m_QueueOfCollisionMsgs.insert( msg);                                if( m_pMsgCollisionTimer->isScheduled()== true )                                cancelEvent(m_pMsgCollisionTimer);                                scheduleAt( simTime() + m_SIFS , m_pMsgCollisionTimer );                                /*char str3[255];                                sprintf(str3, " in the handle message ..............\n");                                recordScalar(" IN THE HANDLE MESSAGE", str3 );*/                        }                        // so in the self message , add a case to check this                        //if it returns any 2 mssgs with same msg kind, then don't send reply and print COLLISION                    else                             			HandleMessageFromBottomLayer(msg);	}	else 		printf("\n\t Invalid sender of the message.");	return;}bool MAC_802_11::Create_ACK_Message(cMessage *msg, c802_11_Packet **ppAckMsg){	*ppAckMsg = new c802_11_Packet("ACK MESSAGE", ACK);		s802_11_MAC_Header &CTSMACHeader   = (*ppAckMsg)->getHdr();	s802_11_MAC_Header RTSMACHeader    = ((c802_11_Packet*)msg)->getHdr();		CTSMACHeader.SourceMACAddress      = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId();	CTSMACHeader.DestinationMACAddress = RTSMACHeader.SourceMACAddress; 	CTSMACHeader.timeForTransfer       = 0 ; //+ 0.1 );  //RTSMACHeader.timeForTransfer - m_SIFS;	(*ppAckMsg)->setHdr(CTSMACHeader);	//printf("NodeId in ACK MAC %d\n",CTSMACHeader.SourceMACAddress );	AddPosInfo(*ppAckMsg);	return true;}bool MAC_802_11::Create_Data_Message(cMessage *msg, int iFragmentIndex, int numOfFragments, c802_11_Packet **ppDataMsg){	*ppDataMsg = new c802_11_Packet("DATA MESSAGE", DATA);	s802_11_MAC_Header MACHeader;	MACHeader.SourceMACAddress  = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId();	Header &NetHeader = (( GearPacket*)msg)->getHdr();	MACHeader.DestinationMACAddress = NetHeader.NextHopDestId;	seq_no++ ;	//printf("DATA numOfFragments %d,iFragmentIndex %d,(*ppDataMsg)->length()= %d m_SIFS %f \n",numOfFragments,iFragmentIndex,(*ppDataMsg)->length(),m_SIFS);	MACHeader.timeForTransfer =  (0.000314 + getPropagationDelay());  // 0.1);//0.2 ); // (numOfFragments - iFragmentIndex)*(*ppDataMsg)->length() + (numOfFragments - iFragmentIndex) * m_SIFS + (numOfFragments - iFragmentIndex)*(*ppDataMsg)->length() ;	 msg->setName("Netw_Pkt"); // Adding the n/w layer packet as an object to MAC layer data frame        (*ppDataMsg)->takeOwnership(false);        (*ppDataMsg)->addObject(msg);                                                                                                 	if(!  (*ppDataMsg)->hasPar("seq_no")  )		(*ppDataMsg)->addPar("seq_no");	(*ppDataMsg)->par("seq_no") = seq_no;                                                                                                 		(*ppDataMsg)->setHdr(MACHeader);	AddPosInfo(*ppDataMsg);	char strMsg[255];	/*sprintf(strMsg, "Node %d, header node id %d, : Fragment Index: %d/%d, TimeForTransfer: %f", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), MACHeader.SourceMACAddress, iFragmentIndex, numOfFragments, (*ppDataMsg)->getHdr().timeForTransfer);	recordScalar("QUEUE_DATA_FRAGMENT", strMsg);*/	return true;}bool MAC_802_11::Create_CTS_Message(cMessage *msg, c802_11_Packet **ppCTSMsg){	*ppCTSMsg = new c802_11_Packet("CTS MESSAGE", CTS_TYPE);		s802_11_MAC_Header &CTSMACHeader   = (*ppCTSMsg)->getHdr();

⌨️ 快捷键说明

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