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

📄 802_11.pc

📁 simulator for ad hoc
💻 PC
📖 第 1 页 / 共 5 页
字号:
   assert(FALSE); abort();  // Fragmentation Needs to be rewritten. (Jay)   //NoFrag    M802->SSRC = 0;//NoFrag //NoFrag    NetworkIpOutputQueueTopPacketForAPriority(//NoFrag       node, M802->myGlomoMac->interfaceIndex, M802->currentPriority,//NoFrag       &topPacket, &nextHopAddress);//NoFrag                  //NoFrag    if  (topPacket == NULL) {//NoFrag       Mac802_11CheckForOutgoingPacket(node, M802);//NoFrag       return;//NoFrag    }//NoFrag //NoFrag //NoFrag    destAddr = nextHopAddress;//NoFrag //NoFrag    remainder = topPacket->packetSize -//NoFrag                (M802_11_FRAG_THRESH * (M802->currentFrag+1));//NoFrag //NoFrag    /* transmit fragment which is not the last one. *///NoFrag    if (remainder > 0)//NoFrag    {//NoFrag       fragmentSize = M802_11_FRAG_THRESH;//NoFrag    }//NoFrag    /* transmitting last fragment. *///NoFrag    else//NoFrag    {//NoFrag       fragmentSize = topPacket->packetSize -//NoFrag                      (M802_11_FRAG_THRESH * M802->currentFrag);//NoFrag    }//NoFrag //NoFrag    pktToRadio = GLOMO_MsgAlloc(node, 0, 0, 0);//NoFrag //NoFrag    hdr.frameType = M802_11_FRAGMENT;//NoFrag    hdr.sourceAddr = node->nodeAddr;//NoFrag    hdr.destAddr = destAddr;//NoFrag    M802->waitingForAckOrCtsFromAddress = destAddr;//NoFrag    payloadSize = topPacket->packetSize;//NoFrag //NoFrag    entry = Mac802_11GetSeqNo(node, M802, destAddr);//NoFrag    assert(entry);//NoFrag    hdr.seqNo = entry->toSeqNo;//NoFrag //NoFrag    /* Update duration to include next FRAG/ACK sequence. *///NoFrag    if (remainder > 0)//NoFrag    {//NoFrag       frameSize = M802_11_FRAG_THRESH + sizeof(M802_11FrameHdr);//NoFrag //NoFrag       left = payloadSize -//NoFrag              (M802->currentFrag * M802_11_FRAG_THRESH);//NoFrag //NoFrag       if (left > M802_11_FRAG_THRESH)//NoFrag       {//NoFrag //NoFrag          hdr.duration =//NoFrag             ((M802_11_SHORT_CTRL_FRAME_SIZE +//NoFrag             M802_11_FRAG_THRESH + sizeof(M802_11FrameHdr) +//NoFrag             M802_11_SHORT_CTRL_FRAME_SIZE) * SECOND) ///NoFrag             (M802->bandwidth) + (3 * SYNCHRONIZATION_TIME) +//NoFrag             (3 * M802_11_SIFS) + //NoFrag             (3 * M802_11_DELAY_UNTIL_SIGNAL_AIRBORN) +//NoFrag             (3 * M802->extraPropDelay);//NoFrag       }//NoFrag       else//NoFrag       {//NoFrag //NoFrag          /* End of next FRAG/ACK period is last FRAG/ACK. *///NoFrag          hdr.duration =//NoFrag             ((M802_11_SHORT_CTRL_FRAME_SIZE +//NoFrag             remainder + sizeof(M802_11FrameHdr) +//NoFrag             M802_11_SHORT_CTRL_FRAME_SIZE) * SECOND) ///NoFrag             (M802->bandwidth) + (3 * M802_11_SIFS) +//NoFrag             (3 * SYNCHRONIZATION_TIME) +//NoFrag             (3 * M802_11_DELAY_UNTIL_SIGNAL_AIRBORN) +//NoFrag             (3 * M802->extraPropDelay);//NoFrag       }//NoFrag    }//NoFrag    /* This is the last fragment. *///NoFrag    else//NoFrag    {//NoFrag //NoFrag       hdr.duration =//NoFrag          (M802_11_SHORT_CTRL_FRAME_SIZE * SECOND) ///NoFrag          (M802->bandwidth) + M802_11_SIFS + //NoFrag          SYNCHRONIZATION_TIME +//NoFrag          M802_11_DELAY_UNTIL_SIGNAL_AIRBORN + //NoFrag          M802->extraPropDelay;//NoFrag    }//NoFrag //NoFrag    GLOMO_MsgPacketAlloc(node, pktToRadio, fragmentSize);//NoFrag //NoFrag    memcpy(pktToRadio->packet,//NoFrag           (topPacket->packet + (M802_11_FRAG_THRESH * M802->currentFrag)),//NoFrag           fragmentSize);//NoFrag //NoFrag    GLOMO_MsgAddHeader(node, pktToRadio, sizeof(M802_11FrameHdr) );//NoFrag //NoFrag    macPktLen = fragmentSize+sizeof(M802_11FrameHdr);//NoFrag    hdr.fragId = M802->currentFrag+1;//NoFrag    M802->currentFrag++;//NoFrag //NoFrag //NoFrag    memcpy(pktToRadio->packet, &(hdr), sizeof(M802_11FrameHdr) );//NoFrag //NoFrag    Mac802_11SetState(node, M802, M802_11_X_FRAGMENT);//NoFrag    //NoFrag    StartTransmittingPacket(node, M802, pktToRadio, M802_11_SIFS);}/* * NAME:        Mac802_11CorrectSequenceNumber. * * PURPOSE:     See if ACK contains the right sequence number. * * PARAMETERS:  node, node that is checking the sequence number being ACKed *              is correct. *              sourceAddr, the node that sent the ACK. *              seqNo, the sequence number of frame that is being ACKed. * * RETURN:      TRUE if sequence number being ACKed is correct, FALSE otherwise. * * ASSUMPTION:  None. */static BOOL Mac802_11CorrectSeqenceNumber(   GlomoNode *node,   GlomoMac802_11 *M802,   NODE_ADDR sourceAddr,   int seqNo){   SeqNoEntry *entry;   entry = Mac802_11GetSeqNo(node, M802, sourceAddr);   assert(entry);   return (entry->fromSeqNo == seqNo);}/* * NAME:        Mac802_11TransmitCTSFrame. * * PURPOSE:     See if ACK contains the right sequence number. * * PARAMETERS:  node, node that is going to transmit CTS frame. *              Rts, RTS frame. * * RETURN:      None. * * ASSUMPTION:  None. */static void Mac802_11TransmitCTSFrame(GlomoNode *node, GlomoMac802_11 *M802,                               Message *Rts){   NODE_ADDR destAddr;   Message *pktToRadio;   int macPktLen;   M802_11LongControlFrame *hdr = (M802_11LongControlFrame *)Rts->packet;   M802_11ShortControlFrame newHdr;   destAddr = hdr->sourceAddr;   pktToRadio = GLOMO_MsgAlloc(node, 0, 0, 0);      GLOMO_MsgPacketAlloc(node, pktToRadio, M802_11_SHORT_CTRL_FRAME_SIZE);   newHdr.frameType = M802_11_CTS;   newHdr.destAddr = destAddr;   // Subtract RTS transmit time.                 newHdr.duration = hdr->duration - M802->extraPropDelay -      M802_11_SIFS - M802->ctsOrAckTransmissionDuration;         // Subtract off CTS transmit time from the total duration   // to get the CTS timeout time.       M802->noResponseTimeoutDuration =  newHdr.duration      - M802->extraPropDelay - M802_11_SIFS      - M802->ctsOrAckTransmissionDuration      - M802->extraPropDelay       + M802_11_SLOT_TIME + EPSILON_DELAY;   macPktLen = M802_11_SHORT_CTRL_FRAME_SIZE;   memcpy(pktToRadio->packet, &(newHdr), M802_11_SHORT_CTRL_FRAME_SIZE );   Mac802_11SetState(node, M802, M802_11_X_CTS);      StartTransmittingPacket(node, M802, pktToRadio, M802_11_SIFS);}/* * NAME:        Mac802_11TransmitFragAck. * * PURPOSE:     Transmit ACKs for fragments. * * PARAMETERS:  node, node that is transmitting the ACK for the fragment. *              hdr, header of frame being acknowledged. * * RETURN:      None. * * ASSUMPTION:  None. */static void Mac802_11TransmitFragAck(    GlomoNode *node, GlomoMac802_11 *M802, M802_11FrameHdr hdr){   NODE_ADDR destAddr;   Message *pktToRadio;   int macPktLen;   M802_11ShortControlFrame newHdr;   assert(FALSE); abort();  // Fragmentation Needs to be rewritten. (Jay)   //NoFrag    destAddr = hdr.sourceAddr;//NoFrag    //NoFrag //NoFrag //NoFrag    pktToRadio = GLOMO_MsgAlloc(node, 0, 0, 0);//NoFrag    GLOMO_MsgPacketAlloc(node, pktToRadio, M802_11_SHORT_CTRL_FRAME_SIZE);//NoFrag //NoFrag    newHdr.frameType = M802_11_ACK;//NoFrag    newHdr.destAddr = destAddr;//NoFrag //NoFrag    newHdr.duration = hdr.duration -//NoFrag       ((M802_11_SHORT_CTRL_FRAME_SIZE * SECOND) ///NoFrag       M802->bandwidth) - M802_11_SIFS - //NoFrag       SYNCHRONIZATION_TIME -//NoFrag       M802_11_DELAY_UNTIL_SIGNAL_AIRBORN - //NoFrag       M802->extraPropDelay;//NoFrag //NoFrag    if (newHdr.duration <= 0)//NoFrag    {//NoFrag       /* Last fragment to ack, so no need to wait after tx. *///NoFrag       M802->noResponseTimeoutDuration = 0;//NoFrag    }//NoFrag    else//NoFrag    {//NoFrag       /* Only want waiting period for data.  Don't want to include ACK. *///NoFrag       M802->noResponseTimeoutDuration = newHdr.duration -//NoFrag          ((M802_11_SHORT_CTRL_FRAME_SIZE * SECOND) ///NoFrag          M802->bandwidth) - M802_11_SIFS;//NoFrag    }//NoFrag //NoFrag //NoFrag    if (M802->noResponseTimeoutDuration < 0)//NoFrag    {//NoFrag       clocktype txDelay;//NoFrag //NoFrag       txDelay = ((clocktype)(M802_11_SHORT_CTRL_FRAME_SIZE * SECOND) / //NoFrag            M802->bandwidth);//NoFrag //NoFrag       printf("802.11: Node %ld duration should not be negative (%ld)!\n", //NoFrag              node->nodeAddr, M802->noResponseTimeoutDuration);//NoFrag //NoFrag       ctoa(txDelay, clockStr);//NoFrag       printf("    tx delay is %s\n", clockStr);//NoFrag       printf("    hdr.duration is %ld\n", hdr.duration);//NoFrag       printf("    newHdr.duration is %ld\n", newHdr.duration);//NoFrag       printf("    source is %ld\n", hdr.sourceAddr);//NoFrag       exit(0);//NoFrag    }//NoFrag //NoFrag    macPktLen = M802_11_SHORT_CTRL_FRAME_SIZE;//NoFrag //NoFrag    memcpy(pktToRadio->packet, &(newHdr), M802_11_SHORT_CTRL_FRAME_SIZE);//NoFrag //NoFrag    Mac802_11SetState(node, M802, M802_11_X_FRAGACK);//NoFrag    //NoFrag    StartTransmittingPacket(node, M802, pktToRadio, M802_11_SIFS);}/* * NAME:        Mac802_11HandlePromiscuousMode. * * PURPOSE:     Sends remote packet to network layer. * * PARAMETERS:  node, node sending remote packet to network layer. *              frame, frame containing network packet. * * RETURN:      None. * * ASSUMPTION:  None. */static void Mac802_11HandlePromiscuousMode(GlomoNode *node, GlomoMac802_11 *M802,                                    Message *frame){   GLOMO_MsgRemoveHeader(node, frame, sizeof(M802_11FrameHdr));   NetworkIpSneakPeekAtMacPacket(node, frame);   GLOMO_MsgAddHeader(node, frame, sizeof(M802_11FrameHdr));}/* * NAME:        Mac802_11ProcessAck. * * PURPOSE:     Process local ACKs. * * PARAMETERS:  node, node processing local ACKs. *              Ack, ACK frame. * * RETURN:      None. * * ASSUMPTION:  None. */static void Mac802_11ProcessAck(GlomoNode *node,                         GlomoMac802_11 *M802,                          Message *Ack){   NODE_ADDR sourceAddr;   NODE_ADDR NotUsed;   Message *tmpPktPtr;   M802_11ShortControlFrame *hdr = (M802_11ShortControlFrame *)Ack->packet;   /* Reset retry counts since frame is acknowledged. */   M802->SSRC = 0;   M802->SLRC = 0;   sourceAddr = M802->waitingForAckOrCtsFromAddress;   M802->waitingForAckOrCtsFromAddress = INVALID_ADDRESS;      NetworkIpOutputQueueTopPacketForAPriority(      node, M802->myGlomoMac->interfaceIndex, M802->currentPriority,       &tmpPktPtr, &NotUsed);   if (tmpPktPtr == NULL)   {      assert(FALSE); abort();      Mac802_11CheckForOutgoingPacket(node, M802);      return;   }   switch(M802->state) {      case M802_11_S_WFACK:   {      Message *pktFromNetwork;      SeqNoEntry *entry;      /* Remove frame from queue since already acknowledged. */            NetworkIpOutputQueueDequeuePacketForAPriority(         node, M802->myGlomoMac->interfaceIndex, M802->currentPriority,          &pktFromNetwork, &NotUsed);            M802->currentPriority = INVALID_PRIORITY;      GLOMO_MsgFree(node, pktFromNetwork);      M802->pktsSentUnicast++;      /* Update exchange sequence number. */      entry = Mac802_11GetSeqNo(node, M802, sourceAddr);      assert(entry);      entry->toSeqNo += 1;      Mac802_11DecreaseCW(node, M802);      Mac802_11CheckForOutgoingPacket(node, M802);      break;   }   case M802_11_S_WFFRAGACK:   {      SeqNoEntry *entry;      /* Update exchange sequence number. */      entry = Mac802_11GetSeqNo(node, M802, sourceAddr);      assert(entry);      entry->toSeqNo += 1;      if ((M802->currentFrag * M802_11_FRAG_THRESH) >=          tmpPktPtr->packetSize)      {         Message *pktFromNetwork;         /* Remove frame from queue since already acknowledged. */                  NetworkIpOutputQueueDequeuePacketForAPriority(            node, M802->myGlomoMac->interfaceIndex,             M802->currentPriority,             &pktFromNetwork, &NotUsed);                  M802->currentPriority = INVALID_PRIORITY;         GLOMO_MsgFree(node, pktFromNetwork);         M802->pktsSentUnicast++;         Mac802_11DecreaseCW(node, M802);         Mac802_11CheckForOutgoingPacket(node, M802);      }      else      {         Mac802_11TransmitNextFrag(node, M802);      }      break;   }   default:      Mac802_11CheckForOutgoingPacket(node, M802);          }/*switch*/}/* * NAME:        Mac802_11TransmitAck * * PURPOSE:     Transmit ACK for frames. * * PARAMETERS:  node, node transmitting the ACK. *              frame, frame being acknowledged. * * RETURN:      None. * * ASSUMPTION:  None. */static void Mac802_11TransmitAck(GlomoNode *node, GlomoMac802_11 *M802, Message *frame){   NODE_ADDR destAddr;   Message *pktToRadio;   int macPktLen;   M802_11FrameHdr *hdr;   M802_11ShortControlFrame newHdr;   hdr = (M802_11FrameHdr *)frame->packet;   destAddr = hdr->sourceAddr;   pktToRadio = GLOMO_MsgAlloc(node, 0, 0, 0);                                  GLOMO_MsgPacketAlloc(node, pktToRadio, M802_11_SHORT_CTRL_FRAME_SIZE);   newHdr.frameType = M802_11_ACK;   newHdr.destAddr = destAddr;   newHdr.duration = 0;   memcpy(pktToRadio->packet, &(newHdr), M802_11_SHORT_CTRL_FRAME_SIZE);   Mac802_11SetState(node, M802, M802_11_X_ACK);   StartTransmittingPacket(node, M802, pktToRadio, M802_11_SIFS);}/* * NAME:        Mac802_11ProcessFrame. * * PURPOSE:     Process incoming frame. * * PARAMETERS:  node, node processing incoming frame. *              frame, frame being processed. * * RETURN:      None. * * ASSUMPTION:  None. */static void Mac802_11ProcessFrame(    GlomoNode *node, GlomoMac802_11 *M802, Message *frame){   M802_11FrameHdr* hdr = (M802_11FrameHdr *)frame->packet;   NODE_ADDR sourceAddr = hdr->sourceAddr;   if ((M802->state != M802_11_S_WFDATA) &&       (Mac802_11IsWaitingForResponseState(M802->state)))   {      // Waiting for Another Packet Type Ignore This one.                        GLOMO_MsgFree(node, frame);

⌨️ 快捷键说明

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