NetSim Source Code Help
Loading...
Searching...
No Matches
LTE_NR.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2021 *
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* This source code is licensed per the NetSim license agreement. *
12* *
13* No portion of this source code may be used as the basis for a derivative work, *
14* or used, for any purpose other than its intended use per the NetSim license *
15* agreement. *
16* *
17* This source code and the algorithms contained within it are confidential trade *
18* secrets of TETCOS and may not be used as the basis for any other software, *
19* hardware, product or service. *
20* *
21* Author: Shashi Kant Suman *
22* *
23* ----------------------------------------------------------------------------------*/
24
25#pragma region HEADER_FILES
26#include "stdafx.h"
27#include "LTENR_SDAP.h"
28#include "LTENR_NSA.h"
29#include "LTENR_Multiplexing.h"
30#pragma endregion
31
32#pragma region VARIABLE_AND_FUN_DEF
33static bool isLTENRConfigured = false;
34static bool isLTENRTraceConfigured = false;
35static bool isCalledOnce = false;
36static bool isMetricsCalled = false;
37//Function prototype
41#pragma endregion
42
43#pragma region LTENR_INIT
45{
46 if (!isCalledOnce)
47 {
52 isCalledOnce = true;
53 }
55}
56#pragma endregion
57
58#pragma region LTENR_RUN
60{
62 {
64 return 0;
65 }
66
68 {
70 {
72 switch (packet->nControlDataType)
73 {
81 break;
87 break;
91 break;
92 }
93 }
94 break;
96 {
100 if (data->deviceType == LTENR_DEVICETYPE_EPC) {
102 break;
103 }
104
107
108 if (isGNB(d, in))
109 {
110 if (data->IFType == nGC_INTERFACE_XN)
111 {
112 gNB_N3_Forward_packet_to_MAC(d, in, packet);
114 break;
115 }
116 }
117
118 if (dest == d) break;
119
120 if (isGNB(d, in))
121 {
122 if (data->IFType == nGC_INTERFACE_N3 || data->IFType == nGC_INTERFACE_LTE_S1)
123 {
124 gNB_N3_Forward_packet_to_MAC(d, in, packet);
126 break;
127 }
128 }
129
130 if (isUPF(d)) {
133
134 if (!splitID)
135 {
136 //Drop the Packet
138 packet->nReceiverId = get_first_dest_from_packet(packet);
142 break;
143 }
144
146 packet->pstruNetworkData->szNextHopIp = IP_COPY(DEVICE_NWADDRESS(splitID, splitIF));
147 packet->nReceiverId = splitID;
148 }
149 gNB_N3_Forward_packet_to_MAC(d, in, packet);
151 break;
152 }
153 }
154 break;
155 case NETWORK_IN_EVENT:
156 {
160
161 if (isLTENRControlPacket(packet) == false &&
163 {
165 if (data->IFType == nGC_INTERFACE_XN && isGNB(d,in))
166 {
168 if (hdr->flag)
169 {
171 packet->pstruMacData->Packet_MACProtocol = hdr->msg;
173 packet->nTransmitterId = d;
174 packet->nReceiverId = hdr->UEID;
175 if (fn_NetSim_isDeviceLTENR(d, in))
177 else
181 LTENR_NSA_XN_INTERFACE_TO_RAN(d, RANIF, packet);
182 }
183 else
184 {
185 NETSIM_ID RANIF;
187 {
189 NETSIM_ID r, rin;
190 fn_NetSim_Stack_GetConnectedDevice(d, RANIF, &r, &rin);
194 }
195 else
196 {
205 }
206 gNB_N3_Forward_packet_to_MAC(d, RANIF, packet);
207 }
208 free(hdr);
210 break;
211 }
212 }
213
214 if (isGNB(d, in))
215 {
217 if (data->IFType == nGC_INTERFACE_N3 && isLTENRControlPacket(packet) == false)
218 {
219 NETSIM_ID RANIF = 0;
220 if (fn_NetSim_isDeviceLTENR(d, in))
222 else
224 gNB_N3_Forward_packet_to_RAN(d, in, RANIF, packet);
226 break;
227 }
228 if (data->IFType == nGC_INTERFACE_LTE_S1 && isLTENRControlPacket(packet) == false)
229 {
231 gNB_N3_Forward_packet_to_RAN(d, in, RANIF, packet);
233 break;
234 }
235 }
236
238 {
243 if (!isEPC(d,in)) {
245 if (data->IFType == nGC_INTERFACE_LTE_S1) {
248 }
249 else {
251 }
253 }
254 else
256 break;
261 break;
264 if (!isEPC(d,in)) {
267 }
268 else
270 break;
277 if (!isEPC(d, in)) {
280 }
281 else
283 break;
284 default:
285 {
286 if (isGNB(d, in)) {
288 gNB_N3_Forward_packet_to_RAN(d, in, RANIF, packet);
290 }
291 }
292 break;
293 }
294 }
295 break;
296 case MAC_OUT_EVENT:
297 {
298 bool isMore = true;
301 switch (packet->nControlDataType)
302 {
308 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer, 1);
309 pstruEventDetails->pPacket = packet;
311 break;
313 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer, 1);
314 break;
315 default:
316 while (isMore)
317 {
320 }
321 break;
322 }
323 }
324 break;
325 case MAC_IN_EVENT:
327 break;
330 break;
332 {
334 {
336 }
338
341 }
342 break;
343 default:
344 fnNetSimError("LTE-NR, Unknown event type %d.\n",
346 break;
347 }
348 return 0;
349}
350#pragma endregion
351
352#pragma region LTENR_TRACE
354{
355 return LTENR_SUBEVNET_NAME(id);
356}
357#pragma endregion
358
359#pragma region FREE_PACKET
361{
362 LTENR_MSG_FREE(packet);
363 return 0;
364}
365#pragma endregion
366
367#pragma region COPY_PACKET
368_declspec(dllexport) int fn_NetSim_LTE_NR_CopyPacket(NetSim_PACKET* destPacket, const NetSim_PACKET* srcPacket)
369{
370 if (srcPacket->pstruMacData->nMACProtocol == MAC_PROTOCOL_LTE ||
372 {
374 ptrLTENR_MSG dmsg = LTENR_MSG_COPY(srcPacket);
375 destPacket->pstruMacData->Packet_MACProtocol = dmsg;
376
377 }
378 if (srcPacket->pstruAppData) {
380 destPacket->pstruAppData->Packet_AppProtocol = LTENR_MSG_APP_COPY(srcPacket);
381 return 0;
382 }
383 }
384 return 0;
385}
386#pragma endregion
387
388#pragma region LTENR_MATRICS
390{
391 if (!isMetricsCalled)
392 {
394 //fn_NetSim_LTENR_SDAP_Metrics_F(file);
395 // return fn_NetSim_LTE_Metrics_F(file);
396 isMetricsCalled = true;
397 }
398 return 0;
399}
400#pragma endregion
401
402#pragma region LTENR_CONFIG
403_declspec(dllexport) int fn_NetSim_LTE_NR_Configure(void** var)
404{
405 isLTENRConfigured = true;
407}
408#pragma endregion
409
410#pragma region CONFIG_PACKET_TRACE
411_declspec(dllexport) char* fn_NetSim_LTE_NR_ConfigPacketTrace(void* xmlNetSimNode)
412{
414 {
415 string szStatus;
416 szStatus = fn_NetSim_xmlConfigPacketTraceField(xmlNetSimNode, "LTENR_PACKET_INFO");
417 if (!_stricmp(szStatus, "ENABLE"))
418 {
420 free(szStatus);
421 return "LTENR_PACKET_INFO,";
422 }
423 free(szStatus);
424 return "";
425 }
426 else
427 return "";
428}
429#pragma endregion
430
431#pragma region LTENR_FINISH
432#include "NetSim_utility.h"
434{
441}
442#pragma endregion
443
444#pragma region WRITE_PACKET_TRACE
445_declspec(dllexport) int fn_NetSim_LTE_NR_WritePacketTrace(NetSim_PACKET* pstruPacket, char** ppszTrace)
446{
448 return -1;
449
450
451 char* s = calloc(2*BUFSIZ, sizeof * s);
452 *ppszTrace = s;
453
454 if (pstruPacket->pstruAppData) {
456 LTENR_MSG_WriteTrace_APP(pstruPacket, s);
457 return 0;
458 }
459 }
460
461 if (pstruPacket->pstruMacData->nMACProtocol != MAC_PROTOCOL_LTE_NR &&
463 {
464 strcpy(s, "N/A,");
465 return -2;
466 }
467
468 LTENR_MSG_WriteTrace(pstruPacket, s);
469 return 0;
470}
471#pragma endregion
472
473#pragma region LOG_TRIGGER_FUN
475{
476#ifdef LTENR_LOG_DEV
477 return true;
478#else
479 return false;
480#endif
481}
482
483
484#pragma region SET_FAST_PERFORMANCE
486{
487 for (NETSIM_ID i = 0; i < NETWORK->nDeviceCount; i++)
488 {
489 for (NETSIM_ID j = 0; j < DEVICE(i + 1)->nNumOfInterface; j++)
490 {
491 if (!isLTE_NRInterface(i + 1, j + 1)) continue;
492
493 ptrLTENR_SDAPVAR sdap = LTENR_SDAP_GET(i + 1, j + 1);
494 if(sdap) sdap->isSDAPDisabled = true;
495 }
496 }
497}
498#pragma endregion
499
500int LTENR_ConvertStrToEnumWithErrorMsg(const char** enumstr, const char* str, int length, char* name)
501{
502 int i;
503 for (i = 0; i < length; i++)
504 {
505 if (!_stricmp(enumstr[i], str))
506 return i;
507 }
508
509 fnNetSimError("Unknown value %s for %s. The value must be in following.\n",
510 str, name);
511 for (i = 0; i < length; i++)
512 fprintf(stderr, "\t%d. %s\n", i + 1, enumstr[i]);
513 fprintf(stderr, "\n");
514 return 0;
515}
unsigned int NETSIM_ID
Definition: Animation.h:45
NETSIM_IPAddress IP_COPY(NETSIM_IPAddress ip)
#define STR_TO_IP4(ipstr)
Definition: IP_Addressing.h:94
int fn_NetSim_LTE_NR_Finish_F()
bool get_ltenr_log_status()
Definition: LTE_NR.c:474
static bool isCalledOnce
Definition: LTE_NR.c:35
static  bool isLTENRConfigured
Definition: LTE_NR.c:33
int fn_NetSim_LTE_NR_Run()
Definition: LTE_NR.c:59
int fn_NetSim_LTE_NR_Init()
Definition: LTE_NR.c:44
static bool isMetricsCalled
Definition: LTE_NR.c:36
char * fn_NetSim_LTE_NR_Trace(NETSIM_ID id)
Definition: LTE_NR.c:353
int fn_NetSim_LTE_NR_Configure_F(void **var)
void set_fast_performance()
Definition: LTE_NR.c:485
int fn_NetSim_LTE_NR_Configure(void **var)
Definition: LTE_NR.c:403
char * fn_NetSim_LTE_NR_ConfigPacketTrace(void *xmlNetSimNode)
Definition: LTE_NR.c:411
int fn_NetSim_LTE_NR_WritePacketTrace(NetSim_PACKET *pstruPacket, char **ppszTrace)
Definition: LTE_NR.c:445
static bool isLTENRTraceConfigured
Definition: LTE_NR.c:34
int LTENR_ConvertStrToEnumWithErrorMsg(const char **enumstr, const char *str, int length, char *name)
Definition: LTE_NR.c:500
int fn_NetSim_LTE_NR_Metrics(PMETRICSWRITER file)
Definition: LTE_NR.c:389
int fn_NetSim_LTE_NR_CopyPacket(NetSim_PACKET *destPacket, const NetSim_PACKET *srcPacket)
Definition: LTE_NR.c:368
int fn_NetSim_LTE_NR_Init_F()
int fn_NetSim_LTE_NR_Finish()
Definition: LTE_NR.c:433
int fn_NetSim_LTE_NR_FreePacket(NetSim_PACKET *packet)
Definition: LTE_NR.c:360
void LTENR_RadioMeasurements_Finish()
void fn_NetSim_LTENR_EPC_RouteHOPacket()
Definition: LTENR_NAS.c:719
void fn_NetSim_LTENR_NSA_RECV()
Definition: LTENR_NSA.c:167
#define isGNB(d, i)
Definition: LTE_NR.h:591
#define isEPC(d, i)
Definition: LTE_NR.h:592
void fn_NetSim_LTENR_Handover_RECV()
NETSIM_ID fn_NetSim_LTENR_CORE_INTERFACE(NETSIM_ID d, LTENR_INTERFACE_TYPE type)
@ LTENR_DEVICETYPE_EPC
Definition: LTE_NR.h:74
bool fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(NETSIM_ID d, NETSIM_ID in)
void LTENR_fn_InterferenceInit()
void close_ltenr_PRB_log()
Definition: LTENR_PRB.c:64
NETSIM_ID fn_NetSim_LTENR_NSA_Splitting_Alogrithm_For_EPC(NETSIM_ID dest)
Definition: LTENR_NSA.c:270
void fn_NetSim_LTENR_HARQ_Init()
Definition: LTENR_HARQ.c:368
void fn_NetSim_LTENR_HARQ_Finish()
Definition: LTENR_HARQ.c:376
void gNB_N3_Forward_packet_to_RAN(NETSIM_ID d, NETSIM_ID in, NETSIM_ID rin, NetSim_PACKET *packet)
#define LTENR_CallEPCOut()
Definition: LTE_NR.h:306
#define isLTENRControlPacket(packet)
Definition: LTE_NR.h:744
void LTENR_NSA_XN_INTERFACE_TO_RAN(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET *packet)
Definition: LTENR_NSA.c:188
void fn_NetSim_LTENR_AMF_PACKET_HANDLER()
Definition: LTENR_AMF.c:344
void LTENR_MSG_WriteTrace_APP(NetSim_PACKET *packet, char *s)
void fn_NetSim_LTENR_SMF_UPF_PACKET_HANDLER()
NETSIM_ID fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(NETSIM_ID r)
@ nGC_INTERFACE_LTE_S1
Definition: LTE_NR.h:189
@ nGC_INTERFACE_XN
Definition: LTE_NR.h:188
@ nGC_INTERFACE_N3
Definition: LTE_NR.h:184
#define LTENR_CallSDAPOut()
Definition: LTE_NR.h:309
#define isUPF(d)
Definition: LTE_NR.h:595
void gNB_N3_Forward_packet_to_MAC(NETSIM_ID d, NETSIM_ID rin, NetSim_PACKET *packet)
#define LTENR_SDAP_GET(d, i)
Definition: LTE_NR.h:605
#define LTENR_CallMACIn()
Definition: LTE_NR.h:320
void fn_NetSim_SN_HANDOVER_PACKET_HANDLER()
void LTENR_RadioMeasurements_Init()
bool isLTE_NRInterface(NETSIM_ID d, NETSIM_ID i)
void fn_NetSim_LTE_MAC_PRBLOG()
Definition: LTENR_PRB.c:33
ptrLTENR_PROTODATA LTENR_PROTODATA_GET(NETSIM_ID d, NETSIM_ID in)
int fn_NetSim_LTENR_Cell_Metrics_F(PMETRICSWRITER metricsWriter)
Definition: LTENR_PDCP.c:890
#define LTENR_CallNASIn()
Definition: LTE_NR.h:308
NETSIM_ID fn_NetSim_FIND_LTE_INTERFACE(NETSIM_ID r)
bool fn_NetSim_isDeviceLTENR(NETSIM_ID r, NETSIM_ID rin)
void LTENR_FreeBLERTable()
void fn_NetSim_LTENR_GNB_CORE_PACKET_HANDLER()
void LTENR_MSG_WriteTrace(NetSim_PACKET *packet, char *s)
void fn_NetSim_LTENR_LTE_S1_CONTROL_PACKET_TO_RAN(NETSIM_ID d, NETSIM_ID RANIF, NetSim_PACKET *packet)
bool LTENR_GET_PACKET_FROM_ACCESS_BUFFER()
void fn_NetSim_LTENR_HandlePhyOut()
Definition: LTENR_PHY.c:1290
NETSIM_ID fn_NetSim_FIND_LTENR_INTERFACE(NETSIM_ID r)
bool fn_NetSim_LTENR_IS_S1_INTERFACE_EXISTS(NETSIM_ID d)
@ LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_REQUEST
Definition: LTENR_Msg.h:70
@ LTENR_MSG_CORE_PFCP_SESSION_RESPONSE
Definition: LTENR_Msg.h:76
@ LTENR_MSG_NAS_HANDOVER_REQUEST_ACK
Definition: LTENR_Msg.h:54
@ LTENR_MSG_CORE_MODIFY_BEARER_RESPONSE
Definition: LTENR_Msg.h:78
@ LTENR_MSG_DC_SEC_CELL_ADDITION_REQUEST
Definition: LTENR_Msg.h:81
@ LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_RESPONSE
Definition: LTENR_Msg.h:71
@ LTENR_MSG_DC_HO_SEC_CELL_RELEASE_REQUEST
Definition: LTENR_Msg.h:88
@ LTENR_MSG_DC_HO_SEC_CELL_ADDITION_REQUEST_ACK
Definition: LTENR_Msg.h:87
@ LTENR_MSG_CORE_PFCP_SESSION_REQUSET
Definition: LTENR_Msg.h:75
@ LTENR_MSG_NAS_HANDOVER_UE_CONTEXT_RELEASE_ACK
Definition: LTENR_Msg.h:59
@ LTENR_MSG_DC_HO_SEC_CELL_RELEASE_REQUEST_ACK
Definition: LTENR_Msg.h:89
@ LTENR_MSG_DC_HO_SEC_CELL_UE_CONTEXT_RELEASE
Definition: LTENR_Msg.h:92
@ LTENR_MSG_NAS_HANDOVER_UE_CONTEXT_RELEASE
Definition: LTENR_Msg.h:58
@ LTENR_MSG_NAS_HANDOVER_PATH_SWITCH_ACK
Definition: LTENR_Msg.h:57
@ LTENR_MSG_CORE_CREATE_SESSION_REQUEST
Definition: LTENR_Msg.h:68
@ LTENR_MSG_DC_HO_SEC_CELL_ADDITION_REQUEST
Definition: LTENR_Msg.h:86
@ LTENR_MSG_CORE_MODIFY_BEARER_REQUEST
Definition: LTENR_Msg.h:77
@ LTENR_MSG_DC_HO_SEC_CELL_UE_CONTEXT_RELEASE_ACK
Definition: LTENR_Msg.h:93
@ LTENR_MSG_CORE_CREATE_SESSION_RESPONSE
Definition: LTENR_Msg.h:69
@ LTENR_MSG_DC_SEC_CELL_ADDITION_RESPONSE
Definition: LTENR_Msg.h:82
@ LTENR_MSG_CORE_INITIAL_UE_MESSAGE
Definition: LTENR_Msg.h:67
@ LTENR_MSG_CORE_REGISTRATION_COMPLETE
Definition: LTENR_Msg.h:72
@ LTENR_MSG_NAS_HANDOVER_REQUEST
Definition: LTENR_Msg.h:53
@ LTENR_MSG_NAS_HANDOVER_PATH_SWITCH
Definition: LTENR_Msg.h:56
void LTENR_MSG_FREE(NetSim_PACKET *packet)
ptrLTENR_MSG LTENR_MSG_APP_COPY(const NetSim_PACKET *packet)
ptrLTENR_MSG LTENR_MSG_COPY(const NetSim_PACKET *packet)
char * LTENR_SUBEVNET_NAME(NETSIM_ID id)
void LTENR_SUBEVENT_CALL()
#define _stricmp
Definition: Linux.h:127
#define _declspec(dllexport)
This function is used to trigger the update.
Definition: Linux.h:41
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
void * PMETRICSWRITER
Definition: MetricsWriter.h:27
void netsim_matlab_interface_close()
NetSim_PACKET * fn_NetSim_Packet_GetPacketFromBuffer(NetSim_BUFFER *pstruBuffer, int nFlag)
NETSIM_ID get_first_dest_from_packet(NetSim_PACKET *packet)
@ PacketStatus_Buffer_Dropped
Definition: Packet.h:104
#define DEVICE(DeviceId)
Definition: Stack.h:769
NETSIM_ID fn_NetSim_Stack_GetDeviceId_asName(const char *name)
NETSIM_ID fn_NetSim_Stack_GetConnectedDevice(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, NETSIM_ID *nConnectedDevId, NETSIM_ID *nConnectedInterfaceId)
char * fn_NetSim_xmlConfigPacketTraceField(const void *xmlNetSimNode, const char *name)
#define DEVICE_NWADDRESS(DeviceId, InterfaceId)
Definition: Stack.h:805
@ MAC_PROTOCOL_LTE
Definition: Stack.h:219
@ MAC_PROTOCOL_LTE_NR
Definition: Stack.h:220
EXPORTED struct stru_NetSim_Network * NETWORK
Definition: Stack.h:742
@ NETWORK_OUT_EVENT
Definition: Stack.h:108
@ APPLICATION_IN_EVENT
Definition: Stack.h:113
@ NETWORK_IN_EVENT
Definition: Stack.h:109
@ PHYSICAL_OUT_EVENT
Definition: Stack.h:104
@ MAC_OUT_EVENT
Definition: Stack.h:106
@ MAC_IN_EVENT
Definition: Stack.h:107
@ PHYSICAL_IN_EVENT
Definition: Stack.h:105
#define DEVICE_ACCESSBUFFER(DeviceId, InterfaceId)
Definition: Stack.h:794
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
#define fn_NetSim_Metrics_Add(packet)
Definition: Stack.h:998
#define fn_NetSim_Packet_FreePacket(pstruPacket)
Definition: main.h:177
#define fn_NetSim_WritePacketTrace(pstruPacket)
Definition: main.h:188
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
LTENR_DEVICETYPE deviceType
Definition: LTE_NR.h:440
LTENR_INTERFACE_TYPE IFType
Definition: LTE_NR.h:443
NETSIM_ID UEID
Definition: LTENR_NSA.h:60
NETSIM_ID UEIF
Definition: LTENR_NSA.h:61
EVENT_TYPE nEventType
Definition: Stack.h:747
struct stru_NetSim_Packet * pPacket
Definition: Stack.h:754
NETSIM_ID nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
NETSIM_ID nInterfaceId
Definition: Stack.h:751
APPLICATION_LAYER_PROTOCOL nApplicationProtocol
Definition: Packet.h:172
MAC_LAYER_PROTOCOL nMACProtocol
Definition: Packet.h:223
NETSIM_IPAddress szGatewayIP
Definition: Packet.h:200
NETSIM_IPAddress szNextHopIp
Definition: Packet.h:201
struct stru_NetSim_Packet_AppLayer * pstruAppData
Definition: Packet.h:273
PACKET_STATUS nPacketStatus
Definition: Packet.h:272
struct stru_NetSim_Packet_NetworkLayer * pstruNetworkData
Definition: Packet.h:275
NETSIM_ID nReceiverId
Definition: Packet.h:266
unsigned int nControlDataType
Definition: Packet.h:258
NETSIM_ID nTransmitterId
Definition: Packet.h:265
struct stru_NetSim_Packet_MACLayer * pstruMacData
Definition: Packet.h:276