25#pragma region HEADER_FILES
27#include "LTENR_SDAP.h"
29#include "LTENR_Multiplexing.h"
30#include "LTENR_NetworkSlicing.h"
34#pragma region VARIABLE_AND_FUN_DEF
35static bool isLTENRConfigured =
false;
36static bool isLTENRTraceConfigured =
false;
37static bool isCalledOnce =
false;
38static bool isMetricsCalled =
false;
40int fn_NetSim_LTE_NR_Init_F();
41int fn_NetSim_LTE_NR_Configure_F(
void** var);
42int fn_NetSim_LTE_NR_Finish_F();
45#pragma region LTENR_INIT
46_declspec(dllexport)
int fn_NetSim_LTE_NR_Init()
52 fn_NetSim_NTN_InitAssociation();
53 initNTN_UeAssociationLogs();
54 initNTNRadioMeasurementLogs();
57 LTENR_fn_InterferenceInit();
58 fn_NetSim_LTENR_HARQ_Init();
59 LTENR_RadioMeasurements_Init();
60 fn_NetSim_LTE_MAC_PRBLOG();
61 fn_NetSim_LTE_HandoverLOG();
63 LTENR_ConfigureNETWORK_SLICINGConfig();
64 init_PRBUtilization();
67 return fn_NetSim_LTE_NR_Init_F();
71#pragma region LTENR_RUN
72_declspec(dllexport)
int fn_NetSim_LTE_NR_Run()
75 if (pstruEventDetails->nSubEventType)
77 LTENR_SUBEVENT_CALL();
81 switch (pstruEventDetails->nEventType)
83 case APPLICATION_IN_EVENT:
85 NetSim_PACKET* packet = pstruEventDetails->pPacket;
86 switch (packet->nControlDataType)
88 case LTENR_MSG_CORE_INITIAL_UE_MESSAGE:
89 case LTENR_MSG_CORE_CREATE_SESSION_RESPONSE:
90 case LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_RESPONSE:
91 case LTENR_MSG_CORE_REGISTRATION_COMPLETE:
92 case LTENR_MSG_NAS_HANDOVER_PATH_SWITCH:
93 case LTENR_MSG_CORE_MODIFY_BEARER_RESPONSE:
94 fn_NetSim_LTENR_AMF_PACKET_HANDLER();
96 case LTENR_MSG_CORE_CREATE_SESSION_REQUEST:
97 case LTENR_MSG_CORE_PFCP_SESSION_REQUSET:
98 case LTENR_MSG_CORE_PFCP_SESSION_RESPONSE:
99 case LTENR_MSG_CORE_MODIFY_BEARER_REQUEST:
100 fn_NetSim_LTENR_SMF_UPF_PACKET_HANDLER();
102 case LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_REQUEST:
103 case LTENR_MSG_NAS_HANDOVER_PATH_SWITCH_ACK:
104 fn_NetSim_LTENR_GNB_CORE_PACKET_HANDLER();
109 case NETWORK_OUT_EVENT:
111 NETSIM_ID d = pstruEventDetails->nDeviceId;
112 NETSIM_ID in = pstruEventDetails->nInterfaceId;
113 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(d, in);
114 if (data->deviceType == LTENR_DEVICETYPE_EPC) {
119 NetSim_PACKET* packet = pstruEventDetails->pPacket;
120 NETSIM_ID dest = get_first_dest_from_packet(packet);
124 if (data->IFType == nGC_INTERFACE_XN)
126 gNB_N3_Forward_packet_to_MAC(d, in, packet);
127 pstruEventDetails->pPacket = NULL;
132 if (dest == d)
break;
136 if (data->IFType == nGC_INTERFACE_N3 || data->IFType == nGC_INTERFACE_LTE_S1)
138 gNB_N3_Forward_packet_to_MAC(d, in, packet);
139 pstruEventDetails->pPacket = NULL;
145 if (data->isDCEnable && fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(d, in)) {
146 NETSIM_ID splitID = fn_NetSim_LTENR_NSA_Splitting_Alogrithm_For_EPC(dest);
151 packet->nPacketStatus = PacketStatus_Buffer_Dropped;
152 packet->nReceiverId = get_first_dest_from_packet(packet);
153 fn_NetSim_WritePacketTrace(packet);
154 fn_NetSim_Packet_FreePacket(packet);
155 pstruEventDetails->pPacket = NULL;
159 NETSIM_ID splitIF = fn_NetSim_LTENR_CORE_INTERFACE(splitID, nGC_INTERFACE_N3);
160 packet->pstruNetworkData->szNextHopIp = IP_COPY(DEVICE_NWADDRESS(splitID, splitIF));
161 packet->nReceiverId = splitID;
163 gNB_N3_Forward_packet_to_MAC(d, in, packet);
164 pstruEventDetails->pPacket = NULL;
169 case NETWORK_IN_EVENT:
171 NETSIM_ID d = pstruEventDetails->nDeviceId;
172 NETSIM_ID in = pstruEventDetails->nInterfaceId;
173 NetSim_PACKET* packet = pstruEventDetails->pPacket;
175 if (isLTENRControlPacket(packet) ==
false &&
176 !fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(d, in))
178 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(d, in);
179 if (data->IFType == nGC_INTERFACE_XN && isGNB(d,in))
181 ptrLTENR_XN_HDR hdr = packet->pstruNetworkData->Packet_NetworkProtocol;
184 packet->pstruNetworkData->Packet_NetworkProtocol = NULL;
185 packet->pstruMacData->Packet_MACProtocol = hdr->msg;
186 NETSIM_ID RANIF = fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(d);
187 packet->nTransmitterId = d;
188 packet->nReceiverId = hdr->UEID;
189 if (fn_NetSim_isDeviceLTENR(d, in))
190 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_LTE_NR;
192 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_LTE;
193 packet->pstruNetworkData->szGatewayIP = STR_TO_IP4(hdr->gateway);
194 packet->pstruNetworkData->szNextHopIp = IP_COPY(DEVICE_NWADDRESS(hdr->UEID, hdr->UEIF));
195 LTENR_NSA_XN_INTERFACE_TO_RAN(d, RANIF, packet);
200 if (fn_NetSim_LTENR_IS_S1_INTERFACE_EXISTS(d))
202 RANIF = fn_NetSim_LTENR_CORE_INTERFACE(d, nGC_INTERFACE_LTE_S1);
204 fn_NetSim_Stack_GetConnectedDevice(d, RANIF, &r, &rin);
205 packet->pstruNetworkData->szGatewayIP = IP_COPY(DEVICE_NWADDRESS(hdr->UEID, hdr->UEIF));
206 packet->pstruNetworkData->szNextHopIp = IP_COPY(DEVICE_NWADDRESS(r, rin));
207 packet->pstruMacData->nMACProtocol = MAC_PROTOCOL_LTE;
211 RANIF = fn_NetSim_LTENR_CORE_INTERFACE(d, nGC_INTERFACE_N3);
212 if (packet->pstruMacData->Packet_MACProtocol != NULL)
213 fn_NetSim_Packet_FreeMacProtocolData(packet);
214 packet->pstruMacData->nMACProtocol = DEVICE_MACPROTOCOL(d, RANIF);
216 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(d,
217 fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(d));
218 packet->pstruNetworkData->szGatewayIP = IP_COPY(DEVICE_NWADDRESS(d, in));
219 NETSIM_ID r = fn_NetSim_Stack_GetDeviceId_asName(pd->connectedUPFName);
220 NETSIM_ID rin = fn_NetSim_LTENR_CORE_INTERFACE(r, nGC_INTERFACE_N3);
221 packet->pstruNetworkData->szNextHopIp = IP_COPY(DEVICE_NWADDRESS(r, rin));
223 gNB_N3_Forward_packet_to_MAC(d, RANIF, packet);
226 pstruEventDetails->pPacket = NULL;
233 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(d, in);
234 if (data->IFType == nGC_INTERFACE_N3 && isLTENRControlPacket(packet) ==
false)
237 if (fn_NetSim_isDeviceLTENR(d, in))
238 RANIF = fn_NetSim_FIND_LTENR_INTERFACE(d);
240 RANIF = fn_NetSim_FIND_LTE_INTERFACE(d);
241 gNB_N3_Forward_packet_to_RAN(d, in, RANIF, packet);
242 pstruEventDetails->pPacket = NULL;
245 if (data->IFType == nGC_INTERFACE_LTE_S1 && isLTENRControlPacket(packet) ==
false)
247 NETSIM_ID RANIF = fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(d);
248 gNB_N3_Forward_packet_to_RAN(d, in, RANIF, packet);
249 pstruEventDetails->pPacket = NULL;
254 switch (pstruEventDetails->pPacket->nControlDataType)
256 case LTENR_MSG_NAS_HANDOVER_REQUEST:
257 case LTENR_MSG_NAS_HANDOVER_REQUEST_ACK:
258 case LTENR_MSG_NAS_HANDOVER_UE_CONTEXT_RELEASE:
259 case LTENR_MSG_NAS_HANDOVER_UE_CONTEXT_RELEASE_ACK:
261 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(d, in);
262 if (data->IFType == nGC_INTERFACE_LTE_S1) {
263 NETSIM_ID RANIF = fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(d);
264 fn_NetSim_LTENR_LTE_S1_CONTROL_PACKET_TO_RAN(d, RANIF, packet);
267 fn_NetSim_LTENR_Handover_RECV();
269 pstruEventDetails->pPacket = NULL;
272 fn_NetSim_LTENR_EPC_RouteHOPacket();
274 case LTENR_MSG_NAS_HANDOVER_PATH_SWITCH:
275 case LTENR_MSG_NAS_HANDOVER_PATH_SWITCH_ACK:
277 pstruEventDetails->pPacket = NULL;
279 case LTENR_MSG_DC_SEC_CELL_ADDITION_REQUEST:
280 case LTENR_MSG_DC_SEC_CELL_ADDITION_RESPONSE:
282 fn_NetSim_LTENR_NSA_RECV();
283 pstruEventDetails->pPacket = NULL;
286 fn_NetSim_LTENR_EPC_RouteHOPacket();
288 case LTENR_MSG_DC_HO_SEC_CELL_ADDITION_REQUEST:
289 case LTENR_MSG_DC_HO_SEC_CELL_ADDITION_REQUEST_ACK:
290 case LTENR_MSG_DC_HO_SEC_CELL_RELEASE_REQUEST:
291 case LTENR_MSG_DC_HO_SEC_CELL_RELEASE_REQUEST_ACK:
292 case LTENR_MSG_DC_HO_SEC_CELL_UE_CONTEXT_RELEASE:
293 case LTENR_MSG_DC_HO_SEC_CELL_UE_CONTEXT_RELEASE_ACK:
295 fn_NetSim_SN_HANDOVER_PACKET_HANDLER();
296 pstruEventDetails->pPacket = NULL;
299 fn_NetSim_LTENR_EPC_RouteHOPacket();
304 NETSIM_ID RANIF = fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(d);
305 gNB_N3_Forward_packet_to_RAN(d, in, RANIF, packet);
306 pstruEventDetails->pPacket = NULL;
316 NetSim_BUFFER* buffer = DEVICE_ACCESSBUFFER(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId);
317 NetSim_PACKET* packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer, 0);
318 switch (packet->nControlDataType)
320 case LTENR_MSG_NAS_HANDOVER_REQUEST:
321 case LTENR_MSG_NAS_HANDOVER_REQUEST_ACK:
322 case LTENR_MSG_NAS_HANDOVER_PATH_SWITCH_ACK:
323 case LTENR_MSG_NAS_HANDOVER_UE_CONTEXT_RELEASE:
324 case LTENR_MSG_NAS_HANDOVER_UE_CONTEXT_RELEASE_ACK:
325 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer, 1);
326 pstruEventDetails->pPacket = packet;
329 case LTENR_MSG_NAS_HANDOVER_PATH_SWITCH:
330 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer, 1);
335 isMore = LTENR_GET_PACKET_FROM_ACCESS_BUFFER();
345 case PHYSICAL_OUT_EVENT:
346 fn_NetSim_LTENR_HandlePhyOut();
348 case PHYSICAL_IN_EVENT:
350 if (!isLTENRControlPacket(pstruEventDetails->pPacket))
352 fn_NetSim_Metrics_Add(pstruEventDetails->pPacket);
355 pstruEventDetails->nEventType = MAC_IN_EVENT;
356 fnpAddEvent(pstruEventDetails);
360 fnNetSimError(
"LTE-NR, Unknown event type %d.\n",
361 pstruEventDetails->nEventType);
368#pragma region LTENR_TRACE
369_declspec(dllexport)
char* fn_NetSim_LTE_NR_Trace(NETSIM_ID
id)
371 return LTENR_SUBEVNET_NAME(
id);
375#pragma region FREE_PACKET
376_declspec(dllexport)
int fn_NetSim_LTE_NR_FreePacket(NetSim_PACKET* packet)
378 LTENR_MSG_FREE(packet);
383#pragma region COPY_PACKET
384_declspec(dllexport)
int fn_NetSim_LTE_NR_CopyPacket(NetSim_PACKET* destPacket,
const NetSim_PACKET* srcPacket)
386 if (srcPacket->pstruMacData->nMACProtocol == MAC_PROTOCOL_LTE ||
387 srcPacket->pstruMacData->nMACProtocol == MAC_PROTOCOL_LTE_NR)
389 ptrLTENR_MSG smsg = srcPacket->pstruMacData->Packet_MACProtocol;
390 ptrLTENR_MSG dmsg = LTENR_MSG_COPY(srcPacket);
391 destPacket->pstruMacData->Packet_MACProtocol = dmsg;
394 if (srcPacket->pstruAppData) {
395 if (srcPacket->pstruAppData->nApplicationProtocol == MAC_PROTOCOL_LTE_NR) {
396 destPacket->pstruAppData->Packet_AppProtocol = LTENR_MSG_APP_COPY(srcPacket);
404#pragma region LTENR_MATRICS
405_declspec(dllexport)
int fn_NetSim_LTE_NR_Metrics(PMETRICSWRITER file)
407 if (!isMetricsCalled)
409 fn_NetSim_LTENR_Cell_Metrics_F(file);
412 isMetricsCalled =
true;
418#pragma region LTENR_CONFIG
419_declspec(dllexport)
int fn_NetSim_LTE_NR_Configure(
void** var)
421 isLTENRConfigured =
true;
422 return fn_NetSim_LTE_NR_Configure_F(var);
426#pragma region CONFIG_PACKET_TRACE
427_declspec(dllexport)
char* fn_NetSim_LTE_NR_ConfigPacketTrace(
void* xmlNetSimNode)
429 if (isLTENRConfigured)
432 szStatus = fn_NetSim_xmlConfigPacketTraceField(xmlNetSimNode,
"LTENR_PACKET_INFO");
433 if (!_stricmp(szStatus,
"ENABLE"))
435 isLTENRTraceConfigured =
true;
437 return "LTENR_PACKET_INFO,";
447#pragma region LTENR_FINISH
448#include "NetSim_utility.h"
449_declspec(dllexport)
int fn_NetSim_LTE_NR_Finish()
451 netsim_matlab_interface_close();
452 fn_NetSim_LTENR_HARQ_Finish();
453 LTENR_FreeBLERTable();
454 LTENR_RadioMeasurements_Finish();
455 close_ltenr_PRB_log();
456 close_ltenr_handover_log();
457 fn_NetSim_PRB_utilization_log_close();
458 return fn_NetSim_LTE_NR_Finish_F();
462#pragma region WRITE_PACKET_TRACE
463_declspec(dllexport)
int fn_NetSim_LTE_NR_WritePacketTrace(NetSim_PACKET* pstruPacket,
char** ppszTrace)
465 if (!isLTENRTraceConfigured)
469 char* s = calloc(2*BUFSIZ,
sizeof * s);
472 if (pstruPacket->pstruAppData) {
473 if (pstruPacket->pstruAppData->nApplicationProtocol == MAC_PROTOCOL_LTE_NR) {
474 LTENR_MSG_WriteTrace_APP(pstruPacket, s);
479 if (pstruPacket->pstruMacData->nMACProtocol != MAC_PROTOCOL_LTE_NR &&
480 pstruPacket->pstruMacData->nMACProtocol != MAC_PROTOCOL_LTE)
486 LTENR_MSG_WriteTrace(pstruPacket, s);
491#pragma region LOG_TRIGGER_FUN
492bool get_ltenr_log_status()
502#pragma region SET_FAST_PERFORMANCE
503void set_fast_performance()
505 for (NETSIM_ID i = 0; i < NETWORK->nDeviceCount; i++)
507 for (NETSIM_ID j = 0; j < DEVICE(i + 1)->nNumOfInterface; j++)
509 if (!isLTE_NRInterface(i + 1, j + 1))
continue;
511 ptrLTENR_SDAPVAR sdap = LTENR_SDAP_GET(i + 1, j + 1);
512 if(sdap) sdap->isSDAPDisabled =
true;
518int LTENR_ConvertStrToEnumWithErrorMsg(
const char** enumstr,
const char* str,
int length,
char* name)
521 for (i = 0; i < length; i++)
523 if (!_stricmp(enumstr[i], str))
527 fnNetSimError(
"Unknown value %s for %s. The value must be in following.\n",
529 for (i = 0; i < length; i++)
530 fprintf(stderr,
"\t%d. %s\n", i + 1, enumstr[i]);
531 fprintf(stderr,
"\n");
535bool get_protocol_log_status(
char* logname)
541 sprintf(str,
"%s/%s", pszIOPath,
"ProtocolLogsConfig.txt");
542 fp = fopen(str,
"r");
546 sprintf(str,
"%s=true", logname);
548 while (fgets(data, BUFSIZ, fp))
551 if (!_strnicmp(data, str, strlen(str)))
563double LTENR_Configure_Rate_Guarantee_GBR_UEs_Config(NETSIM_ID UEId,
bool isUplink)
567 char data[BUFSIZ], input[BUFSIZ];
573 double dl_mac_rg, ul_mac_rg;
575 sprintf(input,
"%s%s%s", pszIOPath, pathSeperator,
"ConfigSupport/UE_GBR_Config.csv");
577 fp = fopen(input,
"r");
580 fnSystemError(
"Unable to open %s file", input);
586 while (fgets(data, BUFSIZ, fp) != NULL)
591 if (*temp ==
'\n' || *temp ==
'#' || *temp == 0 || *temp ==
',')
596 size_t len = strlen(temp);
597 while (len > 0 && ((temp[len - 1] ==
'\n') || (temp[len - 1] ==
','))) temp[--len] =
'\0';
599 if (sscanf(data,
"%d,%lf,%lf\"",
600 &d, &dl_mac_rg, &ul_mac_rg) == 3)
602 NETSIM_ID devId = fn_NetSim_GetDeviceIdByConfigId(d);
612 fprintf(stderr,
"Invalid input found in line %d.\n\"%s\"\n"
613 "Press any key to skip this line and continue simulation.\n", line, temp);