16#include "Aloha_enum.h"
18static void aloha_mac_reset(PALOHA_MAC_VAR mac)
20 mac->backoffCounter = 0;
22 fn_NetSim_Packet_FreePacket(mac->currPacket);
23 mac->currPacket = NULL;
28static void move_time_to_slot(PALOHA_MAC_VAR mac,
double* time)
33 *time = ceil(*time / mac->slotlength)*mac->slotlength;
36static void send_to_phy()
38 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
39 PALOHA_PHY_VAR phy = ALOHA_CURR_PHY;
43 fnNetSimError(
"Aloha - %s is called without any packet ready for transmission\n", __FUNCTION__);
44 assert(mac->currPacket);
48 NetSim_PACKET* packet = fn_NetSim_Packet_CopyPacket(mac->currPacket);
50 double time = pstruEventDetails->dEventTime;
51 move_time_to_slot(mac, &time);
53 packet->pstruMacData->dArrivalTime = packet->pstruNetworkData->dEndTime;
54 packet->pstruMacData->dStartTime = time;
55 packet->pstruMacData->dEndTime = time;
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;
63 pstruEventDetails->dEventTime = time;
64 pstruEventDetails->dPacketSize = fnGetPacketSize(packet);
65 if (packet->pstruAppData)
67 pstruEventDetails->nApplicationId = packet->pstruAppData->nApplicationId;
68 pstruEventDetails->nSegmentId = packet->pstruAppData->nSegmentId;
72 pstruEventDetails->nApplicationId = 0;
73 pstruEventDetails->nSegmentId = 0;
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);
84static void update_receiver(NetSim_PACKET* packet)
86 if (packet->nReceiverId)
89 if (isBroadcastPacket(packet))
92 packet->nReceiverId = get_first_dest_from_packet(packet);
95static void aloha_packet_arrive_from_upper_layer()
97 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
100 if (!mac->isMACBuffer)
102 NetSim_BUFFER* buf = DEVICE_MYACCESSBUFFER();
103 if (fn_NetSim_GetBufferStatus(buf))
105 NetSim_PACKET* p = fn_NetSim_Packet_GetPacketFromBuffer(buf, 1);
109 p->nPacketStatus = PacketStatus_Buffer_Dropped;
110 fn_NetSim_WritePacketTrace(p);
111 fn_NetSim_Packet_FreePacket(p);
118 static double val = 0;
119 aloha_mac_reset(mac);
121 NetSim_BUFFER* buf = DEVICE_MYACCESSBUFFER();
122 if (fn_NetSim_GetBufferStatus(buf))
124 mac->currPacket = fn_NetSim_Packet_GetPacketFromBuffer(buf, 1);
125 update_receiver(mac->currPacket);
126 double waitTime = val;
127 pstruEventDetails->dEventTime += waitTime;
132static void aloha_resend_packet()
134 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
137 if ((mac->retryCount > mac->retryLimit) ||
139 isBroadcastPacket(mac->currPacket))
141 aloha_mac_reset(ALOHA_CURR_MAC);
142 aloha_packet_arrive_from_upper_layer();
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;
156int fn_NetSim_Aloha_Handle_MacOut()
158 switch (pstruEventDetails->nSubEventType)
161 aloha_packet_arrive_from_upper_layer();
163 case ALOHA_PACKET_ERROR:
164 aloha_resend_packet();
166 case ALOHA_PACKET_SUCCESS:
167 aloha_mac_reset(ALOHA_CURR_MAC);
168 aloha_packet_arrive_from_upper_layer();
171 fnNetSimError(
"Unknow subevent %d for aloha mac.\n",
172 pstruEventDetails->nSubEventType);