📄 802_11_mac.cc
字号:
CTSMACHeader.SourceMACAddress = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(); s802_11_MAC_Header RTSMACHeader = ((c802_11_Packet*)msg)->getHdr(); CTSMACHeader.DestinationMACAddress = RTSMACHeader.SourceMACAddress; CTSMACHeader.timeForTransfer = (0.000740 + 2*getPropagationDelay()); //0.2); //0.3 ) ; //RTSMACHeader.timeForTransfer - m_SIFS; (*ppCTSMsg)->setHdr(CTSMACHeader); AddPosInfo(*ppCTSMsg); return true;}bool MAC_802_11::Create_RTS_Message(cMessage *msg, c802_11_Packet **ppRTSMsg){ *ppRTSMsg = new c802_11_Packet("RTS MESSAGE", RTS_TYPE); s802_11_MAC_Header MACHeader; MACHeader.SourceMACAddress = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(); Header &NetHeader = ((GearPacket*)msg)->getHdr(); char string[255];/* sprintf(string," RTS_DEST FROM MACHeader.SourceMACAddress %d FOR destination %d \n", MACHeader.SourceMACAddress,NetHeader.NextHopDestId); recordScalar(" WHYYYYYYYYYYYYYYYYYYYY", string );*/ MACHeader.DestinationMACAddress = NetHeader.NextHopDestId; (*ppRTSMsg)->addPar("QuerySrc"); (*ppRTSMsg)->par("QuerySrc")= originMsgSrc ; // One for DATA and one for acknowledgement //MACHeader.timeForTransfer = msg->length() / m_BitRate + 3 * m_SIFS + msg->length()/m_BitRate; int numOfFragments = msg->length()/m_FragmentLength + 1;// MACHeader.timeForTransfer = ( 0.000670 + 0.1 ); //(numOfFragments * m_FragmentLength)/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (1 + numOfFragments) * m_SIFS + (numOfFragments * m_FragmentLength)/m_BitRate; MACHeader.timeForTransfer = ( 0.001054 + getPropagationDelay()); //0.1 ); //(numOfFragments * m_FragmentLength)/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (1 + numOfFragments) * m_SIFS + (numOfFragments * m_FragmentLength)/m_BitRate; //printf(" TIMETOTRANSFER %f \n",MACHeader.timeForTransfer); (*ppRTSMsg)->setHdr(MACHeader); //printf("RTS_TOIMEFPRTRANSFER numOfFragments %d,m_FragmentLength %d,(*ppRTSMsg)->length()= %d m_SIFS %f m_BitRate = %d \n",numOfFragments,m_FragmentLength,(*ppRTSMsg)->length(),m_SIFS,m_BitRate); AddPosInfo(*ppRTSMsg); return true;}bool MAC_802_11:: Create_BRDCAST_Message( cMessage *msg, c802_11_Packet **ppBRDCASTMsg){ *ppBRDCASTMsg = new c802_11_Packet("BRDCAST MESSAGE", BTS_TYPE); s802_11_MAC_Header BMACHeader; BMACHeader.SourceMACAddress = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(); Header &NetHeader = ((GearPacket*)msg)->getHdr(); /* char str2[255]; sprintf(str2, " BRDCAST MESSAGE by NODE = %d ",BMACHeader.SourceMACAddress ); recordScalar(" ..............", str2); */ //Header &hdr = ((BeaconPkt*)msg)->getHdr(); BMACHeader.DestinationMACAddress = NetHeader.NextHopDestId; msg->setName("Netw_Pkt"); (*ppBRDCASTMsg)->takeOwnership(false); (*ppBRDCASTMsg)->addObject(msg); // Adding the n/w packet as an object to the MAC message //printf(" IN THE BRD CAST"); BMACHeader.timeForTransfer = 0; (*ppBRDCASTMsg)->setHdr(BMACHeader); AddPosInfo(*ppBRDCASTMsg); return true; }bool MAC_802_11::AddPosInfo(c802_11_Packet *pMACMsg){ cPar &parXPos = pMACMsg->addPar("xPos"); cPar &parYPos = pMACMsg->addPar("yPos"); cPar &parRadioPower = pMACMsg->addPar("RadioPower"); return true;}void MAC_802_11::handleSelfMessage(cMessage *msg){ char strMessageName[255] = "MAC_802_11:handleSelfMessage"; char strMessage[255]; switch(msg->kind()) { case NAVTIMER: { m_NAVTimer = 0; if( m_pMsgDIFSTimer->isScheduled() ) cancelEvent(m_pMsgDIFSTimer); scheduleAt(simTime() + m_DIFS, m_pMsgDIFSTimer); // if there is data to be sent then only call ChackWChannelStateAndTransmit /*recordScalar("-----------------", "----------------------------------------------------------------------"); sprintf(strMessage, "NAVTimer expired for Node %d, current time is %f.", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), simTime()); recordScalar(strMessageName, strMessage); recordScalar("-----------------", "----------------------------------------------------------------------"); */ //CheckWChannelStateAndTransmit(); break; } case DIFS_TIMER: { //nrecordScalar("-----------------", "----------------------------------------------------------------------"); if (m_NAVTimer == 0) { /*sprintf(strMessage, "DIFS Timer expired for Node %d, current time is %f. MsgQLength = %d", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), simTime(),m_QueueOfMessages.length()); recordScalar(strMessageName, strMessage);*/ if ( !m_QueueOfMessages.empty() ) { if(Bflag == 0) //!( m_pMsgBOffTimer->isScheduled()) ) { int iBOffNum=intuniform(1,cw); double iBOffTime = iBOffNum * m_SlotTime; // printf(" Time = %f ,iBOffNum= %d , iBOffTime = %f for nodeId %d cw = %d \n",simTime(), iBOffNum,iBOffTime,((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), cw); tstamp_BOffTimer =simTime() + iBOffTime; if( m_pMsgBOffTimer->isScheduled() ) cancelEvent(m_pMsgBOffTimer); scheduleAt( tstamp_BOffTimer , m_pMsgBOffTimer); } else { if( m_pMsgBOffTimer->isScheduled() ) cancelEvent(m_pMsgBOffTimer); if(tstamp_BOffTimer < simTime() ) tstamp_BOffTimer = simTime() + remainingBOffTime ; //printf("time = %f, scheduling remainig back off time = %f for node id = %d\n", simTime(),remainingBOffTime, ((CoOrdinatorBase*)pCoOrdinator)->getNodeId() ); scheduleAt(simTime()+remainingBOffTime,m_pMsgBOffTimer); } } } else { if( m_pMsgNAVTimer->isScheduled() ) cancelEvent(m_pMsgNAVTimer); // implies nav timer not zero scheduleAt( simTime() + m_NAVTimer, m_pMsgNAVTimer); } break; } case BACK_OFF: { //printf(" time = %f, back off expired for node id = %d, remaining boff time = %f, tstamp_BOffTimer = %f bflag = %d\n", simTime(), ((CoOrdinatorBase*)pCoOrdinator)->getNodeId() , remainingBOffTime, tstamp_BOffTimer, Bflag ); Bflag =0; /*recordScalar("-----------------", "----------------------------------------------------------------------"); sprintf(strMessage, "BACK OFF expired for Node %d, current time is %f., iBofftime = %d", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), simTime(), iBOffTime); recordScalar(strMessageName, strMessage);*/ if(m_NAVTimer == 0) CheckWChannelStateAndTransmit() ; else {// IF NAV TIMER IS NOT ZERO, then some other node got the channel } break; } case RTS_EXPIRED: { RtsExpiredCount++; cMessage *msgExp = (cMessage*)m_QueueOfMessages.tail(); if(fWrite) { if ( ((int)msgExp->par("QuerySrc")) >0 && ((int)msgExp->par("QuerySrc")) < no_of_nodes ) { FILE *nw_pkt; sprintf(fName,"mac/%s%d.txt", fileb,(int)msgExp->par("QuerySrc") );//((CoOrdinatorBase*)pCoOrdinator)->getNodeId()); nw_pkt = fopen(fName,"ab"); char a[255]; sprintf(a, " %f RTS_EXPIRED for %d when sending to %d and msg kind = %d ssrc = %d\n", simTime(), ((c802_11_Packet*)msgExp)->getHdr().SourceMACAddress, ((c802_11_Packet*)msgExp)->getHdr().DestinationMACAddress, msgExp->kind(),ssrc+1 ); fputs(a,nw_pkt); fclose(nw_pkt); } } ssrc+=1; if ( ssrc > shortRetryLimit ) { if(fWrite) { if ( ((int)msgExp->par("QuerySrc")) >0 && ((int)msgExp->par("QuerySrc")) < no_of_nodes ) { FILE *nw_pkt; sprintf(fName,"mac/%s%d.txt", fileb,(int)msgExp->par("QuerySrc") );//((CoOrdinatorBase*)pCoOrdinator)->getNodeId()); nw_pkt = fopen(fName,"ab"); char a[255]; sprintf(a, " %f DROP PACKET by %d when sending to %d and msg kind = %d \n", simTime(), ((c802_11_Packet*)msgExp)->getHdr().SourceMACAddress, ((c802_11_Packet*)msgExp)->getHdr().DestinationMACAddress, msgExp->kind() ); fputs(a,nw_pkt); fclose(nw_pkt); } } m_QueueOfMessages.pop(); m_QueueOfMessages.pop(); cMessage *pNExpMsg = (cMessage*) m_QueueOfFragments.tail(); cMessage *pExpNtwMsg =(cMessage*)pNExpMsg->getObject("Netw_Pkt"); printf("POPPED %d ssrc %d shortRetryLimit %d , msg kind = %d\n",MyNodeId,ssrc,shortRetryLimit, pExpNtwMsg->kind()); m_QueueOfFragments.pop(); resetCW(); ssrc=0; } else incContentionWindow(); m_NAVTimer =0; // Exponential BackOff Algorithm Bflag = 0; if(!m_pMsgDIFSTimer -> isScheduled() ) scheduleAt(simTime(),m_pMsgDIFSTimer ); //if( !m_pMsgBOffTimer->isScheduled() ) scheduleAt(simTime() + ( 0.000680 + 0.000300 + 0.1 ) , m_pMsgBOffTimer); /*sprintf(strMessage, "RTS_EXPIRED for Node %d, current time: %f", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), simTime()); recordScalar(strMessageName, strMessage);*/ break; } case COLLISION_TIMER: { if( m_QueueOfCollisionMsgs.length() >= 2 ) { cMessage *collMsg1 = (cMessage*)m_QueueOfCollisionMsgs.pop(); int originMsgSrc1 = collMsg1->par("QuerySrc"); cMessage *collMsg2 = (cMessage*)m_QueueOfCollisionMsgs.pop(); int originMsgSrc2 = collMsg2->par("QuerySrc"); if(fWrite) { if (originMsgSrc1>=0 && originMsgSrc2>=0) { FILE *nw_pkt; sprintf(fName,"mac/%s%d.txt", fileb,originMsgSrc1); sprintf(fName,"mac/%s%d.txt",fileb,originMsgSrc2); nw_pkt = fopen(fName,"ab"); char a[255]; sprintf(a, " %f COLLISION has occured between nodes %d and %d with the query src = %d and %d My node id = %d \n", simTime(), ((c802_11_Packet*)collMsg1)->getHdr().SourceMACAddress,((c802_11_Packet*)collMsg2)->getHdr().SourceMACAddress, originMsgSrc1, originMsgSrc2,((CoOrdinatorBase*)pCoOrdinator)->getNodeId()); fputs(a,nw_pkt); fclose(nw_pkt); } } // then collision occured m_QueueOfCollisionMsgs.clear();// don't send back anything char str2[255]; /*sprintf(str2, " COLLISION HAS OCCURED FOR NODE %d \n current time=%f and src nodes are %d and %d" , ( (CoOrdinatorBase*)pCoOrdinator) -> getNodeId(),simTime(),((c802_11_Packet*)collMsg1)->getHdr().SourceMACAddress,((c802_11_Packet*)collMsg2)->getHdr().SourceMACAddress); recordScalar(" COLLISION", str2 );*/ } else { cMessage *dupMsg = (cMessage *)m_QueueOfCollisionMsgs.pop(); /*char str4[255]; /*sprintf(str4, " COLLISION HAS NOT OCCURED for node %d Current Time = %f" , ((CoOrdinatorBase*)pCoOrdinator) -> getNodeId(), simTime() ); recordScalar( " NO COLLISION ", str4);*/ HandleMessageFromBottomLayer( (cMessage*) dupMsg); } break; } }}int MAC_802_11::CheckWChannelStateAndTransmit(void) // This is executed only when it wants to send RTS and in case NAVTIMER{ // Do NOT Tranmit RTS if this node has already sent an RTS and // is inbetween the data transmission.// printf(" NAVTIMER CheckWChannel %d \n", m_NAVTimer); if ( 0 > m_NAVTimer || m_QueueOfMessages.empty() ) return 0; if (m_pMsgRTSExpired->isScheduled()) { cancelEvent(m_pMsgRTSExpired); } cMessage *msg = (cMessage*)m_QueueOfMessages.tail(); cMessage *msgNew = (cMessage*)msg->dup(); if(msg->kind()==BTS_TYPE) m_QueueOfMessages.pop(); /*if(m_pMsgNAVTimer->isScheduled() ) cancelEvent(m_pMsgNAVTimer); scheduleAt(simTime() + m_NAVTimer, m_pMsgNAVTimer ); */ char strMsgHeader[255] = "CheckWChanAndTransmit"; char strMsg[255]; /*sprintf(strMsg, "Sending message of type %d from %d to %d, Current time: %f", msgNew->kind(), ((c802_11_Packet*)msgNew)->getHdr().SourceMACAddress,((c802_11_Packet*)msgNew)->getHdr().DestinationMACAddress, simTime()); recordScalar("CHECKWChanAndTransmit" , strMsg); recordScalar("-----------------", "----------------------------------------------------------------------");*/ if(msg->kind()!=BTS_TYPE) { m_New_NAVTimer = ((c802_11_Packet*)msg)->getHdr().timeForTransfer+ 0.000364 + getPropagationDelay(); //0.1; changeNAVTimer(); if(fWrite) { //printf("%f (int)msg->par(QuerySrc)= %d msg->type=%d MyNodeId = %d to %d \n",simTime(),(int)msg->par("QuerySrc"),msg->kind(),((CoOrdinatorBase*)pCoOrdinator)->getNodeId(),((c802_11_Packet*)msgNew)->getHdr().DestinationMACAddress ); if ( ((int)msg->par("QuerySrc")) >=0 && ((int)msg->par("QuerySrc")) < no_of_nodes ) { FILE *nw_pkt; //printf(" CHKWC The QuerySrc = %d msg-kind = %d \n",(int)msg->par("QuerySrc"),msg->kind()); sprintf(fName,"mac/%s%d.txt", fileb,(int)msg->par("QuerySrc") );//((CoOrdinatorBase*)pCoOrdinator)->getNodeId()); nw_pkt = fopen(fName,"ab"); char a[255]; sprintf(a, "\n %f Sending RTS from %d to %d m_NAVTimer =%f NAVTIMER = %f\n", simTime(), ((c802_11_Packet*)msgNew)->getHdr().SourceMACAddress, ((c802_11_Packet*)msgNew)->getHdr().DestinationMACAddress,m_NAVTimer,simTime()+m_NAVTimer); fputs(a,nw_pkt); fclose(nw_pkt); } } scheduleAt(simTime() + (2*getPropagationDelay()+0.000680), m_pMsgRTSExpired); } sendDelayed(msgNew,0.000354,"toBottomLayer");// printf("%f msg sent MAC \n",simTime()); return 1;}double MAC_802_11::getPropagationDelay(){ cModule *RadioMod=pNode->submodule("Radio"); double distance=RadioMod->par("RadioRadius"); double propagationDelay=distance/SPEED_OF_LIGHT; return propagationDelay;}void MAC_802_11::finish(){ //printf(" The number of Retries for NodeId %d is %d \n",MyNodeId,RtsExpiredCount);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -