15#include "IEEE802_11.h"
16#include "IEEE802_11_MAC_Frame.h"
17#include "IEEE802_11_Phy.h"
18#include "NetSim_utility.h"
20static UINT get_fragment_number(NetSim_PACKET* packet);
22double getAckSize(PIEEE802_11_PHY_VAR phy)
24 switch(phy->PhyProtocol)
32 return BlockACK_SIZE_802_11n;
34 return BlockACK_SIZE_802_11ac;
36 return BlockACK_SIZE_802_11ax;
38 fnNetSimError(
"Unknown phy protocol %d in %s.",phy->PhyProtocol,__FUNCTION__);
53double getMacOverhead(PIEEE802_11_PHY_VAR phy,
double size)
56 if (phy->PhyProtocol == IEEE_802_11n || phy->PhyProtocol == IEEE_802_11ac || phy->PhyProtocol == IEEE_802_11ax)
58 overhead = MAC_OVERHEAD_802_11n;
60 overhead += (4 - ((int)size % 4)) % 4;
63 overhead = MAC_OVERHEAD;
67static double get_block_ack_size(NETSIM_ID dev, NETSIM_ID ifid)
69 switch (IEEE802_11_PHY(dev, ifid)->PhyProtocol)
71 case IEEE_802_11n:
return BlockACK_SIZE_802_11n;
72 case IEEE_802_11ac:
return BlockACK_SIZE_802_11ac;
73 case IEEE_802_11ax:
return BlockACK_SIZE_802_11ax;
74 default: fnNetSimError(
"Unknown phy protocol %d in %s.", IEEE802_11_PHY(dev, ifid)->PhyProtocol, __FUNCTION__);
79static void ieee802_11_set_hdr(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet, UINT hdrType,
void* hdr)
81 ptrIEEE802_11_HDR h = calloc(1,
sizeof * h);
84 h->sendInterfaceId = in;
86 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(d, in);
88 packet->pstruMacData->dOverhead = getMacOverhead(phy, packet->pstruNetworkData->dPacketSize);
90 packet->pstruMacData->dPayload = packet->pstruNetworkData->dPacketSize;
91 packet->pstruMacData->dPacketSize = packet->pstruMacData->dPayload \
92 + packet->pstruMacData->dOverhead;
93 packet->pstruMacData->dEndTime = pstruEventDetails->dEventTime;
95 if (packet->pstruMacData->Packet_MACProtocol)
98 fn_NetSim_Packet_FreeMacProtocolData(packet);
100 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_IEEE802_11;
101 packet->pstruMacData->Packet_MACProtocol = h;
104void* ieee802_11_get_hdr(NetSim_PACKET* packet, UINT* type)
106 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
107 *type = hdr->hdrType;
111#pragma region FREE_HDR
112static void free_mpdu_header(PIEEE802_11_MAC_HEADER macHdr)
117static void free_ack_header(PIEEE802_11_ACK ack)
122static void free_blockack_header(PIEEE802_11_BLOCKACK back)
127static void free_rts_header(PIEEE802_11_RTS rts)
132static void free_cts_header(PIEEE802_11_CTS cts)
137void ieee802_11_free_hdr(NetSim_PACKET* packet)
139 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
142 switch (hdr->hdrType)
145 free_rts_header(hdr->hdr);
148 free_ack_header(hdr->hdr);
151 free_blockack_header(hdr->hdr);
154 free_cts_header(hdr->hdr);
157 free_mpdu_header(hdr->hdr);
162 packet->pstruMacData->Packet_MACProtocol = NULL;
166#pragma region COPY_HDR
167static PIEEE802_11_RTS copy_rts_header(PIEEE802_11_RTS rts)
169 PIEEE802_11_RTS r = calloc(1,
sizeof * r);
170 memcpy(r, rts,
sizeof * r);
174static PIEEE802_11_CTS copy_cts_header(PIEEE802_11_CTS cts)
176 PIEEE802_11_CTS c = calloc(1,
sizeof * c);
177 memcpy(c, cts,
sizeof * c);
181static PIEEE802_11_ACK copy_ack_header(PIEEE802_11_ACK ack)
183 PIEEE802_11_ACK a = calloc(1,
sizeof * a);
184 memcpy(a, ack,
sizeof * a);
188static PIEEE802_11_BLOCKACK copy_blockack_header(PIEEE802_11_BLOCKACK back)
190 PIEEE802_11_BLOCKACK b = calloc(1,
sizeof * b);
191 memcpy(b, back,
sizeof * b);
195static PIEEE802_11_MAC_HEADER copy_mac_header(PIEEE802_11_MAC_HEADER hdr)
197 PIEEE802_11_MAC_HEADER m = calloc(1,
sizeof * m);
198 memcpy(m, hdr,
sizeof * m);
202void ieee802_11_hdr_copy(NetSim_PACKET* dest, NetSim_PACKET* src)
204 ptrIEEE802_11_HDR shdr = src->pstruMacData->Packet_MACProtocol;
207 ptrIEEE802_11_HDR dhdr = calloc(1,
sizeof * dhdr);
208 memcpy(dhdr, shdr,
sizeof * dhdr);
209 dest->pstruMacData->Packet_MACProtocol = dhdr;
211 switch (shdr->hdrType)
214 dhdr->hdr = copy_rts_header(shdr->hdr);
217 dhdr->hdr = copy_ack_header(shdr->hdr);
220 dhdr->hdr = copy_blockack_header(shdr->hdr);
223 dhdr->hdr = copy_cts_header(shdr->hdr);
226 dhdr->hdr = copy_mac_header(shdr->hdr);
232void fn_NetSim_IEEE802_11_Add_MAC_Header(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId, NetSim_PACKET *pstruPacket,
unsigned int seqNo)
234 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(nDeviceId,nInterfaceId);
235 PIEEE802_11_MAC_VAR mac = IEEE802_11_MAC(nDeviceId,nInterfaceId);
239 PIEEE802_11_MAC_HEADER hdr;
240 hdr = (PIEEE802_11_MAC_HEADER)calloc(1,
sizeof *hdr);
242 hdr->FrameControl.ProtocolVerSion = 0;
243 hdr->FrameControl.Type = DATA;
244 hdr->FrameControl.SubType = QoS_Data;
246 if(mac->BSSType==INFRASTRUCTURE)
248 if(!MAC_COMPARE(mac->BSSId,DEVICE_HWADDRESS(nDeviceId,nInterfaceId)))
250 hdr->FrameControl.ToDS = 0;
251 hdr->FrameControl.FromDS = 1;
252 hdr->Address1=pstruPacket->pstruMacData->szDestMac;
253 hdr->Address2=mac->BSSId;
254 hdr->Address3=pstruPacket->pstruMacData->szSourceMac;
258 hdr->FrameControl.ToDS = 1;
259 hdr->FrameControl.FromDS = 0;
260 hdr->Address1=mac->BSSId;
261 hdr->Address2=pstruPacket->pstruMacData->szSourceMac;
262 hdr->Address3=pstruPacket->pstruMacData->szDestMac;
265 else if(mac->BSSType==MESH)
267 hdr->FrameControl.ToDS = 1;
268 hdr->FrameControl.FromDS = 1;
269 hdr->Address1=pstruPacket->pstruMacData->szDestMac;
270 hdr->Address2=pstruPacket->pstruMacData->szSourceMac;
271 hdr->Address3= pstruPacket->pstruMacData->szDestMac;
272 hdr->Address4= pstruPacket->pstruMacData->szSourceMac;
276 fnNetSimError(
"%d BSS Type is not implemented for IEEE802.11 protocol",mac->BSSType);
279 if(pstruPacket->pstruNextPacket)
280 hdr->FrameControl.MoreFragment = 1;
282 hdr->FrameControl.MoreFragment = 0;
285 hdr->FrameControl.Retry = 1;
287 hdr->FrameControl.Retry = 0;
289 hdr->FrameControl.PowerManagement = 0;
291 hdr->FrameControl.MoreData = 0;
293 hdr->FrameControl.ProtectedFrame = 0;
295 hdr->FrameControl.Order = 0;
297 hdr->snDurationID = 0;
299 hdr->SequenceControl.SequenceNumber = seqNo;
300 hdr->SequenceControl.FragmentNumber = 0;
302 memset(&hdr->QOSControl,0,
sizeof(hdr->QOSControl));
306 ieee802_11_set_hdr(nDeviceId, nInterfaceId, pstruPacket, WLAN_DATA, hdr);
309NetSim_PACKET* fn_NetSim_IEEE802_11_CreateAckPacket(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId,NetSim_PACKET* data,
double time)
311 ptrIEEE802_11_HDR dhdr = data->pstruMacData->Packet_MACProtocol;
312 PIEEE802_11_MAC_HEADER mhdr = dhdr->hdr;
314 NetSim_PACKET* packet;
316 PIEEE802_11_MAC_VAR mac=IEEE802_11_MAC(nDeviceId,nInterfaceId);
319 packet = fn_NetSim_Packet_CreatePacket(MAC_LAYER);
320 packet->nPacketType = PacketType_Control;
321 packet->nPacketPriority = Priority_High;
322 packet->nControlDataType = WLAN_ACK;
323 packet->nReceiverId = data->nTransmitterId;
324 packet->nTransmitterId=nDeviceId;
325 packet->nSourceId=nDeviceId;
326 add_dest_to_packet(packet, data->nTransmitterId);
328 ack = calloc(1,
sizeof* ack);
330 ack->FrameControl.Type = CONTROL;
331 ack->FrameControl.SubType = ACK;
332 ack->RA = mhdr->Address2;
337 if(MAC_COMPARE(DEVICE_HWADDRESS(nDeviceId,nInterfaceId),mac->BSSId))
339 ack->FrameControl.FromDS = 0;
340 ack->FrameControl.ToDS = 1;
344 ack->FrameControl.FromDS = 1;
345 ack->FrameControl.ToDS = 0;
350 ack->FrameControl.FromDS = 0;
351 ack->FrameControl.ToDS = 0;
357 ptrIEEE802_11_HDR hdr = calloc(1,
sizeof * hdr);
359 hdr->hdrType = WLAN_ACK;
360 hdr->sendInterfaceId = nInterfaceId;
361 hdr->recvInterfaceId = dhdr->sendInterfaceId;
363 packet->pstruMacData->Packet_MACProtocol = hdr;
364 packet->pstruMacData->dArrivalTime = time;
365 packet->pstruMacData->dStartTime = time;
366 packet->pstruMacData->dEndTime = time;
367 packet->pstruMacData->dOverhead = ACK_SIZE;
368 packet->pstruMacData->dPacketSize = packet->pstruMacData->dOverhead;
369 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_IEEE802_11;
374NetSim_PACKET* fn_NetSim_IEEE802_11_CreateBlockAckPacket(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId,NetSim_PACKET* data,
double time)
376 ptrIEEE802_11_HDR dhdr = data->pstruMacData->Packet_MACProtocol;
377 PIEEE802_11_MAC_HEADER mhdr = dhdr->hdr;
379 NetSim_PACKET* packet;
380 PIEEE802_11_BLOCKACK ack;
381 PIEEE802_11_MAC_VAR mac=IEEE802_11_MAC(nDeviceId,nInterfaceId);
384 packet = fn_NetSim_Packet_CreatePacket(MAC_LAYER);
385 packet->nPacketType = PacketType_Control;
386 packet->nPacketPriority = Priority_High;
387 packet->nControlDataType = WLAN_BlockACK;
388 packet->nReceiverId = data->nTransmitterId;
389 packet->nTransmitterId=nDeviceId;
390 packet->nSourceId=nDeviceId;
391 add_dest_to_packet(packet, data->nTransmitterId);
393 ack = (PIEEE802_11_BLOCKACK)calloc(1,
sizeof* ack);
395 ack->FrameControl.Type = CONTROL;
396 ack->FrameControl.SubType = BlockAck;
397 ack->RA = mhdr->Address2;
398 ack->TA = MAC_COPY(DEVICE_HWADDRESS(nDeviceId,nInterfaceId));
400 ack->BARControl.compressedBitmap=1;
401 ack->BAStartingSequenceControl.StartingSequenceNumber=get_fragment_number(data);
406 if(MAC_COMPARE(DEVICE_HWADDRESS(nDeviceId,nInterfaceId),mac->BSSId))
408 ack->FrameControl.FromDS = 0;
409 ack->FrameControl.ToDS = 1;
413 ack->FrameControl.FromDS = 1;
414 ack->FrameControl.ToDS = 0;
419 ack->FrameControl.FromDS = 0;
420 ack->FrameControl.ToDS = 0;
426 ptrIEEE802_11_HDR hdr = calloc(1,
sizeof * hdr);
428 hdr->hdrType = WLAN_BlockACK;
429 hdr->sendInterfaceId = nInterfaceId;
430 hdr->recvInterfaceId = dhdr->sendInterfaceId;
432 packet->pstruMacData->Packet_MACProtocol = hdr;
433 packet->pstruMacData->dArrivalTime = time;
434 packet->pstruMacData->dStartTime = time;
435 packet->pstruMacData->dEndTime = time;
436 packet->pstruMacData->dOverhead = get_block_ack_size(nDeviceId,nInterfaceId);;
437 packet->pstruMacData->dPacketSize = packet->pstruMacData->dOverhead;
438 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_IEEE802_11;
443bool isIEEE802_11_CtrlPacket(NetSim_PACKET* packet)
446 return (packet->nControlDataType / 100 == MAC_PROTOCOL_IEEE802_11);
451void fn_NetSim_Process_CtrlPacket()
453 NetSim_PACKET* packet = pstruEventDetails->pPacket;
454 switch(packet->nControlDataType)
457 fn_NetSim_IEEE802_11_CSMACA_ProcessAck();
460 fn_NetSim_IEEE802_11_RTS_CTS_ProcessRTS();
463 fn_NetSim_IEEE802_11_RTS_CTS_ProcessCTS();
466 fn_NetSim_IEEE802_11_CSMACA_ProcessBlockAck();
469 fnNetSimError(
"Unknown ctrl packet %d is %s\n",packet->nControlDataType,__FUNCTION__);
474NetSim_PACKET* fn_NetSim_IEEE802_11_CreateRTSPacket(NetSim_PACKET* data,
double duration)
476 NETSIM_ID d = pstruEventDetails->nDeviceId;
477 NETSIM_ID in = pstruEventDetails->nInterfaceId;
479 PIEEE802_11_MAC_VAR mac=IEEE802_11_CURR_MAC;
480 NetSim_PACKET* packet=fn_NetSim_Packet_CreatePacket(MAC_LAYER);
481 PIEEE802_11_RTS rts=(PIEEE802_11_RTS)calloc(1,
sizeof* rts);
482 NETSIM_ID linkid = DEVICE_PHYLAYER(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->nLinkId;
484 packet->dEventTime=pstruEventDetails->dEventTime;
485 packet->nControlDataType=WLAN_RTS;
486 add_dest_to_packet(packet, data->nReceiverId);
487 packet->nPacketType=PacketType_Control;
488 packet->nReceiverId=data->nReceiverId;
489 packet->nSourceId=data->nTransmitterId;
490 packet->nTransmitterId=data->nTransmitterId;
491 packet->pstruMacData->dArrivalTime=pstruEventDetails->dEventTime;
492 packet->pstruMacData->dEndTime=pstruEventDetails->dEventTime;
493 packet->pstruMacData->dOverhead=RTS_SIZE;
494 packet->pstruMacData->dPacketSize=RTS_SIZE;
495 packet->pstruMacData->dStartTime=pstruEventDetails->dEventTime;
496 packet->pstruMacData->nMACProtocol=MAC_PROTOCOL_IEEE802_11;
497 packet->pstruMacData->szDestMac=MAC_COPY(data->pstruMacData->szNextHopMac);
498 packet->pstruMacData->szNextHopMac=MAC_COPY(data->pstruMacData->szNextHopMac);
499 packet->pstruMacData->szSourceMac=MAC_COPY(data->pstruMacData->szSourceMac);
501 ptrIEEE802_11_HDR hdr = calloc(1,
sizeof * hdr);
503 hdr->hdrType = WLAN_RTS;
504 hdr->sendInterfaceId = in;
505 hdr->recvInterfaceId = fn_NetSim_Stack_GetConnectedInterface(d, in, data->nReceiverId);
506 packet->pstruMacData->Packet_MACProtocol=hdr;
508 rts->FrameControl.Type=CONTROL;
509 rts->FrameControl.SubType=RTS;
510 rts->Duration = (UINT16)duration;
511 rts->TA=MAC_COPY(DEVICE_HWADDRESS(packet->nTransmitterId,
512 fn_NetSim_Stack_GetWirelessInterface(linkid,packet->nTransmitterId)));
514 rts->RA=MAC_COPY(DEVICE_HWADDRESS(packet->nReceiverId,
515 fn_NetSim_Stack_GetWirelessInterface(linkid,packet->nReceiverId)));
520 if(MAC_COMPARE(DEVICE_HWADDRESS(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId),mac->BSSId))
522 rts->FrameControl.FromDS = 0;
523 rts->FrameControl.ToDS = 1;
527 rts->FrameControl.FromDS = 1;
528 rts->FrameControl.ToDS = 0;
533 rts->FrameControl.FromDS = 0;
534 rts->FrameControl.ToDS = 0;
543NetSim_PACKET* fn_NetSim_IEEE802_11_CreateCTSPacket(NetSim_PACKET* data)
545 NETSIM_ID d = pstruEventDetails->nDeviceId;
546 NETSIM_ID in = pstruEventDetails->nInterfaceId;
549 ptrIEEE802_11_HDR dhdr = data->pstruMacData->Packet_MACProtocol;
551 PIEEE802_11_MAC_VAR mac=IEEE802_11_CURR_MAC;
552 NetSim_PACKET* packet=fn_NetSim_Packet_CreatePacket(MAC_LAYER);
553 PIEEE802_11_CTS cts=(PIEEE802_11_CTS)calloc(1,
sizeof* cts);
554 PIEEE802_11_RTS rts = dhdr->hdr;
556 packet->dEventTime=pstruEventDetails->dEventTime;
557 packet->nControlDataType=WLAN_CTS;
558 add_dest_to_packet(packet, data->nTransmitterId);
559 packet->nPacketType=PacketType_Control;
560 packet->nReceiverId=data->nTransmitterId;
561 packet->nSourceId=data->nReceiverId;
562 packet->nTransmitterId=data->nReceiverId;
563 packet->pstruMacData->dArrivalTime=pstruEventDetails->dEventTime;
564 packet->pstruMacData->dEndTime=pstruEventDetails->dEventTime;
565 packet->pstruMacData->dOverhead=CTS_SIZE;
566 packet->pstruMacData->dPacketSize=CTS_SIZE;
567 packet->pstruMacData->dStartTime=pstruEventDetails->dEventTime;
568 packet->pstruMacData->nMACProtocol=MAC_PROTOCOL_IEEE802_11;
569 packet->pstruMacData->szDestMac=MAC_COPY(data->pstruMacData->szSourceMac);
570 packet->pstruMacData->szNextHopMac=MAC_COPY(data->pstruMacData->szSourceMac);
571 packet->pstruMacData->szSourceMac=MAC_COPY(data->pstruMacData->szDestMac);
573 ptrIEEE802_11_HDR hdr = calloc(1,
sizeof * hdr);
575 hdr->hdrType = WLAN_CTS;
576 hdr->sendInterfaceId = in;
577 hdr->recvInterfaceId = dhdr->sendInterfaceId;
578 packet->pstruMacData->Packet_MACProtocol = hdr;
580 cts->FrameControl.Type=CONTROL;
581 cts->FrameControl.SubType=CTS;
582 cts->Duration = (UINT16)calculate_CTS_duration(pstruEventDetails->nDeviceId,
583 pstruEventDetails->nInterfaceId,
586 cts->RA=MAC_COPY(rts->TA);
591 if(MAC_COMPARE(DEVICE_HWADDRESS(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId),mac->BSSId))
593 rts->FrameControl.FromDS = 1;
594 rts->FrameControl.ToDS = 0;
598 rts->FrameControl.FromDS = 0;
599 rts->FrameControl.ToDS = 1;
604 rts->FrameControl.FromDS = 0;
605 rts->FrameControl.ToDS = 0;
614void set_blockack_bitmap(NetSim_PACKET* ackPacket,NetSim_PACKET* packet)
616 ptrIEEE802_11_HDR hdr = ackPacket->pstruMacData->Packet_MACProtocol;
617 PIEEE802_11_BLOCKACK back = hdr->hdr;
618 UINT i=get_fragment_number(packet);
619 SET_BIT_64(back->BitMap,i-1);
622bool is_more_fragment_coming(NetSim_PACKET* packet)
624 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
625 PIEEE802_11_MAC_HEADER mhdr = hdr->hdr;
626 return (
bool)mhdr->FrameControl.MoreFragment;
629bool is_first_packet(NetSim_PACKET* packet)
631 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
632 PIEEE802_11_MAC_HEADER mhdr = hdr->hdr;
633 return mhdr->SequenceControl.SequenceNumber==1;
636static UINT get_fragment_number(NetSim_PACKET* packet)
638 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
639 PIEEE802_11_MAC_HEADER mhdr = hdr->hdr;
640 return mhdr->SequenceControl.SequenceNumber;
643NETSIM_ID get_send_interface_id(NetSim_PACKET* packet)
645 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
647 return hdr->sendInterfaceId;
652NETSIM_ID get_recv_interface_id(NetSim_PACKET* packet)
654 ptrIEEE802_11_HDR hdr = packet->pstruMacData->Packet_MACProtocol;
656 return hdr->recvInterfaceId;