1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ProtocolIE-Field.h"
25 #include "ProtocolExtensionField.h"
26 #include "ProtocolIE-SingleContainer.h"
27 #include "F1SetupResponse.h"
28 #include "SuccessfulOutcome.h"
29 #include "InitiatingMessage.h"
30 #include "NonDynamic5QIDescriptor.h"
31 #include "AveragingWindow.h"
32 #include "MaxDataBurstVolume.h"
33 #include "Flows-Mapped-To-DRB-Item.h"
34 #include "SliceSupportItem.h"
35 #include "ServedPLMNs-Item.h"
37 #include "ULUPTNLInformation-ToBeSetup-Item.h"
38 #include "ULConfiguration.h"
39 #include "ModulationOrder.h"
41 #include "UE-CapabilityRAT-Container.h"
42 #include "UE-CapabilityRAT-ContainerList.h"
43 #include "UE-CapabilityRAT-ContainerListRRC.h"
44 #include "HandoverPreparationInformationRrc-IEs.h"
45 #include "HandoverPreparationInformationRrc.h"
46 #include "SupportedBandwidth.h"
47 #include "FeatureSetUplinkPerCC.h"
48 #include "FeatureSetDownlinkPerCC.h"
49 #include "FeatureSets.h"
50 #include "RF-Parameters.h"
51 #include "UE-NR-Capability.h"
52 #include "ProtocolExtensionContainer.h"
53 #include "CellGroupConfigRrc.h"
54 #include "MAC-CellGroupConfig.h"
55 #include "SchedulingRequestConfig.h"
56 #include "SchedulingRequestToAddMod.h"
57 #include "BSR-Config.h"
58 #include "TAG-Config.h"
60 #include "PHR-Config.h"
61 #include "RLC-Config.h"
62 #include "UL-AM-RLC.h"
63 #include "DL-AM-RLC.h"
64 #include "LogicalChannelConfig.h"
65 #include "RLC-BearerConfig.h"
66 #include "PhysicalCellGroupConfig.h"
67 #include "SpCellConfig.h"
68 #include "ServingCellConfig.h"
69 #include "ControlResourceSet.h"
70 #include "SearchSpace.h"
71 #include "PDCCH-Config.h"
72 #include "PDSCH-TimeDomainResourceAllocation.h"
73 #include "PDSCH-TimeDomainResourceAllocationList.h"
74 #include "DMRS-DownlinkConfig.h"
75 #include "PDSCH-Config.h"
76 #include "BWP-DownlinkDedicated.h"
77 #include "PUSCH-TimeDomainResourceAllocation.h"
78 #include "PUSCH-TimeDomainResourceAllocationList.h"
79 #include "DMRS-UplinkConfig.h"
80 #include "PUSCH-Config.h"
81 #include "SRS-ResourceId.h"
82 #include "SRS-Resource.h"
83 #include "SRS-ResourceSet.h"
84 #include "SRS-Config.h"
85 #include "PUCCH-Config.h"
86 #include "PUCCH-ResourceSet.h"
87 #include "PUCCH-Resource.h"
88 #include "PUCCH-format1.h"
89 #include "PUCCH-FormatConfig.h"
90 #include "BWP-UplinkDedicated.h"
91 #include "PUSCH-ServingCellConfig.h"
92 #include "UplinkConfig.h"
93 #include "PDSCH-ServingCellConfig.h"
94 #include "EUTRANQoS.h"
95 #include "GBR-QosInformation.h"
96 #include "DRBs-ToBeSetupMod-List.h"
97 #include "DRBs-ToBeSetupMod-Item.h"
98 #include "DRBs-Setup-Item.h"
99 #include "DLUPTNLInformation-ToBeSetup-List.h"
100 #include "DLUPTNLInformation-ToBeSetup-Item.h"
101 #include "UPTransportLayerInformation.h"
102 #include "GTPTunnel.h"
103 #include "QoSInformation.h"
104 #include "Cells-to-be-Activated-List.h"
105 #include "DL-CCCH-Message.h"
106 #include "SRB-ToAddModList.h"
107 #include "SRB-ToAddMod.h"
108 #include "RRCSetup-IEs.h"
109 #include "RRCSetup.h"
110 #include "DL-DCCH-Message.h"
111 #include "RRCReconfiguration-IEs.h"
112 #include "RRCReconfiguration.h"
113 #include "DRB-ToAddModList.h"
114 #include "DRB-ToAddMod.h"
115 #include "SDAP-Config.h"
117 #include "MeasTiming.h"
118 #include "MeasTimingList.h"
119 #include "MeasurementTimingConfigurationRrc-IEs.h"
120 #include "MeasurementTimingConfigurationRrc.h"
121 #include "PDCP-Config.h"
122 #include "RSRP-Range.h"
123 #include "RSRQ-Range.h"
124 #include "SINR-Range.h"
125 #include "ThresholdNR.h"
126 #include "MeasObjectToAddMod.h"
127 #include "MeasObjectNR.h"
128 #include "MeasObjectToAddModList.h"
129 #include "EventTriggerConfig.h"
130 #include "ReportConfigNR.h"
131 #include "ReportConfigToAddMod.h"
132 #include "ReportConfigToAddModList.h"
133 #include "MeasIdToAddMod.h"
134 #include "MeasIdToAddModList.h"
135 #include "FilterCoefficient.h"
136 #include "QuantityConfigNR.h"
137 #include "QuantityConfig.h"
138 #include "MeasConfigRrc.h"
139 #include "AS-Config.h"
140 #include "RRCReconfiguration-v1530-IEs.h"
141 #include "CNUEPagingIdentity.h"
142 #include "PagingCell-Item.h"
143 #include "UL-DCCH-Message.h"
144 #include "DRX-ConfigRrc.h"
146 #include "cu_stub_sctp.h"
147 #include "cu_stub_egtp.h"
148 #include "cu_f1ap_msg_hdl.h"
151 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
152 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
154 /*******************************************************************
156 * @brief Sends F1 msg over SCTP
160 * Function : SendF1APMsg
162 * Functionality: Sends F1 msg over SCTP
164 * @params[in] Region region
166 * @return ROK - success
169 * ****************************************************************/
170 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
172 Buffer *mBuf = NULLP;
174 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
176 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
178 ODU_PRINT_MSG(mBuf, 0,0);
180 if(sctpSend(F1_INTERFACE, duId, mBuf) != ROK)
182 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
183 ODU_PUT_MSG_BUF(mBuf);
189 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
190 ODU_PUT_MSG_BUF(mBuf);
193 ODU_PUT_MSG_BUF(mBuf);
197 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
204 /********************************************************************
206 * @brief Builds and sends the F1SetupResponse
210 * Function : BuildAndSendF1SetupRsp
212 * Functionality: Constructs the F1SetupResponse message and sends
213 * it back to the DU through SCTP.
215 * @params[in] void **buf,Buffer to which encoded pattern is written into
216 * @params[in] int *size,size of buffer
218 * @return ROK - success
221 * ****************************************************************/
222 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
225 uint8_t elementCnt,cellCnt;
226 F1AP_PDU_t *f1apMsg = NULL;
227 F1SetupResponse_t *f1SetupRsp = NULL;
228 GNB_CU_Name_t *cuName = NULL;
229 Cells_to_be_Activated_List_t *cellToActivate;
230 RRC_Version_t *rrcVer = NULL;
231 asn_enc_rval_t encRetVal;
232 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
234 /* Allocate the memory for F1SetupRequest_t */
235 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
238 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
241 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
243 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
244 if(f1apMsg->choice.successfulOutcome == NULLP)
246 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
247 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
251 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
252 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
253 f1apMsg->choice.successfulOutcome->value.present = \
254 SuccessfulOutcome__value_PR_F1SetupResponse;
255 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
258 f1SetupRsp->protocolIEs.list.count = elementCnt;
259 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
261 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
262 elementCnt * sizeof(F1SetupResponseIEs_t *));
263 if(f1SetupRsp->protocolIEs.list.array == NULLP)
265 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
266 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
267 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
271 for(idx=0; idx<elementCnt; idx++)
273 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
274 sizeof(F1SetupResponseIEs_t));
275 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
277 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
278 elementCnt * sizeof(F1SetupResponseIEs_t *));
279 CU_FREE(f1apMsg->choice.successfulOutcome, \
280 sizeof(SuccessfulOutcome_t));
281 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
288 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
289 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
290 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
291 F1SetupResponseIEs__value_PR_TransactionID;
292 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
295 /* CU name IE is of type printableString_t which wireshark is unable to decode.
296 * However this string is decoded successfully on online decoders.
297 * Since this is an optional IE and the value received in it are not
298 * used as of now, eliminating this IE for now to avoid wireshark error.
302 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
303 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
304 f1SetupRsp->protocolIEs.list.array[idx]->value.present = F1SetupResponseIEs__value_PR_GNB_CU_Name;
305 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
306 cuName->size = strlen((char *)cuCb.cuCfgParams.cuName);
308 CU_ALLOC(cuName->buf, cuName->size);
309 if(cuName->buf == NULLP)
311 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
313 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
315 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
316 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
317 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
320 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
323 /*Cells to be activated list*/
325 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cells_to_be_Activated_List ;
326 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
327 f1SetupRsp->protocolIEs.list.array[idx]->value.present = F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
328 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.Cells_to_be_Activated_List;
331 cellToActivate->list.count = cellCnt;
332 cellToActivate->list.size = cellCnt * sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
333 CU_ALLOC(cellToActivate->list.array, sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
334 if(cellToActivate->list.array == NULLP)
336 CU_FREE(cuName->buf, sizeof(cuName->size));
337 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
339 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
341 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
342 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
343 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
346 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
348 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
349 if(cellToActivate->list.array[ieIdx] == NULLP)
351 CU_FREE(cellToActivate->list.array, sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
352 CU_FREE(cuName->buf, sizeof(cuName->size));
353 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
355 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
357 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
358 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
359 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
363 cellToActivate->list.array[0]->id = \
364 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
365 cellToActivate->list.array[0]->criticality = Criticality_ignore;
366 cellToActivate->list.array[0]->value.present = \
367 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
368 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
369 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
370 CU_ALLOC(cellToActivate->list.array[0]->\
371 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
373 if(cellToActivate->list.array[0]->value.choice.\
374 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
377 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
379 CU_FREE(cellToActivate->list.array[ieIdx],\
380 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
383 CU_FREE(cellToActivate->list.array,\
384 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
385 CU_FREE(cuName->buf, sizeof(cuName->size));
386 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
388 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
389 sizeof(F1SetupResponseIEs_t));
391 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
392 elementCnt * sizeof(F1SetupResponseIEs_t *));
393 CU_FREE(f1apMsg->choice.successfulOutcome, \
394 sizeof(SuccessfulOutcome_t));
395 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
398 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
399 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
400 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
401 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
402 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
403 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
404 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
405 nRCGI.nRCellIdentity.size);
406 if(cellToActivate->list.array[0]->value.choice.\
407 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
409 CU_FREE(cellToActivate->list.array[0]->\
410 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
412 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
414 CU_FREE(cellToActivate->list.array[ieIdx],\
415 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
418 CU_FREE(cellToActivate->list.array,\
419 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
420 CU_FREE(cuName->buf, sizeof(cuName->size));
421 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
423 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
424 sizeof(F1SetupResponseIEs_t));
426 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
427 elementCnt * sizeof(F1SetupResponseIEs_t *));
428 CU_FREE(f1apMsg->choice.successfulOutcome, \
429 sizeof(SuccessfulOutcome_t));
430 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
433 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
437 f1SetupRsp->protocolIEs.list.array[idx]->id = \
438 ProtocolIE_ID_id_GNB_CU_RRC_Version;
439 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
440 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
441 F1SetupResponseIEs__value_PR_RRC_Version;
442 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
443 rrcVer->latest_RRC_Version.size = RRC_SIZE;
445 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
446 if(rrcVer->latest_RRC_Version.buf == NULLP)
448 CU_FREE(cuName->buf, sizeof(cuName->size));
449 for(ieIdx=0; ieIdx<elementCnt; idx++)
451 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
452 sizeof(F1SetupResponseIEs_t));
454 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
455 elementCnt * sizeof(F1SetupResponseIEs_t *));
456 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
457 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
461 /* Need to check RRC Version */
462 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
463 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
464 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
465 if(rrcVer->iE_Extensions == NULLP)
467 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
468 CU_FREE(cuName->buf, sizeof(cuName->size));
469 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
471 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
472 sizeof(F1SetupResponseIEs_t));
474 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
475 elementCnt * sizeof(F1SetupResponseIEs_t *));
476 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
477 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
480 rrcVer->iE_Extensions->list.count = 1;
481 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
482 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
483 sizeof(struct RRC_Version_ExtIEs *));
484 if(rrcVer->iE_Extensions->list.array == NULLP)
486 CU_FREE(rrcVer->iE_Extensions,\
487 sizeof(ProtocolExtensionContainer_4624P81_t));
488 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
489 CU_FREE(cuName->buf, sizeof(cuName->size));
490 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
492 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
493 sizeof(F1SetupResponseIEs_t));
495 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
496 elementCnt * sizeof(F1SetupResponseIEs_t *));
497 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
498 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
501 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
502 sizeof(struct RRC_Version_ExtIEs));
503 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
505 CU_FREE(rrcVer->iE_Extensions->list.array,\
506 sizeof(struct RRC_Version_ExtIEs *));
507 CU_FREE(rrcVer->iE_Extensions,\
508 sizeof(ProtocolExtensionContainer_4624P81_t));
509 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
510 CU_FREE(cuName->buf, sizeof(cuName->size));
511 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
513 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
514 sizeof(F1SetupResponseIEs_t));
516 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
517 elementCnt * sizeof(F1SetupResponseIEs_t *));
518 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
519 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
522 rrcVer->iE_Extensions->list.array[0]->id = \
523 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
524 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
525 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
526 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
527 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
528 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
529 CU_ALLOC(rrcVer->iE_Extensions->list.\
530 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
532 if(rrcVer->iE_Extensions->list.\
533 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
535 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
536 sizeof(struct RRC_Version_ExtIEs));
537 CU_FREE(rrcVer->iE_Extensions->list.array,\
538 sizeof(struct RRC_Version_ExtIEs *));
539 CU_FREE(rrcVer->iE_Extensions,\
540 sizeof(ProtocolExtensionContainer_4624P81_t));
541 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
542 CU_FREE(cuName->buf, sizeof(cuName->size));
543 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
545 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
546 sizeof(F1SetupResponseIEs_t));
548 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
549 elementCnt * sizeof(F1SetupResponseIEs_t *));
550 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
551 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
554 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
555 Latest_RRC_Version_Enhanced.buf[0] = 0;
556 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
557 Latest_RRC_Version_Enhanced.buf[1] = 5;
558 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
559 Latest_RRC_Version_Enhanced.buf[2] = 15;
561 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
563 /* Encode the F1SetupRequest type as UPER */
564 memset(encBuf, 0, ENC_BUF_MAX_LEN);
566 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
570 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
572 CU_FREE(cuName->buf, cuName->size);
573 for(idx=0; idx<elementCnt; idx++)
575 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
577 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
578 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
579 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
581 /* Check encode results */
582 if(encRetVal.encoded == ENCODE_FAIL)
584 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
585 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
590 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
591 for(int i=0; i< encBufSize; i++)
593 DU_LOG("%x",encBuf[i]);
598 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
600 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
605 }/* End of BuildAndSendF1SetupRsp */
607 /*******************************************************************
609 * @brief Builds and sends the DUUpdateAcknowledge
613 * Function : BuildAndSendDUUpdateAck
615 * Functionality: Constructs the DU Update Acknowledge message and sends
616 * it to the DU through SCTP.
620 * @return ROK - success
623 * ****************************************************************/
625 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
629 F1AP_PDU_t *f1apMsg = NULL;
630 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
631 asn_enc_rval_t enRetVal; /* Encoder return value */
633 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
635 /* Allocate the memory for F1SetupRequest_t */
636 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
639 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
643 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
645 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
646 if(f1apMsg->choice.successfulOutcome == NULLP)
648 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
649 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
653 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
654 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
655 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
656 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
659 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
660 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
662 /* Initialize the F1Setup members */
663 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
664 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
666 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
667 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
668 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
672 for(idx=0; idx<elementCnt; idx++)
674 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
675 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
677 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
678 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
679 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
686 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
687 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
688 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
689 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
690 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
692 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
694 /* Encode the F1SetupRequest type as UPER */
695 memset(encBuf, 0, ENC_BUF_MAX_LEN);
697 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
700 for(idx=0; idx<elementCnt; idx++)
702 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
704 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
705 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
706 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
708 /* Checking encode results */
709 if(enRetVal.encoded == ENCODE_FAIL)
711 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
712 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
717 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
718 for(int i=0; i< encBufSize; i++)
720 DU_LOG("%x",encBuf[i]);
725 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
726 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
728 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
734 }/* End of BuildAndSendDUUpdateAck*/
736 /*******************************************************************
738 * @brief deallocating the memory of F1reset msg
742 * Function : FreeF1ResetReq
745 * - freeing memory of F1reset request msg
751 * ****************************************************************/
752 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
755 Reset_t *f1ResetMsg = NULLP;
759 if(f1apMsg->choice.initiatingMessage)
761 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
762 if(f1ResetMsg->protocolIEs.list.array)
764 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
766 if(f1ResetMsg->protocolIEs.list.array[idx])
768 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
771 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
773 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
775 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
778 /*******************************************************************
780 * @brief build ansld ans send f1reset msg
784 * Function : BuildAndSendF1ResetReq
786 * Functionality: build and send f1reset msg
788 * @return ROK - success
791 * ****************************************************************/
792 uint8_t BuildAndSendF1ResetReq()
794 uint8_t elementCnt=0;
796 uint8_t ret= RFAILED;
797 Reset_t *f1ResetMsg = NULLP;
798 F1AP_PDU_t *f1apMsg = NULLP;
799 asn_enc_rval_t encRetVal;
800 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
803 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
806 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
809 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
810 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
811 if(f1apMsg->choice.initiatingMessage == NULLP)
813 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
816 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
817 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
818 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
820 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
823 f1ResetMsg->protocolIEs.list.count = elementCnt;
824 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
826 /* Initialize the F1Reset members */
827 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
828 if(f1ResetMsg->protocolIEs.list.array == NULLP)
830 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
833 for(idx=0; idx<elementCnt; idx++)
835 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
836 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
838 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
845 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
846 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
847 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
848 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
852 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
853 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
854 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
855 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
856 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
860 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
861 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
862 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
863 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
864 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
866 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
868 /* Encode the F1SetupRequest type as APER */
869 memset(encBuf, 0, ENC_BUF_MAX_LEN);
871 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
875 if(encRetVal.encoded == ENCODE_FAIL)
877 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
878 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
883 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
884 for(idx=0; idx< encBufSize; idx++)
886 DU_LOG("%x",encBuf[idx]);
890 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
891 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
893 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
901 FreeF1ResetReq(f1apMsg);
905 /*******************************************************************
907 * @brief Fills Radio Bearer Config
911 * Function : fillSrbCfg
913 * Functionality: Fills Radio Bearer Config
915 * @params[in] SRB_ToAddModList *
917 * @return ROK - success
920 * ****************************************************************/
921 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
923 uint8_t elementCnt = 0;
924 uint8_t idx, ieId, srbIdx = 0;
926 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
928 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
932 if(bearerCfg != NULLP)
934 bearerCfg->list.count = elementCnt;
935 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
936 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
937 if(bearerCfg->list.array != NULLP)
939 for(idx = 0; idx < elementCnt; idx++)
941 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
942 if(bearerCfg->list.array[idx] == NULLP)
944 for(ieId = 0; ieId < idx; ieId++)
946 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
948 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
955 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
960 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
962 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
963 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
969 /*******************************************************************
971 * @brief Fills Master CellGroup Info
975 * Function : fillMasterCellGroup
977 * Functionality: Fills Master Cell Group IE
979 * @params[in] RRCSetup_IEs_t *
981 * @return ROK - success
984 * ****************************************************************/
986 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
989 masterCellGroup->buf = NULLP;
990 if(ueCb->f1apMsgDb.duToCuContainer.buf)
992 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
993 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
994 if(masterCellGroup->buf != NULLP)
996 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1000 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1011 /*******************************************************************
1013 * @brief Fills RRC setup IE
1017 * Function : fillRRCSetupIE
1019 * Functionality: Fills RRC Setup IE
1021 * @params[in] RRCSetup_IEs_t *
1023 * @return ROK - success
1026 * ****************************************************************/
1028 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1030 uint8_t ret = ROK, srbIdx = 0;
1033 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1034 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1036 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1040 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1044 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1048 /* If SRB configuration are filled successfully in RRC Setup, mark these
1049 * configurartion as sent to UE */
1050 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1052 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1053 ueCb->srbList[srbIdx].cfgSentToUe = true;
1058 /*******************************************************************
1060 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1064 * Function : fillDlCcchRrcMsg
1066 * Functionality: Fills DL DCCCH Message required for
1067 * DLRRCMessageTransfer
1069 * @params[in] RRCContainer_t *rrcContainer
1071 * @return ROK - success
1074 * ****************************************************************/
1076 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1080 DL_CCCH_Message_t dl_CCCH_Msg;
1081 asn_enc_rval_t encRetVal;
1083 if(rrcContainer != NULLP)
1085 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1087 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1088 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1090 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1091 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1092 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1094 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1095 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1096 RRCSetup__criticalExtensions_PR_rrcSetup;
1098 /* Fill RRC Setup IE */
1099 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1100 sizeof(RRCSetup_IEs_t));
1101 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1103 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1107 /* encode DL-CCCH message into RRC Container */
1108 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1109 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1111 encRetVal = uper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1112 /* Encode results */
1113 if(encRetVal.encoded == ENCODE_FAIL)
1115 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1116 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1121 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1122 for(int i = 0; i< encBufSize; i++)
1124 DU_LOG("%x",encBuf[i]);
1126 rrcContainer->size = encBufSize;
1127 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1128 if(rrcContainer->buf != NULLP)
1130 memset(rrcContainer->buf, 0, encBufSize);
1131 for(idx2 = 0; idx2 < encBufSize; idx2++)
1133 rrcContainer->buf[idx2] = encBuf[idx2];
1145 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1151 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1157 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1163 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1168 /*******************************************************************
1170 * @brief Fills QOS flow configuration
1174 * Function : fillQosFlowsToAdd
1176 * Functionality: Fills QOS flow configuration
1178 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1180 * @return ROK - success
1183 * ****************************************************************/
1184 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1186 uint8_t idx, ied, elementCnt;
1189 qosFlow->list.count = elementCnt;
1190 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1191 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1192 if(qosFlow->list.array != NULLP)
1194 for(idx = 0; idx < elementCnt; idx++)
1196 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1197 if(qosFlow->list.array[idx] == NULLP)
1199 for(ied = 0; ied < idx; ied++)
1201 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1203 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1209 *qosFlow->list.array[idx] = 9;
1213 /*******************************************************************
1215 * @brief Fills CN Assoc for Drb to Add/Mod List
1219 * Function : fillCnAssoc
1221 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1223 * @params[in] struct DRB_ToAddMod__cnAssociation *
1225 * @return ROK - success
1228 * ****************************************************************/
1230 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1234 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1235 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1237 cnAssoc->choice.eps_BearerIdentity = 5;
1239 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1241 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1242 if(cnAssoc->choice.sdap_Config)
1244 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1245 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1246 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1247 cnAssoc->choice.sdap_Config->defaultDRB = true;
1248 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1249 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1250 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1251 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1252 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1254 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1258 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1259 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1265 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1272 /*******************************************************************
1274 * @brief Fills Radio Bearer Config for Drb
1278 * Function : fillDrbCfg
1280 * Functionality: Fills Radio Bearer Config for Drb
1282 * @params[in] drbId, DRB_ToAddModList *
1284 * @return ROK - success
1287 * ****************************************************************/
1288 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1290 uint8_t idx, ied, ret, elementCnt;
1296 drbCfg->list.count = elementCnt;
1297 drbCfg->list.size =\
1298 elementCnt * sizeof(DRB_ToAddMod_t *);
1299 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1300 if(drbCfg->list.array != NULLP)
1302 for(idx = 0; idx < elementCnt; idx++)
1304 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1305 if(drbCfg->list.array[idx] == NULLP)
1307 for(ied = 0; ied < idx; ied++)
1309 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1311 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1321 /* CN ASSOCIATION */
1322 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1323 if(drbCfg->list.array[idx]->cnAssociation)
1325 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1328 drbCfg->list.array[idx]->drb_Identity = drbId;
1333 /*******************************************************************
1335 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1339 * Function : fillRrcReconfigIE
1341 * Functionality: Fills RRC Reconfig Message required for
1342 * DLRRCMessageTransfer
1344 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1346 * @return ROK - success
1349 * ****************************************************************/
1351 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1354 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1355 if(rrcReconfigMsg->radioBearerConfig)
1357 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1358 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1360 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1365 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1366 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1368 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1371 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1372 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1373 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1379 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1380 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1386 /*******************************************************************
1388 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1392 * Function : fillDlDcchRrcMsg
1394 * Functionality: Fills DL DCCH Message required for
1395 * DLRRCMessageTransfer
1397 * @params[in] RRCContainer_t *rrcContainer
1399 * @return ROK - success
1402 * ****************************************************************/
1404 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer, bool updateAllRbCfg)
1407 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1408 DL_DCCH_Message_t dl_DCCH_Msg;
1409 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1410 asn_enc_rval_t encRetVal;
1412 if(rrcContainer != NULLP)
1414 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1416 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1417 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1419 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1420 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1421 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1423 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1424 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, updateAllRbCfg);
1427 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1428 * configurartion as sent to UE */
1429 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1431 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1432 ueCb->srbList[srbIdx].cfgSentToUe = true;
1434 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1436 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1437 ueCb->drbList[drbIdx].cfgSentToUe = true;
1440 /* encode DL-DCCH message into RRC Container */
1441 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1442 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1444 encRetVal = uper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1445 /* Encode results */
1446 if(encRetVal.encoded == ENCODE_FAIL)
1448 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1449 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1454 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1455 for(int i = 0; i< encBufSize; i++)
1457 DU_LOG("%x",encBuf[i]);
1459 rrcContainer->size = encBufSize;
1460 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1461 if(rrcContainer->buf != NULLP)
1463 memset(rrcContainer->buf, 0, encBufSize);
1464 for(idx2 = 0; idx2 < encBufSize; idx2++)
1466 rrcContainer->buf[idx2] = encBuf[idx2];
1474 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1480 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1486 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1492 /*******************************************************************
1494 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1498 * Function : BuildDLRRCContainer
1500 * Functionality: Builds RRC Container IE required for
1501 * DLRRCMessageTransfer
1505 * @return ROK - success
1508 * ****************************************************************/
1510 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1512 uint8_t ret, bufLen;
1515 if(rrcMsgType == RRC_SETUP)
1517 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1519 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1521 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1523 DU_LOG("\nINFO --> F1AP : Sending NAS Authentication Request");
1524 char authReqBuf[51] = {0x00, ueCb->pdcpSn++, 0x2a, 0x85, 0x4f, 0xc0, 0x0a, 0xc0, 0x40, 0x40, 0x00, 0x04, 0x2f, 0x58, 0x39, 0x12,\
1525 0x37, 0x15, 0x74, 0x16, 0x4c, 0x8d, 0xd3, 0x95, 0xa6, 0x9e, 0x94, 0x03, 0x24, 0x02, 0x00, 0x6f,\
1526 0x0b, 0x39, 0x5e, 0xbc, 0xb0, 0x00, 0x1a, 0xb1, 0xc1, 0x3f, 0x84, 0x4f, 0x77, 0xe3, 0x20, 0x00,\
1529 rrcContainer->size = bufLen;
1530 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1531 if(rrcContainer->buf != NULLP)
1533 memset(rrcContainer->buf, 0, bufLen);
1534 memcpy(rrcContainer->buf, authReqBuf, bufLen);
1538 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1543 else if(rrcMsgType == NAS_AUTHENTICATION_RSP)
1545 DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
1546 char secModeBuf[30]={0x00, ueCb->pdcpSn++, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1547 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1549 rrcContainer->size = bufLen;
1550 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1551 if(rrcContainer->buf != NULLP)
1553 memset(rrcContainer->buf, 0, bufLen);
1554 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1558 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1562 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1564 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1565 char secModeBuf[9]={0x00, ueCb->pdcpSn++, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1567 rrcContainer->size = bufLen;
1568 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1569 if(rrcContainer->buf != NULLP)
1571 memset(rrcContainer->buf, 0, bufLen);
1572 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1576 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1580 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1582 /*Hardcoded RRC Container from reference logs*/
1583 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1584 char buf[14] ={0x00, ueCb->pdcpSn++, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1586 rrcContainer->size = bufLen;
1587 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1588 if(rrcContainer->buf != NULLP)
1590 memset(rrcContainer->buf, 0, bufLen);
1591 memcpy(rrcContainer->buf, buf, bufLen);
1595 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1599 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1601 uint16_t tmpBufIdx = 0, bufIdx = 0;
1602 RRCContainer_t rrcContainerTmp;
1603 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1604 ret = fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, false);
1605 rrcContainer->size = rrcContainerTmp.size + 2;
1606 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1607 if(rrcContainer->buf != NULLP)
1609 memset(rrcContainer->buf, 0, rrcContainer->size);
1610 rrcContainer->buf[0] = 0x00;
1611 rrcContainer->buf[1] = ueCb->pdcpSn++; //PDCP SN
1612 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
1614 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
1618 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1624 /*******************************************************************
1626 * @brief Frees the DLRRCMessageTransfer
1630 * Function : freeDlRrcMessageTransfer
1632 * Functionality: Frees the DLRRCMessageTransfer
1636 * @return ROK - success
1639 * ****************************************************************/
1640 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1643 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1647 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1648 if(dlRRCMsg->protocolIEs.list.array)
1651 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1652 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1653 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1655 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1657 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1659 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1663 /*******************************************************************
1665 * @brief Builds and sends the DLRRCMessageTransfer
1669 * Function : BuildAndSendDLRRCMessageTransfer
1671 * Functionality: Constructs the DL RRC Message Transfer and sends
1672 * it to the CU through SCTP.
1676 * @return ROK - success
1679 * ****************************************************************/
1680 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1682 uint8_t elementCnt = 0;
1685 F1AP_PDU_t *f1apMsg = NULLP;
1686 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1687 asn_enc_rval_t encRetVal; /* Encoder return value */
1689 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1691 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1692 if(f1apMsg == NULLP)
1694 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1698 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1699 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1700 if(f1apMsg->choice.initiatingMessage == NULLP)
1702 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1703 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1707 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1708 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1709 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1710 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1713 dlRRCMsg->protocolIEs.list.count = elementCnt;
1714 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1716 /* Initialize the F1Setup members */
1717 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1718 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1720 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1721 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1722 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1726 for(idx=0; idx<elementCnt; idx++)
1728 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1729 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1731 for(ieId=0; ieId<idx; ieId++)
1733 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1735 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1736 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1737 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1742 /* GNB CU UE F1AP ID */
1744 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1745 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1746 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1747 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1749 /* GNB DU UE F1AP ID */
1751 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1752 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1753 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1754 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1758 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1759 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1760 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1761 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1765 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1766 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1767 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1768 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1770 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1772 /* Encode the F1SetupRequest type as APER */
1773 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1775 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1777 /* Encode results */
1778 if(encRetVal.encoded == ENCODE_FAIL)
1780 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1781 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1786 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1787 for(int i=0; i< encBufSize; i++)
1789 DU_LOG("%x",encBuf[i]);
1794 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1796 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1799 freeDlRrcMessageTransfer(f1apMsg);
1801 }/* End of BuildAndSendDLRRCMessageTransfer */
1803 /*******************************************************************
1805 * @brief Function to set the Dl RRC Msg Type
1809 * Function : setDlRRCMsgType
1811 * Functionality: Constructs the UE Setup Response and sends
1812 * it to the DU through SCTP.
1816 * @return ROK - success
1819 * ****************************************************************/
1821 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1823 uint8_t rrcMsgType = 0;
1824 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1827 rrcMsgType = RRC_SETUP;
1829 case RRC_SETUP_COMPLETE:
1830 rrcMsgType = RRC_SETUP_COMPLETE;
1832 case NAS_AUTHENTICATION_RSP:
1833 rrcMsgType = NAS_AUTHENTICATION_RSP;
1835 case NAS_SECURITY_MODE_COMPLETE:
1836 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1838 case RRC_SECURITY_MODE_COMPLETE:
1839 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1841 case REGISTRATION_COMPLETE:
1842 rrcMsgType = REGISTRATION_COMPLETE;
1844 case UE_CONTEXT_SETUP_RSP:
1845 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1847 case RRC_RECONFIG_COMPLETE:
1848 rrcMsgType = RRC_RECONFIG_COMPLETE;
1857 /*******************************************************************
1859 * @brief fill long cycle offset value of drx
1863 * Function : fillLongCycleOffsetValue
1865 * Functionality: fill long cycle offset value of drx
1867 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1868 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1870 * @return ROK - success
1873 * ****************************************************************/
1874 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *recvedLongCycleOffsetVal)
1877 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1878 switch(recvedLongCycleOffsetVal->present)
1880 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10:
1882 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1885 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20:
1887 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1890 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32:
1892 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1895 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40:
1897 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1900 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60:
1902 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1905 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64:
1907 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1910 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70:
1912 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1915 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80:
1917 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1920 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128:
1922 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1925 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160:
1927 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1930 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256:
1932 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1935 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320:
1937 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1940 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512:
1942 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1945 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640:
1947 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1950 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024:
1952 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1955 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280:
1957 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1960 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048:
1962 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1965 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560:
1967 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1970 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120:
1972 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1975 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240:
1977 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1985 /*******************************************************************
1987 * @brief Extract configuration from DRX_ConfigRrc
1988 * and store the drx configuration in UeCb
1992 * Function : storeDrxCfgInUeCb
1994 * Functionality: Store drx configuration in UeCb
1996 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
1999 * ****************************************************************/
2000 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
2002 switch(drxSetup->drx_onDurationTimer.present)
2004 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
2006 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
2008 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
2009 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
2012 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
2014 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
2015 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
2019 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
2020 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
2021 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
2022 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
2023 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
2024 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
2025 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
2026 if(drxSetup->shortDRX)
2028 drxCfg->shortDrxPres=true;
2029 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
2030 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
2033 drxCfg->shortDrxPres=false;
2037 /*******************************************************************
2039 * @brief Extract configuration from CellGroupConfig
2043 * Function : extractCellGroupConfig
2045 * Functionality: Extract configuration from CellGroupConfig
2046 * and store in local database
2048 * @params[in] UE control block
2051 * @return ROK - success
2054 * ****************************************************************/
2055 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
2057 uint8_t rbIdx, srbIdx, drbIdx;
2058 bool srbFound, drbFound;
2059 SrbInfo *srbCfgDb = NULLP;
2060 DrbInfo *drbCfgDb = NULLP;
2061 RlcLcCfg *rlcLcCfgDb = NULLP;
2062 MacLcCfg *macLcCfgDb = NULLP;
2063 RLC_BearerConfig_t *rlcCfg = NULLP;
2064 RLC_Config_t *rlcLcCfg = NULLP;
2065 LogicalChannelConfig_t *macLcCfg = NULLP;
2072 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2076 if(cellGrpCfg == NULLP)
2078 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2083 if(cellGrpCfg->mac_CellGroupConfig)
2085 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2087 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2089 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2092 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2094 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup)
2096 ueCb->drxCfgPresent = true;
2097 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2102 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2109 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2114 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2116 /* Update SRB configuration in local DB */
2117 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2119 /* Search if SRB entry is already present in DB */
2120 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2122 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2124 srbCfgDb = &ueCb->srbList[srbIdx];
2130 /* If not, add SRB to UE CB's SRB list */
2133 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2134 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2138 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2139 srbCfgDb->cfgSentToUe = false;
2140 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2141 macLcCfgDb = &srbCfgDb->macLcCfg;
2144 /* Update DRB configuration in local DB */
2145 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2147 /* Search if DRB entry is already present in DB */
2148 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2150 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2152 drbCfgDb = &ueCb->drbList[drbIdx];
2158 /* If not, add DRB to UE CB's SRB list */
2161 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2162 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2166 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2167 drbCfgDb->cfgSentToUe = false;
2168 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2169 macLcCfgDb = &drbCfgDb->macLcCfg;
2173 /* Update RLC configuration for this RB */
2174 rlcLcCfg = rlcCfg->rlc_Config;
2175 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2176 switch(rlcLcCfgDb->rlcMode)
2178 case RLC_Config_PR_am:
2180 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2181 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2182 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2183 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2184 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2186 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2187 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2188 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2192 case RLC_Config_PR_um_Bi_Directional:
2194 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2196 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2197 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2202 /* Update MAC configuration for this LC */
2203 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2204 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2205 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2206 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2207 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2208 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2213 /*******************************************************************
2215 * @brief Function to decode DU to CU RRC container
2219 * Function : extractDuToCuRrcCont
2221 * Functionality: Function to decode DU to CU RRC container
2224 * RRC conatiner octect string to be decoded
2226 * @return ROK - success
2229 * ****************************************************************/
2230 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2232 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2233 asn_dec_rval_t rval; /* Decoder return value */
2235 /* Copy the received container to UeCb */
2236 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2238 /* Decoding DU to CU RRC container octet string to cell group config */
2239 cellGrpCfgMsg = &cellGrpCfg;
2240 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2242 rval = uper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2244 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2246 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2250 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2252 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2254 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2261 /*******************************************************************
2263 * @brief Function to build Initial UL RRC Message
2267 * Function : procInitULRRCMsg
2269 * Functionality: Function to build Initial UL RRC Message
2273 * @return ROK - success
2276 * ****************************************************************/
2278 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2280 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2282 uint16_t cellIdx=0, nrCellId = 0;
2287 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2289 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2291 SEARCH_DU_DB(duIdx, duId, duDb);
2292 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2294 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2296 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2298 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2299 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2302 case ProtocolIE_ID_id_NRCGI:
2303 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2304 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2309 case ProtocolIE_ID_id_C_RNTI:
2310 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2311 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2313 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2314 memset(ueCb, 0, sizeof(CuUeCb));
2315 ueCb->cellCb = cellCb;
2316 ueCb->crnti = crnti;
2317 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2318 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2319 ueCb->state = UE_ATTACH_IN_PROGRESS;
2322 cellCb->ueCb[cellCb->numUe] = ueCb;
2327 case ProtocolIE_ID_id_RRCContainer:
2330 case ProtocolIE_ID_id_DUtoCURRCContainer:
2332 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2333 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2335 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2336 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2337 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2338 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2340 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2341 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2342 ueCb->f1apMsgDb.duToCuContainer.size);
2344 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2346 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2352 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2359 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2368 ueCb->f1apMsgDb.dlRrcMsgCount++;
2369 rrcMsgType = setDlRRCMsgType(ueCb);
2370 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2375 /*******************************************************************
2377 * @brief Builds Nrcgi
2381 * Function : BuildNrcgi
2383 * Functionality: Building the PLMN ID and NR Cell id
2385 * @params[in] NRCGI_t *nrcgi
2386 * @return ROK - success
2389 * ****************************************************************/
2390 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2393 uint8_t unused_bits = 4;
2394 uint8_t byteSize = 5;
2396 /* Allocate Buffer Memory */
2397 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2398 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2399 if(nrcgi->pLMN_Identity.buf == NULLP)
2403 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2409 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2410 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2411 if(nrcgi->nRCellIdentity.buf == NULLP)
2415 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2419 /*******************************************************************
2421 * @brief Builds Special cell list for UE Setup Request
2425 * Function : BuildSplCellList
2427 * Functionality: Constructs the Special Cell list for UESetReq
2429 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2431 * @return ROK - success
2434 * ****************************************************************/
2435 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2441 spCellLst->list.count = cellCnt;
2442 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2443 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2444 if(spCellLst->list.array == NULLP)
2448 for(idx=0; idx<cellCnt; idx++)
2450 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2451 if(spCellLst->list.array[idx] == NULLP)
2457 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2458 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2459 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2461 /* Special Cell ID -NRCGI */
2462 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2467 /*Special Cell Index*/
2468 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2470 }/* End of BuildSplCellList*/
2472 /*******************************************************************
2474 * @brief Builds SRBS to be setup
2478 * Function : BuildSRBSetup
2480 * Functionality: Constructs the SRB's for UESetReq
2482 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2484 * @return ROK - success
2487 * ****************************************************************/
2488 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2493 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2494 srbCnt = ueCb->numSrb;
2497 srbSet->list.count = srbCnt;
2498 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2499 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2500 if(srbSet->list.array == NULLP)
2502 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2506 for(idx=0; idx<srbCnt; idx++)
2508 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2509 if(srbSet->list.array[idx] == NULLP)
2511 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2516 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2519 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2520 srbSet->list.array[idx]->criticality = Criticality_ignore;
2521 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2522 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2523 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2528 for(idx=0; idx<srbCnt; idx++)
2530 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2531 srbSet->list.array[idx]->criticality = Criticality_ignore;
2532 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2533 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2537 }/* End of BuildSRBSetup*/
2539 /*******************************************************************
2541 * @brief Builds QOS Info for DRB Setum Item
2545 * Function : BuildQOSInfo
2547 * Functionality: Constructs the QOS Info for DRB Setup Item
2549 * @params[in] QoSInformation_t *qosinfo
2550 * int16_t pduSessionID
2552 * @return ROK - success
2555 * ****************************************************************/
2556 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2558 uint8_t elementCnt = 0, qosCntIdx = 0;
2559 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2561 /* NonDynamic5QIDescriptor */
2562 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2563 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2564 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2570 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2574 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2575 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2577 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2579 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2585 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2586 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2590 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2591 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2593 /*MaxDataBurstVolume*/
2594 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2595 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2599 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2600 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2603 /*nRGRAN Allocation Retention Priority*/
2606 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2607 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2608 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2612 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2613 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2614 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2616 qosInfo->priorityLevel = PriorityLevel_lowest;
2617 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2618 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2621 /* PDU session ID */
2624 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2625 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2627 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2631 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2632 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2636 elementCnt = NUM_QOS_EXT;
2637 qosIeExt->list.count = elementCnt;
2638 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2640 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2641 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2643 if(qosIeExt->list.array == NULLP)
2645 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2649 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2651 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2652 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2654 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2657 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2658 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2659 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2660 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2661 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2662 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2663 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2664 qosInfo->pduSessionId = pduSessionID;
2669 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2674 }/*End of BuildQOSInfo*/
2676 /*******************************************************************
2678 * @brief Builds SNSSAI
2682 * Function : BuildSNSSAI
2684 * Functionality: Constructs the SNSSAI For DRB list
2686 * @params[in] SNSSAI_t *snssai
2687 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2689 * @return ROK - success
2692 * ****************************************************************/
2693 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2697 snssai->sST.size = sizeof(uint8_t);
2698 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2699 if(snssai->sST.buf == NULLP)
2704 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2706 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2709 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2710 if(snssai->sD == NULLP)
2714 snssai->sD->size = 3 * sizeof(uint8_t);
2715 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2716 if(snssai->sD->buf == NULLP)
2721 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2723 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2726 drbInfo->snssai = snssaiToCopy;
2728 }/*End of BuildSNSSAI*/
2730 /*******************************************************************
2732 * @brief Builds the flow map.
2736 * Function : BuildFlowsMap
2738 * Functionality: Constructs the flowmap For DRB list
2740 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2742 * @return ROK - success
2745 * ****************************************************************/
2746 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2748 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2749 FlowsMapped *qosFlow;
2754 flowCnt = drbInfo->numFlowMap;
2755 flowMap->list.count = flowCnt;
2756 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2757 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2758 if(flowMap->list.array == NULLP)
2760 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2763 for(idx=0; idx<flowCnt; idx++)
2765 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2766 if(flowMap->list.array[idx] == NULLP)
2768 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2774 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2775 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2777 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2779 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2781 qosFlow = &drbInfo->flowMapList[flowIdx];
2788 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2789 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2794 qosFlow = &drbInfo->flowMapList[idx];
2795 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2798 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2799 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2802 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2806 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2807 drbInfo->numFlowMap++;
2810 }/*End of BuildFlowsMap*/
2812 /*******************************************************************
2814 * @brief Builds the Uplink Tunnel Info
2818 * Function : BuildULTnlInfo
2820 * Functionality: Constructs the UL TnlInfo For DRB list
2822 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2824 * @return ROK - success
2827 * ****************************************************************/
2828 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2834 ulInfo->list.count = ulCnt;
2835 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2836 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2837 if(ulInfo->list.array == NULLP)
2839 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2842 for(idx=0; idx<ulCnt; idx++)
2844 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2845 if(ulInfo->list.array[idx] == NULLP)
2847 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2852 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2854 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2855 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2857 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2860 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2861 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2862 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2863 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2865 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2871 /* NOTE: Below IP address must be changed if running on different IP configuration */
2872 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2873 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2874 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2875 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2876 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2878 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2879 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2880 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2881 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2885 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2886 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2887 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2888 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2889 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2893 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2894 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2895 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2896 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2898 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2904 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2905 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2906 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2907 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2909 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2910 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2911 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2912 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2916 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2917 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2918 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2919 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2922 }/*End of BuildULTnlInfo*/
2924 /*******************************************************************
2926 * @brief Builds DRBS to be setup
2930 * Function : BuildDRBSetup
2932 * Functionality: Constructs the DRB's for UESetReq
2934 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2936 * @return ROK - success
2939 * ****************************************************************/
2940 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2942 uint16_t snssaiIdx=0;
2943 uint8_t idx = 0, extIeIdx = 0;
2944 uint8_t elementCnt = 0, drbCnt = 0;
2945 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2946 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2947 DRBs_ToBeSetup_Item_t *drbSetItem;
2948 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2949 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2951 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2952 drbCnt = ueCb->numDrb;
2954 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2955 drbSet->list.count = drbCnt;
2957 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2958 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2959 if(drbSet->list.array == NULLP)
2961 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2965 for(idx=0; idx<drbCnt; idx++)
2967 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2968 if(drbSet->list.array[idx] == NULLP)
2970 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2974 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2975 drbSet->list.array[idx]->criticality = Criticality_ignore;
2976 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2977 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2979 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2981 drbSetItem->dRBID = idx + 1;
2982 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2985 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2988 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2989 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2990 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2992 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2995 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2996 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2997 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2998 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2999 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
3000 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
3002 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
3003 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
3004 if(BuildQOSInforet != ROK)
3006 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
3011 snssaiIdx = (idx% cuCb.numSnssaiSupported);
3012 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3013 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
3014 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
3016 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
3017 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
3018 if(BuildSNSSAIret != ROK)
3020 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
3024 /*Flows mapped to DRB List*/
3025 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3026 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
3027 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
3029 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
3030 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
3031 if(BuildFlowsMapret != ROK)
3033 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
3037 /*ULUPTNLInformation To Be Setup List*/
3038 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3039 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3042 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3044 if(BuildULTnlInforet != ROK)
3046 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
3051 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3053 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3054 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
3057 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
3059 /* DL PDCP SN Length */
3060 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
3062 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
3063 if(!drbToBeSetupExt)
3065 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3070 drbToBeSetupExt->list.count = elementCnt;
3071 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3073 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3074 if(!drbToBeSetupExt->list.array)
3076 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3080 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3082 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3083 if(!drbToBeSetupExt->list.array[extIeIdx])
3085 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3091 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3093 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3094 drbToBeSetupExtIe->criticality = Criticality_ignore;
3095 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3096 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3097 drbSetItem->iE_Extensions = drbToBeSetupExt;
3100 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3104 }/* End of BuildDRBSetup*/
3106 /*******************************************************************
3108 * @brief Deallocating memory of function BuildAndSendUESetReq
3112 * Function : FreeNrcgi
3114 * Functionality: Deallocating memory for function BuildNrcgi
3116 * @params[in] NRCGI_t *nrcgi
3120 *******************************************************************/
3121 void FreeNrcgi(NRCGI_t *nrcgi)
3123 if(nrcgi->pLMN_Identity.buf != NULLP)
3125 if(nrcgi->nRCellIdentity.buf != NULLP)
3127 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3129 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3132 /*******************************************************************
3134 * @brief Deallocating memory of function BuildAndSendUESetReq
3138 * Function : FreeSplCellList
3140 * Functionality: Deallocating memory for function BuildSplCellList
3142 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3147 * *****************************************************************/
3148 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3151 if(spCellLst->list.array != NULLP)
3153 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3155 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3157 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3159 if(spCellLst->list.array[cellidx]!=NULLP)
3161 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3164 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3167 /*******************************************************************
3169 * @brief Deallocating memory of function BuildAndSendUESetReq
3173 * Function : FreeSRBSetup
3175 * Functionality: Deallocating memory for function BuildSRBSetup
3177 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3182 * ******************************************************************/
3183 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3186 if(srbSet->list.array != NULLP)
3188 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3190 if(srbSet->list.array[srbidx]!=NULLP)
3192 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3195 CU_FREE(srbSet->list.array,srbSet->list.size);
3198 /*******************************************************************
3200 * @brief Deallocating memory of function BuildAndSendUESetReq
3204 * Function : FreeQOSInfo
3206 * Functionality: Deallocating memory for function BuildQOSInfo
3208 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3212 * ****************************************************************/
3213 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3215 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3216 uint8_t qosCntIdx = 0;
3218 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3220 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3222 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3224 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3225 sizeof(MaxDataBurstVolume_t));
3227 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3228 sizeof(AveragingWindow_t));
3230 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3231 sizeof(NonDynamic5QIDescriptor_t));
3233 if(drbQos->iE_Extensions)
3235 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3236 if(qosIeExt->list.array != NULLP)
3238 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3240 if(qosIeExt->list.array[qosCntIdx])
3242 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3245 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3248 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3251 /*******************************************************************
3253 * @brief Deallocating memory of function BuildAndSendUESetReq
3257 * Function : FreeULTnlInfo
3259 * Functionality: Deallocating memory for function BuildULTnlInfo
3261 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3266 * ****************************************************************/
3267 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3270 if(ulInfo->list.array != NULLP)
3272 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3274 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3276 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3278 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3279 transportLayerAddress.buf != NULLP)
3281 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3284 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3285 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3286 gTPTunnel->gTP_TEID.size);
3288 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3289 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3290 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3292 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3293 sizeof(GTPTunnel_t));
3296 if(ulInfo->list.array[ulidx]!=NULLP)
3298 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3301 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3304 /*******************************************************************
3306 * @brief Deallocating memory for BuildAndSendUESetReq
3310 * Function : FreeDRBSetup
3312 * Functionality: Deallocating memory for BuildDRBSetup
3314 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3318 * ****************************************************************/
3319 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3321 DRBs_ToBeSetup_Item_t *drbSetItem;
3322 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3324 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3326 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3327 if(drbSet->list.array != NULLP)
3329 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3331 if(drbSet->list.array[drbidx] != NULLP)
3333 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3334 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3336 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3337 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3339 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3340 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3342 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3343 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3345 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3347 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3349 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3351 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3352 flows_Mapped_To_DRB_List.list.array != NULLP)
3354 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3355 flows_Mapped_To_DRB_List.list.count; flowidx++)
3357 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3358 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3360 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3361 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3362 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3364 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3365 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3366 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3368 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3369 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3370 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3372 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3373 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3375 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3376 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3377 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3378 sizeof(MaxDataBurstVolume_t));
3380 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3381 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3382 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3384 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3385 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3386 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3389 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3390 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3392 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3393 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3396 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3397 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3398 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3400 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3401 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3403 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3404 sizeof(OCTET_STRING_t));
3406 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3407 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3409 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3410 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3412 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3413 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3415 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3416 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3418 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3419 iE_Extensions != NULLP)
3421 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3422 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3423 if(qosIeExt->list.array != NULLP)
3425 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3427 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3429 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3432 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3434 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3435 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3438 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3440 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3443 CU_FREE(drbSet->list.array,drbSet->list.size);
3448 /*******************************************************************
3450 * @brief Free the UE Setup Request
3454 * Function : FreeUeContextSetupReq
3456 * Functionality: Deallocate the memory of BuildUESetReq
3458 * @params[in] F1AP_PDU_t *f1apMsg
3463 * ****************************************************************/
3464 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3467 UEContextSetupRequest_t *ueSetReq = NULLP;
3469 if(f1apMsg != NULLP)
3471 if(f1apMsg->choice.initiatingMessage != NULLP)
3473 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3474 if(ueSetReq->protocolIEs.list.array != NULLP)
3476 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3478 if(ueSetReq->protocolIEs.list.array[idx])
3480 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3482 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3484 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3486 case ProtocolIE_ID_id_SpCell_ID:
3487 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3489 case ProtocolIE_ID_id_ServCellIndex:
3491 case ProtocolIE_ID_id_SpCellULConfigured:
3493 case ProtocolIE_ID_id_CUtoDURRCInformation:
3494 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3496 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3497 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3499 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3500 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3502 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3503 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3505 case ProtocolIE_ID_id_RRCContainer:
3506 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3508 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3509 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3512 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3513 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3514 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3517 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3521 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3523 for(ieId=0; ieId<idx; ieId++)
3525 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3527 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3530 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3532 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3534 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3538 /**Filling cell group info **/
3539 /*******************************************************************
3541 * @brief Build Control resource set to add/modify list
3545 * Function : BuildControlRSetToAddModList
3547 * Functionality: Build Control resource set to add/modify list
3550 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3552 * @return ROK - success
3555 * ****************************************************************/
3556 uint8_t BuildControlRSetToAddModList
3558 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3563 uint8_t numBytes, bitsUnused;
3564 struct ControlResourceSet *controlRSet;
3565 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3566 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3569 controlRSetList->list.count = elementCnt;
3570 controlRSetList->list.size = \
3571 elementCnt * sizeof(struct ControlResourceSet *);
3573 controlRSetList->list.array = NULLP;
3574 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3575 if(!controlRSetList->list.array)
3577 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3581 for(idx = 0; idx < elementCnt; idx++)
3583 controlRSetList->list.array[idx] = NULLP;
3584 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3585 if(!controlRSetList->list.array[idx])
3587 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3593 controlRSet = controlRSetList->list.array[idx];
3594 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3596 /* Values harcoded according to our design:
3599 * Bit string stored ff0000000000
3603 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3604 controlRSet->frequencyDomainResources.buf = NULLP;
3605 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3606 controlRSet->frequencyDomainResources.size);
3607 if(!controlRSet->frequencyDomainResources.buf)
3609 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3613 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3614 coreset0EndPrb = CORESET0_END_PRB;
3615 coreset1StartPrb = coreset0EndPrb + 6;
3616 coreset1NumPrb = CORESET1_NUM_PRB;
3617 /* calculate the PRBs */
3618 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3619 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3620 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3622 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3623 controlRSet->cce_REG_MappingType.present = \
3624 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3626 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3627 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3628 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3629 controlRSet->tci_PresentInDCI = NULLP;
3631 uint8_t tciStateIdx;
3633 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3634 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3635 if(!controlRset->tci_StatesPDCCH_ToAddList)
3637 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3642 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3643 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3644 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3645 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3646 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3648 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3652 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3654 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3655 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3657 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3664 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3666 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3667 if(!controlRset->tci_PresentInDCI)
3669 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3673 *(controlRset->tci_PresentInDCI);
3676 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3677 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3678 if(!controlRSet->pdcch_DMRS_ScramblingID)
3680 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3683 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3686 } /* End BuildControlRSetToAddModList */
3688 /*******************************************************************
3690 * @brief Build search space to add/modify list
3694 * Function : BuildSearchSpcToAddModList
3696 * Functionality: Build search space to add/modify list
3699 * @return ROK - success
3702 * ****************************************************************/
3703 uint8_t BuildSearchSpcToAddModList
3705 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3713 struct SearchSpace *searchSpc;
3716 searchSpcList->list.count = elementCnt;
3717 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3719 searchSpcList->list.array = NULLP;
3720 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3721 if(!searchSpcList->list.array)
3723 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3727 for(idx = 0; idx < elementCnt; idx++)
3729 searchSpcList->list.array[idx] = NULLP;
3730 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3731 if(!searchSpcList->list.array[idx])
3733 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3739 searchSpc = searchSpcList->list.array[idx];
3741 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3743 searchSpc->controlResourceSetId = NULLP;
3744 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3745 if(!searchSpc->controlResourceSetId)
3747 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3750 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3752 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3753 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3754 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3755 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3757 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3760 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3761 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3763 searchSpc->duration = NULLP;
3764 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3765 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3766 if(!searchSpc->monitoringSymbolsWithinSlot)
3768 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3772 /* Values taken from reference logs :
3775 * Bit string stores 8000
3780 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3781 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3782 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3783 searchSpc->monitoringSymbolsWithinSlot->size);
3784 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3786 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3791 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3792 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3793 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3794 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3796 searchSpc->nrofCandidates = NULLP;
3797 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3798 if(!searchSpc->nrofCandidates)
3800 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3804 searchSpc->nrofCandidates->aggregationLevel1 = \
3805 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3806 searchSpc->nrofCandidates->aggregationLevel2 = \
3807 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3808 searchSpc->nrofCandidates->aggregationLevel4 = \
3809 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3810 searchSpc->nrofCandidates->aggregationLevel8 = \
3811 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3812 searchSpc->nrofCandidates->aggregationLevel16 = \
3813 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3815 searchSpc->searchSpaceType = NULLP;
3816 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3817 if(!searchSpc->searchSpaceType)
3819 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3823 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3825 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3826 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3827 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3828 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3830 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3833 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3834 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3837 }/* End BuildSearchSpcToAddModList */
3839 /*******************************************************************
3841 * @brief Builds BWP DL dedicated PDCCH config
3845 * Function : BuildBWPDlDedPdcchCfg
3847 * Functionality: Builds BWP DL dedicated PDCCH config
3849 * @params[in] struct PDCCH_Config *pdcchCfg
3851 * @return ROK - success
3854 * ****************************************************************/
3855 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3857 pdcchCfg->controlResourceSetToAddModList = NULLP;
3858 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3859 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3860 if(!pdcchCfg->controlResourceSetToAddModList)
3862 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3866 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3871 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3873 pdcchCfg->searchSpacesToAddModList = NULLP;
3874 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3875 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3876 if(!pdcchCfg->searchSpacesToAddModList)
3878 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3882 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3887 pdcchCfg->searchSpacesToReleaseList = NULLP;
3888 pdcchCfg->downlinkPreemption = NULLP;
3889 pdcchCfg->tpc_PUSCH = NULLP;
3890 pdcchCfg->tpc_PUCCH = NULLP;
3891 pdcchCfg->tpc_SRS = NULLP;
3896 /*******************************************************************
3898 * @brief Builds DMRS DL PDSCH Mapping type A
3902 * Function : BuildDMRSDLPdschMapTypeA
3904 * Functionality: Builds DMRS DL PDSCH Mapping type A
3907 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3908 * @return ROK - success
3911 * ****************************************************************/
3912 uint8_t BuildDMRSDLPdschMapTypeA
3914 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3917 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3918 dmrsDlCfg->choice.setup = NULLP;
3919 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3920 if(!dmrsDlCfg->choice.setup)
3922 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3926 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3927 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3928 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3929 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3931 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3934 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3936 dmrsDlCfg->choice.setup->maxLength = NULLP;
3937 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3938 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3939 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3944 /*******************************************************************
3946 * @brief Builds TCI states to add/modify list
3950 * Function : BuildTCIStatesToAddModList
3952 * Functionality:Builds TCI states to add/modify list
3955 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3957 * @return ROK - success
3960 * ****************************************************************/
3961 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3966 /*******************************************************************
3968 * @brief Builds PDSCH time domain allocation list
3972 * Function : BuildPdschTimeDomAllocList
3974 * Functionality: Builds PDSCH time domain allocation list
3977 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3979 * @return ROK - success
3982 * ****************************************************************/
3983 uint8_t BuildPdschTimeDomAllocList
3985 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3990 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3992 timeDomAllocList->present = \
3993 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3995 timeDomAllocList->choice.setup = NULLP;
3996 CU_ALLOC(timeDomAllocList->choice.setup, \
3997 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3998 if(!timeDomAllocList->choice.setup)
4000 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4005 timeDomAllocList->choice.setup->list.count = elementCnt;
4006 timeDomAllocList->choice.setup->list.size = \
4007 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
4009 timeDomAllocList->choice.setup->list.array = NULLP;
4010 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4011 timeDomAllocList->choice.setup->list.size);
4012 if(!timeDomAllocList->choice.setup->list.array)
4014 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4018 for(idx = 0; idx < elementCnt; idx++)
4020 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4021 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
4022 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4023 if(!timeDomAllocList->choice.setup->list.array[idx])
4025 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4031 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4032 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4033 if(!timeDomAlloc->k0)
4035 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4038 *(timeDomAlloc->k0) = 0;
4039 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4040 timeDomAlloc->startSymbolAndLength = 66;
4043 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4044 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4045 if(!timeDomAlloc->k0)
4047 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4050 *(timeDomAlloc->k0) = 1;
4051 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4052 timeDomAlloc->startSymbolAndLength = 66;
4057 /*******************************************************************
4059 * @brief Builds PDSCH PRB Bundling type
4063 * Function : BuildPdschPrbBundlingType
4065 * Functionality: Builds PDSCH PRB Bundling type
4068 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4070 * @return ROK - success
4073 * ****************************************************************/
4074 uint8_t BuildPdschPrbBundlingType
4076 struct PDSCH_Config__prb_BundlingType *prbBndlType
4079 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4081 prbBndlType->choice.staticBundling = NULLP;
4082 CU_ALLOC(prbBndlType->choice.staticBundling, \
4083 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4084 if(!prbBndlType->choice.staticBundling)
4086 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4089 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4094 /*******************************************************************
4096 * @brief Builds BWP DL dedicated PDSCH config
4100 * Function : BuildBWPDlDedPdschCfg
4102 * Functionality: Builds BWP DL dedicated PDSCH config
4104 * @params[in] struct PDSCH_Config *pdschCfg
4106 * @return ROK - success
4109 * ****************************************************************/
4110 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4112 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4114 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4115 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4116 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4117 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4119 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4123 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4128 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4129 pdschCfg->tci_StatesToAddModList = NULLP;
4130 pdschCfg->tci_StatesToReleaseList = NULLP;
4131 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4133 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4134 if(!pdschCfg->tci_StatesToAddModList)
4136 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4139 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4145 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4147 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4148 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4149 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4150 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4152 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4155 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4159 pdschCfg->pdsch_AggregationFactor = NULLP;
4160 pdschCfg->rateMatchPatternToAddModList = NULLP;
4161 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4162 pdschCfg->rateMatchPatternGroup1 = NULLP;
4163 pdschCfg->rateMatchPatternGroup2 = NULLP;
4164 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4165 pdschCfg->mcs_Table = NULLP;
4167 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4168 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4169 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4171 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4174 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4176 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4181 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4182 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4183 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4184 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4185 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4186 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4187 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4192 /*******************************************************************
4194 * @brief Builds intitial DL BWP
4197 * Function : BuildInitialDlBWP
4199 * Functionality: Builds intitial DL BWP in spCellCfgDed
4201 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4203 * @return ROK - success
4206 * ****************************************************************/
4207 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4209 dlBwp->pdcch_Config = NULLP;
4210 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4211 if(!dlBwp->pdcch_Config)
4213 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4216 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4218 dlBwp->pdcch_Config->choice.setup = NULLP;
4219 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4220 if(!dlBwp->pdcch_Config->choice.setup)
4222 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4225 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4230 dlBwp->pdsch_Config = NULLP;
4231 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4232 if(!dlBwp->pdsch_Config)
4234 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4237 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4239 dlBwp->pdsch_Config->choice.setup = NULLP;
4240 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4241 if(!dlBwp->pdsch_Config->choice.setup)
4243 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4247 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4252 dlBwp->sps_Config = NULLP;
4253 dlBwp->radioLinkMonitoringConfig = NULLP;
4257 /*******************************************************************
4259 * @brief Builds DMRS UL Pusch Mapping type A
4263 * Function : BuildDMRSULPuschMapTypeA
4265 * Functionality: Builds DMRS UL Pusch Mapping type A
4268 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4269 * @return ROK - success
4272 * ****************************************************************/
4273 uint8_t BuildDMRSULPuschMapTypeA
4275 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4278 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4279 dmrsUlCfg->choice.setup= NULLP;
4280 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4281 if(!dmrsUlCfg->choice.setup)
4283 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4287 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4288 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4289 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4290 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4292 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4295 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4297 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4298 dmrsUlCfg->choice.setup->maxLength = NULLP;
4299 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4300 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4301 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4302 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4304 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4308 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4309 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4311 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4313 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4316 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4318 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4319 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4323 /*******************************************************************
4325 * @brief Build PUSCH time domain allocation list
4329 * Function : BuildPuschTimeDomAllocList
4331 * Functionality: Build PUSCH time domain allocation list
4334 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4336 * @return ROK - success
4339 * ****************************************************************/
4340 uint8_t BuildPuschTimeDomAllocList
4342 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4347 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4349 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4350 timeDomAllocList->choice.setup = NULLP;
4351 CU_ALLOC(timeDomAllocList->choice.setup, \
4352 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4353 if(!timeDomAllocList->choice.setup)
4355 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4360 timeDomAllocList->choice.setup->list.count = elementCnt;
4361 timeDomAllocList->choice.setup->list.size = \
4362 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4363 timeDomAllocList->choice.setup->list.array = NULLP;
4364 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4365 timeDomAllocList->choice.setup->list.size);
4366 if(!timeDomAllocList->choice.setup->list.array)
4368 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4372 for(idx = 0; idx < elementCnt; idx++)
4374 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4375 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4376 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4377 if(!timeDomAllocList->choice.setup->list.array[idx])
4379 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4385 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4386 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4387 if(!timeDomAlloc->k2)
4389 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4392 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4393 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4394 timeDomAlloc->startSymbolAndLength = 66;
4397 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4398 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4399 if(!timeDomAlloc->k2)
4401 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4404 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4405 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4406 timeDomAlloc->startSymbolAndLength = 66;
4411 /*******************************************************************
4413 * @brief Builds BWP UL dedicated PUSCH Config
4417 * Function : BuildBWPUlDedPuschCfg
4420 * Builds BWP UL dedicated PUSCH Config
4422 * @params[in] : PUSCH_Config_t *puschCfg
4424 * @return ROK - success
4427 * ****************************************************************/
4428 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4430 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4431 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4432 if(!puschCfg->dataScramblingIdentityPUSCH)
4434 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4437 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4439 puschCfg->txConfig = NULLP;
4440 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4441 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4442 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4443 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4445 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4449 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4454 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4455 puschCfg->pusch_PowerControl = NULLP;
4456 puschCfg->frequencyHopping = NULLP;
4457 puschCfg->frequencyHoppingOffsetLists = NULLP;
4458 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4460 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4461 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4462 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4463 if(!puschCfg->pusch_TimeDomainAllocationList)
4465 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4469 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4474 puschCfg->pusch_AggregationFactor = NULLP;
4475 puschCfg->mcs_Table = NULLP;
4476 puschCfg->mcs_TableTransformPrecoder = NULLP;
4477 puschCfg->transformPrecoder = NULLP;
4478 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4479 if(!puschCfg->transformPrecoder)
4481 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4484 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4486 puschCfg->codebookSubset = NULLP;
4487 puschCfg->maxRank = NULLP;
4488 puschCfg->rbg_Size = NULLP;
4489 puschCfg->uci_OnPUSCH = NULLP;
4490 puschCfg->tp_pi2BPSK = NULLP;
4495 /*******************************************************************
4497 * @brief Builds BWP UL dedicated PUCCH Config
4501 * Function : BuildBWPUlDedPucchCfg
4504 * Builds BWP UL dedicated PUCCH Config
4506 * @params[in] : PUCCH_Config_t *pucchCfg
4508 * @return ROK - success
4511 * ****************************************************************/
4512 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4514 uint8_t arrIdx, elementCnt;
4515 uint8_t rsrcIdx, rsrcSetIdx;
4516 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4517 PUCCH_Resource_t *rsrc = NULLP;
4521 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4522 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4523 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4524 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4525 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4527 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4530 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4531 rsrcSet->pucch_ResourceSetId = 1;
4533 rsrcSet->resourceList.list.count = elementCnt;
4534 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4535 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4536 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4538 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4541 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4545 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4546 pucchCfg->resourceToAddModList->list.count = elementCnt;
4547 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4548 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4549 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4551 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4554 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4555 rsrc->pucch_ResourceId = 1;
4556 rsrc->startingPRB = 0;
4557 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4558 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4559 rsrc->format.choice.format1->initialCyclicShift = 0;
4560 rsrc->format.choice.format1->nrofSymbols = 4;
4561 rsrc->format.choice.format1->startingSymbolIndex = 0;
4562 rsrc->format.choice.format1->timeDomainOCC = 0;
4565 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4566 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4567 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4568 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4569 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4572 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4573 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4575 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4580 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4581 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4582 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4583 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4585 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4589 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4591 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4592 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4594 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4600 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4601 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4606 /*******************************************************************
4608 * @brief Fills SRS resource to add/modify list
4612 * Function : BuildSrsRsrcAddModList
4614 * Functionality: Fills SRS resource to add/modify list
4617 * @return ROK - success
4620 * ****************************************************************/
4621 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4627 resourceList->list.count = elementCnt;
4628 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4629 resourceList->list.array = NULLP;
4630 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4631 if(!resourceList->list.array)
4633 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4637 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4639 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4640 if(!resourceList->list.array[rsrcIdx])
4642 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4648 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4649 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4650 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4652 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4653 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4654 sizeof(struct SRS_Resource__transmissionComb__n2));
4655 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4657 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4660 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4661 = SRS_COMB_OFFSET_N2;
4662 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4663 = SRS_CYCLIC_SHIFT_N2;
4665 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4666 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4667 SRS_Resource__resourceMapping__nrofSymbols_n1;
4668 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4669 SRS_Resource__resourceMapping__repetitionFactor_n1;
4671 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4672 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4673 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4674 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4675 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4676 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4677 SRS_Resource__groupOrSequenceHopping_neither;
4679 /* Setting resource type to aperiodic for intergration purposes */
4680 resourceList->list.array[rsrcIdx]->resourceType.present = \
4681 SRS_Resource__resourceType_PR_aperiodic;
4682 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4683 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4684 sizeof(struct SRS_Resource__resourceType__aperiodic));
4685 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4687 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4690 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4695 /*******************************************************************
4697 * @brief Build SRS resource set Add/mod list
4701 * Function : BuildSrsRsrcSetAddModList
4703 * Functionality: Build SRS resource set Add/mod list
4706 * @return ROK - success
4709 * ****************************************************************/
4710 uint8_t BuildSrsRsrcSetAddModList
4712 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4718 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4721 rsrcSetList->list.count = elementCnt;
4722 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4723 rsrcSetList->list.array = NULLP;
4724 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4725 if(!rsrcSetList->list.array)
4727 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4731 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4733 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4734 if(!rsrcSetList->list.array[rSetIdx])
4736 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4742 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4744 /* Fill Resource Id list in resource set */
4745 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4746 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4747 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4748 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4750 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4755 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4756 rsrcIdList->list.count = elementCnt;
4757 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4758 rsrcIdList->list.array = NULLP;
4759 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4760 if(!rsrcIdList->list.array)
4762 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4766 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4768 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4769 if(!rsrcIdList->list.array[rsrcIdx])
4771 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4777 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4779 /* Fill resource type */
4780 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4781 SRS_ResourceSet__resourceType_PR_aperiodic;
4783 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4784 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4785 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4786 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4788 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4791 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4792 = APERIODIC_SRS_RESRC_TRIGGER;
4794 /* TODO : Fill values for below IEs as expected by Viavi */
4795 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4796 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4799 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4800 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4801 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4802 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4803 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4808 /*******************************************************************
4810 * @brief Builds BWP UL dedicated SRS Config
4814 * Function : BuildBWPUlDedSrsCfg
4816 * Functionality: Builds BWP UL dedicated SRS Config
4818 * @params[in] SRS Config
4819 * @return ROK - success
4822 * ****************************************************************/
4823 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4825 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4826 srsCfg->srs_ResourceSetToAddModList = NULLP;
4827 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4828 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4829 if(!srsCfg->srs_ResourceSetToAddModList)
4831 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4834 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4839 srsCfg->srs_ResourceToReleaseList = NULLP;
4841 /* Resource to Add/Modify list */
4842 srsCfg->srs_ResourceToAddModList = NULLP;
4843 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4844 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4845 if(!srsCfg->srs_ResourceToAddModList)
4847 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4851 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4856 srsCfg->tpc_Accumulation = NULLP;
4861 /*******************************************************************
4863 * @brief Builds inital UL BWP
4867 * Function : BuildInitialUlBWP
4869 * Functionality: Builds initial UL BWP
4871 * @params[in] BWP_UplinkDedicated_t *ulBwp
4872 * @return ROK - success
4875 * ****************************************************************/
4876 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4878 ulBwp->pucch_Config = NULLP;
4879 ulBwp->pucch_Config = NULLP;
4880 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4881 if(!ulBwp->pucch_Config)
4883 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4887 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4888 ulBwp->pucch_Config->choice.setup = NULLP;
4889 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4890 if(!ulBwp->pucch_Config->choice.setup)
4892 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4896 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4901 /* Fill BWP UL dedicated PUSCH config */
4902 ulBwp->pusch_Config = NULLP;
4903 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4904 if(!ulBwp->pusch_Config)
4906 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4910 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4911 ulBwp->pusch_Config->choice.setup = NULLP;
4912 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4913 if(!ulBwp->pusch_Config->choice.setup)
4915 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4919 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4924 ulBwp->configuredGrantConfig = NULLP;
4926 /* Fill BPW UL dedicated SRS config */
4927 ulBwp->srs_Config = NULLP;
4928 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4929 if(!ulBwp->srs_Config)
4931 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4935 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4936 ulBwp->srs_Config->choice.setup = NULLP;
4937 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4938 if(!ulBwp->srs_Config->choice.setup)
4940 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4944 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4949 ulBwp->beamFailureRecoveryConfig = NULLP;
4954 /*******************************************************************
4956 * @brief Builds Pusch Serving cell Config
4960 * Function : BuildPuschSrvCellCfg
4962 * Functionality: Builds Pusch Serving cell Config
4964 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4966 * @return ROK - success
4969 * ****************************************************************/
4970 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4972 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4973 puschCfg->choice.setup = NULLP;
4974 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4975 if(!puschCfg->choice.setup)
4977 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4981 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4982 puschCfg->choice.setup->rateMatching = NULLP;
4983 puschCfg->choice.setup->xOverhead = NULLP;
4984 puschCfg->choice.setup->ext1 = NULLP;
4985 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4986 if(!puschCfg->choice.setup->ext1)
4988 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4992 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4993 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4994 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4996 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4999 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
5001 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
5002 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
5003 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
5005 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5008 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
5012 /*******************************************************************
5014 * @brief Builds UL config
5017 * Function : BuildUlCfg
5019 * Functionality: Builds UL config in spCellCfgDed
5021 * @params[in] UplinkConfig_t *ulCfg
5023 * @return ROK - success
5026 * ****************************************************************/
5027 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
5029 ulCfg->initialUplinkBWP = NULLP;
5030 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5031 if(!ulCfg->initialUplinkBWP)
5033 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5037 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
5042 ulCfg->uplinkBWP_ToReleaseList = NULLP;
5043 ulCfg->uplinkBWP_ToAddModList = NULLP;
5044 ulCfg->firstActiveUplinkBWP_Id = NULLP;
5045 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5046 if(!ulCfg->firstActiveUplinkBWP_Id)
5048 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5051 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5053 ulCfg->pusch_ServingCellConfig = NULLP;
5054 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
5055 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5056 if(!ulCfg->pusch_ServingCellConfig)
5058 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5062 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5067 ulCfg->carrierSwitching = NULLP;
5068 ulCfg->ext1 = NULLP;
5072 /*******************************************************************
5074 * @brief Builds PDSCH serving cell config
5077 * Function : BuildPdschSrvCellCfg
5079 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5081 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5083 * @return ROK - success
5086 * ****************************************************************/
5087 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5089 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5090 pdschCfg->choice.setup = NULLP;
5091 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5092 if(!pdschCfg->choice.setup)
5094 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5098 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5099 pdschCfg->choice.setup->xOverhead = NULLP;
5100 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5101 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5102 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5104 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5107 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5108 pdschCfg->choice.setup->pucch_Cell = NULLP;
5109 pdschCfg->choice.setup->ext1 = NULLP;
5114 /*******************************************************************
5116 * @brief Builds CSI Meas config
5119 * Function : BuildCsiMeasCfg
5121 * Functionality: Builds CSI Meas config in spCellCfgDed
5123 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5125 * @return ROK - success
5128 * ****************************************************************/
5129 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5135 /*******************************************************************
5137 * @brief Builds Spcell config dedicated
5140 * Function : BuildSpCellCfgDed
5142 * Functionality: Builds sp cell config dedicated in spCellCfg
5144 * @params[in] ServingCellConfig_t srvCellCfg
5146 * @return ROK - success
5149 * ****************************************************************/
5150 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5152 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5154 srvCellCfg->initialDownlinkBWP = NULLP;
5155 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5156 if(!srvCellCfg->initialDownlinkBWP)
5158 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5162 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5164 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5167 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5168 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5170 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5171 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5172 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5174 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5177 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5179 srvCellCfg->bwp_InactivityTimer = NULLP;
5181 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5182 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5183 if(!srvCellCfg->defaultDownlinkBWP_Id)
5185 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5188 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5190 srvCellCfg->uplinkConfig = NULLP;
5191 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5192 if(!srvCellCfg->uplinkConfig)
5194 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5198 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5200 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5203 srvCellCfg->supplementaryUplink = NULLP;
5204 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5206 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5207 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5208 if(!srvCellCfg->pdsch_ServingCellConfig)
5210 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5214 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5216 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5220 srvCellCfg->csi_MeasConfig = NULLP;
5222 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5223 if(!srvCellCfg->csi_MeasConfig)
5225 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5229 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5231 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5235 srvCellCfg->sCellDeactivationTimer = NULLP;
5236 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5237 srvCellCfg->tag_Id = TAG_ID;
5238 srvCellCfg->dummy = NULLP;
5239 srvCellCfg->pathlossReferenceLinking = NULLP;
5240 srvCellCfg->servingCellMO = NULLP;
5241 srvCellCfg->ext1 = NULLP;
5245 /*******************************************************************
5247 * @brief Builds Spcell config
5251 * Function : BuildSpCellCfg
5253 * Functionality: Builds sp cell config in DuToCuRrcContainer
5255 * @params[in] SpCellConfig_t spCellCfg
5257 * @return ROK - success
5260 * ****************************************************************/
5261 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5264 spCellCfg->servCellIndex = NULLP;
5265 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5266 if(!spCellCfg->servCellIndex)
5268 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5271 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5273 spCellCfg->reconfigurationWithSync = NULLP;
5274 spCellCfg->rlf_TimersAndConstants = NULLP;
5275 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5276 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5277 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5279 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5282 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5284 spCellCfg->spCellConfigDedicated = NULLP;
5285 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5286 if(!spCellCfg->spCellConfigDedicated)
5288 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5291 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5293 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5298 /*******************************************************************
5300 * @brief Builds Phy cell group config
5304 * Function : BuildPhyCellGrpCfg
5306 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5308 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5310 * @return ROK - success
5313 * ****************************************************************/
5314 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5316 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5317 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5319 phyCellGrpCfg->p_NR_FR1 = NULLP;
5320 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5321 if(!phyCellGrpCfg->p_NR_FR1)
5323 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5326 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5327 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5328 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5329 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5330 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5331 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5332 phyCellGrpCfg->cs_RNTI = NULLP;
5333 phyCellGrpCfg->ext1 = NULLP;
5334 phyCellGrpCfg->ext2 = NULLP;
5339 /*******************************************************************
5341 * @brief Builds tag config
5345 * Function : BuildTagConfig
5347 * Functionality: Builds tag config in MacCellGroupConfig
5349 * @params[in] TAG_Config *tag_Config
5351 * @return ROK - success
5354 * ****************************************************************/
5355 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5357 struct TAG_Config__tag_ToAddModList *tagList;
5358 uint8_t idx, elementCnt;
5360 tagConfig->tag_ToReleaseList = NULLP;
5361 tagConfig->tag_ToAddModList = NULLP;
5362 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5363 if(!tagConfig->tag_ToAddModList)
5365 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5369 elementCnt = 1; //ODU_VALUE_ONE;
5370 tagList = tagConfig->tag_ToAddModList;
5371 tagList->list.count = elementCnt;
5372 tagList->list.size = elementCnt * sizeof(struct TAG *);
5374 tagList->list.array = NULLP;
5375 CU_ALLOC(tagList->list.array, tagList->list.size);
5376 if(!tagList->list.array)
5378 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5382 for(idx=0; idx<tagList->list.count; idx++)
5384 tagList->list.array[idx] = NULLP;
5385 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5386 if(!tagList->list.array[idx])
5388 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5394 tagList->list.array[idx]->tag_Id = TAG_ID;
5395 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5400 /*******************************************************************
5402 * @brief Builds PHR Config
5406 * Function : BuildPhrConfig
5408 * Functionality: Builds phrConfig in MacCellGroupConfig
5410 * @params[in] PHR Config *
5412 * @return ROK - success
5415 * ****************************************************************/
5416 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5419 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5420 phrConfig->choice.setup = NULLP;
5421 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5422 if(!phrConfig->choice.setup)
5424 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5428 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5429 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5430 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5431 phrConfig->choice.setup->multiplePHR = false;
5432 phrConfig->choice.setup->dummy = false;
5433 phrConfig->choice.setup->phr_Type2OtherCell = false;
5434 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5439 /*******************************************************************
5441 * @brief Builds BSR Config
5445 * Function : BuildBsrConfig
5447 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5449 * @params[in] BSR_Config *bsrConfig
5451 * @return ROK - success
5454 * ****************************************************************/
5455 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5457 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5458 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5459 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5464 /*******************************************************************
5466 * @brief Builds scheduling request config
5470 * Function : BuildSchedulingReqConfig
5472 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5474 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5476 * @return ROK - success
5479 * ****************************************************************/
5480 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5482 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5483 uint8_t idx, elementCnt;
5485 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5486 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5487 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5488 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5490 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5494 elementCnt = 1; //ODU_VALUE_ONE;
5495 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5496 schReqList->list.count = elementCnt;
5497 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5499 schReqList->list.array = NULLP;
5500 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5501 if(!schReqList->list.array)
5503 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5507 for(idx=0;idx<schReqList->list.count; idx++)
5509 schReqList->list.array[idx] = NULLP;
5510 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5511 if(!schReqList->list.array[idx])
5513 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5519 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5521 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5522 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5523 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5525 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5528 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5529 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5530 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5534 /*******************************************************************
5536 * @brief Builds Mac cell group config
5540 * Function : BuildMacCellGrpCfg
5542 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5544 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5546 * @return ROK - success
5549 * ****************************************************************/
5550 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5552 macCellGrpCfg->drx_ConfigRrc = NULLP;
5553 macCellGrpCfg->schedulingRequestConfig = NULLP;
5554 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5555 if(!macCellGrpCfg->schedulingRequestConfig)
5557 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5561 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5563 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5567 macCellGrpCfg->bsr_Config = NULLP;
5568 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5569 if(!macCellGrpCfg->bsr_Config)
5571 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5575 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5577 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5581 macCellGrpCfg->tag_Config = NULLP;
5582 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5583 if(!macCellGrpCfg->tag_Config)
5585 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5589 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5591 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5595 macCellGrpCfg->phr_Config = NULLP;
5596 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5597 if(!macCellGrpCfg->phr_Config)
5599 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5603 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5605 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5609 macCellGrpCfg->skipUplinkTxDynamic = false;
5610 macCellGrpCfg->ext1 = NULLP;
5614 /*******************************************************************
5616 * @brief Frees memeory allocated for SearchSpcToAddModList
5620 * Function : FreeSearchSpcToAddModList
5622 * Functionality: Deallocating memory of SearchSpcToAddModList
5624 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5628 4221 * ****************************************************************/
5629 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5633 struct SearchSpace *searchSpc=NULLP;
5635 if(searchSpcList->list.array)
5637 if(searchSpcList->list.array[idx2])
5639 searchSpc = searchSpcList->list.array[idx2];
5640 if(searchSpc->controlResourceSetId)
5642 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5644 if(searchSpc->monitoringSymbolsWithinSlot)
5646 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5648 if(searchSpc->nrofCandidates)
5650 if(searchSpc->searchSpaceType)
5652 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5653 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5654 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5655 SearchSpace__searchSpaceType));
5657 CU_FREE(searchSpc->nrofCandidates,
5658 sizeof(struct SearchSpace__nrofCandidates));
5660 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5661 searchSpc->monitoringSymbolsWithinSlot->size);
5663 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5664 sizeof(BIT_STRING_t));
5666 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5667 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5669 CU_FREE(searchSpc->controlResourceSetId,
5670 sizeof(ControlResourceSetId_t));
5673 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5675 CU_FREE(searchSpcList->list.array[idx1],
5676 sizeof(struct SearchSpace));
5678 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5681 /*******************************************************************
5683 * @brief Frees memory allocated for PdschTimeDomAllocList
5687 * Function : FreePdschTimeDomAllocList
5689 * Functionality: Deallocating memory of PdschTimeDomAllocList
5691 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5695 4221 * ****************************************************************/
5696 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5700 if(timeDomAllocList->choice.setup)
5702 if(timeDomAllocList->choice.setup->list.array)
5704 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5706 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5707 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5709 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5710 timeDomAllocList->choice.setup->list.size);
5712 CU_FREE(timeDomAllocList->choice.setup,\
5713 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5716 /*******************************************************************
5718 * @brief Frees memory allocated for PuschTimeDomAllocList
5722 * Function : FreePuschTimeDomAllocList
5724 * Functionality: Deallocating memory of PuschTimeDomAllocList
5726 * @params[in] PUSCH_Config_t *puschCfg
5730 ***********************************************************************/
5731 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5735 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5737 if(puschCfg->pusch_TimeDomainAllocationList)
5739 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5740 if(timeDomAllocList_t->choice.setup)
5742 if(timeDomAllocList_t->choice.setup->list.array)
5744 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5745 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5747 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5748 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5750 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5751 timeDomAllocList_t->choice.setup->list.size);
5753 CU_FREE(timeDomAllocList_t->choice.setup, \
5754 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5756 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5757 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5758 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5763 /*******************************************************************
5765 * @brief Frees memory allocated for Dedicated PUCCH config
5769 * Function : FreeBWPUlDedPucchCfg
5771 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5773 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5777 * ****************************************************************/
5778 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5780 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5781 PUCCH_Config_t *pucchCfg = NULLP;
5782 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5783 PUCCH_Resource_t *rsrc = NULLP;
5787 if(ulBwpPucchCfg->choice.setup)
5789 pucchCfg = ulBwpPucchCfg->choice.setup;
5791 //Free resource set list
5792 if(pucchCfg->resourceSetToAddModList)
5794 if(pucchCfg->resourceSetToAddModList->list.array)
5796 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5798 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5799 if(rsrcSet->resourceList.list.array)
5801 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5803 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5805 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5807 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5809 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5811 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5814 //Free resource list
5815 if(pucchCfg->resourceToAddModList)
5817 if(pucchCfg->resourceToAddModList->list.array)
5819 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5821 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5822 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5823 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5825 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5827 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5831 if(pucchCfg->format1)
5833 if(pucchCfg->format1->choice.setup)
5835 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5836 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5838 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5842 if(pucchCfg->dl_DataToUL_ACK)
5844 if(pucchCfg->dl_DataToUL_ACK->list.array)
5846 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5848 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5850 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5852 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5855 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5857 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5861 /*******************************************************************
5863 * @brief Frees memory allocated for InitialUlBWP
5867 * Function : FreeInitialUlBWP
5869 * Functionality: Deallocating memory of InitialUlBWP
5871 * @params[in] BWP_UplinkDedicated_t *ulBwp
5875 * ****************************************************************/
5876 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5878 uint8_t rSetIdx, rsrcIdx;
5879 SRS_Config_t *srsCfg = NULLP;
5880 PUSCH_Config_t *puschCfg = NULLP;
5881 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5882 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5883 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5884 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5886 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5888 if(ulBwp->pusch_Config)
5890 if(ulBwp->pusch_Config->choice.setup)
5892 puschCfg=ulBwp->pusch_Config->choice.setup;
5893 if(puschCfg->dataScramblingIdentityPUSCH)
5895 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5897 FreePuschTimeDomAllocList(puschCfg);
5898 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5899 if(dmrsUlCfg->choice.setup)
5901 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5903 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5905 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5907 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5908 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5910 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5913 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5915 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5916 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5918 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5920 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5922 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5924 /* Free SRS-Config */
5925 if(ulBwp->srs_Config)
5927 if(ulBwp->srs_Config->choice.setup)
5929 srsCfg = ulBwp->srs_Config->choice.setup;
5931 /* Free Resource Set to add/mod list */
5932 if(srsCfg->srs_ResourceSetToAddModList)
5934 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5935 if(rsrcSetList->list.array)
5939 /* Free SRS resource Id list in this SRS resource set */
5940 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5942 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5944 if(rsrcIdList->list.array)
5946 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5948 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5950 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5952 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5953 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5956 /* Free resource type info for this SRS resource set */
5957 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5958 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5960 /* Free memory for each resource set */
5961 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5963 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5965 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5967 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5968 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5971 /* Free resource to add/modd list */
5972 if(srsCfg->srs_ResourceToAddModList)
5974 resourceList = srsCfg->srs_ResourceToAddModList;
5975 if(resourceList->list.array)
5978 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5979 sizeof(struct SRS_Resource__transmissionComb__n2));
5980 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5981 sizeof(struct SRS_Resource__resourceType__aperiodic));
5983 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5985 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5987 CU_FREE(resourceList->list.array, resourceList->list.size);
5989 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5990 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5993 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5995 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5999 /*******************************************************************
6001 * @brief Frees memory allocated for initialUplinkBWP
6005 * Function : FreeinitialUplinkBWP
6007 * Functionality: Deallocating memory of initialUplinkBWP
6009 * @params[in] UplinkConfig_t *ulCfg
6014 * ****************************************************************/
6015 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
6017 BWP_UplinkDedicated_t *ulBwp=NULLP;
6018 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6020 if(ulCfg->initialUplinkBWP)
6022 ulBwp=ulCfg->initialUplinkBWP;
6023 if(ulCfg->firstActiveUplinkBWP_Id)
6025 if(ulCfg->pusch_ServingCellConfig)
6027 puschCfg=ulCfg->pusch_ServingCellConfig;
6028 if(puschCfg->choice.setup)
6030 if(puschCfg->choice.setup->ext1)
6032 CU_FREE(puschCfg->choice.setup->ext1->\
6033 processingType2Enabled,sizeof(BOOLEAN_t));
6034 CU_FREE(puschCfg->choice.setup->ext1->\
6035 maxMIMO_Layers,sizeof(long));
6036 CU_FREE(puschCfg->choice.setup->ext1, \
6037 sizeof(struct PUSCH_ServingCellConfig__ext1));
6039 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
6041 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
6043 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
6045 FreeInitialUlBWP(ulBwp);
6046 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6049 /*******************************************************************
6051 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6055 * Function : FreeBWPDlDedPdschCfg
6057 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6059 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6064 * ****************************************************************/
6065 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6067 struct PDSCH_Config *pdschCfg=NULLP;
6068 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6069 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6070 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6072 if(dlBwp->pdsch_Config->choice.setup)
6074 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6075 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6077 if(pdschCfg->pdsch_TimeDomainAllocationList)
6079 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6080 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6082 prbBndlType=&pdschCfg->prb_BundlingType;
6083 CU_FREE(prbBndlType->choice.staticBundling,\
6084 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6085 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6087 FreePdschTimeDomAllocList(timeDomAllocList);
6088 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6089 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6091 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6092 if(dmrsDlCfg->choice.setup)
6094 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6096 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6098 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6099 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6101 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6104 /*******************************************************************
6106 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6110 * Function : FreeBWPDlDedPdcchCfg
6112 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6114 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6119 * ****************************************************************/
6120 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6124 struct PDCCH_Config *pdcchCfg=NULLP;
6125 struct ControlResourceSet *controlRSet=NULLP;
6126 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6128 if(dlBwp->pdcch_Config->choice.setup)
6130 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6131 if(pdcchCfg->controlResourceSetToAddModList)
6133 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6134 if(controlRSetList->list.array)
6136 controlRSet = controlRSetList->list.array[idx2];
6139 if(controlRSet->frequencyDomainResources.buf)
6141 if(controlRSet->pdcch_DMRS_ScramblingID)
6143 if(pdcchCfg->searchSpacesToAddModList)
6145 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6146 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6147 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6149 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6151 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6152 controlRSet->frequencyDomainResources.size);
6155 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6157 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6159 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6161 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6162 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6164 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6167 /*******************************************************************
6169 * @brief Builds RLC Config
6173 * Function : BuildRlcConfig
6175 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6177 * @params[in] RLC_Config *rlcConfig
6179 * @return ROK - success
6182 * ****************************************************************/
6183 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6185 rlcConfig->present = rlcLcCfgDb.rlcMode;
6187 switch(rlcConfig->present)
6189 case RLC_Config_PR_am:
6191 rlcConfig->choice.am = NULLP;
6192 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6193 if(!rlcConfig->choice.am)
6195 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6200 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6201 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6202 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6204 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6207 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6208 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6209 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6210 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6211 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6214 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6215 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6216 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6218 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6221 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6222 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6223 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6228 case RLC_Config_PR_um_Bi_Directional:
6230 rlcConfig->choice.um_Bi_Directional = NULLP;
6231 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6232 if(!rlcConfig->choice.um_Bi_Directional)
6234 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6239 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6240 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6241 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6243 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6246 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6249 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6250 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6251 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6253 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6256 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6257 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6264 /*******************************************************************
6266 * @brief Builds MAC LC Config
6270 * Function : BuildMacLCConfig
6272 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6274 * @params[in] struct LogicalChannelConfig macLcConfig
6276 * @return ROK - success
6279 * ****************************************************************/
6280 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6283 macLcConfig->ul_SpecificParameters = NULLP;
6284 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6285 if(!macLcConfig->ul_SpecificParameters)
6287 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6291 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6292 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6293 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6294 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6295 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6296 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6297 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6299 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6300 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6301 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6303 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6306 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6308 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6309 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6310 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6312 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6315 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6317 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6318 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6319 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6323 /*******************************************************************
6325 * @brief Builds RLC Bearer to Add/Mod list
6329 * Function :BuildRlcBearerToAddModList
6331 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6333 * @params[in] rlc_BearerToAddModList
6335 * @return ROK - success
6338 * ****************************************************************/
6339 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6341 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6344 elementCnt = ueCb->numSrb + ueCb->numDrb;
6347 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6349 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6353 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6355 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6362 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6365 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6368 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6371 rlcBearerList->list.count = elementCnt;
6372 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6374 rlcBearerList->list.array = NULLP;
6375 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6376 if(!rlcBearerList->list.array)
6378 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6382 for(idx=0; idx<rlcBearerList->list.count; idx++)
6384 rlcBearerList->list.array[idx] = NULLP;
6385 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6386 if(!rlcBearerList->list.array[idx])
6388 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6395 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6397 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6400 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6402 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6403 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6405 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6409 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6410 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6412 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6413 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6414 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6415 if(!rlcBearerList->list.array[idx]->rlc_Config)
6417 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6421 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6423 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6427 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6428 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6429 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6431 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6435 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6437 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6443 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6445 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6448 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6450 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6451 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6453 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6457 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6458 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6460 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6461 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6462 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6463 if(!rlcBearerList->list.array[idx]->rlc_Config)
6465 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6469 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6471 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6475 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6476 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6477 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6479 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6483 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6485 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6493 /*******************************************************************
6495 * @brief Free memory allocated for CellGroupConfig
6499 * Function : FreeMemCellGrpCfg
6501 * Functionality: Deallocating memory of CellGroupConfig
6503 * @params[in] pointer to CellGroupConfigRrc_t
6505 * @return ROK - success
6508 ******************************************************************/
6509 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6512 SpCellConfig_t *spCellCfg=NULLP;
6513 ServingCellConfig_t *srvCellCfg=NULLP;
6514 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6515 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6516 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6517 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6518 struct RLC_Config *rlcConfig=NULLP;
6519 struct LogicalChannelConfig *macLcConfig=NULLP;
6520 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6521 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6522 struct TAG_Config *tagConfig=NULLP;
6523 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6524 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6525 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6527 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6530 if(rlcBearerList->list.array)
6532 for(idx=0; idx<rlcBearerList->list.count; idx++)
6534 if(rlcBearerList->list.array[idx])
6536 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6537 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6540 if(rlcConfig->choice.am)
6542 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6543 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6544 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6546 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6548 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6551 if(macLcConfig->ul_SpecificParameters)
6553 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6554 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6555 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6557 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6559 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6562 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6564 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6567 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6570 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6571 if(schedulingRequestConfig)
6573 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6576 if(schReqList->list.array)
6578 for(idx=0;idx<schReqList->list.count; idx++)
6580 if(schReqList->list.array[idx])
6582 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6583 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6586 CU_FREE(schReqList->list.array, schReqList->list.size);
6588 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6589 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6590 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6592 if(macCellGrpCfg->bsr_Config)
6594 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6596 tagConfig = macCellGrpCfg->tag_Config;
6599 tagList = tagConfig->tag_ToAddModList;
6602 if(tagList->list.array)
6604 for(idx=0; idx<tagList->list.count; idx++)
6606 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6608 CU_FREE(tagList->list.array, tagList->list.size);
6610 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6612 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6615 phrConfig = macCellGrpCfg->phr_Config;
6618 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6619 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6622 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6625 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6628 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6629 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6632 spCellCfg = cellGrpCfg->spCellConfig;
6635 if(spCellCfg->servCellIndex)
6637 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6639 if(spCellCfg->spCellConfigDedicated)
6641 srvCellCfg = spCellCfg->spCellConfigDedicated;
6642 if(srvCellCfg->initialDownlinkBWP)
6644 dlBwp = srvCellCfg->initialDownlinkBWP;
6645 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6647 if(srvCellCfg->defaultDownlinkBWP_Id)
6649 if(srvCellCfg->uplinkConfig)
6651 if(srvCellCfg->pdsch_ServingCellConfig)
6653 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6654 if(pdschCfg->choice.setup)
6656 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6657 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6659 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6660 ServingCellConfig__pdsch_ServingCellConfig));
6662 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6663 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6665 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6667 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6669 if(dlBwp->pdcch_Config)
6671 if(dlBwp->pdsch_Config)
6673 FreeBWPDlDedPdschCfg(dlBwp);
6674 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6676 FreeBWPDlDedPdcchCfg(dlBwp);
6677 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6679 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6681 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6683 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6685 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6687 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6692 /*******************************************************************
6694 * @brief Fills CellGroupConfig
6698 * Function : fillCellGrpCfg
6700 * Functionality: Fills CellGroupConfig
6702 * @params[in] pointer to CellGroupConfigRrc_t
6704 * @return ROK - success
6707 ******************************************************************/
6709 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6711 uint8_t ret = RFAILED;
6712 CellGroupConfigRrc_t cellGrpCfg;
6713 asn_enc_rval_t encRetVal;
6717 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6719 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6721 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6723 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6727 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6728 cellGrpCfg.mac_CellGroupConfig = NULLP;
6729 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6730 if(!cellGrpCfg.mac_CellGroupConfig)
6732 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6735 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6737 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6741 cellGrpCfg.physicalCellGroupConfig = NULLP;
6742 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6743 if(!cellGrpCfg.physicalCellGroupConfig)
6745 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6748 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6750 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6754 cellGrpCfg.spCellConfig = NULLP;
6755 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6756 if(!cellGrpCfg.spCellConfig)
6758 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6761 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6763 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6767 cellGrpCfg.sCellToAddModList = NULLP;
6768 cellGrpCfg.sCellToReleaseList = NULLP;
6769 cellGrpCfg.ext1 = NULLP;
6771 /* encode cellGrpCfg into duToCuRrcContainer */
6772 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6773 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6775 encRetVal = uper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6776 /* Encode results */
6777 if(encRetVal.encoded == ENCODE_FAIL)
6779 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6780 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6785 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6786 for(int i=0; i< encBufSize; i++)
6788 DU_LOG("%x",encBuf[i]);
6792 cellGrp->size = encBufSize;
6793 CU_ALLOC(cellGrp->buf, cellGrp->size);
6796 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6799 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6803 FreeMemCellGrpCfg(&cellGrpCfg);
6807 /*******************************************************************
6809 * @brief Free UE Capability RAT container
6813 * Function : freeUeCapRatCont
6816 * Free UE Capability RAT conatiner
6819 * @return ROK - success
6822 * ****************************************************************/
6823 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6826 FeatureSets_t *featureSets;
6828 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6830 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6832 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6833 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6835 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6838 if(ueNrCap->featureSets)
6840 featureSets = ueNrCap->featureSets;
6841 if(featureSets->featureSetsDownlinkPerCC)
6843 if(featureSets->featureSetsDownlinkPerCC->list.array)
6845 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6847 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6848 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6849 sizeof(ModulationOrder_t));
6850 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6852 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6854 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6857 if(featureSets->featureSetsUplinkPerCC)
6859 if(featureSets->featureSetsUplinkPerCC->list.array)
6861 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6863 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6865 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6866 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6867 sizeof(ModulationOrder_t));
6868 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6871 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6873 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6875 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6879 /*******************************************************************
6881 * @brief Free UE capability RAT container list
6885 * Function : freeUeCapRatContList
6887 * Functionality: Free UE capability RAT container list
6890 * @return ROK - success
6893 * ****************************************************************/
6894 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6897 if(ueCapablityList->list.array)
6899 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6901 if(ueCapablityList->list.array[idx])
6902 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6904 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6908 /*******************************************************************
6910 * @brief Free Handover preparation information
6914 * Function : freeHOPreparationInfo
6916 * Functionality: Free Handover preparation information
6919 * @return ROK - success
6922 * ****************************************************************/
6923 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6925 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6927 if(hoPrep->criticalExtensions.choice.c1)
6929 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6931 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6932 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6933 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6934 sizeof(HandoverPreparationInformationRrc_IEs_t));
6936 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6940 /*******************************************************************
6942 * @brief Fill feature sets
6946 * Function : fillFeatureSets
6948 * Functionality: Fill feature sets
6951 * @return ROK - success
6954 * ****************************************************************/
6955 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6957 uint8_t idx, elementCnt;
6959 featureSets->featureSetsDownlink = NULLP;
6960 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6961 if(!featureSets->featureSetsDownlinkPerCC)
6963 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6968 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6969 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6970 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6971 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6973 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6977 for(idx = 0; idx < elementCnt; idx++)
6979 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6980 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6982 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6988 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6989 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6990 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6991 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6992 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6994 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6995 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6997 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7000 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
7002 featureSets->featureSetsUplink = NULLP;
7003 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
7004 if(!featureSets->featureSetsUplinkPerCC)
7006 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7011 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
7012 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
7013 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
7014 if(!featureSets->featureSetsUplinkPerCC->list.array)
7016 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7020 for(idx = 0; idx < elementCnt; idx++)
7022 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
7023 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
7025 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7031 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
7032 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
7033 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
7034 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
7035 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
7036 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
7038 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
7039 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
7041 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7044 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
7049 /*******************************************************************
7051 * @brief Fill UE capability RAT container
7055 * Function : fillUeCapRatCont
7057 * Functionality: Fill UE capability RAT container
7059 * @params[in] UE Capability RAT container buffer
7060 * @return ROK - success
7063 * ****************************************************************/
7064 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
7067 uint8_t idx, elementCnt;
7068 asn_enc_rval_t encRetVal;
7069 UE_NR_Capability_t ueNrCap;
7073 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7075 /* Filling PDCP parameters */
7076 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7077 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7078 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7079 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7080 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7081 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7082 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7083 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7084 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7085 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7086 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7087 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7088 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7089 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7090 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7091 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7092 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7094 ueNrCap.rlc_Parameters = NULLP;
7095 ueNrCap.mac_Parameters = NULLP;
7097 /* Filling PHY parameters */
7098 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7099 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7100 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7101 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7102 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7104 /* Filling RF parameters */
7106 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7107 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7108 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7109 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7111 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7116 for(idx = 0; idx < elementCnt; idx++)
7118 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7119 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7129 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7130 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7131 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7133 ueNrCap.measAndMobParameters = NULLP;
7134 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7135 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7136 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7137 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7138 ueNrCap.featureSets = NULLP;
7140 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7141 if(!ueNrCap.featureSets)
7143 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7148 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7150 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7155 ueNrCap.featureSetCombinations = NULLP;
7156 ueNrCap.lateNonCriticalExtension = NULLP;
7157 ueNrCap.nonCriticalExtension = NULLP;
7159 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7160 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7161 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7163 encRetVal = uper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7165 /* Encode results */
7166 if(encRetVal.encoded == ENCODE_FAIL)
7168 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7169 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7174 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7175 for(int i=0; i< encBufSize; i++)
7177 DU_LOG("%x",encBuf[i]);
7181 ueCapRatContBuf->size = encBufSize;
7182 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7183 if(!ueCapRatContBuf->buf)
7185 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7188 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7192 freeUeCapRatCont(&ueNrCap);
7196 /*******************************************************************
7198 * @brief Fill UE Capability RAT container list
7202 * Function : fillUeCapRatContList
7204 * Functionality: Fill UE Capability RAT container list
7207 * @params[in] UE capability RAT container list
7208 * @return ROK - success
7211 * ****************************************************************/
7212 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7214 uint8_t ret = RFAILED;
7215 uint8_t idx, elementCnt;
7220 ueCapablityList->list.count = elementCnt;
7221 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7223 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7224 if(!ueCapablityList->list.array)
7226 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7231 for(idx=0; idx<elementCnt; idx++)
7233 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7234 if(ueCapablityList->list.array[idx] == NULLP)
7236 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7242 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7243 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7245 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7256 /*******************************************************************
7258 * @brief Fill UE Capability RAT container list octet string
7262 * Function : fillUeCapRatContListBuf
7264 * Functionality: Fill UE Capability RAT container list octet string
7267 * @params[in] UE capability RAT container list buffer
7268 * @return ROK - success
7271 * ****************************************************************/
7272 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7274 uint8_t ret = RFAILED;
7275 asn_enc_rval_t encRetVal;
7276 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7280 ret = fillUeCapRatContList(&ueCapablityList);
7283 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7287 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7288 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7289 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7291 encRetVal = uper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7292 &ueCapablityList, PrepFinalEncBuf, encBuf);
7294 /* Encode results */
7295 if(encRetVal.encoded == ENCODE_FAIL)
7297 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7298 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7303 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7304 for(int i=0; i< encBufSize; i++)
7306 DU_LOG("%x",encBuf[i]);
7310 ueCapablityListBuf->size = encBufSize;
7311 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7312 if(!ueCapablityListBuf->buf)
7314 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7317 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7321 freeUeCapRatContList(&ueCapablityList);
7325 /*******************************************************************
7327 * @brief Free Measurement Timing Configuration
7331 * Function : freeMeasuementTimingConfig
7333 * Functionality: Free Measurement Timing Configuration
7335 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7338 * ****************************************************************/
7339 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7342 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7343 MeasTiming_t *measTiming = NULLP;
7345 if(measTimingConfig.criticalExtensions.choice.c1)
7347 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7349 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7350 if(measTimingCfg->measTiming)
7352 if(measTimingCfg->measTiming->list.array)
7354 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7356 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7357 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7358 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7360 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7362 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7364 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7366 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7370 /*******************************************************************
7372 * @brief Fill Measurement Timing Configuration
7376 * Function : fillMeasTimingCfg
7378 * Functionality: Fill Measurement Timing Configuration
7380 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7381 * @return ROK - success
7384 * ****************************************************************/
7385 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7387 uint8_t elementCnt = 0;
7388 uint8_t measCfgIdx = 0;
7389 MeasTiming_t *measTiming;
7392 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7393 if(!measTimingCfg->measTiming)
7395 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7400 measTimingCfg->measTiming->list.count = elementCnt;
7401 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7402 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7403 if(!measTimingCfg->measTiming->list.array)
7405 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7409 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7411 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7412 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7414 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7420 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7421 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7422 if(!measTiming->frequencyAndTiming)
7424 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7428 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7429 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7431 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7432 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7433 smtc->periodicityAndOffset.choice.sf20 = 0;
7434 smtc->duration = SSB_MTC__duration_sf1;
7438 /*******************************************************************
7440 * @brief Fill Measurement Timing Configuration Octet string
7444 * Function : fillMeasConfigBuf
7446 * Functionality: Fill Measurement Timing Configuration Octet string
7449 * @params[in] MeasConfig_t *measConfgBuf
7450 * @return ROK - success
7453 * ****************************************************************/
7454 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7456 uint8_t ret = RFAILED;
7457 asn_enc_rval_t encRetVal;
7458 MeasurementTimingConfigurationRrc_t measTimingConfig;
7462 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7463 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7464 if(!measTimingConfig.criticalExtensions.choice.c1)
7466 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7469 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7471 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7472 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7474 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7478 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7481 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7485 /* Encode measurement timing configuration into octet string */
7486 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7487 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7489 encRetVal = uper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7491 /* Encode results */
7492 if(encRetVal.encoded == ENCODE_FAIL)
7494 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7495 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7500 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7501 for(int i=0; i< encBufSize; i++)
7503 DU_LOG("%x",encBuf[i]);
7507 measTimingConfigBuf->size = encBufSize;
7508 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7509 if(!measTimingConfigBuf->buf)
7511 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7514 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7518 freeMeasuementTimingConfig(measTimingConfig);
7522 /******************************************************************
7524 * @brief Free RRC reconfiguration non-critical extension
7528 * Function : freeRrcReconfigNonCriticalExt
7530 * Functionality: Free RRC reconfiguration non-critical extension
7532 * @params[in] RRC reconfiguration IE
7535 * ****************************************************************/
7536 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7538 if(rrcRecfg->masterCellGroup)
7540 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7544 /******************************************************************
7546 * @brief Free measurement object addmod list
7550 * Function : freeMeasObjToAddModList
7552 * Functionality: Free measurement object add mod list
7554 * @params[in] Measurement object add/mod list
7557 * ****************************************************************/
7558 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7561 MeasObjectNR_t *measObject;
7563 if(measObjList->list.array)
7565 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7567 if(measObjList->list.array[objIdx])
7569 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7571 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7572 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7573 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7574 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7575 if(measObject->absThreshSS_BlocksConsolidation)
7577 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7578 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7579 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7580 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7582 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7583 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7584 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7585 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7586 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7588 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7591 CU_FREE(measObjList->list.array, measObjList->list.size);
7595 /******************************************************************
7597 * @brief Free report config add mod list
7601 * Function : freeReportCfgToAddModList
7603 * Functionality: Free report config add mod list
7605 * @params[in] Report config list
7608 * ****************************************************************/
7609 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7611 uint8_t reportCfgIdx;
7612 ReportConfigToAddMod_t *reportCfg;
7613 ReportConfigNR_t *reportCfgNr;
7614 EventTriggerConfig_t *eventTriggCfg;
7616 if(reportCfgList->list.array)
7618 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7620 if(reportCfgList->list.array[reportCfgIdx])
7622 reportCfg = reportCfgList->list.array[reportCfgIdx];
7623 if(reportCfg->reportConfig.choice.reportConfigNR)
7625 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7626 if(reportCfgNr->reportType.choice.eventTriggered)
7628 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7629 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7630 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7631 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7632 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7636 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7638 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7642 /******************************************************************
7644 * @brief Free measurement id to add mod list
7648 * Function : freeMeasIdToAddModList
7650 * Functionality: Free measurement id to add mod list
7652 * @params[in] Measurement id to add mod list
7655 * ****************************************************************/
7656 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7659 if(measIdList->list.array)
7661 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7663 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7665 CU_FREE(measIdList->list.array, measIdList->list.size);
7669 /*******************************************************************
7671 * @brief Free quantity config
7675 * Function : freeQunatityConfig
7677 * Functionality: Free quantity config
7679 * @params[in] Quantity Config
7682 * ****************************************************************/
7683 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7686 QuantityConfigNR_t *quantityCfgNr;
7688 if(quantityCfg->quantityConfigNR_List)
7690 if(quantityCfg->quantityConfigNR_List->list.array)
7692 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7694 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7696 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7697 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7698 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7699 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7700 if(quantityCfgNr->quantityConfigRS_Index)
7702 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7703 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7704 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7705 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7707 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7710 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7712 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7716 /******************************************************************
7718 * @brief Free measurement Config
7722 * Function : freeMeasConfig
7724 * Functionality: Free measurement config
7726 * @params[in] Measurement config
7729 * ****************************************************************/
7730 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7732 if(measConfig->measObjectToAddModList)
7734 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7735 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7737 if(measConfig->reportConfigToAddModList)
7739 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7740 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7742 if(measConfig->measIdToAddModList)
7744 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7745 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7747 if(measConfig->s_MeasureConfig)
7749 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7751 if(measConfig->quantityConfig)
7753 freeQuantityConfig(measConfig->quantityConfig);
7754 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7757 /******************************************************************
7759 * @brief Free DRB to AddMod List
7763 * Function : freeDrbToAddModList
7765 * Functionality: Free SRB to AddMod List
7767 * @params[in] SBR to add/mod list
7770 * ****************************************************************/
7771 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7774 if(drbToAddList->list.array)
7776 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7778 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7780 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7782 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7783 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7784 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7785 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7787 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7788 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7790 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7792 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7796 /******************************************************************
7798 * @brief Free SRB to AddMod List
7802 * Function : freeSrbToAddModList
7804 * Functionality: Free SRB to AddMod List
7806 * @params[in] SBR to add/mod list
7809 * ****************************************************************/
7810 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7813 if(srbToAddList->list.array)
7815 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7817 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7818 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7820 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7821 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7824 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7826 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7830 /******************************************************************
7832 * @brief Free Radio Bearer Config
7836 * Function : freeRadioBearerConfig
7838 * Functionality: Free Radio Bearer config
7840 * @params[in] Radio bearer config
7843 * ****************************************************************/
7844 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7846 if(radioBearerConfig->srb_ToAddModList)
7848 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7849 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7851 if(radioBearerConfig->drb_ToAddModList)
7853 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7854 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7858 /******************************************************************
7860 * @brief Free reconfiguration message
7864 * Function : freeRrcReconfig
7866 * Functionality: Free reconfiguration message
7868 * @params[in] RRC Reconfiguration message
7871 * ****************************************************************/
7872 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7874 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7876 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7878 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7879 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7881 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7883 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7884 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7886 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7888 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7889 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7891 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7895 /******************************************************************
7897 * @brief Fill SRB To Add Mod list
7901 * Function : fillSrbToAddModList
7903 * Functionality: fill SRB to Add Mod list
7905 * @params[in] UE control block
7906 * SRB to Add/Mod list
7907 * @return ROK - success
7910 * ****************************************************************/
7911 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7913 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7916 elementCnt = ueCb->numSrb;
7919 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7921 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7928 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7932 srbToAddList->list.count = elementCnt;
7933 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7935 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7936 if(!srbToAddList->list.array)
7938 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7943 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7945 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7948 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7949 if(!srbToAddList->list.array[srbIdx])
7951 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7955 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7957 /* Reestablish PDCP */
7958 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7959 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7961 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7964 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7966 /* PDCP configuration */
7967 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7968 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7970 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7974 /* Reordering timer */
7975 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7976 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7978 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7981 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7988 /******************************************************************
7990 * @biief Fill DRBeTo Add Mod list
7994 * Function : fillDrbToAddModList
7996 * Functionality: fill DRB to Add Mod list
7998 * @params[in] UE control block
7999 * DRB to Add/Mod list
8000 * @return ROK - success
8003 * ****************************************************************/
8004 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
8006 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
8009 elementCnt = ueCb->numDrb;
8012 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8014 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
8021 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
8026 drbToAddList->list.count = elementCnt;
8027 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
8029 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
8030 if(!drbToAddList->list.array)
8032 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
8037 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8039 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
8042 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
8043 if(!drbToAddList->list.array[drbIdx])
8045 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
8050 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
8053 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
8054 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
8056 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
8060 /* PDCP Config -> DRB */
8061 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
8062 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
8064 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8068 /* DRB -> Discard Timer */
8069 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8070 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8072 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8075 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8077 /* UL PDCP SN length */
8078 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8079 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8081 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8084 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8086 /* DL PDCP SN length */
8087 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8088 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8090 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8093 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8095 /* Header Compression */
8096 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8097 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8099 /* Reordering timer */
8100 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8101 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8103 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8106 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8114 /******************************************************************
8116 * @brief Fill Radio bearer configuration
8120 * Function : fillRadioBearerConfig
8122 * Functionality: Fill Radio bearer configuration
8124 * @params[in] UE control block
8125 * Radio bearer config pointer
8126 * @return ROK - success
8129 * ****************************************************************/
8130 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8132 /* SRB To Add/Mod List */
8133 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8134 if(!radioBearerConfig->srb_ToAddModList)
8136 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8139 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8141 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8145 /* DRB To Add/Mod List */
8146 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8147 if(!radioBearerConfig->drb_ToAddModList)
8149 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8152 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8154 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8161 /*******************************************************************
8163 * @brief Fill measurement object to add/mod list
8167 * Function : fillMeasObjToAddModList
8169 * Functionality: Fill measurement object to add/mod list
8171 * @params[in] Measurement object to add/mod list
8172 * @return ROK - success
8175 * ****************************************************************/
8176 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8178 uint8_t elementCnt, objIdx;
8179 MeasObjectNR_t *measObject;
8182 measObjList->list.count = elementCnt;
8183 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8185 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8186 if(!measObjList->list.array)
8188 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8192 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8194 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8195 if(!measObjList->list.array[objIdx])
8197 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8203 measObjList->list.array[objIdx]->measObjectId = 1;
8204 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8205 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8206 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8208 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8212 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8215 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8216 if(!measObject->ssbFrequency)
8218 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8221 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8223 /* Subcarrier spacing */
8224 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8225 if(!measObject->ssbSubcarrierSpacing)
8227 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8230 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8233 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8234 if(!measObject->smtc1)
8236 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8239 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8240 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8241 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8243 /* Absoulute threshold SSB consolidation */
8244 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8245 if(!measObject->absThreshSS_BlocksConsolidation)
8247 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8251 /* RSRP threshold */
8252 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8253 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8255 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8258 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8260 /* RSRQ threshold */
8261 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8262 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8264 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8267 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8269 /* SINR threshold */
8270 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8271 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8273 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8276 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8278 /* Number of SSBs to average */
8279 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8280 if(!measObject->nrofSS_BlocksToAverage)
8282 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8285 *(measObject->nrofSS_BlocksToAverage) = 2;
8287 /* Quantity Config index */
8288 measObject->quantityConfigIndex = 1;
8291 /* RSRP offset for SSB */
8292 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8293 if(!measObject->offsetMO.rsrpOffsetSSB)
8295 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8298 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8300 /* RSRQ offset for SSB */
8301 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8302 if(!measObject->offsetMO.rsrqOffsetSSB)
8304 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8307 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8309 /* SINR offset for SSB */
8310 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8311 if(!measObject->offsetMO.sinrOffsetSSB)
8313 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8316 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8321 /*******************************************************************
8323 * @brief Fill Report configuration to Add/mod list
8327 * Function : fillReportCfgToAddModList
8329 * Functionality: Fill Report configuration to Add/mod list
8331 * @params[in] Report Config To Add/Mod List
8332 * @return ROK - success
8335 * ****************************************************************/
8336 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8339 uint8_t reportCfgIdx;
8340 ReportConfigToAddMod_t *reportCfg;
8341 ReportConfigNR_t *reportCfgNr;
8342 EventTriggerConfig_t *eventTriggCfg;
8345 reportCfgList->list.count = elementCnt;
8346 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8348 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8349 if(!reportCfgList->list.array)
8351 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8355 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8357 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8358 if(!reportCfgList->list.array[reportCfgIdx])
8360 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8366 reportCfg = reportCfgList->list.array[reportCfgIdx];
8367 reportCfg->reportConfigId = 1;
8368 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8370 /* Report Configuration for NR */
8371 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8372 if(!reportCfg->reportConfig.choice.reportConfigNR)
8374 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8377 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8380 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8381 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8382 if(!reportCfgNr->reportType.choice.eventTriggered)
8384 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8387 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8390 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8391 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8392 if(!eventTriggCfg->eventId.choice.eventA3)
8394 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8398 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8399 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8400 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8401 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8402 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8403 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8405 /* Reference Signal Type */
8406 eventTriggCfg->rsType = NR_RS_Type_ssb;
8408 /* Report Interval */
8409 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8412 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8414 /* Report Quantity cell */
8415 eventTriggCfg->reportQuantityCell.rsrp = true;
8416 eventTriggCfg->reportQuantityCell.rsrq = false;
8417 eventTriggCfg->reportQuantityCell.sinr = false;
8419 /* Maximum reported cells */
8420 eventTriggCfg->maxReportCells = 3;
8422 /* Report qunatity RS Indexes */
8423 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8424 if(!eventTriggCfg->reportQuantityRS_Indexes)
8426 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8429 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8430 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8431 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8433 /* Maximum number of RS indexes to report */
8434 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8435 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8437 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8440 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8442 /* Include Beam measurement */
8443 eventTriggCfg->includeBeamMeasurements = false;
8448 /*******************************************************************
8450 * @brief Fill measurement Id to add/mod list
8454 * Function : fillMeasIdToAddModList
8456 * Functionality: Fill measurement Id to add/mod list
8458 * @params[in] Measurement Id to add/mod list
8459 * @return ROK - success
8462 * ****************************************************************/
8463 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8469 measIdList->list.count = elementCnt;
8470 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8472 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8473 if(!measIdList->list.array)
8478 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8480 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8481 if(!measIdList->list.array[measIdIdx])
8487 measIdList->list.array[measIdIdx]->measId = 1;
8488 measIdList->list.array[measIdIdx]->measObjectId = 1;
8489 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8494 /*******************************************************************
8496 * @brief Fill s-measurement configuration
8500 * Function : fillSMeasConfig
8502 * Functionality: Fill s-measurement configuration
8504 * @params[in] s-Measurement config
8505 * @return ROK - success
8508 * ****************************************************************/
8509 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8511 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8512 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8517 /*******************************************************************
8519 * @brief Fill quantity config
8523 * Function : fillQunatityConfig
8525 * Functionality: Fill quantity config
8527 * @params[in] Quantity Config
8528 * @return ROK - success
8531 * ****************************************************************/
8532 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8534 uint8_t elementCnt = 0;
8535 uint8_t quanCfgIdx = 0;
8536 QuantityConfigNR_t *quantityCfgNr;
8538 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8539 if(!quantityCfg->quantityConfigNR_List)
8545 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8546 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8548 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8549 if(!quantityCfg->quantityConfigNR_List->list.array)
8554 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8556 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8557 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8564 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8566 /* Quantity Config of Reference signal */
8567 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8568 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8572 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8574 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8575 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8579 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8581 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8582 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8586 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8588 /* Quantity Config RS index */
8589 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8590 if(!quantityCfgNr->quantityConfigRS_Index)
8595 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8596 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8600 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8602 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8603 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8607 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8609 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8610 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8614 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8619 /*******************************************************************
8621 * @brief Fill measurement configuration
8625 * Function : fillMeasConfig
8627 * Functionality: Fill measurement configuration
8629 * @params[in] Measurement config
8630 * @return ROK - success
8633 * ****************************************************************/
8634 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8636 /* Measurement object to add/mod list */
8637 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8638 if(!measConfig->measObjectToAddModList)
8640 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8643 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8645 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8649 /* Report Config To add/mod list */
8650 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8651 if(!measConfig->reportConfigToAddModList)
8653 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8656 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8658 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8662 /* Measurement Id to add/mod list */
8663 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8664 if(!measConfig->measIdToAddModList)
8666 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8669 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8671 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8675 /* S-Measurement config */
8676 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8677 if(!measConfig->s_MeasureConfig)
8679 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8682 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8684 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8688 /* Qunatity Config */
8689 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8690 if(!measConfig->quantityConfig)
8692 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8695 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8697 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8704 /*******************************************************************
8706 * @brief Fill RRC reconfiguration non-critical extension IE
8710 * Function : fillRrcReconfigNonCriticalExt
8712 * Functionality: Fill RRC reconfiguration non-critical extension
8714 * @params[in] RRC Reconfig Non-critical extension
8715 * @return ROK - success
8718 * ****************************************************************/
8719 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8721 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8722 if(!rrcRecfg->masterCellGroup)
8724 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8728 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8729 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8730 if(!rrcRecfg->masterCellGroup->buf)
8732 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8735 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8738 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8739 * received from DU */
8740 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8742 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8750 /*******************************************************************
8752 * @brief Fill RRC reconfiguration structure
8756 * Function : fillRrcReconfig
8758 * Functionality: Fill RRC reconfiguration
8762 * RRC reconfiguration structure
8763 * @return ROK - success
8766 * ****************************************************************/
8767 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8769 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8771 rrcReconfig->rrc_TransactionIdentifier = 1;
8772 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8774 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8775 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8777 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8781 /* Radio Bearer Configuration */
8782 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8783 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8785 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8788 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8790 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8794 /* Measurement Configuration */
8795 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8796 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8798 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8801 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8803 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8807 /* Non Critical extension */
8808 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8809 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8811 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8814 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8816 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8822 /*******************************************************************
8824 * @brief Fill RRC reconfiguration Octet string
8828 * Function : fillRrcReconfigBuf
8830 * Functionality: Fill RRC reconfiguration octet string
8833 * @params[in] OCTET_STRING_t buffer
8834 * @return ROK - success
8837 * ****************************************************************/
8838 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8840 uint8_t ret = RFAILED;
8841 asn_enc_rval_t encRetVal;
8842 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8843 rrcReconfig = &rrcRecfg;
8847 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8849 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8853 /* Encode RRC Reconfiguration */
8854 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8855 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8857 encRetVal = uper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8859 /* Encode results */
8860 if(encRetVal.encoded == ENCODE_FAIL)
8862 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8863 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8868 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8869 for(int i=0; i< encBufSize; i++)
8871 DU_LOG("%x",encBuf[i]);
8875 rrcReconfigBuf->size = encBufSize;
8876 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8877 if(!rrcReconfigBuf->buf)
8879 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8882 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8887 freeRrcReconfig(rrcReconfig);
8891 /*******************************************************************
8893 * @brief Fill HO preparation information Octet string
8897 * Function : fillHOPreparationInfoBuf
8899 * Functionality: Fill HO preparation information Octet string
8902 * @params[in] HandoverPreparationInformation_t buffer
8903 * @return ROK - success
8906 * ****************************************************************/
8907 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8909 uint8_t ret = RFAILED;
8910 asn_enc_rval_t encRetVal;
8911 HandoverPreparationInformationRrc_t hoPrepInfo;
8912 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8917 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8918 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8919 if(!hoPrepInfo.criticalExtensions.choice.c1)
8921 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8924 hoPrepInfo.criticalExtensions.choice.c1->present = \
8925 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8927 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8928 sizeof(HandoverPreparationInformationRrc_IEs_t));
8929 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8931 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8934 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8936 /* Fill UE Capability RAT container list */
8937 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8940 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8944 /* Fill Source config */
8945 hoPrepInfoIe->sourceConfig = NULLP;
8946 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8947 if(!hoPrepInfoIe->sourceConfig)
8949 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8952 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8956 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8960 hoPrepInfoIe->rrm_Config = NULLP;
8961 hoPrepInfoIe->as_Context = NULLP;
8962 hoPrepInfoIe->nonCriticalExtension = NULLP;
8964 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8965 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8966 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8968 encRetVal = uper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8969 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8971 /* Encode results */
8972 if(encRetVal.encoded == ENCODE_FAIL)
8974 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8975 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8980 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8981 for(int i=0; i< encBufSize; i++)
8983 DU_LOG("%x",encBuf[i]);
8987 hoPrepInfoBuf->size = encBufSize;
8988 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8989 if(!hoPrepInfoBuf->buf)
8991 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8994 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8998 freeHOPreparationInfo(&hoPrepInfo);
9002 /*******************************************************************
9004 * @brief Fills CuToDuContainer
9008 * Function : fillCuToDuContainer
9010 * Functionality: Fills CuToDuContainer
9012 * @params[in] pointer to CUtoDURRCInformation_t
9014 * @return ROK - success
9017 ******************************************************************/
9019 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
9021 uint8_t elementCnt = 0;
9025 /* UE Capabulity RAT Container List */
9026 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9027 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
9029 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
9032 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
9036 /* Commenting this because:
9037 * CUToDURRCInformation->MeasConfig contains measurement gap configurations.
9038 * Howeever measurement gap is not supported in our code. Measurement Gap will
9039 * be required if we want to support inter-RAT handover or handover to
9040 * neighbouring cells operating on a different frequency than serving cell.
9042 * In case we plan to use this IE in future, following fixes are required:
9043 * As of now, we are filling MeasurementTimingConfigurationRrc_t into rrcMsg->measConfig.
9044 * This is incorrect. We must fill MeasConfigRrc_t in rrcMsg->measConfig.
9045 * MeasurementTimingConfigurationRrc_t should be filled in
9046 * rrcMsg->iE_Extensions->MeasurementTimingConfiguration, if required.
9049 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
9050 if(!rrcMsg->measConfig)
9052 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
9055 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
9058 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9061 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9062 if(rrcMsg->iE_Extensions)
9065 rrcMsg->iE_Extensions->list.count = elementCnt;
9066 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9068 /* Initialize the CUtoDURRCInformation_ExtIEs */
9069 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9071 if(rrcMsg->iE_Extensions->list.array == NULLP)
9073 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9077 for(idx=0; idx<elementCnt; idx++)
9079 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9080 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9082 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9089 /* Cell Group Configuration */
9090 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9091 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9092 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9093 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9094 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9097 /* Handover Preparation Information */
9098 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9099 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9100 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9101 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9102 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9107 /*******************************************************************
9109 * @brief Build the drx cycle
9113 * Function : BuildDrxCycle
9115 * Functionality: Build drx cycle IE
9117 * @params[in] pointer to DRXCycle_t
9119 * @return ROK - success
9122 ******************************************************************/
9123 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9125 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms80;
9126 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9127 if(!drxCycle->shortDRXCycleLength)
9129 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9132 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9134 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9135 if(!drxCycle->shortDRXCycleTimer)
9137 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9140 *(drxCycle->shortDRXCycleTimer) = 4;
9143 /*******************************************************************
9145 * @brief Free CuToDuContainer
9149 * Function : FreeCuToDuInfo
9151 * Functionality: Free CuToDuContainer
9153 * @params[in] pointer to CUtoDURRCInformation_t
9155 * @return ROK - success
9158 ******************************************************************/
9160 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9164 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9166 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9167 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9168 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9170 if(rrcMsg->iE_Extensions)
9172 if(rrcMsg->iE_Extensions->list.array)
9174 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9176 if(rrcMsg->iE_Extensions->list.array[idx])
9178 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9180 case ProtocolIE_ID_id_CellGroupConfig:
9181 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9183 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9184 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9189 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9190 rrcMsg->iE_Extensions->list.array[idx]->id);
9196 for(idx2 = 0; idx2 < idx; idx2++)
9198 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9200 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9204 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9207 /*******************************************************************
9209 * @brief Builds and sends the UE Setup Request
9213 * Function : BuildAndSendUeContextSetupReq
9215 * Functionality: Constructs the UE Setup Request and sends
9216 * it to the CU through SCTP.
9220 * @return ROK - success
9223 * ****************************************************************/
9224 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9226 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9227 uint8_t ret= RFAILED, ret1;
9229 uint8_t idx, idx1, bufLen, duIdx;
9231 DuDb *targetDuDb = NULLP;
9232 F1AP_PDU_t *f1apMsg = NULLP;
9233 UEContextSetupRequest_t *ueSetReq = NULLP;
9234 asn_enc_rval_t encRetVal; /* Encoder return value */
9235 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9239 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9241 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9242 if(f1apMsg == NULLP)
9244 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9248 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9249 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9250 if(f1apMsg->choice.initiatingMessage == NULLP)
9252 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9256 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9257 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9258 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9260 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9262 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9272 ueSetReq->protocolIEs.list.count = elementCnt;
9273 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9275 /* Initialize the UESetup members */
9276 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9278 if(ueSetReq->protocolIEs.list.array == NULLP)
9280 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9284 for(idx1=0; idx1<elementCnt; idx1++)
9286 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9287 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9295 /*GNB CU UE F1AP ID*/
9296 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9297 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9298 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9299 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9301 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9303 /*GNB DU UE F1AP ID*/
9305 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9306 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9307 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9308 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9313 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9314 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9315 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9316 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9318 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9319 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetId, targetDuDb);
9320 /* Since we are supporting only one cell per DU, accessing 0th index to
9321 * get target cell info */
9322 spCellId = targetDuDb->cellCb[0].nrCellId;
9325 spCellId = ueCb->cellCb->nrCellId;
9326 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9332 /*Served Cell Index*/
9334 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9335 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9336 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9337 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9339 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9341 /*CellULConfigured*/
9343 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9344 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9345 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9346 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9349 /*CUtoDURRCContainer*/
9351 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9352 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9353 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9354 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9359 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9364 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9365 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9366 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9367 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9369 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9373 /*Special Cells to be SetupList*/
9375 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9376 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9377 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9378 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9379 if(SplCellListret != ROK)
9385 /*SRBs To Be Setup List*/
9387 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9388 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9389 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9390 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9391 if(SrbSetupret != ROK)
9396 /*DRBs to Be Setup List*/
9398 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9399 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9400 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9401 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9407 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9409 /* RRC delivery status request */
9411 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9412 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9413 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9414 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9417 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9419 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9420 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9421 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9423 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9425 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9426 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9427 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9428 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9430 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9433 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9434 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9436 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9438 /* Encode the F1SetupRequest type as APER */
9439 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9441 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9443 /* Encode results */
9444 if(encRetVal.encoded == ENCODE_FAIL)
9446 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9447 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9452 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9453 for(int i=0; i< encBufSize; i++)
9455 DU_LOG("%x",encBuf[i]);
9460 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9462 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9468 FreeUeContextSetupReq(f1apMsg);
9471 }/* End of BuildAndSendUeContextSetupReq*/
9473 /**********************************************************************
9474 * @brief Function to extractTeId received in UE context setup Response
9478 * Function : extractTeId
9481 * - Function to extract TeId
9484 * @return ROK - success
9487 **********************************************************************/
9488 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9492 GTPTunnel_t *gtpDl = NULLP;
9494 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9496 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9498 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9500 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9501 if(gtpDl->gTP_TEID.size > 0)
9503 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9506 DU_LOG("\nERROR --> EGTP: No TeId received");
9514 /****************************************************************
9515 * @brief Function to add Drb tunnels
9519 * Function : addDrbTunnels
9522 * - Function to add Drb tunnels
9525 * @return ROK - success
9528 * ****************************************************************/
9529 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9534 if(teId > MAX_TEID || teId < MIN_TEID)
9536 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9538 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9539 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9540 tnlEvt.lclTeid = teId;
9541 tnlEvt.remTeid = teId;
9542 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9545 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9550 /****************************************************************
9551 * @brief Function to process Drb Setup List
9555 * Function : procDrbSetupList
9558 * - Function to process DRB Setup List
9561 * @return ROK - success
9564 * ****************************************************************/
9565 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9567 uint8_t arrIdx = 0, drbIdx = 0;
9569 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9571 if(drbSetupList != NULLP)
9573 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9575 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9576 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9578 /* extracting teId */
9579 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9582 if(addDrbTunnels(duId, teId)== ROK)
9584 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9586 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9587 * are sent to CU for setting up of Tunnels in DL direction.
9588 * Search for DRB ID in CU databse */
9589 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9591 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9593 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9606 /****************************************************************
9607 * @brief Function to process Ue Context Setup Response
9611 * Function : procUeContextSetupResponse
9614 * - Function to process Ue Context Setup Response
9617 * @return ROK - success
9620 * ****************************************************************/
9621 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9623 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9624 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9626 CuUeCb *ueCb = NULLP;
9627 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9628 OCTET_STRING_t *duToCuRrcContainer;
9630 SEARCH_DU_DB(duIdx, duId, duDb);
9631 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9633 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9635 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9637 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9639 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9642 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9644 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9645 ueCb = &duDb->ueCb[duUeF1apId-1];
9646 /* If ue context is not present in du db, then create UE context
9647 * here. This flow is hit in case of UE handover where UE
9648 * context is created before UE performs RACH on target DU */
9649 if(ueCb->gnbDuUeF1apId == 0)
9651 /* Creating UE context in target DU */
9652 memset(ueCb, 0, sizeof(CuUeCb));
9653 ueCb->cellCb = &duDb->cellCb[0];
9654 ueCb->gnbDuUeF1apId = duUeF1apId;
9655 ueCb->gnbCuUeF1apId = cuUeF1apId;
9656 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9657 ueCb->hoInfo.targetId = duId;
9660 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9661 ueCb->cellCb->numUe++;
9665 case ProtocolIE_ID_id_C_RNTI:
9667 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9670 case ProtocolIE_ID_id_DRBs_Setup_List:
9672 /* Adding Tunnels for successful DRB */
9673 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9676 case ProtocolIE_ID_id_DUtoCURRCInformation:
9678 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9679 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9680 DUtoCURRCInformation.cellGroupConfig;
9681 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9682 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9684 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9692 /* If the UE is in handover, UE context modification request is to be sent to
9693 * source DU once UE context setup response is received from target DU */
9694 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9696 DuDb *srcDuDb = NULLP;
9697 CuUeCb *ueCbInSrcDu = NULLP;
9699 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9700 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9701 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9703 /* UE context setup response is received from target DU. Search all
9704 * DUs to find source DU except this target DU Id.*/
9705 if(cuCb.duInfo[duIdx].duId != duId)
9707 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9710 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9711 * received in UE context setup response since CU UE F1AP ID does not
9712 * change for UE in handover.
9713 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9715 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9716 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9718 srcDuDb = &cuCb.duInfo[duIdx];
9719 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9721 /* Store source DU info in the new UE context created in
9723 ueCb->hoInfo.sourceId = srcDuDb->duId;
9725 /* Copy the received container to UeCb */
9726 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9728 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9730 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9737 if(srcDuDb && ueCbInSrcDu)
9743 ueCb->f1apMsgDb.dlRrcMsgCount++;
9744 rrcMsgType = setDlRRCMsgType(ueCb);
9746 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9747 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9749 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9757 /****************************************************************
9758 * @brief Function to process Ul Rrc Msg received from DU
9762 * Function : procUlRrcMsg
9765 * - Function to process Ul Rrc Msg received from DU
9768 * @return ROK - success
9771 * ****************************************************************/
9773 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9775 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9776 uint8_t *rrcContainer = NULLP;
9777 uint16_t rrcContLen = 0;
9778 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9780 CuUeCb *ueCb = NULLP;
9781 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9784 SEARCH_DU_DB(duIdx, duId, duDb);
9785 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9787 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9789 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9791 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9793 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9796 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9798 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9801 case ProtocolIE_ID_id_SRBID:
9802 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9805 case ProtocolIE_ID_id_RRCContainer:
9807 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9808 CU_ALLOC(rrcContainer, rrcContLen);
9811 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9814 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9816 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9819 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceId;
9820 DuDb *srcDuDb = NULLP;
9822 /* In target DU DB, mark UE as active and delete HO info */
9823 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9824 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9826 /* Release UE context in source DU because the UE is now
9827 * attached to target DU */
9828 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9829 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9831 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9833 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9836 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9847 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9854 ueCb = &duDb->ueCb[duUeF1apId-1];
9855 ueCb->f1apMsgDb.dlRrcMsgCount++;
9856 rrcMsgType = setDlRRCMsgType(ueCb);
9857 if(rrcMsgType == REGISTRATION_COMPLETE)
9859 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9860 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9862 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9864 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9865 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9869 /* In case rrcMsgType is RRC_SETUP_COMPLETE / NAS_AUTHENTICATION_RSP / NAS_SECURITY_MODE_COMPLETE / RRC_SECURITY_MODE_COMPLETE */
9870 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9876 /****************************************************************
9877 * @brief Build And Send F1ResetAck
9881 * Function : FreeF1ResetAck
9884 * - Build And Send F1ResetRSP
9887 * @return ROK - success
9890 * ****************************************************************/
9891 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9894 ResetAcknowledge_t *f1ResetAck;
9898 if(f1apMsg->choice.successfulOutcome)
9900 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9902 if(f1ResetAck->protocolIEs.list.array)
9904 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9906 if(f1ResetAck->protocolIEs.list.array[idx])
9908 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9911 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9913 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9915 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9919 /****************************************************************
9920 * @brief Build And Send F1ResetAck
9924 * Function : BuildAndSendF1ResetAck
9927 * - Build And Send F1ResetRSP
9930 * @return ROK - success
9933 * ****************************************************************/
9935 uint8_t BuildAndSendF1ResetAck()
9938 uint8_t elementCnt = 0;
9939 uint8_t ret = RFAILED;
9940 F1AP_PDU_t *f1apMsg = NULL;
9941 ResetAcknowledge_t *f1ResetAck = NULLP;
9942 asn_enc_rval_t encRetVal;
9943 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9946 /* Allocate the memory for F1ResetRequest_t */
9947 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9948 if(f1apMsg == NULLP)
9950 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9954 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9956 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9957 if(f1apMsg->choice.successfulOutcome == NULLP)
9959 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9963 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9964 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9965 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9966 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9970 f1ResetAck->protocolIEs.list.count = elementCnt;
9971 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9973 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9974 if(f1ResetAck->protocolIEs.list.array == NULLP)
9976 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9980 for(idx=0; idx<elementCnt; idx++)
9982 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9983 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9990 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9991 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9992 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9993 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9995 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9997 /* Encode the F1SetupRequest type as UPER */
9998 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10000 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10002 /* Check encode results */
10003 if(encRetVal.encoded == ENCODE_FAIL)
10005 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
10006 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10011 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
10012 for(int i=0; i< encBufSize; i++)
10014 DU_LOG("%x",encBuf[i]);
10019 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10020 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
10022 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
10030 FreeF1ResetAck(f1apMsg);
10034 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
10038 if(ulInfo->list.array)
10040 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
10042 if(ulInfo->list.array[arrIdx])
10044 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
10046 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
10048 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
10050 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10051 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10052 gTPTunnel->gTP_TEID.size);
10054 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10055 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10056 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10058 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10059 sizeof(GTPTunnel_t));
10061 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10064 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10068 /*******************************************************************
10070 * @brief Deletes the EGTP tunnel
10074 * Function : deleteEgtpTunnel
10076 * Functionality: Deletes the EGTP tunnel
10078 * @params[in] uint8_t *buf
10080 * @return ROK - success
10081 * RFAILED - failure
10083 * ****************************************************************/
10084 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10089 teIdStringToInt(buf, &teId);
10090 if(teId > MAX_TEID || teId < MIN_TEID)
10092 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10095 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10096 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10097 tnlEvt.lclTeid = teId;
10098 tnlEvt.remTeid = teId;
10099 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10101 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10106 /*******************************************************************
10108 * @brief Builds the Uplink Tunnel Info
10112 * Function : BuildUlTnlInfoforSetupMod
10114 * Functionality: Constructs the UL TnlInfo For DRB list
10116 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10118 * @return ROK - success
10119 * RFAILED - failure
10121 * ****************************************************************/
10122 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10128 ulInfo->list.count = ulCnt;
10129 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10130 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10131 if(ulInfo->list.array == NULLP)
10133 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10136 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10138 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10139 if(ulInfo->list.array[arrIdx] == NULLP)
10141 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10147 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10148 UPTransportLayerInformation_PR_gTPTunnel;
10151 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10152 sizeof(GTPTunnel_t));
10153 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10155 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10158 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10159 transportLayerAddress.size = 4*sizeof(uint8_t);
10160 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10161 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10162 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10163 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10164 transportLayerAddress.buf == NULLP)
10166 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10170 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10171 transportLayerAddress.buf[0] = 192;
10172 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10173 transportLayerAddress.buf[1] = 168;
10174 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10175 transportLayerAddress.buf[2] = 130;
10176 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10177 transportLayerAddress.buf[3] = 82;
10178 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10179 transportLayerAddress.bits_unused = 0;
10181 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10182 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10183 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10184 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10187 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10188 = 4 * sizeof(uint8_t);
10189 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10190 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10191 gTPTunnel->gTP_TEID.size);
10192 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10195 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10198 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10199 gTP_TEID.buf[0] = 0;
10200 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10201 gTP_TEID.buf[1] = 0;
10202 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10203 gTP_TEID.buf[2] = 0;
10204 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10206 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10207 * fetched based on the Drb Id */
10209 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10210 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10211 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10215 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10216 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10219 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10220 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10221 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10222 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10224 }/*End of BuildULTnlInfo*/
10226 /*******************************************************************
10228 * @brief freeing the DRB item
10232 * Function : FreeDrbItem
10234 * Functionality: freeing the DRB item
10236 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10238 * @return ROK - success
10239 * RFAILED - failure
10241 * ****************************************************************/
10243 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10246 SNSSAI_t *snssai =NULLP;
10247 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10249 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10250 switch(drbItem->qoSInformation.present)
10252 case QoSInformation_PR_NOTHING:
10254 case QoSInformation_PR_eUTRANQoS:
10256 if(drbItem->qoSInformation.choice.eUTRANQoS)
10258 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10262 case QoSInformation_PR_choice_extension:
10264 if(drbItem->qoSInformation.choice.choice_extension)
10266 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10268 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10269 if(snssai->sST.buf)
10271 CU_FREE(snssai->sST.buf,snssai->sST.size);
10275 if(snssai->sD->buf)
10277 CU_FREE(snssai->sD->buf,snssai->sD->size);
10279 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10282 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10283 if(flowMap->list.array)
10285 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10287 if(flowMap->list.array[arrIdx] )
10289 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10290 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10293 CU_FREE(flowMap->list.array,flowMap->list.size);
10296 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10302 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10303 if(drbItem->uLConfiguration)
10305 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10309 /*******************************************************************
10311 * @brief filling the DRB setup Mod item
10315 * Function : FillDrbItemToSetupMod
10317 * Functionality: filling the DRB setup Mod item
10320 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10322 * @return ROK - success
10323 * RFAILED - failure
10325 * ****************************************************************/
10327 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10332 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10333 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10336 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10338 switch(drbItem->qoSInformation.present)
10340 case QoSInformation_PR_NOTHING:
10344 case QoSInformation_PR_eUTRANQoS:
10347 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10348 if(drbItem->qoSInformation.choice.eUTRANQoS)
10350 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10353 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10354 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10355 PriorityLevel_no_priority;
10357 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10358 Pre_emptionCapability_may_trigger_pre_emption;
10360 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10361 Pre_emptionVulnerability_pre_emptable;
10365 case QoSInformation_PR_choice_extension:
10367 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10368 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10370 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10374 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10375 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10376 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10377 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10378 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10381 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10386 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10387 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10390 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10394 /*Flows mapped to DRB List*/
10395 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10396 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10397 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10400 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10406 /*ULUPTNLInformation To Be Setup List*/
10407 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10408 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10411 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10416 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10417 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10423 /*******************************************************************
10425 * @brief Builds the DRB to be Setup Mod ItemIes
10429 * Function : FillDrbItemList
10431 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10433 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10435 * @return ROK - success
10436 * RFAILED - failure
10438 * ****************************************************************/
10440 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10442 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10443 drbItemIe->criticality = Criticality_reject;
10444 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10446 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10448 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10453 /*******************************************************************
10455 * @brief free the DRB to be Setup Mod list
10459 * Function : FreeDrbToBeSetupModList
10461 * Functionality: free the DRB to be Setup Mod list
10463 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10465 * @return ROK - success
10466 * RFAILED - failure
10468 * ****************************************************************/
10469 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10472 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10474 if(drbSet->list.array)
10476 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10478 if(drbSet->list.array[arrIdx] != NULLP)
10482 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10483 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10485 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10488 CU_FREE(drbSet->list.array, drbSet->list.size);
10493 /*******************************************************************
10495 * @brief Builds the DRB to be Setup Mod list
10499 * Function : BuildDrbToBeSetupList
10501 * Functionality: Constructs the DRB to be Setup Mod list
10503 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10505 * @return ROK - success
10506 * RFAILED - failure
10508 * ****************************************************************/
10510 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10516 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10517 drbSet->list.count = drbCnt;
10518 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10519 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10520 if(drbSet->list.array == NULLP)
10522 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10526 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10528 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10529 if(drbSet->list.array[arrIdx] == NULLP)
10531 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10535 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10538 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10545 /*******************************************************************
10547 * @brief Filling the DRB to be modified item
10551 * Function : FillDrbToBeModItem
10553 * Functionality: filling the DRB to be modified item
10555 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10557 * @return ROK - success
10558 * RFAILED - failure
10560 * ****************************************************************/
10562 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10566 DrbInfo *drbToBeMod;
10569 drbItem->dRBID = DRB2 + arrIdx;
10571 /* Search for DRB ID in CU databse */
10572 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10574 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10576 drbToBeMod = &ueCb->drbList[drbIdx];
10582 drbItem->qoSInformation = NULLP;
10583 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10584 if(drbItem->qoSInformation != NULLP)
10586 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10588 switch(drbItem->qoSInformation->present)
10590 case QoSInformation_PR_NOTHING:
10594 case QoSInformation_PR_eUTRANQoS:
10597 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10598 if(drbItem->qoSInformation->choice.eUTRANQoS)
10600 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10603 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10604 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10605 PriorityLevel_no_priority;
10607 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10608 Pre_emptionCapability_may_trigger_pre_emption;
10610 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10611 Pre_emptionVulnerability_pre_emptable;
10615 case QoSInformation_PR_choice_extension:
10617 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10618 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10620 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10624 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10625 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10626 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10627 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10628 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10631 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10636 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10637 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10640 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10644 /*Flows mapped to DRB List*/
10645 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10646 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10647 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10650 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10657 /*ULUPTNLInformation To Be Setup List*/
10658 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10659 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10662 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10668 /*******************************************************************
10670 * @brief Builds the DRB to be modified Item IE
10674 * Function : FillDrbToBeModItemList
10676 * Functionality: Constructs the DRB to be modified Mod Item Ies
10678 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10680 * @return ROK - success
10681 * RFAILED - failure
10683 * ****************************************************************/
10685 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10687 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10688 drbItemIe->criticality = Criticality_reject;
10689 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10690 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10692 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10699 /*******************************************************************
10701 * @brief Builds the DRB to be modified list
10705 * Function : BuildDrbToBeModList
10707 * Functionality: Constructs the DRB to be modified list
10709 * @params[in] DRBs_ToBeModified_List_t *drbSet
10711 * @return ROK - success
10712 * RFAILED - failure
10714 * ****************************************************************/
10716 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10722 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10723 drbSet->list.count = drbCnt;
10724 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10725 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10726 if(drbSet->list.array == NULLP)
10728 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10731 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10733 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10734 if(drbSet->list.array[arrIdx] == NULLP)
10736 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10740 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10743 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10750 /*******************************************************************
10752 * @brief Builds the DRB to be released Item IE
10756 * Function : FillDrbToBeRelItemList
10758 * Functionality: Constructs the DRB to be modified Mod Item Ies
10760 * @params[in] struct DRBs_ToBeReleased_ItemIEs *drbItemIe
10762 * @return ROK - success
10763 * RFAILED - failure
10765 * ****************************************************************/
10767 uint8_t FillDrbToBeRelItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeReleased_ItemIEs *drbItemIe)
10771 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
10772 drbItemIe->criticality = Criticality_reject;
10773 drbItemIe->value.present = DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
10774 drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID = DRB1 + arrIdx;
10776 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10778 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID)
10780 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
10781 CU_FREE(ueCb->drbList[drbIdx].snssai, sizeof(Snssai));
10788 /*******************************************************************
10790 * @brief Builds the DRB to be released list
10794 * Function : BuildDrbToBeReleasedList
10796 * Functionality: Constructs the DRB to be released list
10798 * @params[in] DRBs_ToBeReleased_List_t *drbSet
10800 * @return ROK - success
10801 * RFAILED - failure
10803 * ****************************************************************/
10805 uint8_t BuildDrbToBeReleasedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeReleased_List_t *drbSet)
10811 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10812 drbSet->list.count = drbCnt;
10813 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeReleased_ItemIEs_t *);
10814 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10815 if(drbSet->list.array == NULLP)
10817 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10820 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10822 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
10823 if(drbSet->list.array[arrIdx] == NULLP)
10825 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10829 ret = FillDrbToBeRelItemList(duId, ueCb, arrIdx, (DRBs_ToBeReleased_ItemIEs_t *)drbSet->list.array[arrIdx]);
10832 DU_LOG("\nERROR --> F1AP : FillDrbToBeRelItemList failed");
10839 /*******************************************************************
10841 * @brief freeing the DRB item
10845 * Function : FreeModifiedDrbItem
10847 * Functionality: freeing the DRB 2 item
10849 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10851 * @return ROK - success
10852 * RFAILED - failure
10854 * ****************************************************************/
10856 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10859 SNSSAI_t *snssai =NULLP;
10860 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10862 if(drbItem->qoSInformation != NULLP)
10864 switch(drbItem->qoSInformation->present)
10866 case QoSInformation_PR_NOTHING:
10868 case QoSInformation_PR_eUTRANQoS:
10870 if(drbItem->qoSInformation->choice.eUTRANQoS)
10872 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10876 case QoSInformation_PR_choice_extension:
10878 if(drbItem->qoSInformation->choice.choice_extension)
10880 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10882 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10883 if(snssai->sST.buf)
10885 CU_FREE(snssai->sST.buf,snssai->sST.size);
10889 if(snssai->sD->buf)
10891 CU_FREE(snssai->sD->buf,snssai->sD->size);
10893 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10896 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10897 if(flowMap->list.array)
10899 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10901 if(flowMap->list.array[arrIdx] )
10903 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10904 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10907 CU_FREE(flowMap->list.array,flowMap->list.size);
10910 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10916 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10917 if(drbItem->uLConfiguration)
10919 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10923 /*******************************************************************
10925 * @brief free the DRB to be modfified list
10929 * Function : FreeDrbToBeModifiedList
10931 * Functionality: free the DRB to be Setup Mod list
10933 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10935 * @return ROK - success
10936 * RFAILED - failure
10938 * ****************************************************************/
10939 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10942 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10944 if(drbSet->list.array)
10946 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10948 if(drbSet->list.array[arrIdx] != NULLP)
10950 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10951 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10952 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10955 CU_FREE(drbSet->list.array, drbSet->list.size);
10960 /*******************************************************************
10962 * @brief free the DRB to be modfified list
10966 * Function : FreeDrbToBeReleasedList
10968 * Functionality: free the DRB to be Release list
10970 * @params[in] FreeDrbToBeReleasedList_t *drbSet
10972 * @return ROK - success
10973 * RFAILED - failure
10975 * ****************************************************************/
10976 void FreeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet)
10979 struct DRBs_ToBeReleased_ItemIEs *drbItemIe;
10981 if(drbSet->list.array)
10983 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10985 if(drbSet->list.array[arrIdx] != NULLP)
10987 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
10990 CU_FREE(drbSet->list.array, drbSet->list.size);
10994 /*******************************************************************
10996 * @brief free the UeContextModification Request
11000 * Function : FreeUeContextModicationRequest
11002 * Functionality : deallocation of memory allocated in UeContextModiification
11005 * @params[in] F1AP_PDU_t *f1apMsg
11009 * ****************************************************************/
11010 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
11012 uint8_t arrIdx =0 , ieId=0;
11013 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11017 if(f1apMsg->choice.initiatingMessage)
11019 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11020 if(ueContextModifyReq->protocolIEs.list.array)
11022 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
11024 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
11026 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
11029 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11031 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11033 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
11035 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11036 choice.DRBs_ToBeSetupMod_List);
11039 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
11041 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11042 choice.DRBs_ToBeModified_List);
11045 case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
11047 FreeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11048 choice.DRBs_ToBeReleased_List);
11051 case ProtocolIE_ID_id_TransmissionActionIndicator:
11053 case ProtocolIE_ID_id_RRCContainer:
11055 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
11056 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
11060 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
11063 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11065 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11067 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11071 /*******************************************************************
11073 * @brief Builds the Ue Context Modification Req
11077 * Function : BuildAndSendUeContextModificationReq
11079 * Functionality: Constructs the Ue Context Modification Req
11083 * @return ROK - success
11084 * RFAILED - failure
11086 * ****************************************************************/
11087 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
11090 uint8_t elementCnt = 0;
11091 uint8_t ret = RFAILED;
11092 uint16_t tmpBufIdx = 0, bufIdx = 0;
11093 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
11094 F1AP_PDU_t *f1apMsg = NULLP;
11095 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11096 RRCContainer_t rrcContainerTmp, *rrcContainer = NULLP;
11097 asn_enc_rval_t encRetVal;
11098 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
11101 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11102 if(f1apMsg == NULLP)
11104 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11108 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11110 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11111 if(f1apMsg->choice.initiatingMessage == NULLP)
11113 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11116 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
11117 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11118 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
11120 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11122 if(action == MODIFY_UE)
11124 else if(action == QUERY_CONFIG)
11126 else if(action == RRC_RECONFIG_COMPLETE_IND)
11128 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11132 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11135 ueContextModifyReq->protocolIEs.list.count = elementCnt;
11136 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
11138 /* Initialize the UE context modification members */
11139 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11140 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
11142 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11146 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11148 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
11149 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
11151 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11157 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11158 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11159 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11160 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
11161 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
11164 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11165 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11166 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
11167 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
11168 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
11170 if(action == MODIFY_UE)
11172 /* DRB to be setup list */
11174 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
11175 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11176 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11177 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
11178 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11179 value.choice.DRBs_ToBeSetupMod_List));
11181 /* DRB to be modified list */
11183 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
11184 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11185 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11186 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11187 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11188 value.choice.DRBs_ToBeModified_List));
11192 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11196 /* DRB to be released list */
11198 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeReleased_List;
11199 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11200 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11201 UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
11202 ret = BuildDrbToBeReleasedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11203 value.choice.DRBs_ToBeReleased_List));
11207 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be deleted list");
11211 else if(action == QUERY_CONFIG)
11214 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11215 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11216 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11217 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11218 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11220 else if(action == RRC_RECONFIG_COMPLETE_IND)
11223 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11224 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11225 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11226 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11227 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11228 RRCReconfigurationCompleteIndicator_true;
11230 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11233 if(action == STOP_DATA_TX)
11235 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11236 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11237 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11238 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11239 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11240 TransmissionActionIndicator_stop;
11242 else if (action == RESTART_DATA_TX)
11244 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11245 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11246 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11247 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11248 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11249 TransmissionActionIndicator_restart;
11253 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11254 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11255 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCContainer;
11256 if(fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, true) != ROK)
11258 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11262 rrcContainer = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
11263 rrcContainer->size = rrcContainerTmp.size + 2; /* 2 bytes of PDCP SN */
11264 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
11265 memset(rrcContainer->buf, 0, rrcContainer->size);
11266 rrcContainer->buf[0] = 0x00;
11267 rrcContainer->buf[1] = ueCb->pdcpSn; //PDCP SN
11268 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
11270 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
11273 /* RRC delivery status request */
11275 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11276 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11277 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11278 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11282 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11284 /* DRX Configuration Indicator */
11286 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator;
11287 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11288 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator;
11289 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release;
11290 ueCb->drxCfgPresent = false;
11291 memset(&ueCb->drxCfg, 0, sizeof(DrxCfg));
11295 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11297 /* Encode the F1SetupRequest type as APER */
11298 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11300 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11302 /* Encode results */
11303 if(encRetVal.encoded == ENCODE_FAIL)
11305 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11306 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11311 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11313 /* This for loop was going into an infinite loop even though encBufSize
11314 * has a small value. Hence commented this
11316 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11318 DU_LOG("%x",encBuf[ieIdx]);
11323 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11324 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11326 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11334 FreeUeContextModicationRequest(f1apMsg);
11338 /*****************************************************************i
11340 * @brief Free memory allocated for UE Context Release Command
11344 * Function : FreeUeContextReleaseCommand
11347 * - Free memory allocated for UE Context Release Command
11349 * @params[in] F1AP_PDU_t *f1apMsg
11352 * *************************************************************/
11353 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11356 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11360 if(f1apMsg->choice.initiatingMessage)
11362 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11363 if(ueReleaseCommand->protocolIEs.list.array)
11365 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11367 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11369 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11371 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11373 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11376 /*******************************************************************
11378 * @brief Builds the Ue Context Release Command
11382 * Function : BuildAndSendUeContextReleaseCommand
11384 * Functionality: Constructs the Ue Context Release Command
11388 * @return ROK - success
11389 * RFAILED - failure
11391 * ****************************************************************/
11392 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11394 bool memAllocFailed = false;
11395 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11398 F1AP_PDU_t *f1apMsg = NULLP;
11399 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11401 asn_enc_rval_t encRetVal;
11402 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11406 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11407 if(f1apMsg == NULLP)
11409 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11413 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11415 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11416 if(f1apMsg->choice.initiatingMessage == NULLP)
11418 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11421 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11422 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11423 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11425 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11427 SEARCH_DU_DB(duIdx, duId, duDb);
11428 ueCb = &duDb->ueCb[duUeF1apId-1];
11429 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11434 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11435 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11437 /* Initialize the UE context modification members */
11438 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11439 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11441 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11445 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11447 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11448 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11450 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11451 memAllocFailed = true;
11456 if(memAllocFailed == true)
11462 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11463 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11464 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11465 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11466 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11469 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11470 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11471 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11472 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11473 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11475 /* Cause of UE context release */
11477 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11478 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11479 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11480 UEContextReleaseCommandIEs__value_PR_Cause;
11481 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11482 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11483 CauseRadioNetwork_normal_release;
11484 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11486 /* RRC Container for RRC release */
11488 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11489 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11490 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11491 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11492 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11494 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11495 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11496 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11497 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11499 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11502 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11503 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11505 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11507 /* Encode the UE Context Release Command type as APER */
11508 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11510 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11513 /* Encode results */
11514 if(encRetVal.encoded == ENCODE_FAIL)
11516 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11517 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11522 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11523 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11525 DU_LOG("%x",encBuf[ieIdx]);
11529 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11530 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11532 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11540 FreeUeContextReleaseCommand(f1apMsg);
11543 /*******************************************************************
11545 * @brief process Ue context release request
11549 * Function : procUeContextReleaseReq
11552 * - process Ue context release request
11554 * @params[in] F1AP_PDU_t *f1apMsg
11555 * @return ROK - success
11556 * RFAILED - failure
11558 * ****************************************************************/
11559 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11561 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11563 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11564 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11566 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11568 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11570 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11572 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11575 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11577 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11585 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11587 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11592 /*******************************************************************
11594 * @brief processing of Gnb-DU config update
11598 * Function : procGnbDuUpdate
11601 * - processing of Gnb-DU config update
11603 * @params[in] F1AP_PDU_t *f1apMsg
11604 * @return ROK - success
11605 * RFAILED - failure
11607 * ****************************************************************/
11608 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11610 bool cellToBeDelete = false;
11611 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11615 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11617 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11618 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11620 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11622 case ProtocolIE_ID_id_TransactionID:
11624 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11626 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11628 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11629 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11630 Served_Cells_To_Delete_List.list.array[0];
11631 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11632 cellToBeDelete = true;
11635 case ProtocolIE_ID_id_gNB_DU_ID:
11639 if(BuildAndSendDUUpdateAck(duId) != ROK)
11641 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11645 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11646 * commented this trigger for now */
11648 if(cellToBeDelete == false)
11650 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11651 if(BuildAndSendF1ResetReq() != ROK)
11653 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11658 if(cellToBeDelete == true)
11660 SEARCH_DU_DB(duIdx, duId, duDb);
11661 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11662 if(cellCb->numUe == 0)
11664 memset(cellCb, 0, sizeof(CuCellCb));
11668 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11673 /*******************************************************************
11675 * @brief storing slice list in CU database
11679 * Function : buildSliceList
11682 * - storing slice list in CU database
11684 * @params[in] SliceSupportList_t *sliceSupportList
11685 * @return ROK - success
11686 * RFAILED - failure
11688 * ****************************************************************/
11689 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11691 uint8_t sliceListIdx = 0;
11693 if(sliceSupportList)
11695 if(sliceSupportList->list.array)
11697 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11698 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11700 if(sliceSupportList->list.array[sliceListIdx])
11702 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11703 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11705 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11708 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11710 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11711 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11713 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11715 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11716 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11717 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11726 /****************************************************************
11727 * @brief Function to process Srb Setup Mod List
11731 * Function : procSrbSetupModList
11734 * - Function to process SRB Setup Mod List
11737 * @return ROK - success
11738 * RFAILED - failure
11740 * ****************************************************************/
11741 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11743 uint8_t arrIdx = 0, srbIdx;
11744 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11746 if(srbSetupList != NULLP)
11748 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11750 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11751 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11753 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11755 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11757 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11769 /****************************************************************
11770 * @brief Function to process Drb Setup Mod List
11774 * Function : procDrbSetupModList
11777 * - Function to process DRB Setup Mod List
11780 * @return ROK - success
11781 * RFAILED - failure
11783 * ****************************************************************/
11784 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11786 uint8_t arrIdx = 0, drbIdx;
11788 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11790 if(drbSetupList != NULLP)
11792 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11794 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11795 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11797 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11799 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11801 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11802 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11807 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11809 /* extracting teId */
11810 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11813 if(addDrbTunnels(duId, teId)== ROK)
11815 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11827 /*******************************************************************
11829 * @brief processing of GNB_DU_Served_Cells Plmn list information
11833 * Function : procServedCellPlmnList
11836 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11839 * @params[in] F1AP_PDU_t *f1apMsg
11840 * @return ROK - success
11841 * RFAILED - failure
11843 * ****************************************************************/
11844 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11846 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11847 ProtocolExtensionContainer_4624P3_t **ieExtend;
11849 if(srvPlmn->list.array)
11851 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11853 if(srvPlmn->list.array[srvPlmnIdx])
11855 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11858 if((*ieExtend)->list.array)
11860 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11862 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11864 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11866 case ProtocolIE_ID_id_TAISliceSupportList:
11868 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11869 extensionValue.choice.SliceSupportList) != ROK)
11871 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11886 /****************************************************************
11887 * @brief Function to process Ue Context Modification Response
11891 * Function : procUeContextModificationResponse
11894 * - Function to process Ue Context Modification Response
11897 * @return ROK - success
11898 * RFAILED - failure
11900 * ****************************************************************/
11901 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *recvBuf, MsgLen recvBufLen)
11903 uint8_t idx=0, duIdx=0;
11904 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11905 DuDb *duDb = NULLP;
11906 CuUeCb *ueCb = NULLP;
11907 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11909 SEARCH_DU_DB(duIdx, duId, duDb);
11910 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11912 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11914 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11916 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11918 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11921 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11923 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11924 ueCb = &duDb->ueCb[duUeF1apId-1];
11926 if((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO))
11928 BuildAndSendHOReq(ueCb, HO_REQ, recvBuf, recvBufLen);
11932 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11934 /* Adding Tunnels for successful DRB */
11935 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11939 case ProtocolIE_ID_id_DRBs_Modified_List:
11941 DU_LOG("\nINFO --> Received DRBs Modified List");
11944 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11946 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11949 case ProtocolIE_ID_id_DUtoCURRCInformation:
11951 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11952 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11953 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11955 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11964 /* If UE is in handover and UE context is not yet created at target DU, then send
11965 * UE context setup request to target DU */
11966 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11968 if(ueCb->hoInfo.HOType == Inter_DU_HO)
11971 DuDb *tgtDuDb = NULLP;
11972 CuUeCb *ueCbInTgtDu = NULLP;
11974 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetId, tgtDuDb);
11977 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11978 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11980 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11982 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11984 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11989 /* If UE context is not found in Target DU DU, send UE context setup
11991 if(ueCbInTgtDu == NULLP)
11993 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetId, ueCb)) != ROK)
11995 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
12003 #ifdef START_DL_UL_DATA
12010 /*******************************************************************
12012 * @brief processing of F1 setup request
12016 * Function : procF1SetupReq
12019 * - processing of F1 setup request
12021 * @params[in] F1AP_PDU_t *f1apMsg
12022 * @return ROK - success
12023 * RFAILED - failure
12025 * ****************************************************************/
12026 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
12028 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
12030 uint64_t nrCellId = 0;
12031 DuDb *duDb = NULLP;
12032 CuCellCb *cellCb = NULLP;
12033 BIT_STRING_t nrcellIdentity;
12034 F1SetupRequest_t *f1SetupReq = NULLP;
12035 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
12036 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
12038 /* Triggering XN setup request before F1 setup establishment */
12039 if(LOCAL_NODE_TYPE == CLIENT)
12040 BuildAndSendXnSetupReq();
12042 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
12043 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
12045 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
12047 case ProtocolIE_ID_id_gNB_DU_ID:
12049 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
12050 SEARCH_DU_DB(duIdx, duId, duDb);
12053 duDb = &cuCb.duInfo[cuCb.numDu];
12056 memset(duDb, 0, sizeof(DuDb));
12061 case ProtocolIE_ID_id_gNB_DU_Name:
12063 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
12066 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
12068 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
12069 if(duServedCell->list.array)
12071 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
12073 if(duServedCell->list.array[plmnidx])
12075 switch(duServedCell->list.array[plmnidx]->id)
12077 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
12079 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
12080 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
12081 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
12083 bitStringToInt(&nrcellIdentity, &nrCellId);
12084 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
12085 if(cellCb == NULLP)
12087 cellCb = &duDb->cellCb[duDb->numCells];
12088 memset(cellCb, 0, sizeof(CuCellCb));
12089 cellCb->nrCellId = nrCellId;
12090 cellCb->cellStatus = CELL_ACTIVE;
12103 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
12107 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
12111 /****************************************************************
12113 * @brief processing of UE Context Release Complete
12117 * Function : procUeContextReleaseComplete
12120 * - processing of UE Context Release Complete
12122 * @params[in] F1AP_PDU_t *f1apMsg
12123 * @return ROK - success
12124 * RFAILED - failure
12126 * ****************************************************************/
12127 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
12129 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
12130 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
12131 DuDb *duDb = NULLP;
12132 CuUeCb *ueCb = NULLP;
12133 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
12135 SEARCH_DU_DB(duIdx, duId, duDb);
12138 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
12142 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
12143 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
12145 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
12147 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12149 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
12152 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12154 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
12155 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
12156 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
12158 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
12160 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
12161 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
12163 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
12165 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
12167 ueCb->cellCb->ueCb[ueIdx] = NULLP;
12168 ueCb->cellCb->numUe--;
12169 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
12171 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
12178 memset(ueCb, 0, sizeof(CuUeCb));
12186 /*******************************************************************
12188 * @brief Builds the Paging cell list
12192 * Function : BuildPagingCellList
12194 * Functionality: Build the paging cell list
12196 * @params[in] PagingCell_list_t *pagingCelllist,
12198 * @return ROK - success
12199 * RFAILED - failure
12201 * ****************************************************************/
12202 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
12204 uint8_t cellIdx =0;
12205 PagingCell_ItemIEs_t *pagingCellItemIes;
12206 PagingCell_Item_t *pagingCellItem;
12208 pagingCelllist->list.count = numCells;
12209 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
12210 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
12211 if(pagingCelllist->list.array == NULLP)
12213 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12217 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12219 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12220 if(pagingCelllist->list.array[cellIdx] == NULLP)
12222 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12227 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12229 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12230 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
12231 pagingCellItemIes->criticality = Criticality_ignore;
12232 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
12233 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12235 /* Fill NrCgi Information */
12236 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
12242 /*******************************************************************
12244 * @brief Deallocation of memory allocated in paging msg
12248 * Function :FreePagingMsg
12250 * Functionality: Deallocation of memory allocated in paging msg
12252 * @params[in] F1AP_PDU_t *f1apMsg
12256 * ****************************************************************/
12257 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12259 uint8_t ieIdx, cellIdx;
12261 PagingCell_ItemIEs_t *pagingCellItemIes;
12262 PagingCell_Item_t *pagingCellItem;
12263 PagingCell_list_t *pagingCelllist;
12267 if(f1apMsg->choice.initiatingMessage)
12269 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12270 if(paging->protocolIEs.list.array)
12272 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12274 if(paging->protocolIEs.list.array[ieIdx])
12276 switch(paging->protocolIEs.list.array[ieIdx]->id)
12278 case ProtocolIE_ID_id_UEIdentityIndexValue:
12280 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12281 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12285 case ProtocolIE_ID_id_PagingIdentity:
12287 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12289 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12291 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12293 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12294 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12296 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12297 sizeof(struct CNUEPagingIdentity));
12303 case ProtocolIE_ID_id_PagingCell_List:
12305 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12306 if(pagingCelllist->list.array)
12308 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12310 if(pagingCelllist->list.array[cellIdx])
12312 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12313 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12315 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12316 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12317 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12319 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12322 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12327 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12330 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12332 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12334 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12337 /*******************************************************************
12339 * @brief Builds and sends the paging message if UE is in idle mode
12343 * Function : BuildAndSendPagingMsg
12345 * Functionality: Builds and sends the paging message
12347 * @params[in] uint32_t duId, uint8_t gsTmsi
12349 * @return ROK - success
12350 * RFAILED - failure
12352 * ****************************************************************/
12353 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12355 bool memAllocFailed = false;
12356 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12357 uint16_t ueId = 0, duIdx = 0;
12359 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12360 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12361 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12362 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12364 F1AP_PDU_t *f1apMsg = NULLP;
12365 Paging_t *paging = NULLP;
12367 asn_enc_rval_t encRetVal;
12369 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12371 SEARCH_DU_DB(duIdx, duId, duDb);
12374 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12377 if(duDb->numCells == 0)
12379 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): No CELL is UP!");
12385 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12386 if(f1apMsg == NULLP)
12388 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12392 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12394 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12395 if(f1apMsg->choice.initiatingMessage == NULLP)
12397 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12400 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12401 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12402 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12404 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12407 paging->protocolIEs.list.count = elementCnt;
12408 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12410 /* Initialize the Paging Message members */
12411 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12412 if(paging->protocolIEs.list.array == NULLP)
12414 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12418 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12420 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12421 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12423 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12424 memAllocFailed = true;
12429 if(memAllocFailed == true)
12434 /* UE Identity Index Value */
12436 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12437 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12438 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12439 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12440 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12441 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12442 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12443 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12445 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12449 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12450 ueId = gsTmsi % 1024;
12451 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12453 /* Paging Identity */
12455 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12456 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12457 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12458 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12459 PagingIdentity_PR_cNUEPagingIdentity;
12460 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12461 sizeof(struct CNUEPagingIdentity));
12462 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12464 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12468 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12469 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12471 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12472 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12473 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12474 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12476 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12480 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12481 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12485 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12486 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12487 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12488 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12490 /* Paging Priority */
12492 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12493 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12494 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12495 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12497 /* Paging Cell List */
12499 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12500 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12501 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12502 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12504 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12508 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12510 /* Encode the UE Context Release Command type as APER */
12511 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12513 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12516 /* Encode results */
12517 if(encRetVal.encoded == ENCODE_FAIL)
12519 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12520 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12525 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12526 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12528 DU_LOG("%x",encBuf[ieIdx]);
12532 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12534 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12543 FreePagingMsg(f1apMsg);
12547 /*******************************************************************
12549 * @brief Handles received F1AP message and sends back response
12553 * Function : F1APMsgHdlr
12556 * - Decodes received F1AP control message
12557 * - Prepares response message, encodes and sends to SCTP
12560 * @return ROK - success
12561 * RFAILED - failure
12563 * ****************************************************************/
12564 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12570 F1AP_PDU_t *f1apMsg = NULLP;
12571 asn_dec_rval_t rval; /* Decoder return value */
12572 F1AP_PDU_t f1apasnmsg ;
12574 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12575 ODU_PRINT_MSG(mBuf, 0,0);
12577 /* Copy mBuf into char array to decode it */
12578 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12579 CU_ALLOC(recvBuf, (Size)recvBufLen);
12581 if(recvBuf == NULLP)
12583 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12586 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12588 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12592 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12593 for(i=0; i< recvBufLen; i++)
12595 DU_LOG("%x",recvBuf[i]);
12598 /* Decoding flat buffer into F1AP messsage */
12599 f1apMsg = &f1apasnmsg;
12600 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12602 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12603 CU_FREE(recvBuf, (Size)recvBufLen);
12605 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12607 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12611 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12613 switch(f1apMsg->present)
12615 case F1AP_PDU_PR_initiatingMessage:
12617 switch(f1apMsg->choice.initiatingMessage->value.present)
12619 case InitiatingMessage__value_PR_Reset:
12621 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12622 BuildAndSendF1ResetAck();
12626 case InitiatingMessage__value_PR_F1SetupRequest:
12628 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12629 procF1SetupReq(duId, f1apMsg);
12633 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12635 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12636 procGnbDuUpdate(*duId, f1apMsg);
12639 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12641 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12642 procInitULRRCMsg(*duId, f1apMsg);
12645 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12647 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12648 procUlRrcMsg(*duId, f1apMsg);
12652 case InitiatingMessage__value_PR_RRCDeliveryReport:
12654 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12657 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12659 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12660 procUeContextReleaseReq(*duId, f1apMsg);
12665 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12666 f1apMsg->choice.initiatingMessage->value.present);
12669 }/* End of switch(initiatingMessage) */
12673 case F1AP_PDU_PR_successfulOutcome:
12675 switch(f1apMsg->choice.successfulOutcome->value.present)
12677 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12679 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12682 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12684 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12685 procUeContextSetupResponse(*duId, f1apMsg);
12688 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12690 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12691 procUeContextModificationResponse(*duId, f1apMsg, recvBuf, recvBufLen);
12694 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12696 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12697 procUeContextReleaseComplete(*duId, f1apMsg);
12702 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12703 f1apMsg->choice.successfulOutcome->value.present);
12706 }/* End of switch(successfulOutcome) */
12711 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12714 }/* End of switch(f1apMsg->present) */
12716 } /* End of F1APMsgHdlr */
12718 /**********************************************************************
12720 **********************************************************************/