NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
LTE_NR.h
1#pragma once
2/************************************************************************************
3* Copyright (C) 2023 *
4* TETCOS, Bangalore. India *
5* *
6* Tetcos owns the intellectual property rights in the Product and its content. *
7* The copying, redistribution, reselling or publication of any or all of the *
8* Product or its content without express prior written consent of Tetcos is *
9* prohibited. Ownership and / or any other right relating to the software and all *
10* intellectual property rights therein shall remain at all times with Tetcos. *
11* *
12* This source code is licensed per the NetSim license agreement. *
13* *
14* No portion of this source code may be used as the basis for a derivative work, *
15* or used, for any purpose other than its intended use per the NetSim license *
16* agreement. *
17* *
18* This source code and the algorithms contained within it are confidential trade *
19* secrets of TETCOS and may not be used as the basis for any other software, *
20* hardware, product or service. *
21* *
22* Author: Shashi Kant Suman *
23* *
24* ----------------------------------------------------------------------------------*/
25#ifndef _NETSIM_LTE_NR_H_
26#define _NETSIM_LTE_NR_H_
27
28#pragma region HEADER_FILES_AND_WARNING_REMOVAL
29#include "List.h"
30#pragma warning ( disable : 4090 )
31#pragma warning ( disable : 4100 )
32#pragma warning ( disable : 4189 )
33#pragma warning ( disable : 4244 )
34#pragma endregion
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40#pragma region LOG_MACRO
41//#define LTENR_LOG
42//#ifdef LTENR_LOG
43//#define LTENR_LOG_DEV
44//#define LTENR_PROPAGATION_LOG
45//#define LTENR_PDCP_LOG
46//#define LTENR_RLC_LOG
47//#ifdef LTENR_RLC_LOG
48//#define LTENR_RLC_BUFFERSTATUSREPORTING_LOG
49//#define LTENR_RLC_TRANSMISSIONSTATUSNOTIFICATION_LOG
50//#endif
51//#endif // LTENR_LOG
52#pragma endregion
53
54#pragma region TYPEDEFS
55 // Typedef's that are referenced in multiple headers file
56 typedef struct stru_LTENR_AssociatedUEPhyInfo LTENR_ASSOCIATEDUEPHYINFO, * ptrLTENR_ASSOCIATEDUEPHYINFO;
57 typedef struct stru_LTENR_GNBPHY LTENR_GNBPHY, * ptrLTENR_GNBPHY;
58#pragma endregion //TYPEDEFS
59
60#pragma region DEVICE_TYPE
61 static bool isFastProcessing = true;
62 /**
63 * @enum enum_LTE_NR_DEVICE_TYPE
64 * @brief Types of DEVICE
65 */
66 typedef enum enum_LTE_NR_DEVICE_TYPE
67 {
68 LTENR_DEVICETYPE_UE = 0,
69 LTENR_DEVICETYPE_GNB = 1,
70 LTENR_DEVICETYPE_ENB = 1,
71 LTENR_DEVICETYPE_NTN_GNB = 1,
72 LTENR_DEVICETYPE_EPC = 2,
73 LTENR_DEVICETYPE_AMF = 3,
74 LTENR_DEVICETYPE_SMF = 4,
75 LTENR_DEVICETYPE_UPF = 5,
76 LTENR_DEVICETYPE_NTN_SATELLITE = 6,
77 LTENR_DEVICETYPE_LAST, //Keep me at last
78 }LTENR_DEVICETYPE;
79 static const char* strLTENR_DEVICETYPE[] =
80 { "UE","gNB","EPC","AMF","SMF","UPF","SATELLITE","Unknown" };
81#pragma endregion
82
83#pragma region LTENR_LogicalChannel
84 /**
85 * @enum enum_LTENR_LogicalChannel
86 * @brief Types of Logical Channel
87 */
88 typedef enum enum_LTENR_LogicalChannel
89 {
90 LTENR_LOGICALCHANNEL_NONE,
91 LTENR_LOGICALCHANNEL_PCCH, // Paging Control Channel
92 LTENR_LOGICALCHANNEL_BCCH, // Broadcast Control Channel
93 LTENR_LOGICALCHANNEL_CCCH, // Common Control Channel
94 LTENR_LOGICALCHANNEL_DCCH, // Dedicated Control Channel
95 LTENR_LOGICALCHANNEL_DTCH, // Dedicated Traffic Channel
96 LTENR_LOGICALCHANNEL_LAST, // Keep me at last
97 }LTENR_LOGICALCHANNEL;
98 static const char* strLTENR_LOGICALCHANNEL[] =
99 { "NONE","PCCH","BCCH","CCCH","DCCH","DTCH","Unknown" };
100#pragma endregion
101
102#pragma region LTENR_SRB
103 /**
104 * @enum enum_LTENR_SRB
105 * @brief Types of SRB
106 */
107 typedef enum enum_LTENR_SRB
108 {
109 LTENR_SRB0,
110 LTENR_SRB1,
111 LTENR_SRB2,
112 LTENR_NA,
113 LTENR_LAST,
114 }LTENR_SRB;
115 static const char* strLTENR_SRB[] =
116 { "SRB0","SRB1","SRB2","N/A","Unknown" };
117#pragma endregion
118
119#pragma region LTENR_TransportChannel
120 /**
121 * @enum enum_LTENR_TransportChannel
122 * @brief Types of Transport Channel
123 */
124 typedef enum enum_LTENR_TransportChannel
125 {
126 LTENR_TRANSPORTCHANNEL_NONE,
127 LTENR_TRANSPORTCHANNEL_BCH, // Broadcast Channel
128 LTENR_TRANSPORTCHANNEL_PCH, // Paging Channel
129 LTENR_TRANSPORTCHANNEL_DL_SCH, // Downlink Shared Channel
130 LTENR_TRANSPORTCHANNEL_UL_SCH, // Uplink Shared Channel
131 LTENR_TRANSPORTCHANNEL_RACH, // Random Access Channel
132 LTENR_TRANSPORTCHANNEL_LAST, // Keep me at last
133 }LTENR_TRANSPORTCHANNEL;
134 static const char* strLTENR_TRANSPORTCHANNEL[] =
135 { "NONE","BCH","PCH","DL-SCH","UL-SCH","RACH","Unknown" };
136#pragma endregion
137
138#pragma region LTENR_PhysicalChannel
139 /**
140 * @enum enum_LTENR_PhysicalChannel
141 * @brief Types of Physical Channel
142 */
143 typedef enum enum_LTENR_PhysicalChannel
144 {
145 LTENR_PHYSICALCHANNEL_NONE,
146 LTENR_PHYSICALCHANNEL_PBCH, // Physical broadcast channel
147 LTENR_PHYSICALCHANNEL_PDCCH, // Physical downlink control channel
148 LTENR_PHYSICALCHANNEL_PDSCH, // Physical downlink shared channel
149 LTENR_PHYSICALCHANNEL_PRACH, // Physical random access channel
150 LTENR_PHYSICALCHANNEL_PUSCH, // physical uplink shared channel
151 LTENR_PHYSICALCHANNEL_PUCCH, // Physical uplink control channel
152 LTENR_PHYSICALCHANNEL_LAST, // Keep me at last
153 }LTENR_PHYSICALCHANNEL;
154 static const char* strLTENR_PHYSICALCHANNEL[] =
155 { "NONE","PBCH","PDCCH","PDSCH","PRACH","PUSCH","PUCCH","Unknown" };
156#pragma endregion
157
158#pragma region LTENR_RLCMode
159 /**
160 * @enum enum_LTENR_RLCMode
161 * @brief Types of RLC Mode
162 */
163 typedef enum enum_LTENR_RLCMode
164 {
165 LTENR_RLCMODE_TM, // Transparent Mode
166 LTENR_RLCMODE_UM, // Unacknowledged mode
167 LTENR_RLCMODE_AM, // Acknowledged mode
168 }LTENR_RLCMODE;
169 static const char* strLTENR_RLCMODE[] =
170 { "Transparent Mode","Unacknowledged Mode", "Acknowledged Mode" };
171#pragma endregion
172
173#pragma region LTENR_INTERFACE_TYPE
174 /**
175 * @enum enum_LTENR_INTERFACE_TYPE
176 * @brief Type of Interfaces
177 */
178 typedef enum enum_LTENR_INTERFACE_TYPE {
179 nGC_INTERFACE_NULL,
180 nGC_INTERFACE_LTE,//4G interface
181 nGC_INTERFACE_RAN,//(R)AN--Uu--UE
182 nGC_INTERFACE_N1_N2,//UE--N1--AMF //(R)AN--N2--AMF
183 nGC_INTERFACE_N3,//UPF--N3--(R)AN
184 nGC_INTERFACE_N4,//UPF--N4--SMF
185 nGC_INTERFACE_N11,//AMF--N11--SMF
186 nGC_INTERFACE_N6,//UPF--N6--DN
187 nGC_INTERFACE_XN,//GNB--Xn--GNB
188 nGC_INTERFACE_LTE_S1,
189 nGC_INTERFACE_LAST,
190 }LTENR_INTERFACE_TYPE;
191 static const char* strLTENR_DEVICEINTERFACETYPE[] =
192 { "Invalid", "LTE","5G_RAN", "5G_N1_N2","5G_N3","5G_N4","5G_N11","5G_N6", "5G_XN", "LTE_S1","Unknown" };
193#pragma endregion
194
195#pragma region LTE_NR_SUBLAYER
196 /**
197 * @enum enum_LTE_NR_SUBLAYER
198 * @brief Type to Sublayers
199 */
200 typedef enum enum_LTE_NR_SUBLAYER
201 {
202 LTENR_SUBLAYER_NGAP,
203 LTENR_SUBLAYER_GTP_U,
204 LTENR_SUBLAYER_NAS_MM,
205 LTENR_SUBLAYER_NAS_SM,
206 LTENR_SUBLAYER_PFCP,
207 LTENR_SUBLAYER_EPC,
208 LTENR_SUBLAYER_NAS,
209 LTENR_SUBLAYER_SDAP,
210 LTENR_SUBLAYER_RRC,
211 LTENR_SUBLAYER_PDCP,
212 LTENR_SUBLAYER_RLC,
213 LTENR_SUBLAYER_MACSCHEDULER,
214 LTENR_SUBLAYER_MAC,
215 LTENR_SUBLAYER_PHY,
216 LTENR_SUBLAYER_LAST, // Keep me at last
217 }LTENR_SUBLAYER;
218#pragma endregion
219
220#pragma region FUN_DEF_OUT_AND_IN
221 //EPC
222 void LTENR_EPC_NetworkOut();
223
224 //Core
225 void fn_NetSim_LTENR_AMF_PACKET_HANDLER();
226 void fn_NetSim_LTENR_SMF_UPF_PACKET_HANDLER();
227 void fn_NetSim_LTENR_GNB_CORE_PACKET_HANDLER();
228
229 //NAS
230 void fn_NetSim_NAS_IN();
231 void fn_NetSim_LTENR_Handover_RECV();
232
233 //PDCP
234 void fn_NetSim_LTENR_PDCP_TransmitPDCPSDU();
235 void fn_NetSim_LTENR_PDCP_ReceivePDCPSDU();
236
237 //RRC
238 void fn_NetSim_LTENR_RRC_MacOut();
239 void fn_NetSim_LTENR_RRC_MacIn();
240
241 //RLC
242 void fn_NetSim_LTENR_RLC_HandlePDUFromUpperLayer();
243 void fn_NetSim_LTENR_RLC_HandleMACIN();
244
245 //SDAP
246 void fn_NetSim_LTENR_SDAP_HandleMacOut();
247 void fn_NetSim_LTENR_SDAP_HandleMacIn();
248
249 //MAC
250 void macOut();
251 void macIn();
252
253 //HARQ
254 void fn_NetSim_LTENR_HARQ_Init();
255 void HARQAssociationHandler(NETSIM_ID gnbId, NETSIM_ID gnbIf, NETSIM_ID ueId, NETSIM_ID ueIf, bool isAssociated);
256 void fn_NetSim_LTENR_HARQ_Finish();
257 void fn_NetSim_LTENR_HARQ_StoreDLPacket();
258 void fn_NetSim_LTENR_HARQ_StoreULPacket();
259 void fn_NetSim_LTENR_HARQ_HandleSlotStart(NETSIM_ID gnbId, NETSIM_ID gnbIf, int caId);
260 void fn_NetSim_LTENR_HARQ_TransmitDownLinkCBG(NETSIM_ID gnbId, NETSIM_ID gnbIf, ptrLTENR_ASSOCIATEDUEPHYINFO info, int caId);
261 void fn_NetSim_LTENR_HARQ_TransmitUpLinkCBG(NETSIM_ID gnbId, NETSIM_ID gnbIf, ptrLTENR_ASSOCIATEDUEPHYINFO info, int caId);
262 void fn_NetSim_LTENR_HARQ_AllocateCBG(NETSIM_ID gnbId, NETSIM_ID gnbIf, int caId);
263 void fn_NetSim_LTENR_HARQ_Transmit(NETSIM_ID gNBId, NETSIM_ID gNBIf, int caId);
264 bool fn_NetSim_LTENR_HARQ_GetNDIFlag(ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo, bool isUplink, int caId);
265 UINT fn_NetSim_LTENR_HARQ_GetPRBReqdForRetx(ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo, bool isUplink, int caId);
266#pragma endregion
267
268#pragma region OUT_AND_IN_MACROS
269#ifdef OUT
270#undef OUT
271#define OUT 0
272#endif
273#ifdef IN
274#undef IN
275#define IN 1
276#endif
277#pragma endregion
278
279#pragma region LTENR_SublayerInfo
281 {
282 LTENR_SUBLAYER subLayer;
283 char name[50];
284 void(*fnOut)(); // Call back function for out event
285 void(*fnIn)(); // Call back function for in event
286 }LTENR_SUBLAYERINFO, *ptrLTENR_SUBLAYERINFO;
287 static LTENR_SUBLAYERINFO subLayerInfo[LTENR_SUBLAYER_LAST] =
288 {
289 {LTENR_SUBLAYER_NGAP,"NGAP",NULL,NULL},
290 {LTENR_SUBLAYER_GTP_U,"GTP-U",NULL,NULL},
291 {LTENR_SUBLAYER_NAS_MM,"NAS-MM",NULL,NULL},
292 {LTENR_SUBLAYER_NAS_SM,"NAS-SM",NULL,NULL},
293 {LTENR_SUBLAYER_PFCP,"PFCP",NULL,NULL},
294 {LTENR_SUBLAYER_EPC,"EPC",LTENR_EPC_NetworkOut,NULL},
295 {LTENR_SUBLAYER_NAS,"NAS",NULL,fn_NetSim_NAS_IN},
296 {LTENR_SUBLAYER_SDAP,"SDAP",fn_NetSim_LTENR_SDAP_HandleMacOut,fn_NetSim_LTENR_SDAP_HandleMacIn},
297 {LTENR_SUBLAYER_RRC,"RRC",fn_NetSim_LTENR_RRC_MacOut, fn_NetSim_LTENR_RRC_MacIn},
298 {LTENR_SUBLAYER_PDCP,"PDCP",fn_NetSim_LTENR_PDCP_TransmitPDCPSDU,fn_NetSim_LTENR_PDCP_ReceivePDCPSDU},
299 {LTENR_SUBLAYER_RLC,"RLC",fn_NetSim_LTENR_RLC_HandlePDUFromUpperLayer,fn_NetSim_LTENR_RLC_HandleMACIN},
300 {LTENR_SUBLAYER_MACSCHEDULER,"MACSCHEDULER",NULL,NULL},
301 {LTENR_SUBLAYER_MAC,"MAC",macOut,macIn},
302 {LTENR_SUBLAYER_PHY,"PHY",NULL,NULL},
303 };
304 void fnCallSublayer(LTENR_SUBLAYER layer, int c);
305#define LTENR_CallEPCOut() (fnCallSublayer(LTENR_SUBLAYER_EPC,OUT))
306#define LTENR_CallNASOut() (fnCallSublayer(LTENR_SUBLAYER_NAS,OUT))
307#define LTENR_CallNASIn() (fnCallSublayer(LTENR_SUBLAYER_NAS,IN))
308#define LTENR_CallSDAPOut() (fnCallSublayer(LTENR_SUBLAYER_SDAP,OUT))
309#define LTENR_CallSDAPIn() (fnCallSublayer(LTENR_SUBLAYER_SDAP,IN))
310#define LTENR_CallRRCOut() (fnCallSublayer(LTENR_SUBLAYER_RRC,OUT))
311#define LTENR_CallRRCIn() (fnCallSublayer(LTENR_SUBLAYER_RRC,IN))
312#define LTENR_CallPDCPOut() (fnCallSublayer(LTENR_SUBLAYER_PDCP,OUT))
313#define LTENR_CallPDCPIN() (fnCallSublayer(LTENR_SUBLAYER_PDCP,IN))
314#define LTENR_CallRLCOut() (fnCallSublayer(LTENR_SUBLAYER_RLC,OUT))
315#define LTENR_CallRLCIn() (fnCallSublayer(LTENR_SUBLAYER_RLC,IN))
316#define LTENR_CallMACSCHEDULEROut() (fnCallSublayer(LTENR_SUBLAYER_MACSCHEDULER,OUT))
317#define LTENR_CallMACSCHEDULERIn() (fnCallSublayer(LTENR_SUBLAYER_MACSCHEDULER,IN))
318#define LTENR_CallMACOut() (fnCallSublayer(LTENR_SUBLAYER_MAC,OUT))
319#define LTENR_CallMACIn() (fnCallSublayer(LTENR_SUBLAYER_MAC,IN))
320#pragma endregion
321
322#pragma region ASSOCIATION_STRUCT_AND_APIs
324 {
325 NETSIM_ID d;
326 NETSIM_ID in;
327 struct stru_LTENR_ASSOCIATIONINFO* next;
328 }LTENR_ASSOCIATIONINFO, *ptrLTENR_ASSOCIATIONINFO;
329 void LTENR_ASSOCIATEINFO_ADD(NETSIM_ID d,
330 NETSIM_ID in,
331 NETSIM_ID rd,
332 NETSIM_ID rin);
333 void LTENR_ASSOCIATEINFO_REMOVE(NETSIM_ID d,
334 NETSIM_ID in,
335 NETSIM_ID rd,
336 NETSIM_ID rin);
337 ptrLTENR_ASSOCIATIONINFO LTENR_ASSOCIATEINFO_FIND(NETSIM_ID d,
338 NETSIM_ID in,
339 NETSIM_ID rd /*OPTIONAL, Return first association*/,
340 NETSIM_ID rin /*OPTIONAL, Return first association for rd*/);
341#define LTENR_ISASSOCIATED(d,in,rd,rin) (LTENR_ASSOCIATEINFO_FIND(d,in,rd,rin)!=NULL)
342 NETSIM_ID LTENR_FIND_ASSOCIATEINTERFACE(NETSIM_ID d, NETSIM_ID i, NETSIM_ID rd);
343#define LTENR_FIND_ASSOCIATEDGNB(ueId,ueIn) (isUE(ueId,ueIn)?LTENR_ASSOCIATEINFO_FIND(ueId,ueIn,0,0)->d:0)
344 void fn_NetSim_LTENR_InitAssociation();
345 void fn_NetSim_LTENR_RegisterCallBackForAssociation(void(*fnCallBack)(NETSIM_ID gnbId,
346 NETSIM_ID gnbIf,
347 NETSIM_ID ueId,
348 NETSIM_ID ueIf,
349 bool isAssociated));
350#pragma endregion
351
352#pragma region NGAP_PROTODATA
353 typedef struct stru_LTE_NR_NGAP_DATA {
354 NETSIM_ID d;
355 NETSIM_ID in;
356 NETSIM_IPAddress destIPaddr;
357 NETSIM_ID destid;
358 LTENR_INTERFACE_TYPE IFType;
359 _ptr_ele ele;
360 }LTE_NR_NGAP_DATA, *ptrLTE_NR_NGAP_DATA;
361#define LTENR_NGAP_DATA_ALLOC() (list_alloc(sizeof(LTE_NR_NGAP_DATA),offsetof(LTE_NR_NGAP_DATA,ele)))
362#define LTENR_NGAP_DATA_NEXT(info) (LIST_NEXT(info))
363#define LTENR_NGAP_DATA_ADD(info,e) (LIST_ADD_LAST(&(info),e))
364#define LTENR_NGAP_DATA_REMOVE(info,e) (LIST_REMOVE(&(info),e))
365#pragma endregion
366
367#pragma region PFCP_PROTODATA
368 typedef struct stru_LTE_NR_PFCP_DATA {
369 NETSIM_ID d;
370 NETSIM_ID in;
371 NETSIM_IPAddress destIPaddr;
372 NETSIM_ID destid;
373 LTENR_INTERFACE_TYPE IFType;
374 _ptr_ele ele;
375 }LTE_NR_PFCP_DATA, * ptrLTE_NR_PFCP_DATA;
376#define LTENR_PFCP_DATA_ALLOC() (list_alloc(sizeof(LTE_NR_PFCP_DATA),offsetof(LTE_NR_PFCP_DATA,ele)))
377#define LTENR_PFCP_DATA_NEXT(info) (LIST_NEXT(info))
378#define LTENR_PFCP_DATA_ADD(info,e) (LIST_ADD_LAST(&(info),e))
379#define LTENR_PFCP_DATA_REMOVE(info,e) (LIST_REMOVE(&(info),e))
380#pragma endregion
381
382#pragma region GTPU_PROTODATA
383 typedef struct stru_LTE_NR_GTPU_DATA {
384 NETSIM_ID d;
385 NETSIM_ID in;
386 NETSIM_IPAddress destIPaddr;
387 NETSIM_ID destid;
388 LTENR_INTERFACE_TYPE IFType;
389 _ptr_ele ele;
390 }LTE_NR_GTPU_DATA, * ptrLTE_NR_GTPU_DATA;
391#define LTENR_GTPU_DATA_ALLOC() (list_alloc(sizeof(LTE_NR_GTPU_DATA),offsetof(LTE_NR_GTPU_DATA,ele)))
392#define LTENR_GTPU_DATA_NEXT(info) (LIST_NEXT(info))
393#define LTENR_GTPU_DATA_ADD(info,e) (LIST_ADD_LAST(&(info),e))
394#define LTENR_GTPU_DATA_REMOVE(info,e) (LIST_REMOVE(&(info),e))
395#pragma endregion
396
397#pragma region GTPC_PROTODATA
399 NETSIM_ID d;
400 NETSIM_ID in;
401 NETSIM_IPAddress destIPaddr;
402 NETSIM_ID destid;
403 LTENR_INTERFACE_TYPE IFType;
404 _ptr_ele ele;
405 }LTE_NR_N11STACK_DATA, * ptrLTE_NR_N11STACK_DATA;
406#define LTENR_N11STACK_DATA_ALLOC() (list_alloc(sizeof(LTE_NR_N11STACK_DATA),offsetof(LTE_NR_N11STACK_DATA,ele)))
407#define LTENR_N11STACK_DATA_NEXT(info) (LIST_NEXT(info))
408#define LTENR_N11STACK_DATA_ADD(info,e) (LIST_ADD_LAST(&(info),e))
409#define LTENR_N11STACK_DATA_REMOVE(info,e) (LIST_REMOVE(&(info),e))
410#pragma endregion
411
412#pragma region NSA
413 typedef enum enum_LTENR_CELL_TYPES
414 {
415 CELL_TYPE_NONE,
416 MMWAVE_CELL_TYPE,
417 NON_MMWAVE_CELL_TYPE,
418 }LTENR_CELL_TYPES;
419
420 typedef enum enum_LTENR_NSA_MODES {
421 NSA_MODE_OPTION3,
422 NSA_MODE_OPTION3A,
423 NSA_MODE_OPTION3X,
424 NSA_MODE_OPTION4,
425 NSA_MODE_OPTION4A,
426 NSA_MODE_OPTION7,
427 NSA_MODE_OPTION7A,
428 NSA_MODE_OPTION7X,
429 NSA_MODE_LAST,
430 }LTENR_NSA_MODES;
431 static const char* strLTENR_NSA_MODES[] =
432 { "OPTION_3","OPTION_3A","OPTION_3X","OPTION_4","OPTION_4A","OPTION_7",
433 "OPTION_7A", "OPTION_7X","Unknown" };
434#pragma endregion
435
436#pragma region BLER_MCS_SELECTION
437 typedef enum
438 {
439 LTENR_ZERO_BLER,
440 LTENR_BLER_ENABLE,
441 }LTENR_BLER_MODEL;
442 static const char* strLTENR_BLER_MODEL[] =
443 { "ZERO_BLER", "BLER_ENABLE" };
444
445 typedef enum
446 {
447 LTENR_IDEAL_SHANNON_THEOREM_BASED_RATE,
448 LTENR_SHANNON_RATE_WITH_ATTENUATION_FACTOR,
449 }LTENR_MCS_SELECTION_MODEL;
450 static const char* strLTENR_MCS_SELECTION_MODEL[] =
451 { "IDEAL_SHANNON_THEOREM_BASED_RATE","SHANNON_RATE_WITH_ATTENUATION_FACTOR", };
452#pragma endregion
453
454#pragma region PROTODATA_AND_APIs
456 {
457 LTENR_DEVICETYPE deviceType;
458 NETSIM_ID deviceId;
459 NETSIM_ID interfaceId;
460 LTENR_INTERFACE_TYPE IFType;
461 MAC_LAYER_PROTOCOL macProtocol;
462
463 //Core
464 NETSIM_ID associateCount;
465 NETSIM_ID NGAP_COUNT;
466 bool isNGAPDATA;
467 ptrLTE_NR_NGAP_DATA NGAPDATA;
468
469 NETSIM_ID PFCP_COUNT;
470 bool isPFCPDATA;
471 ptrLTE_NR_PFCP_DATA PFCPDATA;
472
473 NETSIM_ID GTPU_COUNT;
474 bool isGTPUDATA;
475 ptrLTE_NR_GTPU_DATA GTPUDATA;
476
477 NETSIM_ID N11STACK_COUNT;
478 bool isN11STACK;
479 ptrLTE_NR_N11STACK_DATA N11STACKDATA;
480
481 char* connectedAMFName;
482 char* connectedSMFName;
483 char* connectedUPFName;
484
485 //Config parameter -- RRC
486 double T300;
487 double ueMeasurementReportPeriod;
488 double mibPeriod;
489 double sib1Period;
490 double InteruptionTime_ms;
491 //Config parameter -- PDCP
492 double discardTimer;
493 bool isHdrCompression;
494 bool isoutOfOrderDelivery;
495 double t_reorderingTimer;
496
497 //Config parameter -- RLC
498 char* maxRetxThreshold;
499 char* pollPdu;
500 char* pollBytes;
501 char* t_reassembly;
502 char* t_pollRetransmit;
503 char* t_statusProhibit;
504
505 //Config parameter -- MAC
506 char* schedulingType;
507 double EWMA_Learning_Rate;
508
509 //Config parameter -- HARQ
510 bool isHARQEnable;
511 UINT HARQ_ProcessCount;
512 UINT maxCBGPerTB; // 2,4,6,8
513 UINT HARQ_RetryLimit;
514
515 //Config parameter -- HandoverMargin
516 double HandoverMargin; //ms
517
518 //Config parameter -- TIME_TO_TRIGGER
519 double TTT; //ms
520
521 //Config parameter -- Network Slicing
522 bool isSlicing;
523 double GBRBiasLearningRate;
524 double nu_max;
525
526 //Config parameter -- OLLA
527 bool isOLLAEnable;
528 double targetBLER;
529
530 //BLER model
531 LTENR_BLER_MODEL blerModel;
532
533 //MCS Selection model
534 LTENR_MCS_SELECTION_MODEL mcsSelctionModel;
535 double alpha; //attenuation factor
536
537 ptrLTENR_ASSOCIATIONINFO associationInfo;
538 void* LTENR_LAYER_DATA[LTENR_DEVICETYPE_LAST][LTENR_SUBLAYER_LAST];
539
540 int series3GPP;
541 double CellIndividualOffset;
542
543 //Dual connectivity
544 bool isDCEnable;
545 bool isSNConnect;
546 LTENR_CELL_TYPES MasterCellType;
547 LTENR_CELL_TYPES SecCellType;
548 LTENR_NSA_MODES NSA_MODE;
549
550 //PFS RG UE
551 double DLrateGuarantee;
552 double ULrateGuarantee;
553 }LTENR_PROTODATA,*ptrLTENR_PROTODATA;
554 ptrLTENR_PROTODATA LTENR_PROTOCOLDATA_ALLOC(NETSIM_ID d,
555 NETSIM_ID in);
556 void LTENR_PROTOCOLDATA_FREE(NETSIM_ID d,
557 NETSIM_ID in);
558 void* LTENR_SUBLAYER_DATA_GET(NETSIM_ID d, NETSIM_ID in,
559 LTENR_DEVICETYPE devType,
560 LTENR_SUBLAYER subLayer);
561 void LTENR_SUBLAYER_DATA_SET(NETSIM_ID d, NETSIM_ID in,
562 LTENR_DEVICETYPE devType,
563 LTENR_SUBLAYER subLayer,
564 void* data);
565 bool LTENR_SUBLAYER_DATA_IsInitialized(NETSIM_ID d, NETSIM_ID in,
566 LTENR_DEVICETYPE devType,
567 LTENR_SUBLAYER subLayer);
568 ptrLTENR_PROTODATA LTENR_PROTODATA_GET(NETSIM_ID d, NETSIM_ID in);
569#define LTENR_UEPHY_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_PHY))
570#define LTENR_UEMAC_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_MAC))
571#define LTENR_UERLC_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_RLC))
572#define LTENR_UEMACSCHEDULER_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_MACSCHEDULER))
573#define LTENR_UEPDCP_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_PDCP))
574#define LTENR_UERRC_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_RRC))
575#define LTENR_UESDAP_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_SDAP))
576#define LTENR_GNBPHY_GET(d,i) ((ptrLTENR_GNBPHY)(LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_PHY)))
577#define LTENR_GNBMAC_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_MAC))
578#define LTENR_GNBRLC_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_RLC))
579#define LTENR_GNBMACSCHEDULER_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_MACSCHEDULER))
580#define LTENR_GNBPDCP_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_PDCP))
581#define LTENR_GNBRRC_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_RRC))
582#define LTENR_GNBSDAP_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_SDAP))
583#define LTENR_EPC_GET(d,i) (LTENR_SUBLAYER_DATA_GET(d,i,LTENR_DEVICETYPE_EPC,LTENR_SUBLAYER_EPC))
584
585 //5G core -- AMF
586#define LTENR_AMF_NGAP_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_AMF,LTENR_SUBLAYER_NGAP))
587#define LTENR_AMF_NGAP_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_AMF,LTENR_SUBLAYER_NGAP,data))
588#define LTENR_AMF_NAS_MM_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_AMF,LTENR_SUBLAYER_NAS_MM))
589#define LTENR_AMF_NAS_MM_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_AMF,LTENR_SUBLAYER_NAS_MM,data))
590
591 //5G core -- SMF
592#define LTENR_SMF_GTP_U_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_SMF,LTENR_SUBLAYER_GTP_U))
593#define LTENR_SMF_GTP_U_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_SMF,LTENR_SUBLAYER_GTP_U,data))
594#define LTENR_SMF_NAS_SM_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_SMF,LTENR_SUBLAYER_NAS_SM))
595#define LTENR_SMF_NAS_SM_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_SMF,LTENR_SUBLAYER_NAS_SM,data))
596#define LTENR_SMF_PFCP_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_SMF,LTENR_SUBLAYER_PFCP))
597#define LTENR_SMF_PFCP_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_SMF,LTENR_SUBLAYER_PFCP,data))
598
599 //5G core -- UPF
600#define LTENR_UPF_GTP_U_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_UPF,LTENR_SUBLAYER_GTP_U))
601#define LTENR_UPF_GTP_U_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_UPF,LTENR_SUBLAYER_GTP_U,data))
602#define LTENR_UPF_PFCP_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_UPF,LTENR_SUBLAYER_PFCP))
603#define LTENR_UPF_PFCP_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_UPF,LTENR_SUBLAYER_PFCP,data))
604
605 //5G core -- gNB
606#define LTENR_GNB_NGAP_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_NGAP))
607#define LTENR_GNB_NGAP_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_NGAP,data))
608#define LTENR_GNB_GTP_U_GET(d) (LTENR_SUBLAYER_DATA_GET(d,0,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_GTP_U))
609#define LTENR_GNB_GTP_U_SET(d,data) (LTENR_SUBLAYER_DATA_SET(d,0,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_GTP_U,data))
610
611#define LTENR_UEPHY_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_PHY,data))
612#define LTENR_UEMAC_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_MAC,data))
613#define LTENR_UERLC_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_RLC,data))
614#define LTENR_UEMACSCHEDULER_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_MACSCHEDULER,data))
615#define LTENR_UEPDCP_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_PDCP,data))
616#define LTENR_UERRC_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_RRC,data))
617#define LTENR_UESDAP_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_SDAP,data))
618#define LTENR_GNBPHY_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_PHY,data))
619#define LTENR_GNBMAC_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_MAC,data))
620#define LTENR_GNBRLC_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_RLC,data))
621#define LTENR_GNBMACSCHEDULER_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_MACSCHEDULER,data))
622#define LTENR_GNBPDCP_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_PDCP,data))
623#define LTENR_GNBRRC_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_RRC,data))
624#define LTENR_GNBSDAP_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_SDAP,data))
625#define LTENR_EPC_SET(d,i,data) (LTENR_SUBLAYER_DATA_SET(d,i,LTENR_DEVICETYPE_EPC,LTENR_SUBLAYER_EPC,data))
626#define LTENR_DEVICETYPE_GET(d,i) (LTENR_PROTODATA_GET(d,i)->deviceType)
627#define LTENR_DEVICETYPE_SET(d,i,type) (LTENR_PROTODATA_GET(d,i)->deviceType=type)
628#define LTENR_GNBPDCP_ISINIT(d,i) (LTENR_SUBLAYER_DATA_IsInitialized(d,i,LTENR_DEVICETYPE_GNB,LTENR_SUBLAYER_PDCP))
629#define LTENR_UEPDCP_ISINIT(d,i) (LTENR_SUBLAYER_DATA_IsInitialized(d,i,LTENR_DEVICETYPE_UE,LTENR_SUBLAYER_PDCP))
630#define isUE(d,i) (LTENR_DEVICETYPE_GET(d,i) == LTENR_DEVICETYPE_UE)
631#define isGNB(d,i) (LTENR_DEVICETYPE_GET(d,i) == LTENR_DEVICETYPE_GNB)
632#define isEPC(d,i) (LTENR_DEVICETYPE_GET(d,i) == LTENR_DEVICETYPE_EPC)
633#define isAMF(d) (LTENR_DEVICETYPE_GET(d,0) == LTENR_DEVICETYPE_AMF)
634#define isSMF(d) (LTENR_DEVICETYPE_GET(d,0) == LTENR_DEVICETYPE_SMF)
635#define isUPF(d) (LTENR_DEVICETYPE_GET(d,0) == LTENR_DEVICETYPE_UPF)
636#define isNONRANGNB(d) (LTENR_DEVICETYPE_GET(d,0) == LTENR_DEVICETYPE_GNB)
637#define setUE(d,i) (LTENR_DEVICETYPE_SET(d,i,LTENR_DEVICETYPE_UE))
638#define setGNB(d,i) (LTENR_DEVICETYPE_SET(d,i,LTENR_DEVICETYPE_GNB))
639#define setEPC(d,i) (LTENR_DEVICETYPE_SET(d,i,LTENR_DEVICETYPE_EPC))
640#define setAMF(d) (LTENR_DEVICETYPE_SET(d,0,LTENR_DEVICETYPE_AMF))
641#define setSMF(d) (LTENR_DEVICETYPE_SET(d,0,LTENR_DEVICETYPE_SMF))
642#define setUPF(d) (LTENR_DEVICETYPE_SET(d,0,LTENR_DEVICETYPE_UPF))
643#define LTENR_PDCP_GET(d,i) (isUE(d,i)?LTENR_UEPDCP_GET(d,i):(isGNB(d,i)?LTENR_GNBPDCP_GET(d,i):NULL))
644#define LTENR_RLC_GET(d,i) (isUE(d,i)?LTENR_UERLC_GET(d,i):(isGNB(d,i)?LTENR_GNBRLC_GET(d,i):NULL))
645#define LTENR_SDAP_GET(d,i) (isUE(d,i)?LTENR_UESDAP_GET(d,i):(isGNB(d,i)?LTENR_GNBSDAP_GET(d,i):NULL))
646#pragma endregion
647
648#pragma region INTERFERENCE_MODEL
649
650 typedef enum enum_LTENR_CELL_INTERFERENCE_TYPE {
651 NONE,
652 LTENR_GRADED_DISTANCE_BASED_WYNER_MODEL_INTERFERENCE,
653 LTENR_EXACT_GEOMETRIC_MODEL_INTERFERENCE,
654 LTENR_INTERFERENCE_OVER_THERMAL_INTERFERENCE
655 }LTENR_CELL_INTERFERENCEACE_TYPE;
656 static const char* strLTENR_CELL_INTERFERENCEACE_TYPE[] =
657 { "NO_INTERFERENCE","GRADED_DISTANCE_BASED_WYNER_MODEL","EXACT_GEOMETRIC_MODEL","INTERFERENCE_OVER_THERMAL" };
658
659 // Free the interference head for Wyner Model
660 void free_interference();
661#pragma endregion
662
663#pragma region FUN_DEF_FOR_CORE_INIT
664 //CORE
665 void fn_NetSim_LTENR_AMF_INIT(NETSIM_ID AMFID);
666 void fn_NetSim_LTENR_SMF_INIT(NETSIM_ID SMFID);
667 void fn_NetSim_LTENR_UPF_INIT(NETSIM_ID UPFID);
668 void fn_NetSim_LTENR_NON_RAN_GNB_INIT(NETSIM_ID GNBID);
669#pragma endregion
670
671#pragma region HELPER_APIs
672 //LTE_NR Helper
673 bool isLTE_NRInterface(NETSIM_ID d, NETSIM_ID i);
674 bool isLTENR_RANInterface(NETSIM_ID d, NETSIM_ID in);
675 NETSIM_ID fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(NETSIM_ID r);
676 bool fn_NetSim_LTENR_IS_S1_INTERFACE_EXISTS(NETSIM_ID d);
677 NETSIM_ID fn_NetSim_LTENR_CORE_INTERFACE(NETSIM_ID d, LTENR_INTERFACE_TYPE type);
678 bool fn_NetSim_isDeviceLTENR(NETSIM_ID r, NETSIM_ID rin);
679 NETSIM_ID LTENR_HELPER_Get_connected_interface(NETSIM_ID d, NETSIM_ID r);
680 NETSIM_ID fn_NetSim_LTENR_INTERFACE_ID_FROM_CONNECTED_DEVICE(NETSIM_ID d, NETSIM_ID in, NETSIM_ID r);
681 NETSIM_ID fn_NetSim_FIND_LTENR_INTERFACE(NETSIM_ID r);
682 NETSIM_ID fn_NetSim_FIND_LTE_INTERFACE(NETSIM_ID r);
683 NETSIM_ID fn_NetSim_LTENR_SEC_INTEFACE_FOR_UE(NETSIM_ID d, NETSIM_ID in);
684 NETSIM_ID fn_NetSim_LTENR_MASTER_INTEFACE_FOR_UE(NETSIM_ID d, NETSIM_ID in);
685 bool fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(NETSIM_ID d, NETSIM_ID in);
686 bool fn_NetSim_LTENR_NSA_IS_OPTION_X_EXISTS(NETSIM_ID d, NETSIM_ID in);
687 bool LTENR_GET_PACKET_FROM_ACCESS_BUFFER();
688 void fn_NetSim_LTENR_SNED_TO_XN_INTERFACE(NetSim_PACKET* packet, NETSIM_ID d, NETSIM_ID in,
689 NETSIM_ID r, NETSIM_ID rin, char* gateway, char* nexthop, bool flag);
690#pragma endregion
691
692#pragma region EPC_APIs
693 //LTE-NR EPC interface function
694 void LTENR_EPC_ASSOCIATION(NETSIM_ID epcId, NETSIM_ID epcIf,
695 NETSIM_ID gnbId, NETSIM_ID gnbIf,
696 NETSIM_ID ueId, NETSIM_ID ueIf);
697 void LTENR_EPC_ALLOC(NETSIM_ID d, NETSIM_ID in);
698 void LTENR_GNB_SETEPC(NETSIM_ID d, NETSIM_ID in,
699 NETSIM_ID* e, NETSIM_ID* ein);
700#pragma endregion
701
702#pragma region FUN_DEF_FOR_INTI_METRICS_APIs
703 //LTENR Interference
704 void LTENR_fn_InterferenceInit();
705 //LTENR CORE
706 void fn_NetSim_LTENR_CORE_Init();
707 //LTE-NR NAS
708 void fn_NetSim_LTENR_NAS_Init();
709
710 //LTE-NR SDAP interface function
711 void fn_NetSim_LTENR_SDAP_Init();
712 void fn_NetSim_LTENR_UESDAP_Init(NETSIM_ID ueId, NETSIM_ID ueIf);
713 void fn_NetSim_LTENR_GNBSDAP_Init(NETSIM_ID gnbId, NETSIM_ID gnbIf);
714 int fn_NetSim_LTENR_SDAP_Metrics_F(PMETRICSWRITER metricsWriter);
715 int fn_NetSim_LTENR_Cell_Metrics_F(PMETRICSWRITER metricsWriter);
716
717 // LTE-NR RRC interface function
718 void fn_NetSim_LTENR_RRC_Init();
719 void fn_NetSim_LTENR_UERRC_Init(NETSIM_ID ueId,
720 NETSIM_ID ueInterface);
721 void fn_NetSim_LTENR_GNBRRC_Init(NETSIM_ID gnbId,
722 NETSIM_ID gnbInterface);
723 bool fn_NetSim_LTENR_RRC_isConnected(NETSIM_ID d, NETSIM_ID in,
724 NETSIM_ID r, NETSIM_ID rin);
725 bool fn_NetSim_LTENR_RRC_isActive(NETSIM_ID d, NETSIM_ID in,
726 NETSIM_ID r, NETSIM_ID rin);
727
728 //LTE-NR RRC Conditiona Handover TTT function
729 void fn_NetSim_LTENR_Conditional_HO_TTT_Matrix_Add(NETSIM_ID gnbId, NETSIM_ID gnbIf,
730 NETSIM_ID ueId, NETSIM_ID ueIf);
731 void fn_NetSim_LTENR_Conditional_HO_TTT_Matrix_Remove(NETSIM_ID gnbId, NETSIM_ID gnbIf,
732 NETSIM_ID ueId, NETSIM_ID ueIf);
733 double fn_NetSim_LTENR_Conditional_HO_TTT_Matrix_Find(void* list,
734 NETSIM_ID ueID, NETSIM_ID targetID);
735 void fn_NetSim_LTENR_Conditional_HO_TTT_Matrix_Set(void* list,
736 NETSIM_ID ueID, NETSIM_ID targetID, double value);
737 void fn_NetSim_LTENR_Conditional_HO_TTT_Matrix_Free(NETSIM_ID gnbId, NETSIM_ID gnbIf);
738
739 //LTE-NR PDCP interface function
740 void fn_NetSim_LTENR_PDCP_Init();
741 void fn_NetSim_LTENR_UEPDCP_Init(NETSIM_ID ueId,
742 NETSIM_ID ueIf);
743 void fn_NetSim_LTENR_GNBPDCP_Init(NETSIM_ID gnbId,
744 NETSIM_ID gnbIf);
745
746 //LTE-NR RLC interface function
747 void fn_NetSim_LTENR_RLC_Init();
748 void fn_NetSim_LTENR_UERLC_Init(NETSIM_ID ueId, NETSIM_ID ueIf);
749 void fn_NetSim_LTENR_GNBRLC_Init(NETSIM_ID gnbId, NETSIM_ID gnbIf);
750 UINT fn_NetSim_LTENR_RLC_BufferStatusNotificaton(NETSIM_ID d, NETSIM_ID in,
751 NETSIM_ID r, NETSIM_ID rin,
752 LTENR_LOGICALCHANNEL logicalChannel);
753 void fn_NetSim_LTENR_RLC_TransmissionStatusNotification(NETSIM_ID d, NETSIM_ID in,
754 NETSIM_ID r, NETSIM_ID rin,
755 UINT size, LTENR_LOGICALCHANNEL logicalChannel);
756 // LTE-NR MAC Scheduler
757
758 //LTE-NR Multiplexer
759 int LTENR_Mutiplexer_LDPC_SelectBaseGraph(double TBS, double R);
760 void LTENR_Multiplexer_ComputeCodeBlockSize(int LDPCG, UINT TBS, UINT* C, UINT* cbs, UINT* cbs_);
761
762 //LTE-NR MAC interface function
763 void fn_NetSim_LTENR_MAC_Init();
764 void fn_NetSim_LTENR_GNBMAC_Init(NETSIM_ID gnbId, NETSIM_ID gnbIf);
765 void fn_NetSim_LTENR_UEMAC_Init(NETSIM_ID ueId, NETSIM_ID ueIf);
766 void LTENR_NotifyMACForStartingSlot();
767
768 //LTE-NR PHY interface function
769 void fn_NetSim_LTENR_GNBPHY_Init(NETSIM_ID gnbId, NETSIM_ID gnbIf);
770 void fn_NetSim_LTENR_UEPHY_Init(NETSIM_ID ueId, NETSIM_ID ueIf);
771 void fn_NetSim_LTENR_PHY_Init();
772 double LTENR_PHY_GetSlotEndTime(NETSIM_ID d, NETSIM_ID in);
773 void fn_NetSim_LTENR_HandlePhyOut();
774
775 //BLER Model
776 void LTENR_FreeBLERTable();
777 double LTENR_GetBLER(int tableId, int mcsIndex, int bg, int cbs, double sinr);
778 bool isBLEREnable(NETSIM_ID d, NETSIM_ID in);
779
780 //LTE-NR Radio Measurements log
781 void LTENR_RadioMeasurements_Init();
782 void LTENR_RadioMeasurements_Finish();
783 void LTENR_RadioMeasurements_PDSCH_Log(ptrLTENR_GNBPHY phy, int CA_ID,
784 ptrLTENR_ASSOCIATEDUEPHYINFO info);
785 void LTENR_RadioMeasurements_PUSCH_Log(ptrLTENR_GNBPHY phy, int CA_ID,
786 ptrLTENR_ASSOCIATEDUEPHYINFO info);
787 void LTENR_RadioMeasurements_PBSCH_Log(ptrLTENR_GNBPHY phy, int CA_ID,
788 ptrLTENR_ASSOCIATEDUEPHYINFO info);
789
790 //LTENR OLLA log
791 void LTENR_OLLA_Log_Init();
792 void LTENR_OLLA_Log_Finish();
793
794 //LTE-NR MSG
795 void LTENR_MSG_WriteTrace(NetSim_PACKET* packet, char* s);
796 void LTENR_MSG_WriteTrace_APP(NetSim_PACKET* packet, char* s);
797 //DC
798 void fn_NetSim_LTENR_NSA_SN_HANDOVER_INIT();
799#define isLTENRControlPacket(packet) ((packet)->nPacketType == PacketType_Control && ((packet)->nControlDataType/100 == MAC_PROTOCOL_LTE_NR || (packet)->nControlDataType/100 == MAC_PROTOCOL_LTE))
800#pragma endregion
801
802#pragma region FUN_DEF_LOGs_AND_APIs
803 //LTE-NR log
804 void fn_NetSim_LTE_MAC_PRBLOG();
805 void close_ltenr_PRB_log();
806 bool get_ltenr_log_status();
807 void print_ltenr_log(char* format, ...);
808 void print_ltenr_packet_log(NETSIM_ID d, NETSIM_ID in,
809 LTENR_SUBLAYER layer, NetSim_PACKET* packet,
810 bool isOut);
811 void fn_NetSim_LTE_HandoverLOG();
812 void close_ltenr_handover_log();
813
814 //LTE-NR Function def
815 void fn_NetSim_LTENR_EPC_RouteHOPacket();
816 void fn_NetSim_PHY_MOBILITY_HANDLE(NETSIM_ID d);
817
818 //LTE-NR PRB Utilization
819 void init_PRBUtilization();
820 void LTENR_PRBUtilization_AddEntry(NETSIM_ID gnbId,
821 UINT caId,
822 UINT sliceId,
823 int isUplink,
824 double allocatedPRB,
825 double slotStartTime,
826 double availablePRB,
827 UINT totalPRBs,
828 UINT controlPRBs);
829 void fn_NetSim_PRB_utilization_log_close();
830
831#define LTENR_SDAP_PRINT_PACKET_LOG_OUT() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_SDAP,pstruEventDetails->pPacket,true)
832#define LTENR_SDAP_PRINT_PACKET_LOG_IN() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_SDAP,pstruEventDetails->pPacket,false)
833#define LTENR_RRC_PRINT_PACKET_LOG_OUT() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_RRC,pstruEventDetails->pPacket,true)
834#define LTENR_RRC_PRINT_PACKET_LOG_IN() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_RRC,pstruEventDetails->pPacket,false)
835#define LTENR_PDCP_PRINT_PACKET_LOG_OUT() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_PDCP,pstruEventDetails->pPacket,true)
836#define LTENR_PDCP_PRINT_PACKET_LOG_IN() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_PDCP,pstruEventDetails->pPacket,false)
837#define LTENR_RLC_PRINT_PACKET_LOG_OUT() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_RLC,pstruEventDetails->pPacket,true)
838#define LTENR_RLC_PRINT_PACKET_LOG_IN() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_RLC,pstruEventDetails->pPacket,false)
839#define LTENR_MAC_PRINT_PACKET_LOG_OUT() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_MAC,pstruEventDetails->pPacket,true)
840#define LTENR_MAC_PRINT_PACKET_LOG_IN() print_ltenr_packet_log(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId,LTENR_SUBLAYER_MAC,pstruEventDetails->pPacket,false)
841#pragma endregion
842
843#pragma region GLOBAL_VARIABLE_AND_UITILITY
844 //CA
845#define MAX_CA_COUNT (16*2) /*For TDD - 16
846 * For FDD - 16 *(1 for DL & one for UL
847 */
848//BWP
849#define MAX_BWP_COUNT (4)
850#define MAX_LAYER_COUNT (16)
851
852
853 //LTENR-Utility
854 double str_to_time(char* time);
855 UINT str_to_bytes(char* bytes);
856#define CompareVal(arg0, arg1, op) \
857( \
858 (!_stricmp(op, ">")) ? (arg0 > arg1) :( \
859 (!_stricmp(op, ">=")) ? (arg0 >= arg1) :(\
860 (!_stricmp(op, "<")) ? (arg0 < arg1) :(\
861 (!_stricmp(op, "<=")) ? (arg0 <= arg1) :(\
862 (!_stricmp(op, "==")) ? (arg0 == arg1) :(\
863 (!_stricmp(op, "!=")) ? (arg0 != arg1) :false \
864))))))
865#pragma endregion
866
867#pragma region PACKET_APIs
868 //Core packet
869 void LTENR_Core_Send_Packet(NETSIM_ID src, NETSIM_ID dest,
870 NETSIM_IPAddress srcIP, NETSIM_IPAddress destIP,
871 void* hdr, UINT size,
872 NETSIM_ID packetType, char* szPacketType, NETSIM_ID type);
873 void LTENR_Handover_Send_Packet(NETSIM_ID src, NETSIM_ID dest,
874 NETSIM_IPAddress srcIP, NETSIM_IPAddress destIP,
875 void* hdr, UINT size,
876 NETSIM_ID packetType, char* szPacketType, NETSIM_ID type);
877
878
879 //GNB core
880 void gNB_N3_Forward_packet_to_RAN(NETSIM_ID d, NETSIM_ID in, NETSIM_ID rin, NetSim_PACKET* packet);
881 void gNB_N3_Forward_packet_to_MAC(NETSIM_ID d, NETSIM_ID rin, NetSim_PACKET* packet);
882 void fn_NetSim_LTENR_LTE_S1_CONTROL_PACKET_TO_RAN(NETSIM_ID d, NETSIM_ID RANIF, NetSim_PACKET* packet);
883#pragma endregion
884
885#pragma region DEBUGGER_FUN
886 //debugger function. use when necessary.
887 bool ltenr_validate_list(void* ls, UINT size, UINT next, char* file, UINT line);
888
889 //Fast Performance
890 void set_fast_performance();
891 void fn_NetSim_LTENR_GNB_XN_INTERFACE_INIT();
892#pragma endregion
893
894#pragma region CELL_LIST
895
896 typedef struct stru_LTENR_Cell_List {
897 NETSIM_ID d;
898 NETSIM_ID in;
899 _ptr_ele ele;
900 }LTENR_Cell_List, *ptrLTENR_Cell_List;
901 ptrLTENR_Cell_List gnbDCList;
902 ptrLTENR_Cell_List enbDCList;
903#define LTENR_Cell_List_ALLOC() (list_alloc(sizeof(LTENR_Cell_List),offsetof(LTENR_Cell_List,ele)))
904#define LTENR_Cell_List_NEXT(info) (LIST_NEXT(info))
905#define LTENR_Cell_List_ADD(info,e) (LIST_ADD_LAST(&(info),e))
906#define LTENR_Cell_List_REMOVE(info,e) (LIST_REMOVE(&(info),e))
907#pragma endregion
908
909#pragma region DC_SN_FUN
910 void fn_NetSim_LTENR_NSA_RECV();
911 void fn_NetSim_SN_HANDOVER_PACKET_HANDLER();
912 void LTENR_NSA_XN_INTERFACE_TO_RAN(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet);
913 NETSIM_ID fn_NetSim_LTENR_NSA_Splitting_Alogrithm_For_EPC(NETSIM_ID dest);
914#pragma endregion
915
916#pragma region XML_CONFIGURATION
917 int LTENR_ConvertStrToEnumWithErrorMsg(const char** enumstr, const char* str, int length, char* name);
918 #define LTENR_ConvertStrToEnum(enumName,val) LTENR_ConvertStrToEnumWithErrorMsg(str ## enumName, val, sizeof(str ## enumName)/sizeof(str ## enumName ## [0]), #enumName)
919#pragma endregion
920
921#pragma region GUI_PROTOCOL_LOG_READER
922 bool get_protocol_log_status(char* logname);
923#pragma endregion
924
925 //OLLA
926 void LTENR_OLLA_MarkTBSError(NETSIM_ID gNBId, NETSIM_ID gNBIf,
927 NETSIM_ID ueId, NETSIM_ID ueIf, bool isUplink,
928 UINT caId, UINT layerId);
929 void LTENR_OLLA_MarkTBSSuccess(NETSIM_ID gNBId, NETSIM_ID gNBIf,
930 NETSIM_ID ueId, NETSIM_ID ueIf, bool isUplink,
931 UINT caId, UINT layerId);
932 double LTENR_OLLA_GetDeltaSINR(NETSIM_ID gNBId, NETSIM_ID gNBIf,
933 NETSIM_ID ueId, NETSIM_ID ueIf, bool isUplink,
934 UINT caId, UINT layerId);
935 void test_olla(NETSIM_ID gNBId, NETSIM_ID gNBIf, NETSIM_ID ueId, NETSIM_ID ueIf);
936
937 //GBR UE
938 double LTENR_Configure_Rate_Guarantee_GBR_UEs_Config(NETSIM_ID UEId, bool isUplink);
939#ifdef __cplusplus
940}
941#endif
942#endif /* _NETSIM_LTE_NR_H_ */