NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
LTENR_NSA.c
1/************************************************************************************
2* Copyright (C) 2023 *
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: Kumar Gaurav *
22* *
23* ----------------------------------------------------------------------------------*/
24#pragma region HEADER_FILES
25#include "LTENR_NSA.h"
26#include "LTENR_PHY.h"
27#include "LTENR_Core.h"
28#pragma endregion
29
30#pragma region SEC_CELL_ADDITION_RESPONSE
31void fn_Netsim_NSA_Secondary_Cell_Addition_Response(NETSIM_ID UEID, NETSIM_ID UEIF,
32 NETSIM_ID MGNBID, NETSIM_ID MGNBIF,
33 NETSIM_ID SGNBID, NETSIM_ID SGNBIF) {
34
35 ptrLTENR_SEC_NODE_ADD_HDR msg = calloc(1, sizeof * msg);
36 msg->UEID = UEID;
37 msg->UEIF = UEIF;
38 msg->MgNBID = MGNBID;
39 msg->MgNBIF = MGNBIF;
40 msg->SgNBID = SGNBID;
41 msg->SgNBIF = SGNBIF;
42
43 ptrLTENR_DC_HDR hdr = calloc(1, sizeof * hdr);
44 hdr->msg = msg;
45 hdr->msgType = LTENR_MSG_DC_SEC_CELL_ADDITION_RESPONSE;
46 NETSIM_IPAddress srcIP = NULL;
47 NETSIM_IPAddress destIP = NULL;
48 if (!fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(msg->MgNBID, msg->MgNBIF)) {
49 srcIP = DEVICE_NWADDRESS(SGNBID,
50 fn_NetSim_LTENR_CORE_INTERFACE(SGNBID, nGC_INTERFACE_XN));
51 destIP = DEVICE_NWADDRESS(MGNBID,
52 fn_NetSim_LTENR_CORE_INTERFACE(MGNBID, nGC_INTERFACE_XN));
53 }
54 else {
55 if (fn_NetSim_LTENR_IS_S1_INTERFACE_EXISTS(SGNBID)) {
56 srcIP = DEVICE_NWADDRESS(SGNBID,
57 fn_NetSim_LTENR_CORE_INTERFACE(SGNBID, nGC_INTERFACE_LTE_S1));
58 destIP = DEVICE_NWADDRESS(MGNBID,
59 fn_NetSim_LTENR_CORE_INTERFACE(MGNBID, nGC_INTERFACE_LTE_S1));
60 }
61 else {
62 srcIP = DEVICE_NWADDRESS(SGNBID,
63 fn_NetSim_LTENR_CORE_INTERFACE(SGNBID, nGC_INTERFACE_N3));
64 destIP = DEVICE_NWADDRESS(MGNBID,
65 fn_NetSim_LTENR_CORE_INTERFACE(MGNBID, nGC_INTERFACE_N3));
66 }
67 }
68
69 LTENR_Handover_Send_Packet(SGNBID, MGNBID, srcIP, destIP, hdr, sizeof * hdr,
70 LTENR_MSG_DC_SEC_CELL_ADDITION_RESPONSE,
71 strLTENR_MSGTYPE[LTENR_MSG_DC_SEC_CELL_ADDITION_RESPONSE % (MAC_PROTOCOL_LTE_NR * 100)],
72 DC_SN_CELL_ADDITION_RESPONSE);
73}
74void fn_Netsim_NSA_Secondary_Cell_Addition_Response_Recv(ptrLTENR_DC_HDR header) {
75 ptrLTENR_SEC_NODE_ADD_HDR msg = header->msg;
76 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(msg->UEID, msg->UEIF);
77 rrc->ueSNRRCState = UERRC_CONNECTED;
78 rrc->ueSNCMState = UE_CM_CONNECTED;
79 rrc->ueRRCState = UERRC_CONNECTED;
80 rrc->ueCMState = UE_CM_CONNECTED;
81 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(msg->SgNBID, msg->SgNBIF);
82 //path update msg mn to epc or amf
83 if (fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(msg->UEID, msg->UEIF) ||
84 fn_NetSim_LTENR_NSA_IS_OPTION_X_EXISTS(msg->UEID, msg->UEIF)) {
85 if (!fn_NetSim_LTENR_IS_S1_INTERFACE_EXISTS(msg->SgNBID)) {
86 NETSIM_ID upfID = fn_NetSim_Stack_GetDeviceId_asName(data->connectedUPFName);
87 NETSIM_ID UPFIF = fn_NetSim_LTENR_CORE_INTERFACE(upfID, nGC_INTERFACE_N3);
88 iptable_add(IP_WRAPPER_GET(upfID),
89 DEVICE_NWADDRESS(msg->UEID, msg->UEIF),
90 STR_TO_IP4("255.255.255.255"),
91 0,
92 DEVICE_NWADDRESS(msg->SgNBID, fn_NetSim_LTENR_CORE_INTERFACE(msg->SgNBID, nGC_INTERFACE_N3)),
93 1,
94 &DEVICE_NWADDRESS(upfID, fn_NetSim_LTENR_CORE_INTERFACE(upfID, nGC_INTERFACE_N3)),
95 &UPFIF,
96 1,
97 "LTE_NR");
98 }
99 }
100
101}
102#pragma endregion
103
104#pragma region SEC_CELL_ADDITION_REQ
105void fn_Netsim_NSA_Secondary_Cell_Addition(NETSIM_ID UEID, NETSIM_ID UEIF,
106 NETSIM_ID MGNBID, NETSIM_ID MGNBIF,
107 NETSIM_ID SGNBID, NETSIM_ID SGNBIF) {
108
109 ptrLTENR_SEC_NODE_ADD_HDR msg = calloc(1, sizeof * msg);
110 msg->UEID = UEID;
111 msg->UEIF = UEIF;
112 msg->MgNBID = MGNBID;
113 msg->MgNBIF = MGNBIF;
114 msg->SgNBID = SGNBID;
115 msg->SgNBIF = SGNBIF;
116
117 ptrLTENR_DC_HDR hdr = calloc(1, sizeof * hdr);
118 hdr->msg = msg;
119 hdr->msgType = LTENR_MSG_DC_SEC_CELL_ADDITION_REQUEST;
120 NETSIM_IPAddress srcIP = NULL;
121 NETSIM_IPAddress destIP = NULL;
122 if (!fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(msg->MgNBID, msg->MgNBIF)) {
123 srcIP = DEVICE_NWADDRESS(MGNBID,
124 fn_NetSim_LTENR_CORE_INTERFACE(MGNBID, nGC_INTERFACE_XN));
125 destIP = DEVICE_NWADDRESS(SGNBID,
126 fn_NetSim_LTENR_CORE_INTERFACE(SGNBID, nGC_INTERFACE_XN));
127 }
128 else {
129 if (fn_NetSim_LTENR_IS_S1_INTERFACE_EXISTS(MGNBID)) {
130 srcIP = DEVICE_NWADDRESS(MGNBID,
131 fn_NetSim_LTENR_CORE_INTERFACE(MGNBID, nGC_INTERFACE_LTE_S1));
132 destIP = DEVICE_NWADDRESS(SGNBID,
133 fn_NetSim_LTENR_CORE_INTERFACE(SGNBID, nGC_INTERFACE_LTE_S1));
134 }
135 else {
136 srcIP = DEVICE_NWADDRESS(MGNBID,
137 fn_NetSim_LTENR_CORE_INTERFACE(MGNBID, nGC_INTERFACE_N3));
138 destIP = DEVICE_NWADDRESS(SGNBID,
139 fn_NetSim_LTENR_CORE_INTERFACE(SGNBID, nGC_INTERFACE_N3));
140 }
141 }
142
143 LTENR_Handover_Send_Packet(MGNBID, SGNBID, srcIP, destIP, hdr, sizeof * hdr,
144 LTENR_MSG_DC_SEC_CELL_ADDITION_REQUEST,
145 strLTENR_MSGTYPE[LTENR_MSG_DC_SEC_CELL_ADDITION_REQUEST % (MAC_PROTOCOL_LTE_NR * 100)],
146 DC_SN_CELL_ADDITION_REQUEST);
147}
148
149void fn_Netsim_NSA_Secondary_Cell_Addition_Request_Recv(ptrLTENR_DC_HDR header) {
150 ptrLTENR_SEC_NODE_ADD_HDR msg = header->msg;
151 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(msg->UEID, msg->UEIF);
152 LTENR_ASSOCIATEINFO_ADD(msg->SgNBID, msg->SgNBIF, msg->UEID, msg->UEIF);
153 LTENR_PHY_ASSOCIATION(msg->SgNBID, msg->SgNBIF, msg->UEID, msg->UEIF, true);
154 LTENR_RLC_ASSOCIATION(msg->SgNBID, msg->SgNBIF, msg->UEID, msg->UEIF, true);
155 if (fn_NetSim_LTENR_NSA_IS_CORE_SPLIT_EXISTS(msg->UEID, msg->UEIF) ||
156 fn_NetSim_LTENR_NSA_IS_OPTION_X_EXISTS(msg->UEID, msg->UEIF))
157 LTENR_PDCP_ASSOCIATION(msg->SgNBID, msg->SgNBIF, msg->UEID, msg->UEIF, true);
158 //rrc->SelectedCellID = msg->SgNBID;
159 //rrc->SelectedCellIF = msg->SgNBIF;
160 fn_NetSim_Stack_AddDeviceTolink(msg->UEID, msg->UEIF, DEVICE_PHYLAYER(msg->SgNBID, msg->SgNBIF)->nLinkId);
161 fn_Netsim_NSA_Secondary_Cell_Addition_Response(msg->UEID, msg->UEIF, msg->MgNBID,
162 msg->MgNBIF, msg->SgNBID, msg->SgNBIF);
163}
164#pragma endregion
165
166#pragma region NSA_RECV
167void fn_NetSim_LTENR_NSA_RECV() {
168 NetSim_PACKET* packet = pstruEventDetails->pPacket;
169 ptrLTENR_DC_HDR hdr = NULL;
170 switch (packet->nControlDataType) {
171 case LTENR_MSG_DC_SEC_CELL_ADDITION_REQUEST:
172 hdr = LTENR_HANDOVER_HDR_GET_FROM_PACKET(packet, DC_SN_CELL_ADDITION_REQUEST);
173 fn_Netsim_NSA_Secondary_Cell_Addition_Request_Recv(hdr);
174 LTENR_HANDOVER_HDR_FREE_FROM_PACKET(packet, DC_SN_CELL_ADDITION_REQUEST);
175 break;
176 case LTENR_MSG_DC_SEC_CELL_ADDITION_RESPONSE:
177 hdr = LTENR_HANDOVER_HDR_GET_FROM_PACKET(packet, DC_SN_CELL_ADDITION_RESPONSE);
178 fn_Netsim_NSA_Secondary_Cell_Addition_Response_Recv(hdr);
179 LTENR_HANDOVER_HDR_FREE_FROM_PACKET(packet, DC_SN_CELL_ADDITION_REQUEST);
180 break;
181 default:
182 break;
183 }
184}
185#pragma endregion
186
187#pragma region NSA_XN_INTERFACE_TO_RLC
188void LTENR_NSA_XN_INTERFACE_TO_RAN(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet)
189{
190 NetSim_EVENTDETAILS pevent;
191 memset(&pevent, 0, sizeof pevent);
192 pevent.dEventTime = pstruEventDetails->dEventTime;
193 pevent.nDeviceId = d;
194 pevent.nDeviceType = DEVICE_TYPE(pevent.nDeviceId);
195 pevent.nEventType = TIMER_EVENT;
196 pevent.nInterfaceId = in;
197 pevent.pPacket = packet;
198 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(d, in);
199 LTENR_SET_SUBEVENT(pd, &pevent, LTENR_SUBEVENT_GENERATE_NSA_XN_TO_RAN);
200 fnpAddEvent(&pevent);
201}
202
203void LTENR_NSA_XN_INTERFACE_TO_RAN_Handle()
204{
205 LTENR_CallRLCOut();
206}
207#pragma endregion
208
209#pragma region NSA_INTI
210void fn_NetSim_LTENR_NSA_INIT() {
211 LTENR_SUBEVENT_REGISTER(LTENR_SUBEVENT_GENERATE_NSA_XN_TO_RAN,
212 "LTENR_NSA_XN_TO_RAN",
213 LTENR_NSA_XN_INTERFACE_TO_RAN_Handle);
214 DC_SN_CELL_ADDITION_REQUEST = LTENR_HDR_REGISTER("DC_SEC_CELL_ADDITION_REQUEST", NULL, NULL,
215 LTENR_NSA_DC_SN_CELL_ADDITION_REQUEST_FREEHDR, NULL);
216 DC_SN_CELL_ADDITION_RESPONSE = LTENR_HDR_REGISTER("DC_SEC_CELL_ADDITION_RESPONSE", NULL, NULL,
217 LTENR_NSA_DC_SN_CELL_ADDITION_RESPONSE_FREEHDR, NULL);
218}
219void LTENR_NSA_DC_SN_CELL_ADDITION_REQUEST_FREEHDR(ptrLTENR_DC_HDR hdr) {
220 ptrLTENR_SEC_NODE_ADD_HDR msg = hdr->msg;
221 free(msg);
222 free(hdr);
223
224}
225void LTENR_NSA_DC_SN_CELL_ADDITION_RESPONSE_FREEHDR(ptrLTENR_DC_HDR hdr) {
226 ptrLTENR_SEC_NODE_ADD_HDR msg = hdr->msg;
227 free(msg);
228 free(hdr);
229
230}
231#pragma endregion
232
233#pragma region NW_LAYER_XN
234void fn_NetSim_LTENR_SNED_TO_XN_INTERFACE(NetSim_PACKET* packet, NETSIM_ID d, NETSIM_ID in,
235 NETSIM_ID r, NETSIM_ID rin, char*gateway, char* nexthop, bool flag)
236{
237 NetSim_EVENTDETAILS pevent;
238 memset(&pevent, 0, sizeof pevent);
239 pevent.dEventTime = pstruEventDetails->dEventTime;
240 pevent.dPacketSize = packet->pstruNetworkData->dPacketSize;
241 pevent.nDeviceId = d;
242 pevent.nInterfaceId = fn_NetSim_LTENR_CORE_INTERFACE(pevent.nDeviceId, nGC_INTERFACE_XN);
243 pevent.nDeviceType = DEVICE_TYPE(pevent.nDeviceId);
244 pevent.nEventType = NETWORK_OUT_EVENT;
245 pevent.nPacketId = packet->nPacketId;
246 if (packet->pstruAppData)
247 {
248 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
249 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
250 }
251 ptrLTENR_XN_HDR hdr = calloc(1, sizeof * hdr);
252 hdr->gnbID = d;
253 hdr->gnbIF = in;
254 hdr->UEID = r;
255 hdr->UEIF = rin;
256 hdr->flag = flag;
257 hdr->gateway = gateway;
258 hdr->nexthop = nexthop;
259 hdr->msg = packet->pstruMacData->Packet_MACProtocol;
260 packet->pstruNetworkData->Packet_NetworkProtocol = hdr;
261 packet->pstruMacData->Packet_MACProtocol = NULL;
262 pevent.pPacket = packet;
263 pevent.nProtocolId = NW_PROTOCOL_IPV4;
264 fnpAddEvent(&pevent);
265
266}
267#pragma endregion
268
269#pragma region SPLITTING_ALGO
270NETSIM_ID fn_NetSim_LTENR_NSA_Splitting_Alogrithm_For_EPC(NETSIM_ID dest) {
271 NETSIM_ID in = fn_NetSim_Get_LTENR_INTERFACE_ID_FROM_DEVICE_ID(dest);
272 in = fn_NetSim_LTENR_MASTER_INTEFACE_FOR_UE(dest, in);
273 ptrLTENR_UERRC rrc = LTENR_UERRC_GET(dest, in);
274
275 if (!rrc->ueRRCState == UERRC_CONNECTED)
276 return 0;
277
278 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(dest, in);
279 NetSim_PACKET* packet = pstruEventDetails->pPacket;
280 if (data->isDCEnable) {
281 if (data->NSA_MODE == NSA_MODE_OPTION3A) {
282 if (packet->nQOS == QOS_GBR)//GRB LTE
283 return rrc->SelectedCellID;
284 else if(packet->nQOS != QOS_GBR && rrc->SNID)
285 return rrc->SNID;
286 else
287 return rrc->SelectedCellID;
288 }
289 if (data->NSA_MODE == NSA_MODE_OPTION3) {
290 return rrc->SelectedCellID;
291 }
292 }
293
294
295 if(!fn_NetSim_LTENR_NSA_IS_OPTION_X_EXISTS(dest, in)){
296 if (rrc->isAlternativePacket) {
297 rrc->isAlternativePacket = false;
298 if (rrc->SNID)
299 return rrc->SNID;
300 else
301 return rrc->SelectedCellID;
302 }
303 else {
304 rrc->isAlternativePacket = true;
305 if (rrc->SelectedCellID)
306 return rrc->SelectedCellID;
307 else
308 return rrc->SNID;
309 }
310 }
311 else {
312 if (rrc->SNID)
313 return rrc->SNID;
314 else
315 return rrc->SelectedCellID;
316 }
317}
318#pragma endregion