25#include "IEEE802_11.h"
26#include "IEEE802_11_MAC_Frame.h"
27#include "IEEE802_11_Phy.h"
30static void fn_NetSim_IEEE802_11_MacInit(
bool* isInterfaceUsed);
31static void forward_to_other_interface(NetSim_PACKET* packet);
32static void add_to_mac_queue(NetSim_PACKET* packet);
34void fn_NetSim_IEEE802_11_MacOut()
36 NETSIM_ID d = pstruEventDetails->nDeviceId;
37 NETSIM_ID ifCount = DEVICE(d)->nNumOfInterface;
40 switch(pstruEventDetails->nSubEventType)
44 bool* isInterfaceUsed = calloc(ifCount,
sizeof * isInterfaceUsed);
45 fn_NetSim_IEEE802_11_MacInit(isInterfaceUsed);
46 for (i = 0; i < ifCount; i++)
48 if (isInterfaceUsed[i])
50 pstruEventDetails->nInterfaceId = i + 1;
51 fn_NetSim_IEEE802_11_CSMACA_Init();
54 free(isInterfaceUsed);
58 if(fn_NetSim_IEEE802_11_CSMACA_CS())
59 fn_NetSim_IEEE802_11_CSMACA_CheckNAV();
61 case IEEE802_11_EVENT_DIFS_FAILED:
62 ieee802_11_csmaca_difs_failed(IEEE802_11_CURR_MAC);
64 case IEEE802_11_EVENT_DIFS_END:
65 fn_NetSim_IEEE802_11_CSMACA_DIFSEnd();
67 case IEEE802_11_EVENT_AIFS_FAILED:
68 ieee802_11_csmaca_aifs_failed(IEEE802_11_CURR_MAC);
70 case IEEE802_11_EVENT_AIFS_END:
71 fn_NetSim_IEEE802_11_CSMACA_AIFSEnd();
73 case IEEE802_11_EVENT_BACKOFF:
74 if(fn_NetSim_IEEE802_11_CSMACA_Backoff())
75 fn_NetSim_IEEE802_11_SendToPhy();
77 case IEEE802_11_EVENT_BACKOFF_PAUSED:
78 ieee802_11_csmaca_pause_backoff(IEEE802_11_CURR_MAC);
81 if(IEEE802_11_CURR_MAC->macAggregationStatus)
82 fn_NetSim_IEEE802_11_CSMACA_SendBlockACK();
84 fn_NetSim_IEEE802_11_CSMACA_SendACK();
87 fn_NetSim_IEEE802_11_RTS_CTS_SendCTS();
90 fn_NetSim_IEEE802_11_SendToPhy();
93 fnNetSimError(
"Unknown sub-event %d for IEEE802_11 MAC OUT.",pstruEventDetails->nSubEventType);
98int fn_NetSim_IEEE802_11_MacIn()
100 NETSIM_ID d = pstruEventDetails->nDeviceId;
101 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
102 NetSim_EVENTDETAILS pevent;
103 NetSim_PACKET* packet = pstruEventDetails->pPacket;
106 if(isIEEE802_11_CtrlPacket(packet))
108 fn_NetSim_Process_CtrlPacket();
112 mac->metrics.nReceivedFrameCount++;
114 memcpy(&pevent,pstruEventDetails,
sizeof pevent);
115 data = fn_NetSim_Packet_CopyPacket(packet);
116 if(DEVICE_NWLAYER(d))
118 fn_NetSim_IEEE802_11_FreePacket(packet);
119 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_NULL;
120 pevent.nInterfaceId = mac->parentInterfaceId;
121 pevent.nSubEventType=0;
122 pevent.nProtocolId = fn_NetSim_Stack_GetNWProtocol(d);
123 pevent.nEventType=NETWORK_IN_EVENT;
124 fnpAddEvent(&pevent);
128 if(mac->BSSType==INFRASTRUCTURE)
130 if (isBroadcastPacket(packet) || isMulticastPacket(packet))
132 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
133 fn_NetSim_802_11_InfrastructureBSS_UpdateReceiver(packet);
134 add_to_mac_queue(packet);
135 forward_to_other_interface(p);
139 if (isPacketforsameInfrastructureBSS(mac, packet))
141 fn_NetSim_802_11_InfrastructureBSS_UpdateReceiver(packet);
142 add_to_mac_queue(packet);
145 forward_to_other_interface(packet);
148 else if(mac->BSSType==MESH)
150 if(isPacketforsameMeshBSS(mac,packet))
152 fn_NetSim_802_11_MeshBSS_UpdateReceiver(packet);
153 add_to_mac_queue(packet);
156 forward_to_other_interface(packet);
160 fnNetSimError(
"BSSType %d is not implemented for IEEE802.11 protocol");
164 if (!isBroadcastPacket(data) &&
165 !isMulticastPacket(data))
167 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
170 pevent.nEventType=MAC_OUT_EVENT;
171 pevent.nSubEventType=SEND_ACK;
173 fnpAddEvent(&pevent);
174 IEEE802_11_Change_Mac_State(IEEE802_11_CURR_MAC,IEEE802_11_MACSTATE_TXing_ACK);
179static void fn_NetSim_IEEE802_11_MacInit(
bool* isInterfaceUsed)
181 NETSIM_ID d = pstruEventDetails->nDeviceId;
182 NETSIM_ID in = pstruEventDetails->nInterfaceId;
183 PIEEE802_11_MAC_VAR mac=IEEE802_11_CURR_MAC;
184 NetSim_BUFFER* pstruBuffer = DEVICE_ACCESSBUFFER(d, in);
186 if (mac->currentProcessingPacket)
188 isInterfaceUsed[in - 1] =
true;
191 if (mac->parentInterfaceId != in)
193 isInterfaceUsed[in - 1] =
true;
196 if (isPacketInQueue(d, in))
197 isInterfaceUsed[in - 1] =
true;
199 while(fn_NetSim_GetBufferStatus(pstruBuffer))
201 NetSim_PACKET* pstruPacket = fn_NetSim_Packet_GetPacketFromBuffer(pstruBuffer,1);
203 if(mac->BSSType==INFRASTRUCTURE)
205 if(isPacketforsameInfrastructureBSS(mac,pstruPacket))
206 fn_NetSim_802_11_InfrastructureBSS_UpdateReceiver(pstruPacket);
209 fn_NetSim_Packet_FreePacket(pstruPacket);
213 else if(mac->BSSType==MESH)
215 if(isPacketforsameMeshBSS(mac,pstruPacket))
216 fn_NetSim_802_11_MeshBSS_UpdateReceiver(pstruPacket);
219 fn_NetSim_Packet_FreePacket(pstruPacket);
225 fnNetSimError(
"BSSType %d is not implemented for IEEE802.11 protocol", mac->BSSType);
229 pstruPacket->pstruMacData->dArrivalTime = pstruEventDetails->dEventTime ;
230 pstruPacket->pstruMacData->dPayload = pstruPacket->pstruNetworkData->dPacketSize;
233 NETSIM_ID vin = add_to_queue(d, in, pstruPacket);
235 isInterfaceUsed[vin - 1] =
true;
240void IEEE802_11_Change_Mac_State(PIEEE802_11_MAC_VAR mac,IEEE802_11_MAC_STATE state)
242 print_ieee802_11_log(
"Device %d, interface %d, changing mac state from %s to %s.",
245 strIEEE802_11_MAC_STATE[mac->currMacState],
246 strIEEE802_11_MAC_STATE[state]);
247 mac->prevMacState=mac->currMacState;
248 mac->currMacState=state;
251void set_mac_state_after_txend(PIEEE802_11_MAC_VAR mac)
253 switch(mac->currMacState)
255 case IEEE802_11_MACSTATE_MAC_IDLE:
257 case IEEE802_11_MACSTATE_TXing_ACK:
258 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
260 case IEEE802_11_MACSTATE_TXing_MPDU:
261 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_Wait_ACK);
263 case IEEE802_11_MACSTATE_Txing_BroadCast:
264 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
266 case IEEE802_11_MACSTATE_TXing_CTS:
267 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
269 case IEEE802_11_MACSTATE_TXing_RTS:
270 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_Wait_CTS);
273 fnNetSimError(
"Unknown mac state %d is %s",mac->currMacState,__FUNCTION__);
274 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_MAC_IDLE);
278void set_mac_state_for_tx(PIEEE802_11_MAC_VAR mac,NetSim_PACKET* p)
280 switch(p->nControlDataType)
283 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_TXing_RTS);
286 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_TXing_CTS);
289 IEEE802_11_Change_Mac_State(mac,IEEE802_11_MACSTATE_TXing_ACK);
292 if(isBroadcastPacket(p) || isMulticastPacket(p))
293 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_Txing_BroadCast);
295 IEEE802_11_Change_Mac_State(mac, IEEE802_11_MACSTATE_TXing_MPDU);
300bool isMacTransmittingState(PIEEE802_11_MAC_VAR mac)
302 if (mac->currMacState == IEEE802_11_MACSTATE_TXing_MPDU ||
303 mac->currMacState == IEEE802_11_MACSTATE_Txing_BroadCast ||
304 mac->currMacState == IEEE802_11_MACSTATE_TXing_ACK ||
305 mac->currMacState == IEEE802_11_MACSTATE_TXing_RTS ||
306 mac->currMacState == IEEE802_11_MACSTATE_TXing_CTS)
311bool isMacReceivingState(PIEEE802_11_MAC_VAR mac)
313 if (mac->currMacState == IEEE802_11_MACSTATE_Wait_ACK ||
314 mac->currMacState == IEEE802_11_MACSTATE_Wait_CTS ||
315 mac->currMacState == IEEE802_11_MACSTATE_Wait_BlockACK ||
316 mac->currMacState == IEEE802_11_MACSTATE_Wait_DATA)
321bool isMacIdle(PIEEE802_11_MAC_VAR mac)
323 if (mac->currMacState == IEEE802_11_MACSTATE_MAC_IDLE ||
324 mac->currMacState == IEEE802_11_MACSTATE_WF_NAV ||
325 mac->currMacState == IEEE802_11_MACSTATE_Wait_DIFS ||
326 mac->currMacState == IEEE802_11_MACSTATE_Wait_AIFS ||
327 mac->currMacState == IEEE802_11_MACSTATE_BACKING_OFF)
332void fn_NetSim_IEEE802_11_SendToPhy()
334 double dPacketSize=0;
335 NETSIM_ID nDeviceId = pstruEventDetails->nDeviceId;
336 NETSIM_ID nInterfaceId = pstruEventDetails->nInterfaceId;
337 PIEEE802_11_MAC_VAR mac = IEEE802_11_CURR_MAC;
339 NetSim_PACKET *p=mac->currentProcessingPacket;
340 NetSim_PACKET* pstruPacket;
343 if(!mac->currentProcessingPacket)
345 fnNetSimError(
"%s is called without mac->currentProcessingPacket",__FUNCTION__);
348 set_mac_state_for_tx(mac,p);
349 ieee802_11_edcaf_set_txop_time(mac, ldEventTime);
351 if(!isBroadcastPacket(mac->currentProcessingPacket) &&
352 !isMulticastPacket(mac->currentProcessingPacket))
353 pstruPacket = fn_NetSim_Packet_CopyPacketList(mac->currentProcessingPacket);
356 pstruPacket = mac->currentProcessingPacket;
357 mac->currentProcessingPacket = NULL;
360 pstruEventDetails->pPacket = pstruPacket;
364 if(!isIEEE802_11_CtrlPacket(pstruPacket))
366 fn_NetSim_IEEE802_11_Add_MAC_Header(nDeviceId,nInterfaceId,pstruPacket,i);
367 mac->metrics.nTransmittedFrameCount++;
369 dPacketSize += pstruPacket->pstruMacData->dPacketSize;
370 pstruPacket=pstruPacket->pstruNextPacket;
373 pstruPacket = pstruEventDetails->pPacket;
374 pstruPacket->nTransmitterId = pstruEventDetails->nDeviceId;
376 pstruEventDetails->nInterfaceId = mac->parentInterfaceId;
377 pstruEventDetails->nEventType = PHYSICAL_OUT_EVENT;
378 pstruEventDetails->nPacketId = pstruPacket->nPacketId;
379 if(pstruPacket->pstruAppData)
381 pstruEventDetails->nSegmentId = pstruPacket->pstruAppData->nSegmentId;
382 pstruEventDetails->nApplicationId = pstruPacket->pstruAppData->nApplicationId;
386 pstruEventDetails->nApplicationId = 0;
387 pstruEventDetails->nSegmentId = 0;
389 pstruEventDetails->nSubEventType = IEEE802_11_PHY_TXSTART_REQUEST;
390 pstruEventDetails->dPacketSize = dPacketSize;
391 fnpAddEvent(pstruEventDetails);
394static void forward_to_other_interface(NetSim_PACKET* packet)
396 NetSim_EVENTDETAILS pevent;
398 NETSIM_ID inf=pstruEventDetails->nInterfaceId;
399 NETSIM_ID d=pstruEventDetails->nDeviceId;
401 fn_NetSim_IEEE802_11_FreePacket(packet);
402 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_NULL;
403 packet->pstruMacData->Packet_MACProtocol=NULL;
404 packet->pstruMacData->dPacketSize=0;
405 packet->pstruMacData->dPayload=0;
406 packet->pstruMacData->dOverhead=0;
407 for(i=1;i<=DEVICE(d)->nNumOfInterface;i++)
409 NetSim_BUFFER* buf=DEVICE_ACCESSBUFFER(d,i);
415 if (isVirtualInterface(d, i))
continue;
417 if(!fn_NetSim_GetBufferStatus(buf))
419 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
420 pevent.nInterfaceId=i;
421 pevent.nEventType=MAC_OUT_EVENT;
422 pevent.nProtocolId=fn_NetSim_Stack_GetMacProtocol(d,i);
423 pevent.nSubEventType=0;
425 fnpAddEvent(&pevent);
427 p=fn_NetSim_Packet_CopyPacket(packet);
428 fn_NetSim_Packet_AddPacketToList(buf,p,0);
430 fn_NetSim_Packet_FreePacket(packet);
433static void add_to_mac_queue(NetSim_PACKET* packet)
435 NETSIM_ID inf=pstruEventDetails->nInterfaceId;
436 NETSIM_ID d=pstruEventDetails->nDeviceId;
437 NetSim_BUFFER* buf=DEVICE_ACCESSBUFFER(d,inf);
439 fn_NetSim_IEEE802_11_FreePacket(packet);
440 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_NULL;
441 packet->pstruMacData->Packet_MACProtocol=NULL;
442 packet->pstruMacData->dPacketSize=0;
443 packet->pstruMacData->dPayload=0;
444 packet->pstruMacData->dOverhead=0;
446 if(!fn_NetSim_GetBufferStatus(buf))
448 pstruEventDetails->nInterfaceId=inf;
449 pstruEventDetails->nEventType=MAC_OUT_EVENT;
450 pstruEventDetails->nProtocolId=fn_NetSim_Stack_GetMacProtocol(d,inf);
451 pstruEventDetails->nSubEventType=0;
452 pstruEventDetails->pPacket=NULL;
453 fnpAddEvent(pstruEventDetails);
455 fn_NetSim_Packet_AddPacketToList(buf,packet,0);
458void fn_NetSim_IEE802_11_MacReInit(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId)
460 NetSim_EVENTDETAILS pevent;
461 memcpy(&pevent,pstruEventDetails,
sizeof pevent);
462 pstruEventDetails->dEventTime += 0.1;
463 pstruEventDetails->nDeviceId=nDeviceId;
464 pstruEventDetails->nInterfaceId=nInterfaceId;
465 pstruEventDetails->nDeviceType=DEVICE_TYPE(nDeviceId);
466 pstruEventDetails->dPacketSize=0;
467 pstruEventDetails->nApplicationId=0;
468 pstruEventDetails->nEventType=MAC_OUT_EVENT;
469 pstruEventDetails->nPacketId=0;
470 pstruEventDetails->nSegmentId=0;
471 pstruEventDetails->nSubEventType=0;
472 pstruEventDetails->pPacket=NULL;
473 pstruEventDetails->szOtherDetails=NULL;
474 IEEE802_11_CURR_MAC->nRetryCount = 0;
475 fn_NetSim_IEEE802_11_CSMACA_Init();
476 memcpy(pstruEventDetails,&pevent,
sizeof pevent);
479double calculate_nav(NETSIM_ID d, NETSIM_ID i, NetSim_PACKET* packet)
481 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(d, i);
483 switch (packet->nControlDataType)
487 double duration =(double) (((PIEEE802_11_RTS)((ptrIEEE802_11_HDR)(packet->pstruMacData->Packet_MACProtocol))->hdr)->Duration);
488 nav += ceil(packet->pstruPhyData->dStartTime +duration) + 3;
493 double duration = (double)(((PIEEE802_11_CTS)((ptrIEEE802_11_HDR)(packet->pstruMacData->Packet_MACProtocol))->hdr)->Duration);
494 nav += ceil(packet->pstruPhyData->dStartTime + duration) + 2;
498 nav += ceil(packet->pstruPhyData->dStartTime);
501 nav += ceil(packet->pstruPhyData->dStartTime);
504 if (isBroadcastPacket(packet) ||
505 isMulticastPacket(packet))
507 nav += ceil(packet->pstruPhyData->dStartTime) + 1;
511 nav += ceil(packet->pstruPhyData->dStartTime
512 + phy->plmeCharacteristics.aSIFSTime
513 + get_preamble_time(phy)
514 + ((getAckSize(phy) * 8) / phy->dControlFrameDataRate)) + 1;