24#ifndef _NETSIM_IEEE802_11_H_
25#define _NETSIM_IEEE802_11_H_
29#ifndef _NO_DEFAULT_LINKER_
31#pragma comment(lib,"IEEE802.11.lib")
32#pragma comment(lib,"Metrics.lib")
33#pragma comment(lib,"NetworkStack.lib")
34#pragma comment(lib,"Mobility.lib")
35#pragma comment(lib,"PropagationModel.lib")
40#include "IEEE802_11_enum.h"
41#include "IEEE802_11_EDCAF.h"
44#define CONTRL_FRAME_RATE_11B 1
45#define CONTRL_FRAME_RATE_11A_AND_G 6
46#define CONTRL_FRAME_RATE_11P 3
70 static const char* strWLANProtocol[] =
71 {
"",
"IEEE_802_11a",
"IEEE_802_11b",
"IEEE_802_11g",
"IEEE_802_11p",
"IEEE_802_11n",
"IEEE_802_11e",
"IEEE_802_11ac" ,
"IEEE_802_11ax"};
79 static const char* strBERMODEL[] =
80 {
"SINR_BER_BY_FORMULA",
"SINR_BER_PER_TABLE"};
93 enum enum_802_11_FrameControl_Type
102 enum enum_802_11_Management_Frame_SubType
104 AssociationRequest = 0x0,
105 AssociationResponse = 0x1,
106 ReassociationRequest = 0x2,
107 ReassociationResponse = 0x3,
110 TimingAdvertisement = 0x6,
114 Disassociation = 0xA,
115 Authentication = 0xB,
116 Deauthentication = 0xC,
123 enum enum_802_11_Control_Frame_SubType
126 ControlWrapper = 0x7,
138 enum enum_802_11_Data_Frame_SubType
143 Data_Plus_CFAck_Plus_CFPoll,
151 QoSData_Plus_CFAck_Plus_CFPoll,
155 QoS_CFAck_Plus_CFPoll,
161 IEEE802_11_MACSTATE_MAC_IDLE = 0,
162 IEEE802_11_MACSTATE_WF_NAV,
163 IEEE802_11_MACSTATE_Wait_DIFS,
164 IEEE802_11_MACSTATE_Wait_AIFS,
165 IEEE802_11_MACSTATE_BACKING_OFF,
166 IEEE802_11_MACSTATE_TXing_MPDU,
167 IEEE802_11_MACSTATE_Txing_BroadCast,
168 IEEE802_11_MACSTATE_TXing_ACK,
169 IEEE802_11_MACSTATE_TXing_RTS,
170 IEEE802_11_MACSTATE_TXing_CTS,
171 IEEE802_11_MACSTATE_Wait_DATA,
172 IEEE802_11_MACSTATE_Wait_CTS,
173 IEEE802_11_MACSTATE_Wait_ACK,
174 IEEE802_11_MACSTATE_Wait_BlockACK,
175 IEEE802_11_MACSTATE_OFF,
176 IEEE802_11_MACSTATE_LAST,
177 }IEEE802_11_MAC_STATE;
178 static char strIEEE802_11_MAC_STATE[IEEE802_11_MACSTATE_LAST][48] =
186 "TRANSMITTING_BROADCAST",
200 RATEADAPTATION_DISABLE,
201 RATEADAPTATION_MINSTREL,
202 RATEADAPTATION_GENERIC,
203 RATEADAPTATION_FIXED,
204 }IEEE802_11_RATE_ADAPTATION;
210 }IEEE802_11_MEDIUM_ACCESS_PROTOCOL;
211#define IEEE802_11_MEDIUM_ACCESS_PROTOCOL_DEFAULT _strdup("DCF")
216 UINT nBackoffFailedCount;
217 UINT nBackoffSuccessCount;
218 UINT nTransmittedFrameCount;
219 UINT nReceivedFrameCount;
222 UINT nRTSReceivedCount;
223 UINT nCTSReceivedCount;
224 }IEEE802_11_METRICS,*PIEEE802_11_METRICS;
229 NETSIM_ID interfaceId;
230 NETSIM_ID parentInterfaceId;
233 IEEE802_11_BSS_TYPE BSSType;
234 IEEE802_11_RATE_ADAPTATION rate_adaptationAlgo;
235 UINT dot11ShortRetryLimit;
236 UINT dot11LongRetryLimit;
237 UINT dot11RTSThreshold;
238 IEEE802_11_MEDIUM_ACCESS_PROTOCOL mediumAccessProtocol;
241 bool macAggregationStatus;
242 UINT nNumberOfAggregatedPackets;
243 NetSim_PACKET* blockAckPacket;
247 DOT11EDCATABLE dot11EdcaTable[MAX_AC_CATEGORY];
248 ptrDOT11EDCATABLE currEdcaTable;
252 IEEE802_11_MAC_STATE currMacState;
253 IEEE802_11_MAC_STATE prevMacState;
255 double dBackOffStartTime;
257 double dBackoffLeftTime;
263 NetSim_PACKET* currentProcessingPacket;
264 NetSim_PACKET* waitingforCTS;
268 PNETSIM_MACADDRESS BSSId;
270 NETSIM_ID nAPInterfaceId;
272 NETSIM_ID* devIdsinBSS;
273 NETSIM_ID* devIfinBSS;
275 double dPacketProcessingEndTime;
280 long long int backoff;
281 long long int difsEnd;
282 long long int aifsEnd;
283 long long int ackTimeOut;
284 long long int ctsTimeout;
288 IEEE802_11_METRICS metrics;
290 }IEEE802_MAC_VAR,*PIEEE802_11_MAC_VAR;
292#define IEEE802_11_CURR_MAC IEEE802_11_MAC(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)
293#define isDCF(mac) (mac->mediumAccessProtocol == DCF)
294#define isEDCAF(mac) (mac->mediumAccessProtocol == EDCAF)
302 PPROPAGATION_INFO Propagation_Info;
304 }propagation_info_for_list, * ptrpropagation_info_for_list;
306#define PPROPAGATION_INFO_ALLOC() (struct stru_propagation_info_for_list*)list_alloc(sizeof(struct stru_propagation_info_for_list),offsetof(struct stru_propagation_info_for_list,ele))
307#define PPROPAGATION_INFO_ADD(info,e) (LIST_ADD_LAST(&(info),(e)))
308#define PPROPAGATION_INFO_NEXT(entity) (LIST_NEXT(entity))
309#define PPROPAGATION_INFO_REMOVE(ls, mem) (LIST_FREE((void**)(ls),(mem)))
311 int fn_NetSim_IEEE802_11_PropagationInit();
312 int fn_NetSim_IEEE802_11_FreePropagationInfo();
313 _declspec(dllexport) PPROPAGATION_INFO find_propagation_info(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri);
316#define isSTAIdle(macVar,phyVar) (macVar->currMacState == IEEE802_11_MACSTATE_MAC_IDLE && phyVar->radio.radioState == RX_ON_IDLE)
317#define isCurrSTAIdle isSTAIdle(IEEE802_11_CURR_MAC,IEEE802_11_CURR_PHY)
318#define isSTAIdlebyId(devid,ifid) isSTAIdle(IEEE802_11_MAC(devid,ifid),IEEE802_11_PHY(devid,ifid))
319#define isCurrSTAMediumIdle() (isMediumIdle(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId))
322 void fn_NetSim_802_11_MeshBSS_UpdateReceiver(NetSim_PACKET* packet);
323 bool isPacketforsameMeshBSS(PIEEE802_11_MAC_VAR mac,NetSim_PACKET* packet);
326 void fn_NetSim_802_11_InfrastructureBSS_UpdateReceiver(NetSim_PACKET* packet);
327 bool isPacketforsameInfrastructureBSS(PIEEE802_11_MAC_VAR mac,NetSim_PACKET* packet);
330 bool isMacTransmittingState(PIEEE802_11_MAC_VAR mac);
331 bool isMacReceivingState(PIEEE802_11_MAC_VAR mac);
332 bool isMacIdle(PIEEE802_11_MAC_VAR mac);
333 void IEEE802_11_Change_Mac_State(PIEEE802_11_MAC_VAR mac,IEEE802_11_MAC_STATE state);
334 void fn_NetSim_IEE802_11_MacReInit(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId);
335 void fn_NetSim_IEEE802_11_Timer();
336 void fn_NetSim_IEEE802_11_MacOut();
337 int fn_NetSim_IEEE802_11_MacIn();
338 double calculate_nav(NETSIM_ID d, NETSIM_ID i, NetSim_PACKET* packet);
339 void fn_NetSim_IEEE802_11_SendToPhy();
342 int fn_NetSim_IEEE802_11_CSMACA_Init();
343 bool fn_NetSim_IEEE802_11_CSMACA_CS();
344 int fn_NetSim_IEEE802_11_CSMACA_CheckNAV();
345 void fn_NetSim_IEEE802_11_CSMACA_DIFSEnd();
346 void ieee802_11_csmaca_difs_failed(PIEEE802_11_MAC_VAR mac);
347 void fn_NetSim_IEEE802_11_CSMACA_AIFSEnd();
348 void ieee802_11_csmaca_aifs_failed(PIEEE802_11_MAC_VAR mac);
349 void fn_NetSim_IEEE802_11_CSMACA_ProcessAck();
350 void fn_NetSim_IEEE802_11_CSMACA_IncreaseCW(PIEEE802_11_MAC_VAR mac);
351 bool fn_NetSim_IEEE802_11_CSMACA_CheckRetryLimit(PIEEE802_11_MAC_VAR mac, UINT frameLength);
352 void fn_NetSim_IEEE802_11_CSMACA_ProcessBlockAck();
353 void fn_NetSim_IEEE802_11_CSMA_AckTimeOut();
354 int fn_NetSim_IEEE802_11_CSMACA_SendBlockACK();
355 int fn_NetSim_IEEE802_11_CSMACA_SendACK();
356 bool fn_NetSim_IEEE802_11_CSMACA_Backoff();
357 void ieee802_11_csmaca_pause_backoff(PIEEE802_11_MAC_VAR mac);
358 void fn_NetSim_IEEE802_11_CSMACA_AddAckTimeOut(NetSim_PACKET* packet,NETSIM_ID devId,NETSIM_ID devIf);
359 void fn_NetSim_IEEE802_11_CSMA_UpdateNAV(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet);
363 bool isIEEE802_11_CtrlPacket(NetSim_PACKET* packet);
364 double getAckSize(
void* phy);
367 double getMacOverhead(
void* phy,
double size);
368 double calculate_CTS_duration(NETSIM_ID d,
371 bool is_more_fragment_coming(NetSim_PACKET* packet);
372 bool is_first_packet(NetSim_PACKET* packet);
373 NetSim_PACKET* fn_NetSim_IEEE802_11_CreateRTSPacket(NetSim_PACKET* data,
double duration);
374 NetSim_PACKET* fn_NetSim_IEEE802_11_CreateCTSPacket(NetSim_PACKET* data);
375 NetSim_PACKET* fn_NetSim_IEEE802_11_CreateAckPacket(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId,NetSim_PACKET* data,
double time);
376 NetSim_PACKET* fn_NetSim_IEEE802_11_CreateBlockAckPacket(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId,NetSim_PACKET* data,
double time);
377 void fn_NetSim_IEEE802_11_Add_MAC_Header(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId, NetSim_PACKET *pstruPacket,
unsigned int i);
378 void set_blockack_bitmap(NetSim_PACKET* ackPacket,NetSim_PACKET* packet);
379 void fn_NetSim_Process_CtrlPacket();
380 void ieee802_11_free_hdr(NetSim_PACKET* packet);
381 void ieee802_11_hdr_copy(NetSim_PACKET* src,NetSim_PACKET* dest);
384 void fn_NetSim_IEEE802_11_RTS_CTS_Init();
385 void fn_NetSim_IEEE802_11_RTS_CTS_CTSTimeOut();
386 void fn_NetSim_IEEE802_11_RTS_CTS_ProcessRTS();
387 void fn_NetSim_IEEE802_11_RTS_CTS_ProcessCTS();
388 void fn_NetSim_IEEE802_11_RTS_CTS_SendCTS();
389 void fn_NetSim_IEEE802_11_RTS_CTS_AddCTSTimeOut(NetSim_PACKET* packet,NETSIM_ID devId,NETSIM_ID devIf);
392 void Generic_Rate_adaptation_init(NETSIM_ID nDevId,NETSIM_ID nifid);
393 void free_rate_adaptation_data(
void* phy);
394 void packet_recv_notify(NETSIM_ID devid,NETSIM_ID ifid,NETSIM_ID rcvid);
395 void packet_drop_notify(NETSIM_ID devid,NETSIM_ID ifid,NETSIM_ID rcvid);
396 unsigned int get_rate_index(NETSIM_ID devid,NETSIM_ID ifid,NETSIM_ID rcvid);
399 _declspec(dllexport)
int fn_NetSim_IEEE802_11_FreePacket(NetSim_PACKET* pstruPacket);
400 int fn_NetSim_IEEE802_11_Finish_F();
403 void InitMinstrel(NETSIM_ID nDevId,NETSIM_ID nifid);
404 void Minstrel_Init(NETSIM_ID nDevId,NETSIM_ID nifid);
405 void Ht_InitMinstrel(NETSIM_ID nDevId,NETSIM_ID nifid);
406 void DoReportDataFailed(NETSIM_ID dev,NETSIM_ID ifid,NETSIM_ID recv);
407 void DoReportDataOk(NETSIM_ID dev,NETSIM_ID ifid,NETSIM_ID recv);
408 void DoReportFinalDataFailed(NETSIM_ID dev,NETSIM_ID ifid,NETSIM_ID recv);
409 BOOL DoNeedDataRetransmission(NETSIM_ID dev,NETSIM_ID ifid,NETSIM_ID recv);
410 UINT get_minstrel_rate_index(NETSIM_ID dev,NETSIM_ID ifid,NETSIM_ID recv);
411 void FreeMinstrel(NETSIM_ID nDevId, NETSIM_ID nifid);
412 void DoReportAmpduStatus(NETSIM_ID devid,NETSIM_ID ifid,NETSIM_ID recvid,UINT success,UINT failed);
413 BOOL Ht_DoNeedDataRetransmission(NETSIM_ID devid,NETSIM_ID ifid,NETSIM_ID recvid);
414 BOOL Minstrel_DoNeedDataSend(NETSIM_ID nDevId,NETSIM_ID nifid,NETSIM_ID recvid);
415 void Minstrel_ReportDataFailed(NETSIM_ID nDevId,NETSIM_ID nifid,NETSIM_ID recvid);
416 void Minstrel_ReportFinalDataFailed(NETSIM_ID nDevId,NETSIM_ID nifid,NETSIM_ID recvid);
418 void HT_Minstrel_Free(NETSIM_ID nDevId, NETSIM_ID nifid);
421 void He_InitMinstrel(NETSIM_ID nDevId, NETSIM_ID nifid);
422 void He_DoReportAmpduStatus(NETSIM_ID devid, NETSIM_ID ifid, NETSIM_ID recvid, UINT success, UINT failed);
423 BOOL He_DoNeedDataRetransmission(NETSIM_ID devid, NETSIM_ID ifid, NETSIM_ID recvid);
425 void HE_Minstrel_Free(NETSIM_ID nDevId, NETSIM_ID nifid);
430 PIEEE802_11_MAC_VAR IEEE802_11_MAC(NETSIM_ID ndeviceId, NETSIM_ID nInterfaceId);
431 void SET_IEEE802_11_MAC(NETSIM_ID ndeviceId, NETSIM_ID nInterfaceId, PIEEE802_11_MAC_VAR mac);
432 bool isIEEE802_11_Configure(NETSIM_ID ndeviceId, NETSIM_ID nInterfaceId);
433 bool validate_processing_time(
double time, NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId);
434 NetSim_PACKET* get_from_queue(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, UINT nPacketRequire, UINT* nPacketCount);
435 NETSIM_ID add_to_queue(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, NetSim_PACKET* packet);
436 void readd_to_queue(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, NetSim_PACKET* packet);
437 bool isPacketInQueue(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId);
440 void medium_change_callbackHandler(NETSIM_ID d,
442 bool status, NetSim_PACKET*);
443 bool medium_isRadioIdleHandler(NETSIM_ID d,
445 bool medium_isTransmitterBusyHandler(NETSIM_ID d,
447 double medium_getRxPowerHandler(NETSIM_ID tx,
452 void packetSentNotify(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet);
455 bool isIEEE802_11_log();
456 void print_ieee802_11_log(
char* format, ...);
457 bool isieee802_11_Backoff_log();
458 void print_ieee802_11_Backoff_log(
char* format, ...);
459 bool get_protocol_log_status(
char* logname);
462 NETSIM_ID get_send_interface_id(NetSim_PACKET* packet);
463 NETSIM_ID get_recv_interface_id(NetSim_PACKET* packet);
466 void ieee802_11_edcaf_set_txop_time(PIEEE802_11_MAC_VAR mac,
double currTime);
467 void ieee802_11_edcaf_unset_txop_time(PIEEE802_11_MAC_VAR mac);
468 bool ieee802_11_edcaf_is_txop_timer_set(PIEEE802_11_MAC_VAR mac,
double currTime);
Data structure for physical layer parameters.
Data structure for physical layer parameters.