25#include "IEEE802_11.h"
26#include "IEEE802_11_Phy.h"
27#include "IEEE802_11_MAC_Frame.h"
28#include "NetSim_utility.h"
31static void fn_NetSim_IEEE802_11_CSMACA_RandomBackOffTimeCalculation();
32static void fn_NetSim_IEEE802_11_CSMACA_StartBackOff();
34static double get_CSMACA_Time(PIEEE802_11_PHY_VAR phy)
36 if (!phy->dControlFrameDataRate)
37 fnNetSimError(
"Control frame data rate is 0 for device %d, interface %d in %s\n",
38 pstruEventDetails->nDeviceId,
39 pstruEventDetails->nInterfaceId,
42 phy->plmeCharacteristics.aSIFSTime +
43 get_preamble_time(phy) +
44 ((getAckSize(phy) * 8) / phy->dControlFrameDataRate);
48int fn_NetSim_IEEE802_11_CSMACA_Init()
50 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
51 PIEEE802_11_PHY_VAR phy = IEEE802_11_CURR_PHY;
53 NetSim_PACKET* packet;
58 if (mac->dNAV > pstruEventDetails->dEventTime)
62 if(mac->currentProcessingPacket)
63 packet = mac->currentProcessingPacket;
68 packet = get_from_queue(pstruEventDetails->nDeviceId,
69 pstruEventDetails->nInterfaceId,
70 mac->nNumberOfAggregatedPackets,
74 mac->currentProcessingPacket=packet;
75 mac->nCWcurrent = mac->currEdcaTable->CWmin;
78 mac->dPacketProcessingEndTime = pstruEventDetails->dEventTime;
81 fn_NetSim_IEEE802_11_RTS_CTS_Init();
84 mac->dPacketProcessingEndTime += get_CSMACA_Time(IEEE802_11_CURR_PHY);
86 if (!validate_processing_time(mac->dPacketProcessingEndTime,pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId))
89 packet = mac->currentProcessingPacket;
92 NetSim_EVENTDETAILS pevent;
93 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
94 pevent.nPacketId = packet->nPacketId;
95 if(packet->pstruAppData)
97 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
98 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
102 pevent.nSegmentId = 0;
103 pevent.nApplicationId = 0;
106 if(packet->pstruNetworkData)
107 pevent.dPacketSize = packet->pstruNetworkData->dPacketSize;
109 pevent.dPacketSize = packet->pstruMacData->dPacketSize;
110 pevent.pPacket = packet;
111 pevent.nProtocolId = MAC_PROTOCOL_IEEE802_11;
112 pevent.nSubEventType = CS;
113 pevent.nEventType = MAC_OUT_EVENT;
114 fnpAddEvent(&pevent);
118bool fn_NetSim_IEEE802_11_CSMACA_CS()
120 return (isCurrSTAIdle && isCurrSTAMediumIdle());
131int fn_NetSim_IEEE802_11_CSMACA_CheckNAV()
133 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
134 PIEEE802_11_PHY_VAR phy = IEEE802_11_CURR_PHY;
136 if(pstruEventDetails->dEventTime >= mac->dNAV-4)
141 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_Wait_DIFS);
143 pstruEventDetails->dEventTime += phy->DIFS;
144 pstruEventDetails->nSubEventType = IEEE802_11_EVENT_DIFS_END;
145 mac->EVENTID.difsEnd = fnpAddEvent(pstruEventDetails);
147 else if(isEDCAF(mac))
150 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_Wait_AIFS);
152 pstruEventDetails->dEventTime += mac->currEdcaTable->AIFSN * getSlotTime(phy) * 1.0;
153 pstruEventDetails->nSubEventType = IEEE802_11_EVENT_AIFS_END;
154 mac->EVENTID.aifsEnd = fnpAddEvent(pstruEventDetails);
158 fnNetSimError(
"Unknown Medium access protocol\n");
164void ieee802_11_csmaca_difs_failed(PIEEE802_11_MAC_VAR mac)
166 fnDeleteEvent(mac->EVENTID.difsEnd);
167 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_MAC_IDLE);
170void ieee802_11_csmaca_aifs_failed(PIEEE802_11_MAC_VAR mac)
172 fnDeleteEvent(mac->EVENTID.aifsEnd);
173 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_MAC_IDLE);
185void fn_NetSim_IEEE802_11_CSMACA_DIFSEnd()
187 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
189 if(isCurrSTAMediumIdle())
192 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_BACKING_OFF);
195 fn_NetSim_IEEE802_11_CSMACA_StartBackOff();
197 else if(mac->currMacState==IEEE802_11_MACSTATE_Wait_DIFS)
199 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
203void fn_NetSim_IEEE802_11_CSMACA_AIFSEnd()
205 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
207 if (isCurrSTAMediumIdle())
210 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_BACKING_OFF);
213 fn_NetSim_IEEE802_11_CSMACA_StartBackOff();
215 else if (mac->currMacState == IEEE802_11_MACSTATE_Wait_AIFS)
217 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_MAC_IDLE);
225static void fn_NetSim_IEEE802_11_CSMACA_StartBackOff()
227 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
228 PIEEE802_11_PHY_VAR phy = IEEE802_11_CURR_PHY;
229 mac->dBackOffStartTime = pstruEventDetails->dEventTime;
230 if(mac->nBackOffCounter == 0)
231 fn_NetSim_IEEE802_11_CSMACA_RandomBackOffTimeCalculation();
233 print_ieee802_11_log(
"Time %lf, Device %d, Interface %d, Starting backoff. Counter is %d.",
234 pstruEventDetails->dEventTime,
237 mac->nBackOffCounter);
240 print_ieee802_11_Backoff_log(
"%s,%lf,%lld,%d,%d,%d,",
241 DEVICE_NAME(mac->deviceId),
242 pstruEventDetails->dEventTime,
243 mac->currentProcessingPacket->nPacketId,
244 mac->nBackOffCounter,
245 mac->nCWcurrent, mac->nRetryCount);
249 mac->dBackOffStartTime = pstruEventDetails->dEventTime;
250 mac->dBackoffLeftTime = mac->nBackOffCounter*
251 phy->plmeCharacteristics.aSlotTime +
252 mac->dBackOffStartTime;
254 mac->dPacketProcessingEndTime += mac->dBackoffLeftTime -
255 mac->dBackOffStartTime;
256 if (!validate_processing_time(mac->dPacketProcessingEndTime,
257 pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId))
260 pstruEventDetails->dEventTime += phy->plmeCharacteristics.aSlotTime;
261 pstruEventDetails->nSubEventType = IEEE802_11_EVENT_BACKOFF;
262 mac->EVENTID.backoff = fnpAddEvent(pstruEventDetails);
270static void fn_NetSim_IEEE802_11_CSMACA_RandomBackOffTimeCalculation()
272 double dRandomNumber = 0.0;
273 PIEEE802_11_MAC_VAR mac=IEEE802_11_CURR_MAC;
274 NETSIM_ID nDeviceId = pstruEventDetails->nDeviceId;
276 dRandomNumber = fn_NetSim_Utilities_GenerateRandomNo(&NETWORK->ppstruDeviceList[nDeviceId-1]->ulSeed[0],&NETWORK->ppstruDeviceList[nDeviceId-1]->ulSeed[1]);
277 dRandomNumber /= NETSIM_RAND_MAX;
278 dRandomNumber *= mac->nCWcurrent;
279 mac->nBackOffCounter = (int)dRandomNumber;
282bool fn_NetSim_IEEE802_11_CSMACA_Backoff()
284 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
285 PIEEE802_11_PHY_VAR phy = IEEE802_11_CURR_PHY;
287 assert(mac->nBackOffCounter>=0);
290 mac->dPacketProcessingEndTime = max(mac->dPacketProcessingEndTime, pstruEventDetails->dEventTime);
292 if(phy->radio.radioState != RX_ON_IDLE)
294 if(mac->currMacState==IEEE802_11_MACSTATE_BACKING_OFF)
295 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
296 mac->metrics.nBackoffFailedCount++;
299 print_ieee802_11_log(
"Time %lf micro sec, Backoff failed for %d-%d due to radio is not idle\n",
300 ldEventTime, pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
304 if(isCurrSTAMediumIdle())
306 mac->nBackOffCounter--;
307 if(mac->nBackOffCounter>0)
309 pstruEventDetails->dEventTime += phy->plmeCharacteristics.aSlotTime;
311 if (!validate_processing_time(pstruEventDetails->dEventTime,
312 pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId))
315 pstruEventDetails->nSubEventType = IEEE802_11_EVENT_BACKOFF;
316 mac->EVENTID.backoff = fnpAddEvent(pstruEventDetails);
321 mac->nBackOffCounter=0;
322 mac->dBackoffLeftTime=0;
323 mac->metrics.nBackoffSuccessCount++;
324 print_ieee802_11_log(
"Time %lf micro sec, Backoff Suceesful for %d-%d\n",
325 ldEventTime, pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
331 if(mac->nBackOffCounter<=1)
333 if(mac->currMacState==IEEE802_11_MACSTATE_BACKING_OFF)
334 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
335 mac->metrics.nBackoffFailedCount++;
336 mac->dBackoffLeftTime=0;
337 mac->nBackOffCounter=0;
338 print_ieee802_11_log(
"Time %lf micro sec, Backoff failed for %d-%d due to medium is not idle\n",
339 ldEventTime, pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
344 pstruEventDetails->dEventTime += phy->plmeCharacteristics.aSlotTime;
346 if (!validate_processing_time(pstruEventDetails->dEventTime,
347 pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId))
350 pstruEventDetails->nSubEventType = IEEE802_11_EVENT_BACKOFF;
351 mac->EVENTID.backoff = fnpAddEvent(pstruEventDetails);
352 print_ieee802_11_log(
"Time %lf micro sec, Backoff paused for %d-%d due to medium is not idle.\n",
353 ldEventTime, pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
359void ieee802_11_csmaca_pause_backoff(PIEEE802_11_MAC_VAR mac)
361 fnDeleteEvent(mac->EVENTID.backoff);
362 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_MAC_IDLE);
369int fn_NetSim_IEEE802_11_CSMACA_SendACK()
371 NetSim_PACKET* packet=fn_NetSim_IEEE802_11_CreateAckPacket(pstruEventDetails->nDeviceId,
372 pstruEventDetails->nInterfaceId,
373 pstruEventDetails->pPacket,
374 pstruEventDetails->dEventTime);
377 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
380 pstruEventDetails->dEventTime += IEEE802_11_CURR_PHY->SIFS;
381 pstruEventDetails->dPacketSize = packet->pstruMacData->dPacketSize;
382 pstruEventDetails->nSubEventType = 0;
383 pstruEventDetails->nEventType = PHYSICAL_OUT_EVENT;
384 pstruEventDetails->pPacket = packet;
385 fnpAddEvent(pstruEventDetails);
387 IEEE802_11_Change_Mac_State(IEEE802_11_CURR_MAC,IEEE802_11_MACSTATE_TXing_ACK);
391void fn_NetSim_IEEE802_11_CSMACA_ProcessAck()
393 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
395 NetSim_PACKET* p=mac->currentProcessingPacket;
398 if(mac->rate_adaptationAlgo== RATEADAPTATION_GENERIC)
399 packet_recv_notify(pstruEventDetails->nDeviceId,
400 pstruEventDetails->nInterfaceId,
401 pstruEventDetails->pPacket->nTransmitterId);
402 else if(mac->rate_adaptationAlgo== RATEADAPTATION_MINSTREL)
403 DoReportDataOk(pstruEventDetails->nDeviceId,
404 pstruEventDetails->nInterfaceId,
405 pstruEventDetails->pPacket->nTransmitterId);
410 p=p->pstruNextPacket;
411 if(t->ReceiveAckNotification)
412 t->ReceiveAckNotification(pstruEventDetails->pPacket);
413 fn_NetSim_Packet_FreePacket(t);
415 mac->currentProcessingPacket=NULL;
416 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
417 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
419 if (ieee802_11_edcaf_is_txop_timer_set(mac, ldEventTime))
423 NetSim_PACKET* packet = get_from_queue(pstruEventDetails->nDeviceId,
424 pstruEventDetails->nInterfaceId,
425 mac->nNumberOfAggregatedPackets,
428 if (!packet) ieee802_11_edcaf_unset_txop_time(mac);
431 mac->currentProcessingPacket = packet;
432 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(mac->deviceId, mac->parentInterfaceId);
435 pstruEventDetails->dEventTime += getSIFSTime(phy);
436 fn_NetSim_IEEE802_11_SendToPhy();
441 ieee802_11_edcaf_unset_txop_time(mac);
442 fn_NetSim_IEE802_11_MacReInit(pstruEventDetails->nDeviceId,
443 pstruEventDetails->nInterfaceId);
445 fnDeleteEvent(mac->EVENTID.ackTimeOut);
448void fn_NetSim_IEEE802_11_CSMACA_ProcessBlockAck()
450 UINT success=0,fail=0;
452 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
453 NetSim_PACKET* p=mac->currentProcessingPacket;
454 PIEEE802_11_BLOCKACK back = ((ptrIEEE802_11_HDR)PACKET_MACPROTOCOLDATA(pstruEventDetails->pPacket))->hdr;
455 NetSim_PACKET* prev=NULL;
459 if (flag == 0 && i == 1)
463 if(BIT_IS_SET_64(back->BitMap,i++))
466 if (t->ReceiveAckNotification)
467 t->ReceiveAckNotification(pstruEventDetails->pPacket);
471 prev->pstruNextPacket=t->pstruNextPacket;
472 p=p->pstruNextPacket;
473 fn_NetSim_Packet_FreePacket(t);
478 p=p->pstruNextPacket;
479 mac->currentProcessingPacket=p;
480 fn_NetSim_Packet_FreePacket(t);
489 p=p->pstruNextPacket;
493 if(mac->rate_adaptationAlgo== RATEADAPTATION_GENERIC)
497 packet_recv_notify(pstruEventDetails->nDeviceId,
498 pstruEventDetails->nInterfaceId,
499 pstruEventDetails->pPacket->nTransmitterId);
501 packet_drop_notify(pstruEventDetails->nDeviceId,
502 pstruEventDetails->nInterfaceId,
503 pstruEventDetails->pPacket->nTransmitterId);
505 else if(mac->rate_adaptationAlgo== RATEADAPTATION_MINSTREL)
507 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
508 if (phy->PhyProtocol == IEEE_802_11ax)
510 He_DoReportAmpduStatus(pstruEventDetails->nDeviceId,
511 pstruEventDetails->nInterfaceId,
512 pstruEventDetails->pPacket->nTransmitterId,
516 DoReportAmpduStatus(pstruEventDetails->nDeviceId,
517 pstruEventDetails->nInterfaceId,
518 pstruEventDetails->pPacket->nTransmitterId,
523 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
524 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_MAC_IDLE);
526 if (ieee802_11_edcaf_is_txop_timer_set(mac, ldEventTime))
530 NetSim_PACKET* packet = get_from_queue(pstruEventDetails->nDeviceId,
531 pstruEventDetails->nInterfaceId,
532 mac->nNumberOfAggregatedPackets,
535 ieee802_11_edcaf_unset_txop_time(mac);
538 mac->currentProcessingPacket = packet;
539 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(mac->deviceId, mac->parentInterfaceId);
542 pstruEventDetails->dEventTime += getSIFSTime(phy);
543 fn_NetSim_IEEE802_11_SendToPhy();
548 ieee802_11_edcaf_unset_txop_time(mac);
549 fn_NetSim_IEE802_11_MacReInit(pstruEventDetails->nDeviceId,
550 pstruEventDetails->nInterfaceId);
553 fnDeleteEvent(mac->EVENTID.ackTimeOut);
556void fn_NetSim_IEEE802_11_CSMACA_AddAckTimeOut(NetSim_PACKET* packet,NETSIM_ID devId,NETSIM_ID devIf)
558 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
560 NetSim_EVENTDETAILS pevent;
561 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(devId,devIf);
562 PIEEE802_11_MAC_VAR mac = IEEE802_11_MAC(devId, hdr->sendInterfaceId);
565 acktime = ceil(packet->pstruPhyData->dStartTime
566 + phy->plmeCharacteristics.aSIFSTime
567 + get_preamble_time(phy)
568 + ((getAckSize(phy) * 8)/phy->dControlFrameDataRate));
570 pevent.dEventTime=acktime+2;
571 pevent.dPacketSize=0;
572 pevent.nDeviceId=devId;
573 pevent.nDeviceType=DEVICE_TYPE(devId);
574 pevent.nEventType=TIMER_EVENT;
575 pevent.nInterfaceId=hdr->sendInterfaceId;
576 pevent.nPacketId=packet->nPacketId;
577 pevent.nProtocolId=MAC_PROTOCOL_IEEE802_11;
578 if(packet->pstruAppData)
580 pevent.nSegmentId=packet->pstruAppData->nSegmentId;
581 pevent.nApplicationId=packet->pstruAppData->nApplicationId;
586 pevent.nApplicationId=0;
588 pevent.nSubEventType=ACK_TIMEOUT;
590 pevent.szOtherDetails=NULL;
591 mac->EVENTID.ackTimeOut = fnpAddEvent(&pevent);
594void fn_NetSim_IEEE802_11_CSMA_AckTimeOut()
596 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
599 if(mac->currMacState == IEEE802_11_MACSTATE_Wait_ACK ||
600 mac->currMacState == IEEE802_11_MACSTATE_TXing_MPDU)
602 UINT frameLength = (UINT)mac->currentProcessingPacket->pstruMacData->dPayload;
604 if(mac->rate_adaptationAlgo== RATEADAPTATION_GENERIC)
605 packet_drop_notify(pstruEventDetails->nDeviceId,
606 pstruEventDetails->nInterfaceId,
607 mac->currentProcessingPacket->nReceiverId);
609 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
610 ieee802_11_edcaf_unset_txop_time(mac);
612 if (mac->rate_adaptationAlgo == RATEADAPTATION_MINSTREL)
613 isRetry = Minstrel_DoNeedDataSend(pstruEventDetails->nDeviceId,
614 pstruEventDetails->nInterfaceId,
615 mac->currentProcessingPacket->nReceiverId);
617 isRetry = fn_NetSim_IEEE802_11_CSMACA_CheckRetryLimit(mac, frameLength);
622 if(mac->rate_adaptationAlgo== RATEADAPTATION_MINSTREL)
623 Minstrel_ReportDataFailed(pstruEventDetails->nDeviceId,
624 pstruEventDetails->nInterfaceId,
625 mac->currentProcessingPacket->nReceiverId);
626 fn_NetSim_IEEE802_11_CSMACA_IncreaseCW(mac);
627 fn_NetSim_IEEE802_11_CSMACA_Init();
631 if(mac->rate_adaptationAlgo == RATEADAPTATION_MINSTREL)
632 Minstrel_ReportFinalDataFailed(pstruEventDetails->nDeviceId,
633 pstruEventDetails->nInterfaceId,
634 mac->currentProcessingPacket->nReceiverId);
636 if(mac->currentProcessingPacket)
638 NetSim_PACKET* pstruPacket = mac->currentProcessingPacket;
640 if(pstruPacket->DropNotification)
641 pstruPacket->DropNotification(pstruPacket);
642 fn_NetSim_Packet_FreePacket(mac->currentProcessingPacket);
643 mac->currentProcessingPacket=NULL;
645 mac->nRetryCount = 0;
646 fn_NetSim_IEEE802_11_CSMACA_Init();
656bool fn_NetSim_IEEE802_11_CSMACA_CheckRetryLimit(PIEEE802_11_MAC_VAR mac, UINT frameLength)
658 if (frameLength <= mac->dot11RTSThreshold)
660 if (mac->nRetryCount < mac->dot11ShortRetryLimit - 1)
667 if (mac->nRetryCount < mac->dot11LongRetryLimit - 1)
681void fn_NetSim_IEEE802_11_CSMACA_IncreaseCW(PIEEE802_11_MAC_VAR mac)
683 mac->nCWcurrent = min((mac->nCWcurrent * 2) + 1, mac->currEdcaTable->CWmax);
690int fn_NetSim_IEEE802_11_CSMACA_SendBlockACK()
692 NetSim_PACKET* packet;
693 NetSim_PACKET* p=pstruEventDetails->pPacket;
695 if(IEEE802_11_CURR_MAC->blockAckPacket)
696 packet = IEEE802_11_CURR_MAC->blockAckPacket;
699 packet=fn_NetSim_IEEE802_11_CreateBlockAckPacket(pstruEventDetails->nDeviceId,
700 pstruEventDetails->nInterfaceId,
701 pstruEventDetails->pPacket,
702 pstruEventDetails->dEventTime);
703 IEEE802_11_CURR_MAC->blockAckPacket=packet;
706 set_blockack_bitmap(packet,pstruEventDetails->pPacket);
708 if(!is_more_fragment_coming(pstruEventDetails->pPacket))
710 PIEEE802_11_BLOCKACK back = ((ptrIEEE802_11_HDR)PACKET_MACPROTOCOLDATA(packet))->hdr;
711 if (BIT_IS_SET_64(back->BitMap, 0))
714 pstruEventDetails->dEventTime += IEEE802_11_CURR_PHY->SIFS;
715 pstruEventDetails->dPacketSize = packet->pstruMacData->dPacketSize;
716 pstruEventDetails->nSubEventType = 0;
717 pstruEventDetails->nEventType = PHYSICAL_OUT_EVENT;
718 pstruEventDetails->pPacket = packet;
719 fnpAddEvent(pstruEventDetails);
722 IEEE802_11_Change_Mac_State(IEEE802_11_CURR_MAC,IEEE802_11_MACSTATE_TXing_ACK);
723 IEEE802_11_CURR_MAC->blockAckPacket=NULL;
727 fn_NetSim_Packet_FreePacket(p);
731void fn_NetSim_IEEE802_11_CSMA_UpdateNAV(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet)
733 ptrIEEE802_11_HDR mhdr = packet->pstruMacData->Packet_MACProtocol;
734 if (d == packet->nReceiverId && mhdr->recvInterfaceId == in) {
return; }
736 bool isUpdated =
false;
737 PIEEE802_11_MAC_VAR mac = IEEE802_11_MAC(d, in);
739 void* hdr = ieee802_11_get_hdr(packet, &type);
743 if (d == packet->nTransmitterId && mhdr->sendInterfaceId == in) {
return; }
744 mac->dNAV = max(mac->dNAV, (ldEventTime + ((PIEEE802_11_RTS)hdr)->Duration));
748 mac->dNAV = max(mac->dNAV, (ldEventTime + ((PIEEE802_11_CTS)hdr)->Duration));
755 NetSim_EVENTDETAILS pevent;
756 memset(&pevent, 0,
sizeof pevent);
757 pevent.dEventTime = mac->dNAV+1.05;
758 pevent.dPacketSize = 0;
759 pevent.nDeviceId = d;
760 pevent.nDeviceType = DEVICE_TYPE(d);
761 pevent.nEventType = MAC_OUT_EVENT;
762 pevent.nInterfaceId = in;
763 pevent.nProtocolId = MAC_PROTOCOL_IEEE802_11;
764 pevent.nSubEventType = 0;
765 fnpAddEvent(&pevent);