📄 802_11_mac.cc
字号:
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 + -