📄 802_11.pc
字号:
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 + -