NetSim Source Code Help
Loading...
Searching...
No Matches
IEEE802_11_Mac.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2021 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* This source code is licensed per the NetSim license agreement. *
12* *
13* No portion of this source code may be used as the basis for a derivative work, *
14* or used, for any purpose other than its intended use per the NetSim license *
15* agreement. *
16* *
17* This source code and the algorithms contained within it are confidential trade *
18* secrets of TETCOS and may not be used as the basis for any other software, *
19* hardware, product or service. *
20* *
21* Author: Shashi Kant Suman *
22* *
23* ----------------------------------------------------------------------------------*/
24#include "main.h"
25#include "IEEE802_11.h"
27#include "IEEE802_11_Phy.h"
28
29//Function prototype
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);
33
35{
37 NETSIM_ID ifCount = DEVICE(d)->nNumOfInterface;
38 NETSIM_ID i;
39
41 {
42 case 0:
43 {
44 bool* isInterfaceUsed = calloc(ifCount, sizeof * isInterfaceUsed);
45 fn_NetSim_IEEE802_11_MacInit(isInterfaceUsed);
46 for (i = 0; i < ifCount; i++)
47 {
48 if (isInterfaceUsed[i])
49 {
52 }
53 }
54 free(isInterfaceUsed);
55 }
56 break;
57 case CS:
60 break;
61 case IEEE802_11_EVENT_DIFS_FAILED:
63 break;
64 case IEEE802_11_EVENT_DIFS_END:
66 break;
67 case IEEE802_11_EVENT_AIFS_FAILED:
69 break;
70 case IEEE802_11_EVENT_AIFS_END:
72 break;
73 case IEEE802_11_EVENT_BACKOFF:
76 break;
77 case IEEE802_11_EVENT_BACKOFF_PAUSED:
79 break;
80 case SEND_ACK:
81 if(IEEE802_11_CURR_MAC->macAggregationStatus)
83 else
85 break;
86 case SEND_CTS:
88 break;
89 case SEND_MPDU:
91 break;
92 default:
93 fnNetSimError("Unknown sub-event %d for IEEE802_11 MAC OUT.",pstruEventDetails->nSubEventType);
94 break;
95 }
96}
97
99{
102 NetSim_EVENTDETAILS pevent;
104 NetSim_PACKET* data;
105
106 if(isIEEE802_11_CtrlPacket(packet))
107 {
109 return 0;
110 }
111
113
114 memcpy(&pevent,pstruEventDetails,sizeof pevent);
115 data = fn_NetSim_Packet_CopyPacket(packet);
116 if(DEVICE_NWLAYER(d))
117 {
120 pevent.nInterfaceId = mac->parentInterfaceId;
121 pevent.nSubEventType=0;
124 fnpAddEvent(&pevent);
125 }
126 else
127 {
128 if(mac->BSSType==INFRASTRUCTURE)
129 {
130 if (isBroadcastPacket(packet) || isMulticastPacket(packet))
131 {
134 add_to_mac_queue(packet);
136 }
137 else
138 {
139 if (isPacketforsameInfrastructureBSS(mac, packet))
140 {
142 add_to_mac_queue(packet);
143 }
144 else
146 }
147 }
148 else if(mac->BSSType==MESH)
149 {
150 if(isPacketforsameMeshBSS(mac,packet))
151 {
153 add_to_mac_queue(packet);
154 }
155 else
157 }
158 else
159 {
160 fnNetSimError("BSSType %d is not implemented for IEEE802.11 protocol");
161 return -1;
162 }
163 }
164 if (!isBroadcastPacket(data) &&
165 !isMulticastPacket(data)) //No ack for broadcast or multicast
166 {
167 memcpy(&pevent, pstruEventDetails, sizeof pevent);
168
169 //Add event to send ack
171 pevent.nSubEventType=SEND_ACK;
172 pevent.pPacket=data;
173 fnpAddEvent(&pevent);
175 }
176 return 0;
177}
178
179static void fn_NetSim_IEEE802_11_MacInit(bool* isInterfaceUsed)
180{
184 NetSim_BUFFER* pstruBuffer = DEVICE_ACCESSBUFFER(d, in);
185
187 {
188 isInterfaceUsed[in - 1] = true;
189 }
190
191 if (mac->parentInterfaceId != in)
192 {
193 isInterfaceUsed[in - 1] = true;
194 }
195
196 if (isPacketInQueue(d, in))
197 isInterfaceUsed[in - 1] = true;
198
199 while(fn_NetSim_GetBufferStatus(pstruBuffer))
200 {
201 NetSim_PACKET* pstruPacket = fn_NetSim_Packet_GetPacketFromBuffer(pstruBuffer,1);
202
203 if(mac->BSSType==INFRASTRUCTURE)
204 {
205 if(isPacketforsameInfrastructureBSS(mac,pstruPacket))
207 else
208 {
209 fn_NetSim_Packet_FreePacket(pstruPacket);
210 continue;
211 }
212 }
213 else if(mac->BSSType==MESH)
214 {
215 if(isPacketforsameMeshBSS(mac,pstruPacket))
217 else
218 {
219 fn_NetSim_Packet_FreePacket(pstruPacket);
220 continue;
221 }
222 }
223 else
224 {
225 fnNetSimError("BSSType %d is not implemented for IEEE802.11 protocol", mac->BSSType);
226 return;
227 }
228
230 pstruPacket->pstruMacData->dPayload = pstruPacket->pstruNetworkData->dPacketSize;
231
232 //Call IEEE802.11e
233 NETSIM_ID vin = add_to_queue(d, in, pstruPacket);
234 if (vin)
235 isInterfaceUsed[vin - 1] = true;
236 }
237 return;
238}
239
241{
242 print_ieee802_11_log("Device %d, interface %d, changing mac state from %s to %s.",
243 mac->deviceId,
244 mac->interfaceId,
247 mac->prevMacState=mac->currMacState;
248 mac->currMacState=state;
249}
250
252{
253 switch(mac->currMacState)
254 {
256 break;
259 break;
262 break;
265 break;
268 break;
271 break;
272 default:
273 fnNetSimError("Unknown mac state %d is %s",mac->currMacState,__FUNCTION__);
275 }
276}
277
279{
280 switch(p->nControlDataType)
281 {
282 case WLAN_RTS:
284 break;
285 case WLAN_CTS:
287 break;
288 case WLAN_ACK:
290 break;
291 default:
294 else
296 break;
297 }
298}
299
301{
307 return true;
308 return false;
309}
310
312{
317 return true;
318 return false;
319}
320
322{
328 return true;
329 return false;
330}
331
333{
334 double dPacketSize=0;
338
340 NetSim_PACKET* pstruPacket;
341 unsigned int i=1;
342
344 {
345 fnNetSimError("%s is called without mac->currentProcessingPacket",__FUNCTION__);
346 return;
347 }
350
354 else
355 {
356 pstruPacket = mac->currentProcessingPacket;
357 mac->currentProcessingPacket = NULL;
358 }
359
360 pstruEventDetails->pPacket = pstruPacket;
361 // Add the MAC header
362 while(pstruPacket)
363 {
364 if(!isIEEE802_11_CtrlPacket(pstruPacket))
365 {
366 fn_NetSim_IEEE802_11_Add_MAC_Header(nDeviceId,nInterfaceId,pstruPacket,i);
368 }
369 dPacketSize += pstruPacket->pstruMacData->dPacketSize;
370 pstruPacket=pstruPacket->pstruNextPacket;
371 i++;
372 }
373 pstruPacket = pstruEventDetails->pPacket;
375
378 pstruEventDetails->nPacketId = pstruPacket->nPacketId;
379 if(pstruPacket->pstruAppData)
380 {
383 }
384 else
385 {
388 }
389 pstruEventDetails->nSubEventType = IEEE802_11_PHY_TXSTART_REQUEST;
390 pstruEventDetails->dPacketSize = dPacketSize;
392}
393
395{
396 NetSim_EVENTDETAILS pevent;
397 NETSIM_ID i;
400
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++)
408 {
410 NetSim_PACKET* p;
411
412 if(i==inf)
413 continue;
414
415 if (isVirtualInterface(d, i)) continue;
416
418 {
419 memcpy(&pevent, pstruEventDetails, sizeof pevent);
420 pevent.nInterfaceId=i;
423 pevent.nSubEventType=0;
424 pevent.pPacket=NULL;
425 fnpAddEvent(&pevent);
426 }
429 }
431}
432
433static void add_to_mac_queue(NetSim_PACKET* packet)
434{
438
441 packet->pstruMacData->Packet_MACProtocol=NULL;
442 packet->pstruMacData->dPacketSize=0;
443 packet->pstruMacData->dPayload=0;
444 packet->pstruMacData->dOverhead=0;
445
447 {
454 }
456}
457
459{
460 NetSim_EVENTDETAILS pevent;
461 memcpy(&pevent,pstruEventDetails,sizeof pevent);
463 pstruEventDetails->nDeviceId=nDeviceId;
464 pstruEventDetails->nInterfaceId=nInterfaceId;
474 IEEE802_11_CURR_MAC->nRetryCount = 0;
476 memcpy(pstruEventDetails,&pevent,sizeof pevent);
477}
478
480{
482 double nav = 0;
483 switch (packet->nControlDataType)
484 {
485 case WLAN_RTS:
486 {
487 double duration =(double) (((PIEEE802_11_RTS)((ptrIEEE802_11_HDR)(packet->pstruMacData->Packet_MACProtocol))->hdr)->Duration);
488 nav += ceil(packet->pstruPhyData->dStartTime +duration) + 3;
489 }
490 break;
491 case WLAN_CTS:
492 {
493 double duration = (double)(((PIEEE802_11_CTS)((ptrIEEE802_11_HDR)(packet->pstruMacData->Packet_MACProtocol))->hdr)->Duration);
494 nav += ceil(packet->pstruPhyData->dStartTime + duration) + 2;
495 }
496 break;
497 case WLAN_ACK:
498 nav += ceil(packet->pstruPhyData->dStartTime);
499 break;
500 case WLAN_BlockACK:
501 nav += ceil(packet->pstruPhyData->dStartTime);
502 break;
503 default:
504 if (isBroadcastPacket(packet) ||
505 isMulticastPacket(packet))
506 {
507 nav += ceil(packet->pstruPhyData->dStartTime) + 1;
508 }
509 else
510 {
511 nav += ceil(packet->pstruPhyData->dStartTime
513 + get_preamble_time(phy)
514 + ((getAckSize(phy) * 8) / phy->dControlFrameDataRate)) + 1;
515 }
516 break;
517 }
518 return nav;
519}
unsigned int NETSIM_ID
Definition: Animation.h:45
int fn_NetSim_IEEE802_11_CSMACA_CheckNAV()
Definition: CSMACA.c:131
int fn_NetSim_IEEE802_11_CSMACA_SendBlockACK()
Definition: CSMACA.c:680
int fn_NetSim_IEEE802_11_CSMACA_SendACK()
Definition: CSMACA.c:369
void fn_NetSim_IEEE802_11_CSMACA_DIFSEnd()
Definition: CSMACA.c:185
void ieee802_11_csmaca_aifs_failed(PIEEE802_11_MAC_VAR mac)
Definition: CSMACA.c:170
void ieee802_11_csmaca_pause_backoff(PIEEE802_11_MAC_VAR mac)
Definition: CSMACA.c:359
void ieee802_11_csmaca_difs_failed(PIEEE802_11_MAC_VAR mac)
Definition: CSMACA.c:164
bool fn_NetSim_IEEE802_11_CSMACA_CS()
Definition: CSMACA.c:118
bool fn_NetSim_IEEE802_11_CSMACA_Backoff()
Definition: CSMACA.c:282
void fn_NetSim_IEEE802_11_CSMACA_AIFSEnd()
Definition: CSMACA.c:203
int fn_NetSim_IEEE802_11_CSMACA_Init()
Definition: CSMACA.c:48
PIEEE802_11_PHY_VAR IEEE802_11_PHY(NETSIM_ID ndeviceId, NETSIM_ID nInterfaceId)
bool isPacketInQueue(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId)
NETSIM_ID add_to_queue(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, NetSim_PACKET *packet)
int fn_NetSim_IEEE802_11_FreePacket(NetSim_PACKET *pstruPacket)
Definition: IEEE802_11.c:94
double getAckSize(void *phy)
void ieee802_11_edcaf_set_txop_time(PIEEE802_11_MAC_VAR mac, double currTime)
IEEE802_11_MAC_STATE
Enumeration for 802.11 MAC states.
Definition: IEEE802_11.h:153
@ IEEE802_11_MACSTATE_BACKING_OFF
Definition: IEEE802_11.h:158
@ IEEE802_11_MACSTATE_Wait_BlockACK
Definition: IEEE802_11.h:167
@ IEEE802_11_MACSTATE_Wait_DATA
Definition: IEEE802_11.h:164
@ IEEE802_11_MACSTATE_Wait_AIFS
Definition: IEEE802_11.h:157
@ IEEE802_11_MACSTATE_Wait_ACK
Definition: IEEE802_11.h:166
@ IEEE802_11_MACSTATE_TXing_CTS
Definition: IEEE802_11.h:163
@ IEEE802_11_MACSTATE_WF_NAV
Definition: IEEE802_11.h:155
@ IEEE802_11_MACSTATE_Txing_BroadCast
Definition: IEEE802_11.h:160
@ IEEE802_11_MACSTATE_MAC_IDLE
Definition: IEEE802_11.h:154
@ IEEE802_11_MACSTATE_TXing_MPDU
Definition: IEEE802_11.h:159
@ IEEE802_11_MACSTATE_TXing_RTS
Definition: IEEE802_11.h:162
@ IEEE802_11_MACSTATE_Wait_DIFS
Definition: IEEE802_11.h:156
@ IEEE802_11_MACSTATE_TXing_ACK
Definition: IEEE802_11.h:161
@ IEEE802_11_MACSTATE_Wait_CTS
Definition: IEEE802_11.h:165
void fn_NetSim_IEEE802_11_Add_MAC_Header(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, NetSim_PACKET *pstruPacket, unsigned int i)
void fn_NetSim_Process_CtrlPacket()
@ INFRASTRUCTURE
Definition: IEEE802_11.h:57
@ MESH
Definition: IEEE802_11.h:59
void fn_NetSim_IEEE802_11_RTS_CTS_SendCTS()
Definition: RTS_CTS.c:129
bool isPacketforsameInfrastructureBSS(PIEEE802_11_MAC_VAR mac, NetSim_PACKET *packet)
void fn_NetSim_802_11_InfrastructureBSS_UpdateReceiver(NetSim_PACKET *packet)
void fn_NetSim_802_11_MeshBSS_UpdateReceiver(NetSim_PACKET *packet)
Definition: MeshBSS.c:48
bool isIEEE802_11_CtrlPacket(NetSim_PACKET *packet)
bool isPacketforsameMeshBSS(PIEEE802_11_MAC_VAR mac, NetSim_PACKET *packet)
Definition: MeshBSS.c:62
static char strIEEE802_11_MAC_STATE[IEEE802_11_MACSTATE_LAST][48]
Definition: IEEE802_11.h:171
void print_ieee802_11_log(char *format,...)
#define IEEE802_11_CURR_MAC
Definition: IEEE802_11.h:285
@ WLAN_RTS
@ WLAN_BlockACK
@ WLAN_CTS
@ WLAN_ACK
void fn_NetSim_IEEE802_11_MacOut()
static void forward_to_other_interface(NetSim_PACKET *packet)
void fn_NetSim_IEE802_11_MacReInit(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId)
double calculate_nav(NETSIM_ID d, NETSIM_ID i, NetSim_PACKET *packet)
bool isMacReceivingState(PIEEE802_11_MAC_VAR mac)
static void fn_NetSim_IEEE802_11_MacInit(bool *isInterfaceUsed)
static void add_to_mac_queue(NetSim_PACKET *packet)
void IEEE802_11_Change_Mac_State(PIEEE802_11_MAC_VAR mac, IEEE802_11_MAC_STATE state)
void fn_NetSim_IEEE802_11_SendToPhy()
bool isMacIdle(PIEEE802_11_MAC_VAR mac)
void set_mac_state_for_tx(PIEEE802_11_MAC_VAR mac, NetSim_PACKET *p)
bool isMacTransmittingState(PIEEE802_11_MAC_VAR mac)
int fn_NetSim_IEEE802_11_MacIn()
void set_mac_state_after_txend(PIEEE802_11_MAC_VAR mac)
double get_preamble_time(PIEEE802_11_PHY_VAR phy)
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
bool fn_NetSim_GetBufferStatus(NetSim_BUFFER *pstruBuffer)
Definition: Scheduling.c:41
NetSim_PACKET * fn_NetSim_Packet_GetPacketFromBuffer(NetSim_BUFFER *pstruBuffer, int nFlag)
bool isMulticastPacket(NetSim_PACKET *packet)
bool isBroadcastPacket(NetSim_PACKET *packet)
EXPORTED double ldEventTime
Definition: Stack.h:838
#define DEVICE(DeviceId)
Definition: Stack.h:769
NETWORK_LAYER_PROTOCOL fn_NetSim_Stack_GetNWProtocol(NETSIM_ID nDeviceId)
bool isVirtualInterface(NETSIM_ID d, NETSIM_ID in)
#define DEVICE_TYPE(DeviceId)
Definition: Stack.h:773
MAC_LAYER_PROTOCOL fn_NetSim_Stack_GetMacProtocol(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId)
@ MAC_PROTOCOL_NULL
Definition: Stack.h:206
@ NETWORK_IN_EVENT
Definition: Stack.h:109
@ PHYSICAL_OUT_EVENT
Definition: Stack.h:104
@ MAC_OUT_EVENT
Definition: Stack.h:106
#define DEVICE_ACCESSBUFFER(DeviceId, InterfaceId)
Definition: Stack.h:794
#define DEVICE_NWLAYER(DeviceId)
Definition: Stack.h:785
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
#define fn_NetSim_Packet_CopyPacket(pstruPacket)
Definition: main.h:182
#define fn_NetSim_Packet_FreePacket(pstruPacket)
Definition: main.h:177
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
#define fn_NetSim_Packet_AddPacketToList(pstruBuffer, pstruPacket, nInsertionType)
Definition: main.h:179
#define fn_NetSim_Packet_CopyPacketList(pstruPacket)
Definition: main.h:184
Page-405 of IEEE Std 802.11-2012 Figure 8-14—CTS frame.
IEEE802_11_MAC_STATE prevMacState
Definition: IEEE802_11.h:246
NETSIM_ID interfaceId
Definition: IEEE802_11.h:222
NETSIM_ID parentInterfaceId
Definition: IEEE802_11.h:223
IEEE802_11_MAC_STATE currMacState
Definition: IEEE802_11.h:245
NetSim_PACKET * currentProcessingPacket
Definition: IEEE802_11.h:256
IEEE802_11_METRICS metrics
Definition: IEEE802_11.h:281
IEEE802_11_BSS_TYPE BSSType
Definition: IEEE802_11.h:226
NETSIM_ID deviceId
Definition: IEEE802_11.h:221
PLME_CHARACTERISTICS plmeCharacteristics
Page-404 of IEEE Std 802.11-2012 Figure 8-13—RTS frame.
NETSIM_ID nApplicationId
Definition: Stack.h:752
EVENT_TYPE nEventType
Definition: Stack.h:747
NETSIM_ID nProtocolId
Definition: Stack.h:748
struct stru_NetSim_Packet * pPacket
Definition: Stack.h:754
NETSIM_ID nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
long long int nPacketId
Definition: Stack.h:755
netsimDEVICE_TYPE nDeviceType
Definition: Stack.h:749
NETSIM_ID nInterfaceId
Definition: Stack.h:751
MAC_LAYER_PROTOCOL nMACProtocol
Definition: Packet.h:223
long long int nPacketId
Definition: Packet.h:256
struct stru_NetSim_Packet_AppLayer * pstruAppData
Definition: Packet.h:273
struct stru_NetSim_Packet_PhyLayer * pstruPhyData
Definition: Packet.h:277
struct stru_NetSim_Packet_NetworkLayer * pstruNetworkData
Definition: Packet.h:275
unsigned int nControlDataType
Definition: Packet.h:258
struct stru_NetSim_Packet * pstruNextPacket
Definition: Packet.h:278
NETSIM_ID nTransmitterId
Definition: Packet.h:265
struct stru_NetSim_Packet_MACLayer * pstruMacData
Definition: Packet.h:276