25#pragma region HEADER_FILES
28#include "LTENR_NetworkSlicing.h"
31#pragma region MAC_INIT
32void fn_NetSim_LTENR_MAC_Init()
37void fn_NetSim_LTENR_UEMAC_Init(NETSIM_ID ueId, NETSIM_ID ueIf)
41static LTENR_GnbSchedulingType fn_NetSim_LTENR_SchedulingType(
char* var) {
42 if (!_stricmp(var,
"ROUND_ROBIN"))
43 return LTENR_MAC_SCHEDULING_ROUNDROBIN;
44 else if (!_stricmp(var,
"PROPORTIONAL_FAIR"))
45 return LTENR_MAC_SCHEDULING_PROPORTIONALFAIR;
46 else if (!_stricmp(var,
"MAX_THROUGHPUT"))
47 return LTENR_MAC_SCHEDULING_MAXTHROUGHTPUT;
48 else if (!_stricmp(var,
"FAIR_SCHEDULING"))
49 return LTENR_MAC_SCHEDULING_FAIR_SCHEDULING;
50 else if (!_stricmp(var,
"PFS_WITH_RATE_GUARANTEE"))
51 return LTENR_MAC_SCHEDULING_PF_WITH_RG;
53 fnNetSimError(
"Unknown Scheduling Type");
54 return LTENR_MAC_SCHEDULING_ROUNDROBIN;
58void fn_NetSim_LTENR_GNBMAC_Init(NETSIM_ID gnbId, NETSIM_ID gnbIf)
60 ptrLTENR_GNBMAC mac = calloc(1,
sizeof * mac);
63 LTENR_GNBMAC_SET(gnbId, gnbIf, mac);
65 if (fn_NetSim_LTENR_IS_S1_INTERFACE_EXISTS(gnbId)) {
66 LTENR_GNB_SETEPC(gnbId, gnbIf, &mac->epcId, &mac->epcIf);
71#pragma region MAC_TEMP_FUNCTION
75 NetSim_PACKET* packet = pstruEventDetails->pPacket;
76 NETSIM_ID d = pstruEventDetails->nDeviceId;
77 NETSIM_ID in = pstruEventDetails->nInterfaceId;
78 NETSIM_ID rin = LTENR_FIND_ASSOCIATEINTERFACE(d, in, packet->nReceiverId);
80 if (LTENR_IS_UPLANE_MSG(packet))
82 if (isGNB(d, in)) fn_NetSim_LTENR_HARQ_StoreDLPacket();
83 else fn_NetSim_LTENR_HARQ_StoreULPacket();
87 pstruEventDetails->nEventType = PHYSICAL_OUT_EVENT;
88 fnpAddEvent(pstruEventDetails);
94 NETSIM_ID d = pstruEventDetails->nDeviceId;
95 NETSIM_ID in = pstruEventDetails->nInterfaceId;
97 NetSim_PACKET* packet = pstruEventDetails->pPacket;
99 NetSim_EVENTDETAILS pevent;
100 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
104 memcpy(pstruEventDetails, &pevent,
sizeof * pstruEventDetails);
105 pstruEventDetails->pPacket = packet;
106 packet = packet->pstruNextPacket;
107 pstruEventDetails->pPacket->pstruNextPacket = NULL;
108 remote = pstruEventDetails->pPacket->nTransmitterId;
109 NETSIM_ID rin = LTENR_FIND_ASSOCIATEINTERFACE(d, in, remote);
110 pstruEventDetails->pPacket->pstruPhyData->dStartTime = ldEventTime;
111 pstruEventDetails->pPacket->pstruPhyData->dArrivalTime = ldEventTime;
116 pstruEventDetails->pPacket->nPacketStatus = PacketStatus_Dropped;
117 pstruEventDetails->pPacket->pstruPhyData->dEndTime = ldEventTime;
118 fn_NetSim_WritePacketTrace(pstruEventDetails->pPacket);
119 if((isLTENRControlPacket(pstruEventDetails->pPacket)))
122 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
126 pstruEventDetails->pPacket->pstruPhyData->dEndTime = ldEventTime;
127 pstruEventDetails->pPacket->nPacketStatus = PacketStatus_NoError;
128 fn_NetSim_WritePacketTrace(pstruEventDetails->pPacket);
135#pragma region MAC_SCHEDULERINTERFACE
136ptrLTENR_UESCHEDULERINFO LTENR_MACScheduler_FindInfoForUE(ptrLTENR_SCHEDULERINFO si,
137 NETSIM_ID d, NETSIM_ID in,
140 ptrLTENR_UESCHEDULERINFO info = isUplink ? si->uplinkInfo : si->downlinkInfo;
143 if (info->ueId == d && info->ueIf == in)
150static void LTENR_MACScheduler_RemoveInfoForUE(ptrLTENR_SCHEDULERINFO si,
151 NETSIM_ID d, NETSIM_ID in,
154 ptrLTENR_UESCHEDULERINFO info = isUplink ? si->uplinkInfo : si->downlinkInfo;
155 ptrLTENR_UESCHEDULERINFO p = NULL;
158 if (info->ueId == d && info->ueIf == in)
163 si->uplinkInfo = info->next;
165 si->downlinkInfo = info->next;
172 p->next = info->next;
182static ptrLTENR_UESCHEDULERINFO LTENR_MACScheduler_InitInfoForUE(ptrLTENR_SCHEDULERINFO si,
183 NETSIM_ID d, NETSIM_ID in,
186 ptrLTENR_UESCHEDULERINFO info = calloc(1,
sizeof * info);
189 ptrLTENR_UESCHEDULERINFO l = isUplink ? si->uplinkInfo : si->downlinkInfo;
198 if (isUplink) si->uplinkInfo = info;
199 else si->downlinkInfo = info;
204static void LTENR_MACScheduler_UpdateInfoForUE(ptrLTENR_GNBMAC mac, ptrLTENR_GNBPHY phy,
205 ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo,
206 ptrLTENR_UESCHEDULERINFO info,
bool isUplink,
int CA_ID)
208 ptrLTENR_UEPHY uePhy = LTENR_UEPHY_GET(assocInfo->ueId, assocInfo->ueIf);
209 UINT layerCount = LTENR_PHY_GET_LAYER_COUNT(uePhy, isUplink);
211 UINT64 bitsPerPRB = 0,TBS = 0;
213 if (fn_NetSim_LTENR_HARQ_GetNDIFlag(assocInfo, isUplink, CA_ID) ==
false)
216 info->PRBReqdForHARQRetransmission = fn_NetSim_LTENR_HARQ_GetPRBReqdForRetx(assocInfo, isUplink, CA_ID);
217 info->bitsPerPRB = 0;
222 info->PRBReqdForHARQRetransmission = 0;
224 for (UINT i = 0; i < layerCount; i++)
226 ptrLTENR_AMCINFO amc = isUplink ? assocInfo->uplinkAMCInfo[CA_ID][i] : assocInfo->downlinkAMCInfo[CA_ID][i];
227 if (amc->cqiTable.CQIIndex != 0) {
228 TBS = LTENR_calculateTBSSize(phy, 1, amc->mcsTable, CA_ID);
230 info->bitsPerPRBLayer[i] = TBS;
234 ptrLTENR_SCHEDULERINFO si = mac->schedulerInfo[CA_ID];
236 if (fn_NetSim_LTENR_RRC_isActive(mac->gnbId, mac->gnbIf, assocInfo->ueId, assocInfo->ueIf)) {
237 info->bitsPerPRB = bitsPerPRB;
239 si->isUERRCSetUpCompleted =
true;
241 else info->bitsPerPRB = 0;
244 info->bufferSize = fn_NetSim_LTENR_RLC_BufferStatusNotificaton(assocInfo->ueId, assocInfo->ueIf,
245 mac->gnbId, mac->gnbIf,
246 LTENR_LOGICALCHANNEL_DTCH);
248 info->bufferSize = fn_NetSim_LTENR_RLC_BufferStatusNotificaton(mac->gnbId, mac->gnbIf,
249 assocInfo->ueId, assocInfo->ueIf,
250 LTENR_LOGICALCHANNEL_DTCH);
253static void LTENR_MAC_AddSchedulerStausForUE(ptrLTENR_GNBMAC mac, ptrLTENR_GNBPHY phy,
254 ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo, ptrLTENR_SCHEDULERINFO si,
int CA_ID)
256 ptrLTENR_UESCHEDULERINFO uinfo = LTENR_MACScheduler_FindInfoForUE(si, assocInfo->ueId, assocInfo->ueIf,
true);
257 ptrLTENR_UESCHEDULERINFO dinfo = LTENR_MACScheduler_FindInfoForUE(si, assocInfo->ueId, assocInfo->ueIf,
false);
259 uinfo = LTENR_MACScheduler_InitInfoForUE(si, assocInfo->ueId, assocInfo->ueIf,
true);
261 dinfo = LTENR_MACScheduler_InitInfoForUE(si, assocInfo->ueId, assocInfo->ueIf,
false);
263 if(si->slotType == SLOT_UPLINK)
265 LTENR_MACScheduler_UpdateInfoForUE(mac, phy, assocInfo, uinfo,
true, CA_ID);
266 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(uinfo->ueId,uinfo->ueIf);
267 uinfo->rateGuarantee = pd->ULrateGuarantee;
268 if (si->schedulingType == LTENR_MAC_SCHEDULING_PF_WITH_RG &&
269 nws->rsrcSharingTechnique == LTENR_RESOURCE_SHARING_DYNAMIC)
271 UINT ueSliceId = nws->ueSliceId[uinfo->ueId];
272 uinfo->slice_lower_bound = (nws->Info[ueSliceId].uplinkBandwidth.minResourceShare)/100;
273 uinfo->slice_upper_bound = (nws->Info[ueSliceId].uplinkBandwidth.maxResourceShare)/100;
277 uinfo->slice_lower_bound = MIN_RESOURCE_SHARE;
278 uinfo->slice_upper_bound = MAX_RESOURCE_SHARE;
281 else if(si->slotType == SLOT_DOWNLINK)
283 LTENR_MACScheduler_UpdateInfoForUE(mac, phy, assocInfo, dinfo,
false, CA_ID);
284 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(dinfo->ueId, dinfo->ueIf);
285 dinfo->rateGuarantee = pd->DLrateGuarantee;
286 if (si->schedulingType == LTENR_MAC_SCHEDULING_PF_WITH_RG &&
287 nws->rsrcSharingTechnique == LTENR_RESOURCE_SHARING_DYNAMIC)
289 UINT ueSliceId = nws->ueSliceId[dinfo->ueId];
290 dinfo->slice_lower_bound = (nws->Info[ueSliceId].downlinkBandwidth.minResourceShare)/100;
291 dinfo->slice_upper_bound = (nws->Info[ueSliceId].downlinkBandwidth.maxResourceShare)/100;
295 dinfo->slice_lower_bound = MIN_RESOURCE_SHARE;
296 dinfo->slice_upper_bound = MAX_RESOURCE_SHARE;
299 if (si->slotType == SLOT_DOWNLINK) si->TotalPRBReqdForHARQRetransmission += dinfo->PRBReqdForHARQRetransmission;
300 else si->TotalPRBReqdForHARQRetransmission += uinfo->PRBReqdForHARQRetransmission;
303static void LTENR_MAC_InitSchedulerStatus(ptrLTENR_GNBMAC mac)
305 ptrLTENR_GNBPHY phy = LTENR_GNBPHY_GET(mac->gnbId, mac->gnbIf);
306 int CA_ID = phy->currentFrameInfo->Current_CA_ID;
307 ptrLTENR_CA ca = phy->spectrumConfig->CA[CA_ID];
308 ptrLTENR_SPECTRUMCONFIG sc = phy->spectrumConfig;
309 ptrLTENR_SCHEDULERINFO info = NULL;
311 if (mac->schedulerInfo[CA_ID])
313 info = mac->schedulerInfo[CA_ID];
314 info->slotType = phy->currentFrameInfo->slotType;
316 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(mac->gnbId, mac->gnbIf);
317 info->schedulingType = fn_NetSim_LTENR_SchedulingType(pd->schedulingType);
318 info->alpha = pd->EWMA_Learning_Rate;
322 info = calloc(1,
sizeof * info);
323 mac->schedulerInfo[CA_ID] = info;
324 info->gnbId = mac->gnbId;
325 info->gnbIf = mac->gnbIf;
326 info->PRBCount = ca->PRBCount;
327 info->OH_DL = ca->OverheadDL;
328 info->OH_UL = ca->OverheadUL;
329 info->slotType = phy->currentFrameInfo->slotType;
331 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(mac->gnbId, mac->gnbIf);
332 info->schedulingType = fn_NetSim_LTENR_SchedulingType(pd->schedulingType);
335 info->TotalPRBReqdForHARQRetransmission = 0;
337 ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo = phy->associatedUEPhyInfo;
340 if (assocInfo->isAssociated)
341 LTENR_MAC_AddSchedulerStausForUE(mac, phy, assocInfo, info, CA_ID);
344 ptrLTENR_UESCHEDULERINFO uinfo = LTENR_MACScheduler_FindInfoForUE(info, assocInfo->ueId, assocInfo->ueIf,
true);
345 ptrLTENR_UESCHEDULERINFO dinfo = LTENR_MACScheduler_FindInfoForUE(info, assocInfo->ueId, assocInfo->ueIf,
false);
347 LTENR_MACScheduler_RemoveInfoForUE(info, assocInfo->ueId, assocInfo->ueIf,
true);
349 LTENR_MACScheduler_RemoveInfoForUE(info, assocInfo->ueId, assocInfo->ueIf,
false);
351 LTENR_ASSOCIATEDUEPHYINFO_NEXT(assocInfo);
356#pragma region MAC_RLC_INTERFACE
357static void LTENR_MAC_NotifyRLCForTransmission_forControl(NETSIM_ID d, NETSIM_ID in,
358 NETSIM_ID r, NETSIM_ID rin)
360 fn_NetSim_LTENR_RLC_TransmissionStatusNotification(d, in,
363 LTENR_LOGICALCHANNEL_BCCH);
364 fn_NetSim_LTENR_RLC_TransmissionStatusNotification(d, in,
367 LTENR_LOGICALCHANNEL_CCCH);
368 fn_NetSim_LTENR_RLC_TransmissionStatusNotification(d, in,
371 LTENR_LOGICALCHANNEL_DCCH);
372 fn_NetSim_LTENR_RLC_TransmissionStatusNotification(d, in,
375 LTENR_LOGICALCHANNEL_PCCH);
378static void LTENR_MAC_NotifyRLCForTransmission_forDTCH(NETSIM_ID d, NETSIM_ID in,
379 ptrLTENR_UESCHEDULERINFO si,
bool isUplink)
384 fn_NetSim_LTENR_RLC_TransmissionStatusNotification(si->ueId, si->ueIf,
385 d, in, (UINT)(si->allocatedPRBCount*si->bitsPerPRB/8.0),
386 LTENR_LOGICALCHANNEL_DTCH);
388 fn_NetSim_LTENR_RLC_TransmissionStatusNotification(d, in,
390 (UINT)(si->allocatedPRBCount * si->bitsPerPRB / 8.0),
391 LTENR_LOGICALCHANNEL_DTCH);
396void LTENR_MAC_NotifyRLCForTransmission(ptrLTENR_GNBMAC mac)
398 NETSIM_ID gnbId = mac->gnbId;
399 NETSIM_ID gnbIf = mac->gnbIf;
400 ptrLTENR_GNBPHY phy = LTENR_GNBPHY_GET(gnbId, gnbIf);
401 int CA_ID = phy->currentFrameInfo->Current_CA_ID;
402 ptrLTENR_SCHEDULERINFO si = mac->schedulerInfo[CA_ID];
404 LTENR_SLOTTYPE slotType = si->slotType;
406 ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo = phy->associatedUEPhyInfo;
411 if (assocInfo->isAssociated)
413 if (slotType == SLOT_UPLINK || slotType == SLOT_MIXED)
414 LTENR_MAC_NotifyRLCForTransmission_forControl(assocInfo->ueId, assocInfo->ueIf,
417 if (slotType == SLOT_DOWNLINK || slotType == SLOT_MIXED)
418 LTENR_MAC_NotifyRLCForTransmission_forControl(gnbId, gnbIf,
419 assocInfo->ueId, assocInfo->ueIf);
421 LTENR_ASSOCIATEDUEPHYINFO_NEXT(assocInfo);
424 if (slotType == SLOT_DOWNLINK || slotType == SLOT_MIXED)
425 LTENR_MAC_NotifyRLCForTransmission_forControl(gnbId, gnbIf,
428 if (slotType == SLOT_UPLINK || slotType == SLOT_MIXED)
429 LTENR_MAC_NotifyRLCForTransmission_forDTCH(gnbId, gnbIf, si->uplinkInfo,
true);
431 if (slotType == SLOT_DOWNLINK || slotType == SLOT_MIXED)
432 LTENR_MAC_NotifyRLCForTransmission_forDTCH(gnbId, gnbIf, si->downlinkInfo,
false);
436#pragma region MAC_PHY_INTERFACE
437void LTENR_NotifyMACForStartingSlot()
439 NETSIM_ID gnbId = pstruEventDetails->nDeviceId;
440 NETSIM_ID gnbIf = pstruEventDetails->nInterfaceId;
441 ptrLTENR_GNBMAC mac = LTENR_GNBMAC_GET(gnbId, gnbIf);
442 ptrLTENR_GNBPHY phy = LTENR_GNBPHY_GET(gnbId, gnbIf);
443 int CA_ID = phy->currentFrameInfo->Current_CA_ID;
445 fn_NetSim_LTENR_HARQ_HandleSlotStart(gnbId, gnbIf, CA_ID);
447 LTENR_MAC_InitSchedulerStatus(mac);
449 LTENR_PRB_Scheduler(mac->schedulerInfo[CA_ID]);
451 fn_NetSim_LTENR_HARQ_AllocateCBG(gnbId, gnbIf, CA_ID);
456 LTENR_MAC_NotifyRLCForTransmission(mac);
458 fn_NetSim_LTENR_HARQ_Transmit(gnbId, gnbIf, CA_ID);