NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
Aloha_Mac.c
1/************************************************************************************
2* Copyright (C) 2023 *
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* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14#include "main.h"
15#include "Aloha.h"
16#include "Aloha_enum.h"
17
18static void aloha_mac_reset(PALOHA_MAC_VAR mac)
19{
20 mac->backoffCounter = 0;
21 if (mac->currPacket)
22 fn_NetSim_Packet_FreePacket(mac->currPacket);
23 mac->currPacket = NULL;
24 mac->retryCount = 0;
25 mac->waitTime = 0;
26}
27
28static void move_time_to_slot(PALOHA_MAC_VAR mac, double* time)
29{
30 if (!mac->isSlotted)
31 return;
32
33 *time = ceil(*time / mac->slotlength)*mac->slotlength;
34}
35
36static void send_to_phy()
37{
38 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
39 PALOHA_PHY_VAR phy = ALOHA_CURR_PHY;
40
41 if (!mac->currPacket)
42 {
43 fnNetSimError("Aloha - %s is called without any packet ready for transmission\n", __FUNCTION__);
44 assert(mac->currPacket);
45 return;
46 }
47
48 NetSim_PACKET* packet = fn_NetSim_Packet_CopyPacket(mac->currPacket);
49
50 double time = pstruEventDetails->dEventTime;
51 move_time_to_slot(mac, &time);
52
53 packet->pstruMacData->dArrivalTime = packet->pstruNetworkData->dEndTime;
54 packet->pstruMacData->dStartTime = time;
55 packet->pstruMacData->dEndTime = time;
56
57 packet->pstruMacData->dPayload = packet->pstruNetworkData->dPacketSize;
58 packet->pstruMacData->dOverhead = ALOHA_MAC_OVERHEAD;
59 packet->pstruMacData->dPacketSize =
60 packet->pstruMacData->dPayload +
61 packet->pstruMacData->dOverhead;
62
63 pstruEventDetails->dEventTime = time;
64 pstruEventDetails->dPacketSize = fnGetPacketSize(packet);
65 if (packet->pstruAppData)
66 {
67 pstruEventDetails->nApplicationId = packet->pstruAppData->nApplicationId;
68 pstruEventDetails->nSegmentId = packet->pstruAppData->nSegmentId;
69 }
70 else
71 {
72 pstruEventDetails->nApplicationId = 0;
73 pstruEventDetails->nSegmentId = 0;
74 }
75 pstruEventDetails->nEventType = PHYSICAL_OUT_EVENT;
76 pstruEventDetails->nPacketId = packet->nPacketId;
77 pstruEventDetails->nProtocolId = MAC_PROTOCOL_ALOHA;
78 pstruEventDetails->nSubEventType = 0;
79 pstruEventDetails->pPacket = packet;
80 pstruEventDetails->szOtherDetails = NULL;
81 fnpAddEvent(pstruEventDetails);
82}
83
84static void update_receiver(NetSim_PACKET* packet)
85{
86 if (packet->nReceiverId)
87 return;
88
89 if (isBroadcastPacket(packet))
90 return;
91
92 packet->nReceiverId = get_first_dest_from_packet(packet);
93}
94
95static void aloha_packet_arrive_from_upper_layer()
96{
97 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
98 if (mac->currPacket)
99 {
100 if (!mac->isMACBuffer)
101 {
102 NetSim_BUFFER* buf = DEVICE_MYACCESSBUFFER();
103 if (fn_NetSim_GetBufferStatus(buf))
104 {
105 NetSim_PACKET* p = fn_NetSim_Packet_GetPacketFromBuffer(buf, 1);
106 if (p)
107 {
108 update_receiver(p);
109 p->nPacketStatus = PacketStatus_Buffer_Dropped;
110 fn_NetSim_WritePacketTrace(p);
111 fn_NetSim_Packet_FreePacket(p);
112 }
113 }
114 }
115 return;
116 }
117
118 static double val = 0;
119 aloha_mac_reset(mac);
120
121 NetSim_BUFFER* buf = DEVICE_MYACCESSBUFFER();
122 if (fn_NetSim_GetBufferStatus(buf))
123 {
124 mac->currPacket = fn_NetSim_Packet_GetPacketFromBuffer(buf, 1);
125 update_receiver(mac->currPacket);
126 double waitTime = val;
127 pstruEventDetails->dEventTime += waitTime;
128 send_to_phy();
129 }
130}
131
132static void aloha_resend_packet()
133{
134 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
135
136 mac->retryCount++;
137 if ((mac->retryCount > mac->retryLimit) ||
138 !mac->currPacket ||
139 isBroadcastPacket(mac->currPacket))
140 {
141 aloha_mac_reset(ALOHA_CURR_MAC);
142 aloha_packet_arrive_from_upper_layer();
143 return;
144 }
145
146 int window = (int)pow(2, mac->retryCount) - 1;
147 int backoffCounter = (int)floor(window * NETSIM_RAND_01());
148 double waitTime = mac->slotlength;
149 waitTime *= backoffCounter;
150 assert(waitTime >= 0.0);
151 pstruEventDetails->dEventTime += waitTime;
152
153 send_to_phy();
154}
155
156int fn_NetSim_Aloha_Handle_MacOut()
157{
158 switch (pstruEventDetails->nSubEventType)
159 {
160 case 0:
161 aloha_packet_arrive_from_upper_layer();
162 break;
163 case ALOHA_PACKET_ERROR:
164 aloha_resend_packet();
165 break;
166 case ALOHA_PACKET_SUCCESS:
167 aloha_mac_reset(ALOHA_CURR_MAC);
168 aloha_packet_arrive_from_upper_layer();
169 break;
170 default:
171 fnNetSimError("Unknow subevent %d for aloha mac.\n",
172 pstruEventDetails->nSubEventType);
173 break;
174 }
175 return 0;
176}