25#include "IEEE802_11.h"
26#include "IEEE802_11_Phy.h"
27#include "IEEE802_11_MAC_Frame.h"
28#include "IEEE802_11_PhyFrame.h"
29#include "NetSim_utility.h"
31#include "AdvancedPlots.h"
32#pragma comment(lib,"AdvancedPlots.lib")
34double DSSSPhy_get_min_rxSensitivity();
35double ofdmphy_get_min_rxSensitivity(
double bandwidth);
36double HTPhy_get_min_rxSensitivity(
double bandwidth, UINT NSS);
37double HEPhy_get_min_rxSensitivity(
double bandwidth, UINT NSS);
38double fn_NetSim_IEEE802_11_GetMinRxSensitivity(NETSIM_ID txId, NETSIM_ID txIf);
40#define SPEED_OF_LIGHT 299.792458
41static double calculate_propagation_delay(NetSim_PACKET* packet)
43 NETSIM_ID tx=packet->nTransmitterId;
44 NETSIM_ID rx=packet->nReceiverId;
45 double d=fn_NetSim_Utilities_CalculateDistance(DEVICE_POSITION(tx),DEVICE_POSITION(rx));
46 return d/SPEED_OF_LIGHT;
58int fn_NetSim_IEEE802_11_PHY_Init(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId)
60 PIEEE802_11_PHY_VAR pstruPhyVar=IEEE802_11_PHY(nDeviceId,nInterfaceId);
63 pstruPhyVar->radio.radioState = RX_ON_IDLE;
65 switch(pstruPhyVar->PhyType)
68 switch((
int)pstruPhyVar->dChannelBandwidth)
71 pstruPhyVar->plmeCharacteristics.aPLCPHeaderLength = 4 ;
72 pstruPhyVar->plmeCharacteristics.aPreambleLength = 16;
73 pstruPhyVar->plmeCharacteristics.aCCATime = 4;
74 pstruPhyVar->plmeCharacteristics.aMACProcessingDelay = 2;
75 pstruPhyVar->plmeCharacteristics.aMPDUDurationFactor = 0;
76 pstruPhyVar->plmeCharacteristics.aMPDUMaxLength = 4095;
77 pstruPhyVar->plmeCharacteristics.aPHY_RX_START_Delay = 25;
78 pstruPhyVar->plmeCharacteristics.aRxPLCPDelay = 1;
79 pstruPhyVar->plmeCharacteristics.aRxRFDelay = 1;
80 pstruPhyVar->plmeCharacteristics.aRxTxSwitchTime = 1;
81 pstruPhyVar->plmeCharacteristics.aRxTxTurnaroundTime = 2;
82 pstruPhyVar->plmeCharacteristics.aTxPLCPDelay = 1;
83 pstruPhyVar->plmeCharacteristics.aTxRampOnTime = 1;
85 pstruPhyVar->dControlFrameDataRate = CONTRL_FRAME_RATE_11A_AND_G;
86 pstruPhyVar->dBroadcastFrameDataRate = CONTRL_FRAME_RATE_11A_AND_G;
89 pstruPhyVar->plmeCharacteristics.aPLCPHeaderLength = 8 ;
90 pstruPhyVar->plmeCharacteristics.aPreambleLength = 32;
91 pstruPhyVar->plmeCharacteristics.aCCATime = 8;
92 pstruPhyVar->plmeCharacteristics.aMACProcessingDelay = 2;
93 pstruPhyVar->plmeCharacteristics.aMPDUDurationFactor = 0;
94 pstruPhyVar->plmeCharacteristics.aMPDUMaxLength = 4095;
95 pstruPhyVar->plmeCharacteristics.aPHY_RX_START_Delay = 49;
96 pstruPhyVar->plmeCharacteristics.aRxPLCPDelay = 1;
97 pstruPhyVar->plmeCharacteristics.aRxRFDelay = 1;
98 pstruPhyVar->plmeCharacteristics.aRxTxSwitchTime = 1;
99 pstruPhyVar->plmeCharacteristics.aRxTxTurnaroundTime = 2;
100 pstruPhyVar->plmeCharacteristics.aTxPLCPDelay = 1;
101 pstruPhyVar->plmeCharacteristics.aTxRampOnTime = 1;
103 pstruPhyVar->dControlFrameDataRate = CONTRL_FRAME_RATE_11P;
104 pstruPhyVar->dBroadcastFrameDataRate = CONTRL_FRAME_RATE_11P;
107 pstruPhyVar->plmeCharacteristics.aPLCPHeaderLength = 16;
108 pstruPhyVar->plmeCharacteristics.aPreambleLength = 64;
109 pstruPhyVar->plmeCharacteristics.aCCATime = 16;
110 pstruPhyVar->plmeCharacteristics.aMACProcessingDelay = 2;
111 pstruPhyVar->plmeCharacteristics.aMPDUDurationFactor = 0;
112 pstruPhyVar->plmeCharacteristics.aMPDUMaxLength = 4095;
113 pstruPhyVar->plmeCharacteristics.aPHY_RX_START_Delay = 97;
114 pstruPhyVar->plmeCharacteristics.aRxPLCPDelay = 1;
115 pstruPhyVar->plmeCharacteristics.aRxRFDelay = 1;
116 pstruPhyVar->plmeCharacteristics.aRxTxSwitchTime = 1;
117 pstruPhyVar->plmeCharacteristics.aRxTxTurnaroundTime = 2;
118 pstruPhyVar->plmeCharacteristics.aTxPLCPDelay = 1;
119 pstruPhyVar->plmeCharacteristics.aTxRampOnTime = 1;
121 pstruPhyVar->dControlFrameDataRate = CONTRL_FRAME_RATE_11P;
122 pstruPhyVar->dBroadcastFrameDataRate = CONTRL_FRAME_RATE_11P;
125 fn_NetSim_IEEE802_11_OFDMPhy_SetEDThreshold(pstruPhyVar);
128 fn_NetSim_IEEE802_11n_OFDM_MIMO_init(nDeviceId,nInterfaceId);
129 fn_NetSim_IEEE802_11_HTPhy_SetEDThreshold(pstruPhyVar);
132 fn_NetSim_IEEE802_11ac_OFDM_MIMO_init(nDeviceId,nInterfaceId);
133 fn_NetSim_IEEE802_11_HTPhy_SetEDThreshold(pstruPhyVar);
136 fn_NetSim_IEEE802_11ax_OFDM_MIMO_init(nDeviceId,nInterfaceId);
137 fn_NetSim_IEEE802_11_HEPhy_SetEDThreshold(pstruPhyVar);
142 pstruPhyVar->plmeCharacteristics.aPLCPHeaderLength = 48;
143 pstruPhyVar->plmeCharacteristics.aPreambleLength = 144;
144 pstruPhyVar->plmeCharacteristics.aCCATime = 15;
145 pstruPhyVar->plmeCharacteristics.aMACProcessingDelay = 2;
146 pstruPhyVar->plmeCharacteristics.aMPDUDurationFactor = 0;
147 pstruPhyVar->plmeCharacteristics.aMPDUMaxLength = 8192;
148 pstruPhyVar->plmeCharacteristics.aPHY_RX_START_Delay = 192;
149 pstruPhyVar->plmeCharacteristics.aRxPLCPDelay = 1;
150 pstruPhyVar->plmeCharacteristics.aRxRFDelay = 1;
151 pstruPhyVar->plmeCharacteristics.aRxTxSwitchTime = 4;
152 pstruPhyVar->plmeCharacteristics.aRxTxTurnaroundTime = 5;
153 pstruPhyVar->plmeCharacteristics.aTxPLCPDelay = 1;
154 pstruPhyVar->plmeCharacteristics.aTxRampOnTime = 1;
155 pstruPhyVar->dControlFrameDataRate = CONTRL_FRAME_RATE_11B;
156 pstruPhyVar->dBroadcastFrameDataRate = CONTRL_FRAME_RATE_11B;
157 fn_NetSim_IEEE802_11_DSSPhy_SetEDThreshold(pstruPhyVar);
161 pstruPhyVar->SIFS = pstruPhyVar->plmeCharacteristics.aSIFSTime;
162 pstruPhyVar->DIFS = pstruPhyVar->plmeCharacteristics.aSIFSTime + (2 * pstruPhyVar->plmeCharacteristics.aSlotTime);
163 pstruPhyVar->EIFS = pstruPhyVar->plmeCharacteristics.aSIFSTime + pstruPhyVar->DIFS + (int) (ACK_SIZE * 8.0 / pstruPhyVar->dControlFrameDataRate) + 1;
164 pstruPhyVar->PIFS = pstruPhyVar->plmeCharacteristics.aSIFSTime + pstruPhyVar->plmeCharacteristics.aSlotTime;
168bool isMediumIdle(NETSIM_ID d, NETSIM_ID in)
170 PIEEE802_11_MAC_VAR mac = IEEE802_11_MAC(d, in);
171 return medium_isIdle(d, mac->parentInterfaceId);
174double get_preamble_time(PIEEE802_11_PHY_VAR phy)
176 double dPreambleTime = 0;
177 switch(phy->PhyProtocol)
183 dPreambleTime = (double)(phy->plmeCharacteristics.aPreambleLength+phy->plmeCharacteristics.aPLCPHeaderLength);
186 dPreambleTime = get_11n_preamble_time(phy);
189 dPreambleTime = get_11ac_preamble_time(phy);
192 dPreambleTime = get_11ax_preamble_time(phy);
195 fnNetSimError(
"Unknown phy protocol %d in %s.",phy->PhyProtocol,__FUNCTION__);
197 return dPreambleTime;
200int fn_NetSim_IEEE802_11_PhyOut()
202 NETSIM_ID srcid=pstruEventDetails->nDeviceId;
203 NETSIM_ID srcif=pstruEventDetails->nInterfaceId;
205 PIEEE802_11_PHY_VAR phy = IEEE802_11_CURR_PHY;
206 NetSim_PACKET* packet=pstruEventDetails->pPacket;
207 double time = pstruEventDetails->dEventTime;
208 double dTransmissionTime;
209 double dPropagationDelay;
210 double dPreambleTime;
212 NetSim_PACKET* last=NULL;
214 UINT64 transmissionId = 0;
217 NETSIM_ID destId = packet->nReceiverId;
218 NETSIM_ID destif = fn_NetSim_Stack_GetConnectedInterface(srcid, srcif, destId);
222 packet->pstruPhyData->dArrivalTime=pstruEventDetails->dEventTime;
223 packet->pstruPhyData->dStartTime=time;
224 packet->pstruPhyData->dEndTime=time;
226 packet->pstruPhyData->dPayload=packet->pstruMacData->dPacketSize;
227 packet->pstruPhyData->dOverhead=0;
228 packet->pstruPhyData->dPacketSize=packet->pstruPhyData->dPayload+
229 packet->pstruPhyData->dOverhead;
231 fn_NetSim_IEEE802_11_SetDataRate(srcid, srcif,
233 packet, packet->pstruPhyData->dArrivalTime);
235 fn_NetSim_IEEE802_11_Add_Phy_Header(packet, &transmissionId);
237 packet->pstruPhyData->nPhyMedium=PHY_MEDIUM_WIRELESS;
240 dPreambleTime = get_preamble_time(phy);
244 dTransmissionTime = fn_NetSim_IEEE802_11_CalculateTransmissionTime(packet->pstruPhyData->dPayload
245 ,pstruEventDetails->nDeviceId,
246 pstruEventDetails->nInterfaceId);
247 dPropagationDelay = 0.01;
249 time+=dTransmissionTime+dPreambleTime;
250 packet->pstruPhyData->dStartTime=time;
251 packet->pstruPhyData->dEndTime=packet->pstruPhyData->dStartTime+dPropagationDelay;
253 if(wireshark_trace.convert_sim_to_real_packet &&
254 DEVICE_MACLAYER(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->isWiresharkWriter)
256 wireshark_trace.convert_sim_to_real_packet(packet,
257 wireshark_trace.pcapWriterlist[pstruEventDetails->nDeviceId-1][pstruEventDetails->nInterfaceId-1],
258 pstruEventDetails->dEventTime);
260 packet = packet->pstruNextPacket;
264 if (!validate_processing_time(time,
265 pstruEventDetails->nDeviceId,
266 pstruEventDetails->nInterfaceId))
268 packet = pstruEventDetails->pPacket;
269 if (packet == NULL) {
return -2; }
271 if(packet->nReceiverId)
273 transmitflag = fn_NetSim_IEEE802_11_TransmitFrame(packet,srcid,srcif);
274 if(!isIEEE802_11_CtrlPacket(packet) &&
275 !isMulticastPacket(packet) &&
276 !isBroadcastPacket(packet))
277 fn_NetSim_IEEE802_11_CSMACA_AddAckTimeOut(last,srcid,srcif);
278 else if(packet->nControlDataType == WLAN_RTS)
279 fn_NetSim_IEEE802_11_RTS_CTS_AddCTSTimeOut(packet,srcid,srcif);
282 fn_NetSim_Packet_FreePacket(packet);
286 transmitflag = fn_NetSim_IEEE802_11_TransmitBroadcastFrame(packet,srcid,srcif);
290 NETSIM_ID srcSendIf = get_send_interface_id(packet);
291 PIEEE802_11_MAC_VAR srcMac = IEEE802_11_MAC(packet->nTransmitterId, srcSendIf);
292 set_mac_state_after_txend(srcMac);
294 fn_NetSim_Packet_FreePacket(packet);
299int fn_NetSim_IEEE802_11_PhyIn()
301 NetSim_PACKET* packet = pstruEventDetails->pPacket;
302 ptrIEEE802_11_PHY_HDR hdr = PACKET_PHYPROTOCOLDATA(packet);
303 PIEEE802_11_PHY_VAR phy = IEEE802_11_CURR_PHY;
304 PIEEE802_11_MAC_VAR srcMac;
305 PIEEE802_11_PHY_VAR srcPhy;
306 PACKET_STATUS status;
310 morefrag = is_more_fragment_coming(packet);
313 if(wireshark_trace.convert_sim_to_real_packet &&
314 DEVICE_MACLAYER(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->isWiresharkWriter)
316 wireshark_trace.convert_sim_to_real_packet(pstruEventDetails->pPacket,
317 wireshark_trace.pcapWriterlist[pstruEventDetails->nDeviceId-1][pstruEventDetails->nInterfaceId-1],
318 pstruEventDetails->dEventTime);
321 ifid = fn_NetSim_Stack_GetConnectedInterface(pstruEventDetails->nDeviceId,
322 pstruEventDetails->nInterfaceId,
323 packet->nTransmitterId);
325 NETSIM_ID srcSendIf = get_send_interface_id(packet);
326 srcPhy = IEEE802_11_PHY(packet->nTransmitterId, ifid);
327 srcMac = IEEE802_11_MAC(packet->nTransmitterId, srcSendIf);
330 if (is_first_packet(packet))
336 if (set_radio_state(packet->nTransmitterId, ifid,
337 RX_ON_IDLE, pstruEventDetails->nDeviceId,
338 hdr->transmissionId))
339 set_mac_state_after_txend(srcMac);
343 IEEE_802_11RadioMeasurements_Log(packet, packet->nTransmitterId,
345 pstruEventDetails->nDeviceId,
346 pstruEventDetails->nInterfaceId);
348 medium_notify_packet_received(packet);
350 double pdbm = GET_RX_POWER_dbm(packet->nTransmitterId,
352 pstruEventDetails->nDeviceId,
353 pstruEventDetails->nInterfaceId,
354 packet->pstruPhyData->dArrivalTime);
355 if (pdbm < srcPhy->dCurrentRxSensitivity_dbm)
357 set_radio_state(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId,
358 RX_ON_IDLE, packet->nTransmitterId,
359 hdr->transmissionId);
365 if (isIEEE802_11_CtrlPacket(packet) || !morefrag)
366 set_radio_state(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId,
367 RX_ON_IDLE, packet->nTransmitterId,
368 hdr->transmissionId);
371 if(phy->firstpacketstatus==PacketStatus_Collided)
372 packet->nPacketStatus=PacketStatus_Collided;
376 if(packet->nPacketStatus==PacketStatus_Collided)
378 if(!isIEEE802_11_CtrlPacket(packet) && is_first_packet(packet))
379 phy->firstpacketstatus = PacketStatus_Collided;
381 fn_NetSim_WritePacketTrace(packet);
382 fn_NetSim_Metrics_Add(packet);
383 fn_NetSim_Packet_FreePacket(packet);
387 status = packet->nPacketStatus;
388 if(status == PacketStatus_Error)
390 if(!isIEEE802_11_CtrlPacket(packet) && is_first_packet(packet))
391 phy->firstpacketstatus = PacketStatus_Error;
394 packet->pstruPhyData->nPacketErrorFlag = PacketStatus_Error;
395 packet->nPacketStatus=PacketStatus_Error;
396 fn_NetSim_WritePacketTrace(packet);
397 fn_NetSim_Metrics_Add(packet);
398 fn_NetSim_Packet_FreePacket(packet);
404 packet->pstruPhyData->nPacketErrorFlag = PacketStatus_NoError;
405 packet->nPacketStatus =PacketStatus_NoError;
406 fn_NetSim_WritePacketTrace(packet);
407 fn_NetSim_Metrics_Add(packet);
410 packet->pstruPhyData->dArrivalTime =packet->pstruPhyData->dEndTime;
411 packet->pstruPhyData->dStartTime =packet->pstruPhyData->dEndTime;
412 packet->pstruPhyData->dPayload = packet->pstruPhyData->dPacketSize - packet->pstruPhyData->dOverhead;
413 packet->pstruPhyData->dPacketSize = packet->pstruPhyData->dPayload;
414 packet->pstruPhyData->dOverhead = 0;
415 packet->pstruPhyData->dEndTime =packet->pstruPhyData->dEndTime;
417 switch(packet->nControlDataType)
420 pstruEventDetails->nSubEventType = RECEIVE_ACK;
423 pstruEventDetails->nSubEventType = RECEIVE_BLOCK_ACK;
426 pstruEventDetails->nSubEventType = RECEIVE_RTS;
429 pstruEventDetails->nSubEventType = RECEIVE_CTS;
432 pstruEventDetails->nSubEventType = RECEIVE_MPDU;
436 ptrIEEE802_11_HDR machdr = packet->pstruMacData->Packet_MACProtocol;
437 if (machdr->recvInterfaceId)
438 pstruEventDetails->nInterfaceId = machdr->recvInterfaceId;
440 pstruEventDetails->nEventType = MAC_IN_EVENT;
441 pstruEventDetails->pPacket = packet;
442 fnpAddEvent(pstruEventDetails);
446 phy->firstpacketstatus = PacketStatus_NoError;
451static void wlanphy_update_medium_param(NETSIM_ID d, NETSIM_ID in)
453 PIEEE802_11_PHY_VAR pstruPhy = IEEE802_11_PHY(d, in);
455 switch (pstruPhy->PhyProtocol)
458 medium_update_datarate(d, in, pstruPhy->PHY_TYPE.dsssPhy.dDataRate);
459 medium_update_modulation(d, in, pstruPhy->PHY_TYPE.dsssPhy.modulation, pstruPhy->PHY_TYPE.dsssPhy.dCodeRate);
460 medium_update_MCS(d, in, pstruPhy->MCS, strWLANProtocol[pstruPhy->PhyProtocol], strBERMODEL[pstruPhy->Ber_Model]);
465 medium_update_datarate(d, in, pstruPhy->PHY_TYPE.ofdmPhy.dDataRate);
466 medium_update_modulation(d, in, pstruPhy->PHY_TYPE.ofdmPhy.modulation, pstruPhy->PHY_TYPE.ofdmPhy.dCodingRate);
467 medium_update_MCS(d, in, pstruPhy->MCS, strWLANProtocol[pstruPhy->PhyProtocol], strBERMODEL[pstruPhy->Ber_Model]);
471 medium_update_datarate(d, in, pstruPhy->PHY_TYPE.ofdmPhy_11n.dDataRate);
472 medium_update_modulation(d, in, pstruPhy->PHY_TYPE.ofdmPhy_11n.modulation, pstruPhy->PHY_TYPE.ofdmPhy_11n.dCodingRate);
473 medium_update_MCS(d, in, pstruPhy->MCS, strWLANProtocol[pstruPhy->PhyProtocol], strBERMODEL[pstruPhy->Ber_Model]);
476 medium_update_datarate(d, in, pstruPhy->PHY_TYPE.ofdmPhy_11ax.dDataRate);
477 medium_update_modulation(d, in, pstruPhy->PHY_TYPE.ofdmPhy_11ax.modulation, pstruPhy->PHY_TYPE.ofdmPhy_11ax.dCodingRate);
478 medium_update_MCS(d, in, pstruPhy->MCS, strWLANProtocol[pstruPhy->PhyProtocol], strBERMODEL[pstruPhy->Ber_Model]);
481 fnNetSimError(
"IEEE802.11--- Unknown phy protocol type %d in %s\n", pstruPhy->PhyProtocol, __FUNCTION__);
489double fn_NetSim_IEEE802_11_CalculateTransmissionTime(
double size, NETSIM_ID nDevId, NETSIM_ID nInterfaceId)
491 double dTxTime = 0.0;
492 PIEEE802_11_PHY_VAR pstruPhy = IEEE802_11_PHY(nDevId,nInterfaceId);
494 switch (pstruPhy->PhyProtocol)
497 return ceil(size *(8 / pstruPhy->PHY_TYPE.dsssPhy.dDataRate));
502 return ceil(size *(8 / pstruPhy->PHY_TYPE.ofdmPhy.dDataRate));
505 return (ceil(size * (8 * 1000.0 / pstruPhy->PHY_TYPE.ofdmPhy_11n.dDataRate))) / 1000.0;
507 return (ceil(size * (8 * 1000.0 / pstruPhy->PHY_TYPE.ofdmPhy_11ax.dDataRate))) / 1000.0;
509 fnNetSimError(
"IEEE802.11--- Unknown phy protocol type %d in Calculate Transmission Time\n", pstruPhy->PhyProtocol);
516bool CheckFrequencyInterfrence(
double dFrequency1,
double dFrequency2,
double bandwidth)
518 if(dFrequency1 > dFrequency2)
520 if( (dFrequency1 - dFrequency2) >= bandwidth )
527 if( (dFrequency2 - dFrequency1) >= bandwidth )
540bool fn_NetSim_IEEE802_11_TransmitFrame(NetSim_PACKET* pstruPacket, NETSIM_ID nDevId, NETSIM_ID nInterfaceId)
542 PIEEE802_11_PHY_VAR srcPhy=IEEE802_11_PHY(nDevId,nInterfaceId);
543 PIEEE802_11_PHY_VAR destPhy;
545 NetSim_PACKET *pstruPacketList=pstruPacket;
546 ptrIEEE802_11_PHY_HDR hdr = PACKET_PHYPROTOCOLDATA(pstruPacket);
547 NetSim_EVENTDETAILS pevent;
548 NETSIM_ID destId=pstruPacket->nReceiverId;
549 NETSIM_ID destif=fn_NetSim_Stack_GetConnectedInterface(nDevId,nInterfaceId,destId);
551 destPhy=IEEE802_11_PHY(destId,destif);
554 fnNetSimError(
"No dest phy layer is found for device %d:%d in function %s",
555 destId, destif, __FUNCTION__);
560 while(pstruPacketList)
562 pstruPacketList->nReceiverId = destId;
563 pstruPacketList->nTransmitterId = nDevId;
564 pstruPacketList=pstruPacketList->pstruNextPacket;
567 if (!set_radio_state(nDevId, nInterfaceId, TRX_ON_BUSY, destId, hdr->transmissionId))
571 if (set_radio_state(destId, destif, RX_ON_BUSY, nDevId, hdr->transmissionId))
573 fn_NetSim_IEEE802_11_CSMA_UpdateNAV(destId, destif, pstruPacket);
576 destPhy->dCurrentRxSensitivity_dbm=srcPhy->dCurrentRxSensitivity_dbm;
577 pstruPacketList=pstruPacket;
578 while(pstruPacketList)
580 pstruPacket=pstruPacketList;
581 pstruPacketList = pstruPacketList->pstruNextPacket;
582 pstruPacket->pstruNextPacket=NULL;
584 memcpy(&pevent,pstruEventDetails,
sizeof* pstruEventDetails);
585 pevent.dEventTime = pstruPacket->pstruPhyData->dEndTime;
586 pevent.dPacketSize = pstruPacket->pstruPhyData->dPacketSize;
587 if(pstruPacket->pstruAppData)
589 pevent.nApplicationId = pstruPacket->pstruAppData->nApplicationId;
590 pevent.nSegmentId = pstruPacket->pstruAppData->nSegmentId;
594 pevent.nApplicationId = 0;
595 pevent.nSegmentId = 0;
597 pevent.nDeviceId = destId;
598 pevent.nDeviceType = DEVICE_TYPE(destId);
599 pevent.nEventType = PHYSICAL_IN_EVENT;
600 pevent.nInterfaceId = destif;
601 pevent.nPacketId = pstruPacket->nPacketId;
602 pevent.nProtocolId = MAC_PROTOCOL_IEEE802_11;
603 pevent.pPacket=pstruPacket;
604 pevent.nSubEventType = 0;
605 fnpAddEvent(&pevent);
607 wlanphy_update_medium_param(nDevId, nInterfaceId);
608 medium_notify_packet_send(pstruPacket,
617bool fn_NetSim_IEEE802_11_TransmitBroadcastFrame(NetSim_PACKET* pstruPacket, NETSIM_ID nDevId, NETSIM_ID nInterfaceId)
619 bool isTransmitted =
false;
622 link=DEVICE_PHYLAYER(nDevId,nInterfaceId)->pstruNetSimLinks;
623 switch(link->nLinkType)
627 if(link->puniDevList.pstrup2MP.nCenterDeviceId !=nDevId)
630 NetSim_PACKET* packet= fn_NetSim_Packet_CopyPacketList(pstruPacket);
631 packet->nReceiverId=link->puniDevList.pstrup2MP.nCenterDeviceId;
632 transmitflag = fn_NetSim_IEEE802_11_TransmitFrame(packet,nDevId,nInterfaceId);
634 fn_NetSim_Packet_FreePacket(packet);
636 isTransmitted =
true;
640 for(i=0;i<link->puniDevList.pstrup2MP.nConnectedDeviceCount-1;i++)
643 NetSim_PACKET* packet= fn_NetSim_Packet_CopyPacketList(pstruPacket);
644 packet->nReceiverId=link->puniDevList.pstrup2MP.anDevIds[i];
645 transmitflag = fn_NetSim_IEEE802_11_TransmitFrame(packet,nDevId,nInterfaceId);
647 fn_NetSim_Packet_FreePacket(packet);
649 isTransmitted =
true;
655 for(i=0;i<link->puniDevList.pstruMP2MP.nConnectedDeviceCount;i++)
657 if(link->puniDevList.pstruMP2MP.anDevIds[i]!=nDevId)
660 NetSim_PACKET* packet= fn_NetSim_Packet_CopyPacketList(pstruPacket);
661 packet->nReceiverId=link->puniDevList.pstruMP2MP.anDevIds[i];
662 transmitflag = fn_NetSim_IEEE802_11_TransmitFrame(packet,nDevId,nInterfaceId);
664 fn_NetSim_Packet_FreePacket(packet);
666 isTransmitted =
true;
673 NetSim_PACKET* packet= fn_NetSim_Packet_CopyPacketList(pstruPacket);
674 if(link->puniDevList.pstruP2P.nFirstDeviceId!=nDevId)
675 pstruPacket->nReceiverId=link->puniDevList.pstruP2P.nFirstDeviceId;
676 else if(link->puniDevList.pstruP2P.nSecondDeviceId!=nDevId)
677 pstruPacket->nReceiverId=link->puniDevList.pstruP2P.nSecondDeviceId;
678 transmitflag = fn_NetSim_IEEE802_11_TransmitFrame(packet,nDevId,nInterfaceId);
680 fn_NetSim_Packet_FreePacket(packet);
682 isTransmitted =
true;
686 fnNetSimError(
"Unknown link type in %s",__FUNCTION__);
689 return isTransmitted;
696int fn_NetSim_IEEE802_11_SetDataRate(NETSIM_ID txId, NETSIM_ID txIf,
697 NETSIM_ID rxId, NETSIM_ID rxIf,
698 NetSim_PACKET* packet,
double time)
701 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(txId, txIf);
703 switch (phy->PhyProtocol)
706 fn_NetSim_IEEE802_11_DSSSPhy_DataRate(txId, txIf, rxId, packet, time);
711 fn_NetSim_IEEE802_11_OFDMPhy_DataRate(txId, txIf, rxId, packet, time);
715 fn_NetSim_IEEE802_11_HTPhy_DataRate(txId, txIf, rxId, packet, time);
718 fn_NetSim_IEEE802_11_HEPhy_DataRate(txId, txIf, rxId, packet, time);
721 fnNetSimError(
"IEEE802.11--- Unknown protocol %d in %s\n", phy->PhyProtocol, __FUNCTION__);
727double fn_NetSim_IEEE802_11_GetMinRxSensitivity(NETSIM_ID txId, NETSIM_ID txIf)
729 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(txId, txIf);
730 double dInterferenceThreshold = 0.0;
731 switch (phy->PhyProtocol)
734 dInterferenceThreshold = DSSSPhy_get_min_rxSensitivity();
739 dInterferenceThreshold = ofdmphy_get_min_rxSensitivity(phy->dChannelBandwidth);
743 dInterferenceThreshold = HTPhy_get_min_rxSensitivity(phy->dChannelBandwidth, phy->NSS);
746 dInterferenceThreshold = HEPhy_get_min_rxSensitivity(phy->dChannelBandwidth, phy->NSS);
749 fnNetSimError(
"IEEE802.11--- Unknown protocol %d in %s\n", phy->PhyProtocol, __FUNCTION__);
752 return dInterferenceThreshold;