25#pragma region HEADER_FILES
27#include "LTENR_Core.h"
28#include "LTENR_SMF_UPF.h"
31#pragma region FIND_AMF_VAR
32ptrLTENR_AMF_VAR LTENR_FIND_NGAP_AMF_VAR(NETSIM_ID AMFID, NETSIM_ID AMFIF) {
33 ptrLTENR_AMF_VAR var = LTENR_AMF_NGAP_GET(AMFID);
41ptrLTENR_AMF_VAR LTENR_FIND_GTP_C_AMF_VAR(NETSIM_ID AMFID, NETSIM_ID AMFIF) {
42 ptrLTENR_AMF_VAR var = LTENR_AMF_NAS_MM_GET(AMFID);
51#pragma region AMF_SELECTION
52NETSIM_ID LTENR_AMF_GetUeConnectedAmf(NETSIM_ID UEID, NETSIM_ID UEIF) {
53 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(UEID, UEIF);
54 return rrc->SelectedAMFID;
57NETSIM_ID LTENR_AMF_GetNewAMF(NETSIM_ID UEID, NETSIM_ID UEIF) {
58 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(UEID, UEIF);
59 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(rrc->SelectedCellID, rrc->SelectedCellIF);
60 return fn_NetSim_Stack_GetDeviceId_asName(pd->connectedAMFName);
64#pragma region ADDITION_OF_NODES
65void LTENR_AMF_AddgNB(NETSIM_ID AMFID, NETSIM_ID AMFIF,
66 NETSIM_ID gNBID, NETSIM_ID gNBIF) {
67 ptrLTENR_AMF_VAR AMFVar = LTENR_FIND_NGAP_AMF_VAR(AMFID, AMFIF);
68 ptrLTENR_AMF_INFO gnbInfo = LTENR_AMF_INFO_ALLOC();
70 gnbInfo->
gnbLTENRIF = fn_NetSim_LTENR_CORE_INTERFACE(gNBID, nGC_INTERFACE_RAN);
72 LTENR_AMF_INFO_ADD(AMFVar->
info, gnbInfo);
75void LTENR_AMF_AddSMF(NETSIM_ID AMFID, NETSIM_ID AMFIF,
76 NETSIM_ID SMFID, NETSIM_ID SMFIF, ptrLTENR_AMF_VAR AMFVar) {
77 ptrLTENR_AMF_SMF_Info smfInfo = calloc(1,
sizeof * smfInfo);
78 smfInfo->
SMFID = SMFID;
79 smfInfo->
SMFIF = SMFID;
83ptrLTENR_AMF_INFO LTENR_AMF_Find_gNB_Info(NETSIM_ID AMFID, NETSIM_ID AMFIF,
84 NETSIM_ID gNBID, NETSIM_ID gNBIF) {
85 ptrLTENR_AMF_VAR AMFVar = LTENR_FIND_NGAP_AMF_VAR(AMFID, AMFIF);
86 ptrLTENR_AMF_INFO info = AMFVar->
info;
88 if (info->gnbN2ID == gNBID && info->gnbN2IF == gNBIF)
90 info = LIST_NEXT(info);
95void LTENR_AMF_AddUE(NETSIM_ID AMFID, NETSIM_ID AMFIF,
96 NETSIM_ID gNBID, NETSIM_ID gNBIF,
97 NETSIM_ID UEID, NETSIM_ID UEIF) {
98 ptrLTENR_AMF_INFO info = LTENR_AMF_Find_gNB_Info(AMFID, AMFIF, gNBID, gNBIF);
99 ptr_LTENR_AMF_UE_LIST list = LTENR_AMF_UE_LIST_ALLOC();
102 LTENR_AMF_UE_LIST_ADD(info->ueList,list);
105void LTENR_AMF_DeleteUE(NETSIM_ID AMFID, NETSIM_ID AMFIF,
106 NETSIM_ID gNBID, NETSIM_ID gNBIF,
107 NETSIM_ID UEID, NETSIM_ID UEIF) {
108 ptrLTENR_AMF_INFO info = LTENR_AMF_Find_gNB_Info(AMFID, AMFIF, gNBID, gNBIF);
109 ptr_LTENR_AMF_UE_LIST list = info->ueList;
111 if (list->
UEID == UEID && list->
UEIF == UEIF)
112 LTENR_AMF_UE_LIST_REMOVE(info->ueList,list);
113 list = LIST_NEXT(list);
118#pragma region CREATE_SESSION_REQUEST
119void LTENR_AMF_CREATE_SESSION_REQUEST(ptrLTENR_CORE_HDR hdr, ptrLTENR_EPSBEARER bearer) {
121 ptrLTENR_AMF_SMF_CREATE_SESSION_REQUEST_MSG msg = calloc(1,
sizeof * msg);
122 msg->AMFID = hdr->
AMFID;
123 msg->AMFIF = hdr->
AMFIF;
124 msg->gNBID = hdr->
gNBID;
125 msg->gNBIF = hdr->
gNBIF;
126 msg->UEID = hdr->
UEID;
127 msg->UEIF = hdr->
UEIF;
128 msg->uli = hdr->
gNBID;
129 ptrLTENR_Bearer_Context bearerRequest = LTENR_Bearer_Context_ALLOC();
132 LTENR_Bearer_Context_ADD(msg->bearer, bearerRequest);
134 hdr->
msgType = LTENR_MSG_CORE_CREATE_SESSION_REQUEST;
136 ptrLTENR_GTPC_HEADER apphdr = fn_NetSim_LTENR_GTPC_DEFAULT_HEADER();
139 NETSIM_IPAddress srcIP = DEVICE_NWADDRESS(hdr->
AMFID,
140 fn_NetSim_LTENR_CORE_INTERFACE(hdr->
AMFID, nGC_INTERFACE_N11));
141 NETSIM_IPAddress destIP = DEVICE_NWADDRESS(hdr->
SMFID, hdr->
SMFIF);
142 LTENR_Core_Send_Packet(hdr->
AMFID, hdr->
SMFID, srcIP, destIP, hdr,
sizeof * hdr,
143 LTENR_MSG_CORE_CREATE_SESSION_REQUEST,
144 strLTENR_MSGTYPE[LTENR_MSG_CORE_CREATE_SESSION_REQUEST % (MAC_PROTOCOL_LTE_NR * 100)],
145 CreateSessionRequestID);
149#pragma region INITIAL_MSG_RECV
150void fn_NetSim_LTENR_AMF_INITIAL_MSG_RECV(ptrLTENR_CORE_HDR hdr) {
151 NETSIM_ID d = pstruEventDetails->nDeviceId;
152 NETSIM_ID in = pstruEventDetails->nInterfaceId;
157 ptrLTENR_CORE_HDR msg = calloc(1,
sizeof * msg);
158 memcpy(msg, hdr,
sizeof * msg);
161 ptrLTENR_EPSBEARER bearer = LTENR_EPSBEARER_Create_Default();
162 LTENR_AMF_CREATE_SESSION_REQUEST(msg, bearer);
166#pragma region INITIAL_CONTEXT_SETUP_RESPONSE_RECV
167void fn_NetSim_LTENR_SEC_CELL_SelectionAddition(NETSIM_ID UE_ID, NETSIM_ID UE_IF) {
168 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(UE_ID, UE_IF);
169 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(UE_ID, UE_IF);
170 if (data->isDCEnable && !rrc->isSNSconnected) {
171 NETSIM_ID ueInterface = fn_NetSim_LTENR_SEC_INTEFACE_FOR_UE(UE_ID, UE_IF);
172 NETSIM_ID SNID = fn_NetSim_LTENR_FIND_BEST_SN_CELL_FOR_UE(UE_ID, ueInterface);
174 NETSIM_ID SNIF = fn_NetSim_LTENR_INTERFACE_ID_FROM_CONNECTED_DEVICE(UE_ID, ueInterface, SNID);
175 fn_Netsim_NSA_Secondary_Cell_Addition(UE_ID, ueInterface, rrc->SelectedCellID,
176 rrc->SelectedCellIF, SNID, SNIF);
182void fn_NetSim_LTENR_AMF_INITIAL_CONTEXT_SETUP_RESPONSE_RECV(ptrLTENR_CORE_HDR hdr) {
185 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(hdr->
UEID, hdr->
UEIF);
186 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(hdr->
UEID, hdr->
UEIF);
187 rrc->ueCMState = UE_CM_CONNECTED;
188 NETSIM_ID UPFIF = fn_NetSim_LTENR_CORE_INTERFACE(hdr->
UPFID, nGC_INTERFACE_N3);
189 iptable_add(IP_WRAPPER_GET(hdr->
UPFID),
190 DEVICE_NWADDRESS(hdr->
UEID, hdr->
UEIF),
191 STR_TO_IP4(
"255.255.255.255"),
193 DEVICE_NWADDRESS(hdr->
gNBID, fn_NetSim_LTENR_CORE_INTERFACE(hdr->
gNBID, nGC_INTERFACE_N3)),
195 &DEVICE_NWADDRESS(hdr->
UPFID, fn_NetSim_LTENR_CORE_INTERFACE(hdr->
UPFID, nGC_INTERFACE_N3)),
202#pragma region INITIAL_CONTEXT_SETUP_REQUEST
203void fn_NetSim_LTENR_AMF_INITIAL_CONTEXT_SETUP_REQUEST(ptrLTENR_CORE_HDR hdr, ptrLTENR_Bearer_Setup bearer) {
204 hdr->
msgType = LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_REQUEST;
205 ptrLTENR_AMF_INITIAL_CONTEXT_REQUEST msg = calloc(1,
sizeof * msg);
206 msg->AMFID = hdr->
AMFID;
207 msg->gNBID = hdr->
gNBID;
208 msg->UEID = hdr->
UEID;
209 msg->pduSessionID = ++pduSessionID;
210 msg->bearer = bearer;
213 ptrLTENR_CORE_NGAP_HEADER apphdr = calloc(1,
sizeof * apphdr);
214 apphdr->
procedureCode = NGAP_PROCEDURECODE_INITIAL_CONTEXT_SETUP_REQUEST;
219 NETSIM_IPAddress srcIP = DEVICE_NWADDRESS(hdr->
AMFID,
220 fn_NetSim_LTENR_CORE_INTERFACE(hdr->
AMFID, nGC_INTERFACE_N1_N2));
221 NETSIM_IPAddress destIP = DEVICE_NWADDRESS(hdr->
gNBID,hdr->
gNBIF);
223 LTENR_Core_Send_Packet(hdr->
AMFID, hdr->
gNBID, srcIP, destIP, hdr,
sizeof * hdr,
224 LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_REQUEST,
225 strLTENR_MSGTYPE[LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_REQUEST % (MAC_PROTOCOL_LTE_NR * 100)],
226 InitialContextSetupRequestID);
230#pragma region AMF_CREATE_SESSION_RESPONSE_RECV
231void fn_NetSim_LTENR_AMF_CREATE_SESSION_RESPONSE_RECV(ptrLTENR_CORE_HDR hdr) {
232 ptrLTENR_AMF_SMF_CREATE_SESSION_RESPONSE_MSG msg = hdr->
msg;
233 ptrLTENR_Bearer_Activate bearer = msg->Bearer;
235 ptrLTENR_Bearer_Setup bearerSetup = LTENR_Bearer_Setup_ALLOC();
241 ptrLTENR_CORE_HDR temp_HDR = calloc(1,
sizeof * temp_HDR);
242 memcpy(temp_HDR, hdr,
sizeof * temp_HDR);
243 temp_HDR->
msgType = LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_REQUEST;
244 temp_HDR->
msg = NULL;
245 fn_NetSim_LTENR_AMF_INITIAL_CONTEXT_SETUP_REQUEST(temp_HDR, bearerSetup);
249#pragma region PATH_SWITCH_ACK
250void fn_NetSim_LTENR_GNB_CORE_PATH_SWITCH_ACK_MSG(ptrLTENR_HANDOVER_Hdr hdr) {
251 NETSIM_IPAddress destIP = DEVICE_NWADDRESS(hdr->targetCellID,
252 fn_NetSim_LTENR_CORE_INTERFACE(hdr->targetCellID, nGC_INTERFACE_N1_N2));
253 NETSIM_IPAddress srcIP = DEVICE_NWADDRESS(hdr->targetAMFID, hdr->targetAMFIF);
254 ptrLTENR_NAS_PATH_SWITCH_REQUEST_ACK msg = calloc(1,
sizeof * msg);
255 msg->targetGNBID = hdr->targetCellID;
256 msg->associatedEPCtoTarget = hdr->targetAMFID;
258 hdr->msgType = LTENR_MSG_NAS_HANDOVER_PATH_SWITCH_ACK;
260 ptrLTENR_CORE_NGAP_HEADER apphdr = calloc(1,
sizeof * apphdr);
264 hdr->apphdr = apphdr;
265 iptable_add(IP_WRAPPER_GET(hdr->targetAMFID),
267 STR_TO_IP4(
"255.255.255.255"),
276 LTENR_Core_Send_Packet(hdr->targetAMFID, hdr->targetCellID, srcIP, destIP, hdr,
sizeof * hdr,
277 LTENR_MSG_NAS_HANDOVER_PATH_SWITCH_ACK,
278 strLTENR_MSGTYPE[LTENR_MSG_NAS_HANDOVER_PATH_SWITCH_ACK % (MAC_PROTOCOL_LTE_NR * 100)],
283#pragma region MODIFY_BEARER_REQUEST
284void fn_NetSim_LTENR_AMF_MODIFY_BEARER_REQUEST(ptrLTENR_HANDOVER_Hdr hdr) {
285 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(hdr->UEID, hdr->UEIF);
286 hdr->msgType = LTENR_MSG_CORE_MODIFY_BEARER_REQUEST;
287 ptrLTENR_AMF_MODIFY_BEARER_REQUEST msg = calloc(1,
sizeof * msg);
288 msg->SAMFID = hdr->AMFID;
289 msg->SgNBID = hdr->serveringCellID;
290 msg->TgNBID = hdr->targetCellID;
291 msg->TAMFID = hdr->targetAMFID;
292 msg->UEID = hdr->UEID;
293 msg->bearer = (ptrLTENR_Bearer_Setup)rrc->bearer;
296 NETSIM_ID SMFIF = fn_NetSim_LTENR_CORE_INTERFACE(hdr->associateSMFID, nGC_INTERFACE_N11);
297 NETSIM_ID AMFIF = fn_NetSim_LTENR_CORE_INTERFACE(hdr->targetAMFID, nGC_INTERFACE_N11);
298 NETSIM_IPAddress destIP = DEVICE_NWADDRESS(hdr->associateSMFID, SMFIF);
299 NETSIM_IPAddress srcIP = DEVICE_NWADDRESS(hdr->targetAMFID, AMFIF);
301 LTENR_Core_Send_Packet(hdr->targetAMFID, hdr->associateSMFID, srcIP, destIP, hdr,
sizeof * hdr,
302 LTENR_MSG_CORE_MODIFY_BEARER_REQUEST,
303 strLTENR_MSGTYPE[LTENR_MSG_CORE_MODIFY_BEARER_REQUEST % (MAC_PROTOCOL_LTE_NR * 100)],
304 ModifyBearerRequestID);
308#pragma region PATH_SWITCH_RECV
309void fn_NetSim_SMF_UPF_LTENR_PATH_SWITCH_RECV(ptrLTENR_HANDOVER_Hdr hdr) {
310 ptrLTENR_HANDOVER_Hdr msg = calloc(1,
sizeof * msg);
311 memcpy(msg, hdr,
sizeof * msg);
313 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(hdr->targetCellID, hdr->targetCellIF);
314 NETSIM_ID UPFID = fn_NetSim_Stack_GetDeviceId_asName(data->connectedUPFName);
315 NETSIM_ID UPFIF = fn_NetSim_LTENR_CORE_INTERFACE(UPFID, nGC_INTERFACE_N3);
316 NETSIM_ID SgnbN2IF = fn_NetSim_LTENR_CORE_INTERFACE(hdr->serveringCellID, nGC_INTERFACE_N1_N2);
317 NETSIM_ID TgnbN2IF = fn_NetSim_LTENR_CORE_INTERFACE(hdr->targetCellID, nGC_INTERFACE_N1_N2);
319 if (!LTENR_AMF_Find_gNB_Info(hdr->targetAMFID, hdr->targetAMFIF, hdr->targetCellID, TgnbN2IF))
320 LTENR_AMF_AddgNB(hdr->targetAMFID, hdr->targetAMFIF, hdr->targetCellID, TgnbN2IF);
322 LTENR_AMF_DeleteUE(hdr->AMFID, hdr->AMFIF, hdr->serveringCellID, SgnbN2IF, hdr->UEID, hdr->UEIF);
323 LTENR_AMF_AddUE(hdr->targetAMFID, hdr->targetAMFIF, hdr->targetCellID, TgnbN2IF, hdr->UEID, hdr->UEIF);
325 iptable_delete(IP_WRAPPER_GET(UPFID),
326 DEVICE_NWADDRESS(hdr->UEID, hdr->UEIF),
327 DEVICE_NWADDRESS(UPFID, UPFIF),
"LTE_NR");
329 iptable_add(IP_WRAPPER_GET(UPFID),
330 DEVICE_NWADDRESS(hdr->UEID, hdr->UEIF),
331 STR_TO_IP4(
"255.255.255.255"),
333 DEVICE_NWADDRESS(hdr->targetCellID, fn_NetSim_LTENR_CORE_INTERFACE(hdr->targetCellID, nGC_INTERFACE_N3)),
335 &DEVICE_NWADDRESS(UPFID, fn_NetSim_LTENR_CORE_INTERFACE(UPFID, nGC_INTERFACE_N3)),
340 fn_NetSim_LTENR_AMF_MODIFY_BEARER_REQUEST(msg);
344#pragma region MODIFY_BEARER_RESPONSE_RECV
345void fn_NetSim_SMF_UPF_LTENR_MODIFY_BEARER_RESPONSE_RECV(ptrLTENR_HANDOVER_Hdr hdr) {
346 ptrLTENR_HANDOVER_Hdr msg = calloc(1,
sizeof * msg);
347 memcpy(msg, hdr,
sizeof * msg);
349 fn_NetSim_LTENR_GNB_CORE_PATH_SWITCH_ACK_MSG(msg);
353#pragma region AMF_OUT_AND_IN
354void fn_NetSim_LTENR_AMF_PACKET_HANDLER() {
355 NetSim_PACKET* packet = pstruEventDetails->pPacket;
356 NETSIM_ID d = pstruEventDetails->nDeviceId;
357 NETSIM_ID in = pstruEventDetails->nInterfaceId;
358 ptrLTENR_CORE_HDR hdr = NULL;
359 ptrLTENR_HANDOVER_Hdr handoverHdr = NULL;
361 switch (packet->nControlDataType)
363 case LTENR_MSG_CORE_INITIAL_UE_MESSAGE:
364 hdr = LTENR_CORE_HDR_GET_FROM_PACKET(packet, InitalUEMsgHDRID);
365 fn_NetSim_LTENR_AMF_INITIAL_MSG_RECV(hdr);
366 fn_NetSim_Packet_FreePacket(packet);
368 case LTENR_MSG_CORE_CREATE_SESSION_RESPONSE:
369 hdr = LTENR_CORE_HDR_GET_FROM_PACKET(packet, CreateSessionResponseID);
370 fn_NetSim_LTENR_AMF_CREATE_SESSION_RESPONSE_RECV(hdr);
371 fn_NetSim_Packet_FreePacket(packet);
373 case LTENR_MSG_CORE_INITIAL_CONTEXT_SETUP_RESPONSE:
374 hdr = LTENR_CORE_HDR_GET_FROM_PACKET(packet, InitialContextSetupResponseID);
375 fn_NetSim_LTENR_AMF_INITIAL_CONTEXT_SETUP_RESPONSE_RECV(hdr);
376 fn_NetSim_Packet_FreePacket(packet);
378 case LTENR_MSG_NAS_HANDOVER_PATH_SWITCH:
379 handoverHdr = LTENR_CORE_HDR_GET_FROM_PACKET(packet, nasPathSwitch);
380 fn_NetSim_SMF_UPF_LTENR_PATH_SWITCH_RECV(handoverHdr);
381 fn_NetSim_Packet_FreePacket(packet);
383 case LTENR_MSG_CORE_MODIFY_BEARER_RESPONSE:
384 handoverHdr = LTENR_CORE_HDR_GET_FROM_PACKET(packet, ModifyBearerResponseID);
385 fn_NetSim_SMF_UPF_LTENR_MODIFY_BEARER_RESPONSE_RECV(handoverHdr);
386 fn_NetSim_Packet_FreePacket(packet);
394#pragma region AMF_INIT
395void LTENR_AMF_N2_INTERFACE_INIT(NETSIM_ID AMFID) {
396 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(AMFID, 0);
397 ptrLTE_NR_NGAP_DATA list = data->NGAPDATA;
398 ptrLTENR_AMF_VAR var = NULL;
401 list->in = fn_NetSim_LTENR_CORE_INTERFACE(AMFID, list->IFType);
403 ptrLTENR_AMF_VAR info = LTENR_AMF_VAR_ALLOC();
404 info->amfN2ID = AMFID;
405 info->amfN2IF = AMFIF;
406 info->interfacetype = nGC_INTERFACE_N1_N2;
407 LTENR_AMF_VAR_ADD(var, info);
409 iptable_add(IP_WRAPPER_GET(AMFID),
411 STR_TO_IP4(
"255.255.255.255"),
415 &DEVICE_NWADDRESS(AMFID, AMFIF),
419 list = LTENR_NGAP_DATA_NEXT(list);
421 LTENR_AMF_NGAP_SET(AMFID, var);
424void LTENR_AMF_N11_INTERFACE_INIT(NETSIM_ID AMFID) {
425 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(AMFID, 0);
426 ptrLTE_NR_N11STACK_DATA list = data->N11STACKDATA;
427 ptrLTENR_AMF_VAR var = NULL;
430 list->in = fn_NetSim_LTENR_CORE_INTERFACE(AMFID, list->IFType);
432 ptrLTENR_AMF_VAR info = LTENR_AMF_VAR_ALLOC();
433 info->amfN2ID = AMFID;
434 info->amfN2IF = AMFIF;
435 info->interfacetype = nGC_INTERFACE_N11;
436 LTENR_AMF_VAR_ADD(var, info);
439 fn_NetSim_Stack_GetConnectedDevice(AMFID, AMFIF, &r, &rin);
440 LTENR_AMF_AddSMF(AMFID, AMFIF, r, rin, info);
442 iptable_add(IP_WRAPPER_GET(AMFID),
444 STR_TO_IP4(
"255.255.255.255"),
448 &DEVICE_NWADDRESS(AMFID, AMFIF),
452 list = LTENR_N11STACK_DATA_NEXT(list);
454 LTENR_AMF_NAS_MM_SET(AMFID, var);
457void fn_NetSim_LTENR_AMF_INIT(NETSIM_ID AMFID) {
458 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(AMFID, 0);
460 if (data->isN11STACK) {
461 LTENR_AMF_N11_INTERFACE_INIT(AMFID);
463 if (data->isNGAPDATA) {
464 LTENR_AMF_N2_INTERFACE_INIT(AMFID);
ptrLTENR_AMF_SMF_Info smfInfo
ptrLTENR_EPSBEARER epsBearer
ptrLTENR_FULLY_QUALIFIED_TEID smfte
ptrLTENR_EPSBEARER epsBearer
NETSIM_IPAddress transportLayerIP
ptrLTENR_EPSBEARER epsBearer
LTENR_CORE_NGAP_PROCEDURECODE procedureCode
NETSIM_IPAddress TXaddress