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(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 Security mode command");
1524 char secModeBuf[30]={0x00, ueCb->pdcpSn++, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1525 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1527 rrcContainer->size = bufLen;
1528 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1529 if(rrcContainer->buf != NULLP)
1531 memset(rrcContainer->buf, 0, bufLen);
1532 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1536 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1540 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1542 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1543 char secModeBuf[9]={0x00, ueCb->pdcpSn++, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1545 rrcContainer->size = bufLen;
1546 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1547 if(rrcContainer->buf != NULLP)
1549 memset(rrcContainer->buf, 0, bufLen);
1550 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1554 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1558 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1560 /*Hardcoded RRC Container from reference logs*/
1561 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1562 char buf[14] ={0x00, ueCb->pdcpSn++, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1564 rrcContainer->size = bufLen;
1565 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1566 if(rrcContainer->buf != NULLP)
1568 memset(rrcContainer->buf, 0, bufLen);
1569 memcpy(rrcContainer->buf, buf, bufLen);
1573 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1577 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1579 uint16_t tmpBufIdx = 0, bufIdx = 0;
1580 RRCContainer_t rrcContainerTmp;
1581 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1582 ret = fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, false);
1583 rrcContainer->size = rrcContainerTmp.size + 2;
1584 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1585 if(rrcContainer->buf != NULLP)
1587 memset(rrcContainer->buf, 0, rrcContainer->size);
1588 rrcContainer->buf[0] = 0x00;
1589 rrcContainer->buf[1] = ueCb->pdcpSn++; //PDCP SN
1590 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
1592 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
1596 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1602 /*******************************************************************
1604 * @brief Frees the DLRRCMessageTransfer
1608 * Function : freeDlRrcMessageTransfer
1610 * Functionality: Frees the DLRRCMessageTransfer
1614 * @return ROK - success
1617 * ****************************************************************/
1618 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1621 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1625 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1626 if(dlRRCMsg->protocolIEs.list.array)
1629 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1630 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1631 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1633 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1635 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1637 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1641 /*******************************************************************
1643 * @brief Builds and sends the DLRRCMessageTransfer
1647 * Function : BuildAndSendDLRRCMessageTransfer
1649 * Functionality: Constructs the DL RRC Message Transfer and sends
1650 * it to the CU through SCTP.
1654 * @return ROK - success
1657 * ****************************************************************/
1658 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1660 uint8_t elementCnt = 0;
1663 F1AP_PDU_t *f1apMsg = NULLP;
1664 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1665 asn_enc_rval_t encRetVal; /* Encoder return value */
1667 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1669 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1670 if(f1apMsg == NULLP)
1672 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1676 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1677 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1678 if(f1apMsg->choice.initiatingMessage == NULLP)
1680 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1681 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1685 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1686 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1687 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1688 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1691 dlRRCMsg->protocolIEs.list.count = elementCnt;
1692 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1694 /* Initialize the F1Setup members */
1695 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1696 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1698 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1699 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1700 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1704 for(idx=0; idx<elementCnt; idx++)
1706 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1707 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1709 for(ieId=0; ieId<idx; ieId++)
1711 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1713 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1714 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1715 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1720 /* GNB CU UE F1AP ID */
1722 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1723 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1724 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1725 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1727 /* GNB DU UE F1AP ID */
1729 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1730 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1731 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1732 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1736 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1737 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1738 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1739 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1743 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1744 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1745 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1746 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1748 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1750 /* Encode the F1SetupRequest type as APER */
1751 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1753 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1755 /* Encode results */
1756 if(encRetVal.encoded == ENCODE_FAIL)
1758 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1759 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1764 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1765 for(int i=0; i< encBufSize; i++)
1767 DU_LOG("%x",encBuf[i]);
1772 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1774 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1777 freeDlRrcMessageTransfer(f1apMsg);
1779 }/* End of BuildAndSendDLRRCMessageTransfer */
1781 /*******************************************************************
1783 * @brief Function to set the Dl RRC Msg Type
1787 * Function : setDlRRCMsgType
1789 * Functionality: Constructs the UE Setup Response and sends
1790 * it to the DU through SCTP.
1794 * @return ROK - success
1797 * ****************************************************************/
1799 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1801 uint8_t rrcMsgType = 0;
1802 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1805 rrcMsgType = RRC_SETUP;
1807 case RRC_SETUP_COMPLETE:
1808 rrcMsgType = RRC_SETUP_COMPLETE;
1810 case NAS_SECURITY_MODE_COMPLETE:
1811 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1813 case RRC_SECURITY_MODE_COMPLETE:
1814 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1816 case REGISTRATION_COMPLETE:
1817 rrcMsgType = REGISTRATION_COMPLETE;
1819 case UE_CONTEXT_SETUP_RSP:
1820 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1822 case RRC_RECONFIG_COMPLETE:
1823 rrcMsgType = RRC_RECONFIG_COMPLETE;
1832 /*******************************************************************
1834 * @brief fill long cycle offset value of drx
1838 * Function : fillLongCycleOffsetValue
1840 * Functionality: fill long cycle offset value of drx
1842 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1843 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1845 * @return ROK - success
1848 * ****************************************************************/
1849 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *recvedLongCycleOffsetVal)
1852 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1853 switch(recvedLongCycleOffsetVal->present)
1855 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10:
1857 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1860 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20:
1862 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1865 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32:
1867 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1870 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40:
1872 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1875 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60:
1877 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1880 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64:
1882 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1885 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70:
1887 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1890 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80:
1892 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1895 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128:
1897 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1900 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160:
1902 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1905 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256:
1907 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1910 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320:
1912 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1915 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512:
1917 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1920 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640:
1922 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1925 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024:
1927 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1930 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280:
1932 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1935 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048:
1937 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1940 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560:
1942 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1945 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120:
1947 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1950 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240:
1952 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1960 /*******************************************************************
1962 * @brief Extract configuration from DRX_ConfigRrc
1963 * and store the drx configuration in UeCb
1967 * Function : storeDrxCfgInUeCb
1969 * Functionality: Store drx configuration in UeCb
1971 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
1974 * ****************************************************************/
1975 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
1977 switch(drxSetup->drx_onDurationTimer.present)
1979 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
1981 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
1983 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
1984 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
1987 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
1989 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
1990 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
1994 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
1995 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
1996 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
1997 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
1998 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
1999 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
2000 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
2001 if(drxSetup->shortDRX)
2003 drxCfg->shortDrxPres=true;
2004 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
2005 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
2008 drxCfg->shortDrxPres=false;
2012 /*******************************************************************
2014 * @brief Extract configuration from CellGroupConfig
2018 * Function : extractCellGroupConfig
2020 * Functionality: Extract configuration from CellGroupConfig
2021 * and store in local database
2023 * @params[in] UE control block
2026 * @return ROK - success
2029 * ****************************************************************/
2030 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
2032 uint8_t rbIdx, srbIdx, drbIdx;
2033 bool srbFound, drbFound;
2034 SrbInfo *srbCfgDb = NULLP;
2035 DrbInfo *drbCfgDb = NULLP;
2036 RlcLcCfg *rlcLcCfgDb = NULLP;
2037 MacLcCfg *macLcCfgDb = NULLP;
2038 RLC_BearerConfig_t *rlcCfg = NULLP;
2039 RLC_Config_t *rlcLcCfg = NULLP;
2040 LogicalChannelConfig_t *macLcCfg = NULLP;
2047 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2051 if(cellGrpCfg == NULLP)
2053 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2058 if(cellGrpCfg->mac_CellGroupConfig)
2060 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2062 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2064 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2067 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2069 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup)
2071 ueCb->drxCfgPresent = true;
2072 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2077 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2084 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2089 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2091 /* Update SRB configuration in local DB */
2092 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2094 /* Search if SRB entry is already present in DB */
2095 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2097 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2099 srbCfgDb = &ueCb->srbList[srbIdx];
2105 /* If not, add SRB to UE CB's SRB list */
2108 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2109 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2113 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2114 srbCfgDb->cfgSentToUe = false;
2115 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2116 macLcCfgDb = &srbCfgDb->macLcCfg;
2119 /* Update DRB configuration in local DB */
2120 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2122 /* Search if DRB entry is already present in DB */
2123 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2125 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2127 drbCfgDb = &ueCb->drbList[drbIdx];
2133 /* If not, add DRB to UE CB's SRB list */
2136 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2137 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2141 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2142 drbCfgDb->cfgSentToUe = false;
2143 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2144 macLcCfgDb = &drbCfgDb->macLcCfg;
2148 /* Update RLC configuration for this RB */
2149 rlcLcCfg = rlcCfg->rlc_Config;
2150 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2151 switch(rlcLcCfgDb->rlcMode)
2153 case RLC_Config_PR_am:
2155 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2156 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2157 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2158 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2159 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2161 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2162 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2163 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2167 case RLC_Config_PR_um_Bi_Directional:
2169 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2171 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2172 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2177 /* Update MAC configuration for this LC */
2178 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2179 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2180 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2181 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2182 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2183 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2188 /*******************************************************************
2190 * @brief Function to decode DU to CU RRC container
2194 * Function : extractDuToCuRrcCont
2196 * Functionality: Function to decode DU to CU RRC container
2199 * RRC conatiner octect string to be decoded
2201 * @return ROK - success
2204 * ****************************************************************/
2205 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2207 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2208 asn_dec_rval_t rval; /* Decoder return value */
2210 /* Copy the received container to UeCb */
2211 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2213 /* Decoding DU to CU RRC container octet string to cell group config */
2214 cellGrpCfgMsg = &cellGrpCfg;
2215 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2217 rval = uper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2219 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2221 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2225 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2227 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2229 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2236 /*******************************************************************
2238 * @brief Function to build Initial UL RRC Message
2242 * Function : procInitULRRCMsg
2244 * Functionality: Function to build Initial UL RRC Message
2248 * @return ROK - success
2251 * ****************************************************************/
2253 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2255 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2257 uint16_t cellIdx=0, nrCellId = 0;
2262 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2264 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2266 SEARCH_DU_DB(duIdx, duId, duDb);
2267 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2269 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2271 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2273 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2274 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2277 case ProtocolIE_ID_id_NRCGI:
2278 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2279 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2284 case ProtocolIE_ID_id_C_RNTI:
2285 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2286 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2288 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2289 memset(ueCb, 0, sizeof(CuUeCb));
2290 ueCb->cellCb = cellCb;
2291 ueCb->crnti = crnti;
2292 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2293 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2294 ueCb->state = UE_ATTACH_IN_PROGRESS;
2297 cellCb->ueCb[cellCb->numUe] = ueCb;
2302 case ProtocolIE_ID_id_RRCContainer:
2305 case ProtocolIE_ID_id_DUtoCURRCContainer:
2307 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2308 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2310 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2311 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2312 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2313 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2315 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2316 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2317 ueCb->f1apMsgDb.duToCuContainer.size);
2319 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2321 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2327 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2334 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2343 ueCb->f1apMsgDb.dlRrcMsgCount++;
2344 rrcMsgType = setDlRRCMsgType(ueCb);
2345 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2350 /*******************************************************************
2352 * @brief Builds Nrcgi
2356 * Function : BuildNrcgi
2358 * Functionality: Building the PLMN ID and NR Cell id
2360 * @params[in] NRCGI_t *nrcgi
2361 * @return ROK - success
2364 * ****************************************************************/
2365 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2368 uint8_t unused_bits = 4;
2369 uint8_t byteSize = 5;
2371 /* Allocate Buffer Memory */
2372 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2373 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2374 if(nrcgi->pLMN_Identity.buf == NULLP)
2378 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2384 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2385 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2386 if(nrcgi->nRCellIdentity.buf == NULLP)
2390 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2394 /*******************************************************************
2396 * @brief Builds Special cell list for UE Setup Request
2400 * Function : BuildSplCellList
2402 * Functionality: Constructs the Special Cell list for UESetReq
2404 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2406 * @return ROK - success
2409 * ****************************************************************/
2410 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2416 spCellLst->list.count = cellCnt;
2417 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2418 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2419 if(spCellLst->list.array == NULLP)
2423 for(idx=0; idx<cellCnt; idx++)
2425 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2426 if(spCellLst->list.array[idx] == NULLP)
2432 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2433 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2434 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2436 /* Special Cell ID -NRCGI */
2437 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2442 /*Special Cell Index*/
2443 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2445 }/* End of BuildSplCellList*/
2447 /*******************************************************************
2449 * @brief Builds SRBS to be setup
2453 * Function : BuildSRBSetup
2455 * Functionality: Constructs the SRB's for UESetReq
2457 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2459 * @return ROK - success
2462 * ****************************************************************/
2463 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2468 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2469 srbCnt = ueCb->numSrb;
2472 srbSet->list.count = srbCnt;
2473 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2474 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2475 if(srbSet->list.array == NULLP)
2477 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2481 for(idx=0; idx<srbCnt; idx++)
2483 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2484 if(srbSet->list.array[idx] == NULLP)
2486 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2491 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2494 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2495 srbSet->list.array[idx]->criticality = Criticality_ignore;
2496 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2497 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2498 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2503 for(idx=0; idx<srbCnt; idx++)
2505 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2506 srbSet->list.array[idx]->criticality = Criticality_ignore;
2507 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2508 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2512 }/* End of BuildSRBSetup*/
2514 /*******************************************************************
2516 * @brief Builds QOS Info for DRB Setum Item
2520 * Function : BuildQOSInfo
2522 * Functionality: Constructs the QOS Info for DRB Setup Item
2524 * @params[in] QoSInformation_t *qosinfo
2525 * int16_t pduSessionID
2527 * @return ROK - success
2530 * ****************************************************************/
2531 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2533 uint8_t elementCnt = 0, qosCntIdx = 0;
2534 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2536 /* NonDynamic5QIDescriptor */
2537 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2538 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2539 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2545 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2549 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2550 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2552 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2554 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2560 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2561 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2565 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2566 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2568 /*MaxDataBurstVolume*/
2569 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2570 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2574 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2575 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2578 /*nRGRAN Allocation Retention Priority*/
2581 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2582 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2583 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2587 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2588 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2589 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2591 qosInfo->priorityLevel = PriorityLevel_lowest;
2592 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2593 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2596 /* PDU session ID */
2599 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2600 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2602 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2606 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2607 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2611 elementCnt = NUM_QOS_EXT;
2612 qosIeExt->list.count = elementCnt;
2613 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2615 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2616 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2618 if(qosIeExt->list.array == NULLP)
2620 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2624 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2626 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2627 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2629 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2632 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2633 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2634 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2635 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2636 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2637 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2638 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2639 qosInfo->pduSessionId = pduSessionID;
2644 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2649 }/*End of BuildQOSInfo*/
2651 /*******************************************************************
2653 * @brief Builds SNSSAI
2657 * Function : BuildSNSSAI
2659 * Functionality: Constructs the SNSSAI For DRB list
2661 * @params[in] SNSSAI_t *snssai
2662 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2664 * @return ROK - success
2667 * ****************************************************************/
2668 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2672 snssai->sST.size = sizeof(uint8_t);
2673 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2674 if(snssai->sST.buf == NULLP)
2679 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2681 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2684 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2685 if(snssai->sD == NULLP)
2689 snssai->sD->size = 3 * sizeof(uint8_t);
2690 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2691 if(snssai->sD->buf == NULLP)
2696 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2698 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2701 drbInfo->snssai = snssaiToCopy;
2703 }/*End of BuildSNSSAI*/
2705 /*******************************************************************
2707 * @brief Builds the flow map.
2711 * Function : BuildFlowsMap
2713 * Functionality: Constructs the flowmap For DRB list
2715 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2717 * @return ROK - success
2720 * ****************************************************************/
2721 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2723 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2724 FlowsMapped *qosFlow;
2729 flowCnt = drbInfo->numFlowMap;
2730 flowMap->list.count = flowCnt;
2731 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2732 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2733 if(flowMap->list.array == NULLP)
2735 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2738 for(idx=0; idx<flowCnt; idx++)
2740 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2741 if(flowMap->list.array[idx] == NULLP)
2743 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2749 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2750 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2752 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2754 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2756 qosFlow = &drbInfo->flowMapList[flowIdx];
2763 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2764 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2769 qosFlow = &drbInfo->flowMapList[idx];
2770 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2773 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2774 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2777 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2781 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2782 drbInfo->numFlowMap++;
2785 }/*End of BuildFlowsMap*/
2787 /*******************************************************************
2789 * @brief Builds the Uplink Tunnel Info
2793 * Function : BuildULTnlInfo
2795 * Functionality: Constructs the UL TnlInfo For DRB list
2797 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2799 * @return ROK - success
2802 * ****************************************************************/
2803 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2809 ulInfo->list.count = ulCnt;
2810 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2811 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2812 if(ulInfo->list.array == NULLP)
2814 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2817 for(idx=0; idx<ulCnt; idx++)
2819 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2820 if(ulInfo->list.array[idx] == NULLP)
2822 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2827 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2829 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2830 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2832 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2835 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2836 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2837 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2838 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2840 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2846 /* NOTE: Below IP address must be changed if running on different IP configuration */
2847 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2848 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2849 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2850 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2851 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2853 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2854 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2855 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2856 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2860 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2861 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2862 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2863 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2864 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2868 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2869 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2870 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2871 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2873 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2879 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2880 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2881 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2882 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2884 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2885 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2886 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2887 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2891 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2892 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2893 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2894 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2897 }/*End of BuildULTnlInfo*/
2899 /*******************************************************************
2901 * @brief Builds DRBS to be setup
2905 * Function : BuildDRBSetup
2907 * Functionality: Constructs the DRB's for UESetReq
2909 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2911 * @return ROK - success
2914 * ****************************************************************/
2915 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2917 uint16_t snssaiIdx=0;
2918 uint8_t idx = 0, extIeIdx = 0;
2919 uint8_t elementCnt = 0, drbCnt = 0;
2920 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2921 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2922 DRBs_ToBeSetup_Item_t *drbSetItem;
2923 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2924 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2926 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2927 drbCnt = ueCb->numDrb;
2929 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2930 drbSet->list.count = drbCnt;
2932 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2933 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2934 if(drbSet->list.array == NULLP)
2936 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2940 for(idx=0; idx<drbCnt; idx++)
2942 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2943 if(drbSet->list.array[idx] == NULLP)
2945 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2949 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2950 drbSet->list.array[idx]->criticality = Criticality_ignore;
2951 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2952 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2954 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2956 drbSetItem->dRBID = idx + 1;
2957 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2960 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2963 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2964 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2965 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2967 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2970 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2971 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2972 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2973 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2974 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2975 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2977 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2978 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2979 if(BuildQOSInforet != ROK)
2981 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2986 snssaiIdx = (idx% cuCb.numSnssaiSupported);
2987 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2988 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2989 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
2991 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2992 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
2993 if(BuildSNSSAIret != ROK)
2995 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2999 /*Flows mapped to DRB List*/
3000 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3001 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
3002 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
3004 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
3005 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
3006 if(BuildFlowsMapret != ROK)
3008 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
3012 /*ULUPTNLInformation To Be Setup List*/
3013 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3014 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3017 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3019 if(BuildULTnlInforet != ROK)
3021 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
3026 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3028 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3029 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
3032 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
3034 /* DL PDCP SN Length */
3035 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
3037 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
3038 if(!drbToBeSetupExt)
3040 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3045 drbToBeSetupExt->list.count = elementCnt;
3046 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3048 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3049 if(!drbToBeSetupExt->list.array)
3051 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3055 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3057 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3058 if(!drbToBeSetupExt->list.array[extIeIdx])
3060 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3066 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3068 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3069 drbToBeSetupExtIe->criticality = Criticality_ignore;
3070 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3071 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3072 drbSetItem->iE_Extensions = drbToBeSetupExt;
3075 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3079 }/* End of BuildDRBSetup*/
3081 /*******************************************************************
3083 * @brief Deallocating memory of function BuildAndSendUESetReq
3087 * Function : FreeNrcgi
3089 * Functionality: Deallocating memory for function BuildNrcgi
3091 * @params[in] NRCGI_t *nrcgi
3095 *******************************************************************/
3096 void FreeNrcgi(NRCGI_t *nrcgi)
3098 if(nrcgi->pLMN_Identity.buf != NULLP)
3100 if(nrcgi->nRCellIdentity.buf != NULLP)
3102 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3104 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3107 /*******************************************************************
3109 * @brief Deallocating memory of function BuildAndSendUESetReq
3113 * Function : FreeSplCellList
3115 * Functionality: Deallocating memory for function BuildSplCellList
3117 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3122 * *****************************************************************/
3123 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3126 if(spCellLst->list.array != NULLP)
3128 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3130 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3132 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3134 if(spCellLst->list.array[cellidx]!=NULLP)
3136 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3139 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3142 /*******************************************************************
3144 * @brief Deallocating memory of function BuildAndSendUESetReq
3148 * Function : FreeSRBSetup
3150 * Functionality: Deallocating memory for function BuildSRBSetup
3152 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3157 * ******************************************************************/
3158 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3161 if(srbSet->list.array != NULLP)
3163 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3165 if(srbSet->list.array[srbidx]!=NULLP)
3167 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3170 CU_FREE(srbSet->list.array,srbSet->list.size);
3173 /*******************************************************************
3175 * @brief Deallocating memory of function BuildAndSendUESetReq
3179 * Function : FreeQOSInfo
3181 * Functionality: Deallocating memory for function BuildQOSInfo
3183 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3187 * ****************************************************************/
3188 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3190 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3191 uint8_t qosCntIdx = 0;
3193 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3195 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3197 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3199 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3200 sizeof(MaxDataBurstVolume_t));
3202 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3203 sizeof(AveragingWindow_t));
3205 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3206 sizeof(NonDynamic5QIDescriptor_t));
3208 if(drbQos->iE_Extensions)
3210 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3211 if(qosIeExt->list.array != NULLP)
3213 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3215 if(qosIeExt->list.array[qosCntIdx])
3217 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3220 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3223 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3226 /*******************************************************************
3228 * @brief Deallocating memory of function BuildAndSendUESetReq
3232 * Function : FreeULTnlInfo
3234 * Functionality: Deallocating memory for function BuildULTnlInfo
3236 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3241 * ****************************************************************/
3242 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3245 if(ulInfo->list.array != NULLP)
3247 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3249 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3251 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3253 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3254 transportLayerAddress.buf != NULLP)
3256 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3259 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3260 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3261 gTPTunnel->gTP_TEID.size);
3263 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3264 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3265 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3267 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3268 sizeof(GTPTunnel_t));
3271 if(ulInfo->list.array[ulidx]!=NULLP)
3273 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3276 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3279 /*******************************************************************
3281 * @brief Deallocating memory for BuildAndSendUESetReq
3285 * Function : FreeDRBSetup
3287 * Functionality: Deallocating memory for BuildDRBSetup
3289 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3293 * ****************************************************************/
3294 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3296 DRBs_ToBeSetup_Item_t *drbSetItem;
3297 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3299 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3301 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3302 if(drbSet->list.array != NULLP)
3304 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3306 if(drbSet->list.array[drbidx] != NULLP)
3308 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3309 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3311 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3312 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3314 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3315 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3317 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3318 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3320 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3322 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3324 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3326 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3327 flows_Mapped_To_DRB_List.list.array != NULLP)
3329 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3330 flows_Mapped_To_DRB_List.list.count; flowidx++)
3332 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3333 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3335 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3336 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3337 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3339 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3340 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3341 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3343 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3344 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3345 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3347 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3348 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3350 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3351 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3352 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3353 sizeof(MaxDataBurstVolume_t));
3355 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3356 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3357 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3359 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3360 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3361 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3364 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3365 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3367 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3368 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3371 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3372 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3373 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3375 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3376 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3378 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3379 sizeof(OCTET_STRING_t));
3381 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3382 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3384 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3385 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3387 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3388 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3390 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3391 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3393 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3394 iE_Extensions != NULLP)
3396 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3397 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3398 if(qosIeExt->list.array != NULLP)
3400 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3402 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3404 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3407 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3409 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3410 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3413 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3415 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3418 CU_FREE(drbSet->list.array,drbSet->list.size);
3423 /*******************************************************************
3425 * @brief Free the UE Setup Request
3429 * Function : FreeUeContextSetupReq
3431 * Functionality: Deallocate the memory of BuildUESetReq
3433 * @params[in] F1AP_PDU_t *f1apMsg
3438 * ****************************************************************/
3439 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3442 UEContextSetupRequest_t *ueSetReq = NULLP;
3444 if(f1apMsg != NULLP)
3446 if(f1apMsg->choice.initiatingMessage != NULLP)
3448 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3449 if(ueSetReq->protocolIEs.list.array != NULLP)
3451 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3453 if(ueSetReq->protocolIEs.list.array[idx])
3455 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3457 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3459 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3461 case ProtocolIE_ID_id_SpCell_ID:
3462 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3464 case ProtocolIE_ID_id_ServCellIndex:
3466 case ProtocolIE_ID_id_SpCellULConfigured:
3468 case ProtocolIE_ID_id_CUtoDURRCInformation:
3469 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3471 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3472 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3474 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3475 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3477 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3478 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3480 case ProtocolIE_ID_id_RRCContainer:
3481 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3483 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3484 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3487 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3488 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3489 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3492 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3496 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3498 for(ieId=0; ieId<idx; ieId++)
3500 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3502 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3505 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3507 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3509 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3513 /**Filling cell group info **/
3514 /*******************************************************************
3516 * @brief Build Control resource set to add/modify list
3520 * Function : BuildControlRSetToAddModList
3522 * Functionality: Build Control resource set to add/modify list
3525 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3527 * @return ROK - success
3530 * ****************************************************************/
3531 uint8_t BuildControlRSetToAddModList
3533 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3538 uint8_t numBytes, bitsUnused;
3539 struct ControlResourceSet *controlRSet;
3540 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3541 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3544 controlRSetList->list.count = elementCnt;
3545 controlRSetList->list.size = \
3546 elementCnt * sizeof(struct ControlResourceSet *);
3548 controlRSetList->list.array = NULLP;
3549 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3550 if(!controlRSetList->list.array)
3552 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3556 for(idx = 0; idx < elementCnt; idx++)
3558 controlRSetList->list.array[idx] = NULLP;
3559 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3560 if(!controlRSetList->list.array[idx])
3562 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3568 controlRSet = controlRSetList->list.array[idx];
3569 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3571 /* Values harcoded according to our design:
3574 * Bit string stored ff0000000000
3578 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3579 controlRSet->frequencyDomainResources.buf = NULLP;
3580 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3581 controlRSet->frequencyDomainResources.size);
3582 if(!controlRSet->frequencyDomainResources.buf)
3584 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3588 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3589 coreset0EndPrb = CORESET0_END_PRB;
3590 coreset1StartPrb = coreset0EndPrb + 6;
3591 coreset1NumPrb = CORESET1_NUM_PRB;
3592 /* calculate the PRBs */
3593 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3594 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3595 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3597 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3598 controlRSet->cce_REG_MappingType.present = \
3599 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3601 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3602 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3603 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3604 controlRSet->tci_PresentInDCI = NULLP;
3606 uint8_t tciStateIdx;
3608 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3609 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3610 if(!controlRset->tci_StatesPDCCH_ToAddList)
3612 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3617 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3618 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3619 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3620 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3621 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3623 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3627 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3629 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3630 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3632 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3639 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3641 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3642 if(!controlRset->tci_PresentInDCI)
3644 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3648 *(controlRset->tci_PresentInDCI);
3651 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3652 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3653 if(!controlRSet->pdcch_DMRS_ScramblingID)
3655 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3658 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3661 } /* End BuildControlRSetToAddModList */
3663 /*******************************************************************
3665 * @brief Build search space to add/modify list
3669 * Function : BuildSearchSpcToAddModList
3671 * Functionality: Build search space to add/modify list
3674 * @return ROK - success
3677 * ****************************************************************/
3678 uint8_t BuildSearchSpcToAddModList
3680 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3688 struct SearchSpace *searchSpc;
3691 searchSpcList->list.count = elementCnt;
3692 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3694 searchSpcList->list.array = NULLP;
3695 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3696 if(!searchSpcList->list.array)
3698 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3702 for(idx = 0; idx < elementCnt; idx++)
3704 searchSpcList->list.array[idx] = NULLP;
3705 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3706 if(!searchSpcList->list.array[idx])
3708 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3714 searchSpc = searchSpcList->list.array[idx];
3716 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3718 searchSpc->controlResourceSetId = NULLP;
3719 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3720 if(!searchSpc->controlResourceSetId)
3722 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3725 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3727 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3728 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3729 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3730 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3732 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3735 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3736 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3738 searchSpc->duration = NULLP;
3739 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3740 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3741 if(!searchSpc->monitoringSymbolsWithinSlot)
3743 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3747 /* Values taken from reference logs :
3750 * Bit string stores 8000
3755 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3756 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3757 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3758 searchSpc->monitoringSymbolsWithinSlot->size);
3759 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3761 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3766 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3767 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3768 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3769 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3771 searchSpc->nrofCandidates = NULLP;
3772 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3773 if(!searchSpc->nrofCandidates)
3775 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3779 searchSpc->nrofCandidates->aggregationLevel1 = \
3780 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3781 searchSpc->nrofCandidates->aggregationLevel2 = \
3782 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3783 searchSpc->nrofCandidates->aggregationLevel4 = \
3784 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3785 searchSpc->nrofCandidates->aggregationLevel8 = \
3786 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3787 searchSpc->nrofCandidates->aggregationLevel16 = \
3788 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3790 searchSpc->searchSpaceType = NULLP;
3791 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3792 if(!searchSpc->searchSpaceType)
3794 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3798 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3800 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3801 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3802 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3803 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3805 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3808 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3809 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3812 }/* End BuildSearchSpcToAddModList */
3814 /*******************************************************************
3816 * @brief Builds BWP DL dedicated PDCCH config
3820 * Function : BuildBWPDlDedPdcchCfg
3822 * Functionality: Builds BWP DL dedicated PDCCH config
3824 * @params[in] struct PDCCH_Config *pdcchCfg
3826 * @return ROK - success
3829 * ****************************************************************/
3830 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3832 pdcchCfg->controlResourceSetToAddModList = NULLP;
3833 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3834 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3835 if(!pdcchCfg->controlResourceSetToAddModList)
3837 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3841 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3846 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3848 pdcchCfg->searchSpacesToAddModList = NULLP;
3849 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3850 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3851 if(!pdcchCfg->searchSpacesToAddModList)
3853 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3857 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3862 pdcchCfg->searchSpacesToReleaseList = NULLP;
3863 pdcchCfg->downlinkPreemption = NULLP;
3864 pdcchCfg->tpc_PUSCH = NULLP;
3865 pdcchCfg->tpc_PUCCH = NULLP;
3866 pdcchCfg->tpc_SRS = NULLP;
3871 /*******************************************************************
3873 * @brief Builds DMRS DL PDSCH Mapping type A
3877 * Function : BuildDMRSDLPdschMapTypeA
3879 * Functionality: Builds DMRS DL PDSCH Mapping type A
3882 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3883 * @return ROK - success
3886 * ****************************************************************/
3887 uint8_t BuildDMRSDLPdschMapTypeA
3889 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3892 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3893 dmrsDlCfg->choice.setup = NULLP;
3894 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3895 if(!dmrsDlCfg->choice.setup)
3897 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3901 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3902 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3903 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3904 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3906 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3909 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3911 dmrsDlCfg->choice.setup->maxLength = NULLP;
3912 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3913 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3914 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3919 /*******************************************************************
3921 * @brief Builds TCI states to add/modify list
3925 * Function : BuildTCIStatesToAddModList
3927 * Functionality:Builds TCI states to add/modify list
3930 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3932 * @return ROK - success
3935 * ****************************************************************/
3936 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3941 /*******************************************************************
3943 * @brief Builds PDSCH time domain allocation list
3947 * Function : BuildPdschTimeDomAllocList
3949 * Functionality: Builds PDSCH time domain allocation list
3952 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3954 * @return ROK - success
3957 * ****************************************************************/
3958 uint8_t BuildPdschTimeDomAllocList
3960 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3965 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3967 timeDomAllocList->present = \
3968 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3970 timeDomAllocList->choice.setup = NULLP;
3971 CU_ALLOC(timeDomAllocList->choice.setup, \
3972 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3973 if(!timeDomAllocList->choice.setup)
3975 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3980 timeDomAllocList->choice.setup->list.count = elementCnt;
3981 timeDomAllocList->choice.setup->list.size = \
3982 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3984 timeDomAllocList->choice.setup->list.array = NULLP;
3985 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3986 timeDomAllocList->choice.setup->list.size);
3987 if(!timeDomAllocList->choice.setup->list.array)
3989 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3993 for(idx = 0; idx < elementCnt; idx++)
3995 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3996 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3997 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3998 if(!timeDomAllocList->choice.setup->list.array[idx])
4000 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4006 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4007 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4008 if(!timeDomAlloc->k0)
4010 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4013 *(timeDomAlloc->k0) = 0;
4014 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4015 timeDomAlloc->startSymbolAndLength = 66;
4018 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4019 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4020 if(!timeDomAlloc->k0)
4022 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4025 *(timeDomAlloc->k0) = 1;
4026 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4027 timeDomAlloc->startSymbolAndLength = 66;
4032 /*******************************************************************
4034 * @brief Builds PDSCH PRB Bundling type
4038 * Function : BuildPdschPrbBundlingType
4040 * Functionality: Builds PDSCH PRB Bundling type
4043 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4045 * @return ROK - success
4048 * ****************************************************************/
4049 uint8_t BuildPdschPrbBundlingType
4051 struct PDSCH_Config__prb_BundlingType *prbBndlType
4054 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4056 prbBndlType->choice.staticBundling = NULLP;
4057 CU_ALLOC(prbBndlType->choice.staticBundling, \
4058 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4059 if(!prbBndlType->choice.staticBundling)
4061 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4064 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4069 /*******************************************************************
4071 * @brief Builds BWP DL dedicated PDSCH config
4075 * Function : BuildBWPDlDedPdschCfg
4077 * Functionality: Builds BWP DL dedicated PDSCH config
4079 * @params[in] struct PDSCH_Config *pdschCfg
4081 * @return ROK - success
4084 * ****************************************************************/
4085 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4087 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4089 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4090 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4091 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4092 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4094 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4098 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4103 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4104 pdschCfg->tci_StatesToAddModList = NULLP;
4105 pdschCfg->tci_StatesToReleaseList = NULLP;
4106 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4108 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4109 if(!pdschCfg->tci_StatesToAddModList)
4111 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4114 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4120 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4122 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4123 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4124 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4125 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4127 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4130 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4134 pdschCfg->pdsch_AggregationFactor = NULLP;
4135 pdschCfg->rateMatchPatternToAddModList = NULLP;
4136 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4137 pdschCfg->rateMatchPatternGroup1 = NULLP;
4138 pdschCfg->rateMatchPatternGroup2 = NULLP;
4139 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4140 pdschCfg->mcs_Table = NULLP;
4142 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4143 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4144 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4146 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4149 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4151 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4156 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4157 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4158 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4159 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4160 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4161 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4162 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4167 /*******************************************************************
4169 * @brief Builds intitial DL BWP
4172 * Function : BuildInitialDlBWP
4174 * Functionality: Builds intitial DL BWP in spCellCfgDed
4176 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4178 * @return ROK - success
4181 * ****************************************************************/
4182 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4184 dlBwp->pdcch_Config = NULLP;
4185 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4186 if(!dlBwp->pdcch_Config)
4188 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4191 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4193 dlBwp->pdcch_Config->choice.setup = NULLP;
4194 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4195 if(!dlBwp->pdcch_Config->choice.setup)
4197 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4200 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4205 dlBwp->pdsch_Config = NULLP;
4206 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4207 if(!dlBwp->pdsch_Config)
4209 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4212 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4214 dlBwp->pdsch_Config->choice.setup = NULLP;
4215 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4216 if(!dlBwp->pdsch_Config->choice.setup)
4218 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4222 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4227 dlBwp->sps_Config = NULLP;
4228 dlBwp->radioLinkMonitoringConfig = NULLP;
4232 /*******************************************************************
4234 * @brief Builds DMRS UL Pusch Mapping type A
4238 * Function : BuildDMRSULPuschMapTypeA
4240 * Functionality: Builds DMRS UL Pusch Mapping type A
4243 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4244 * @return ROK - success
4247 * ****************************************************************/
4248 uint8_t BuildDMRSULPuschMapTypeA
4250 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4253 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4254 dmrsUlCfg->choice.setup= NULLP;
4255 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4256 if(!dmrsUlCfg->choice.setup)
4258 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4262 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4263 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4264 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4265 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4267 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4270 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4272 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4273 dmrsUlCfg->choice.setup->maxLength = NULLP;
4274 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4275 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4276 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4277 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4279 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4283 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4284 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4286 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4288 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4291 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4293 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4294 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4298 /*******************************************************************
4300 * @brief Build PUSCH time domain allocation list
4304 * Function : BuildPuschTimeDomAllocList
4306 * Functionality: Build PUSCH time domain allocation list
4309 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4311 * @return ROK - success
4314 * ****************************************************************/
4315 uint8_t BuildPuschTimeDomAllocList
4317 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4322 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4324 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4325 timeDomAllocList->choice.setup = NULLP;
4326 CU_ALLOC(timeDomAllocList->choice.setup, \
4327 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4328 if(!timeDomAllocList->choice.setup)
4330 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4335 timeDomAllocList->choice.setup->list.count = elementCnt;
4336 timeDomAllocList->choice.setup->list.size = \
4337 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4338 timeDomAllocList->choice.setup->list.array = NULLP;
4339 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4340 timeDomAllocList->choice.setup->list.size);
4341 if(!timeDomAllocList->choice.setup->list.array)
4343 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4347 for(idx = 0; idx < elementCnt; idx++)
4349 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4350 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4351 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4352 if(!timeDomAllocList->choice.setup->list.array[idx])
4354 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4360 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4361 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4362 if(!timeDomAlloc->k2)
4364 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4367 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4368 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4369 timeDomAlloc->startSymbolAndLength = 66;
4372 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4373 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4374 if(!timeDomAlloc->k2)
4376 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4379 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4380 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4381 timeDomAlloc->startSymbolAndLength = 66;
4386 /*******************************************************************
4388 * @brief Builds BWP UL dedicated PUSCH Config
4392 * Function : BuildBWPUlDedPuschCfg
4395 * Builds BWP UL dedicated PUSCH Config
4397 * @params[in] : PUSCH_Config_t *puschCfg
4399 * @return ROK - success
4402 * ****************************************************************/
4403 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4405 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4406 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4407 if(!puschCfg->dataScramblingIdentityPUSCH)
4409 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4412 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4414 puschCfg->txConfig = NULLP;
4415 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4416 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4417 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4418 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4420 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4424 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4429 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4430 puschCfg->pusch_PowerControl = NULLP;
4431 puschCfg->frequencyHopping = NULLP;
4432 puschCfg->frequencyHoppingOffsetLists = NULLP;
4433 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4435 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4436 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4437 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4438 if(!puschCfg->pusch_TimeDomainAllocationList)
4440 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4444 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4449 puschCfg->pusch_AggregationFactor = NULLP;
4450 puschCfg->mcs_Table = NULLP;
4451 puschCfg->mcs_TableTransformPrecoder = NULLP;
4452 puschCfg->transformPrecoder = NULLP;
4453 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4454 if(!puschCfg->transformPrecoder)
4456 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4459 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4461 puschCfg->codebookSubset = NULLP;
4462 puschCfg->maxRank = NULLP;
4463 puschCfg->rbg_Size = NULLP;
4464 puschCfg->uci_OnPUSCH = NULLP;
4465 puschCfg->tp_pi2BPSK = NULLP;
4470 /*******************************************************************
4472 * @brief Builds BWP UL dedicated PUCCH Config
4476 * Function : BuildBWPUlDedPucchCfg
4479 * Builds BWP UL dedicated PUCCH Config
4481 * @params[in] : PUCCH_Config_t *pucchCfg
4483 * @return ROK - success
4486 * ****************************************************************/
4487 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4489 uint8_t arrIdx, elementCnt;
4490 uint8_t rsrcIdx, rsrcSetIdx;
4491 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4492 PUCCH_Resource_t *rsrc = NULLP;
4496 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4497 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4498 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4499 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4500 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4502 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4505 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4506 rsrcSet->pucch_ResourceSetId = 1;
4508 rsrcSet->resourceList.list.count = elementCnt;
4509 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4510 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4511 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4513 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4516 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4520 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4521 pucchCfg->resourceToAddModList->list.count = elementCnt;
4522 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4523 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4524 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4526 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4529 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4530 rsrc->pucch_ResourceId = 1;
4531 rsrc->startingPRB = 0;
4532 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4533 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4534 rsrc->format.choice.format1->initialCyclicShift = 0;
4535 rsrc->format.choice.format1->nrofSymbols = 4;
4536 rsrc->format.choice.format1->startingSymbolIndex = 0;
4537 rsrc->format.choice.format1->timeDomainOCC = 0;
4540 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4541 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4542 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4543 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4544 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4547 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4548 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4550 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4555 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4556 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4557 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4558 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4560 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4564 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4566 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4567 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4569 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4575 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4576 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4581 /*******************************************************************
4583 * @brief Fills SRS resource to add/modify list
4587 * Function : BuildSrsRsrcAddModList
4589 * Functionality: Fills SRS resource to add/modify list
4592 * @return ROK - success
4595 * ****************************************************************/
4596 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4602 resourceList->list.count = elementCnt;
4603 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4604 resourceList->list.array = NULLP;
4605 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4606 if(!resourceList->list.array)
4608 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4612 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4614 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4615 if(!resourceList->list.array[rsrcIdx])
4617 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4623 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4624 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4625 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4627 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4628 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4629 sizeof(struct SRS_Resource__transmissionComb__n2));
4630 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4632 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4635 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4636 = SRS_COMB_OFFSET_N2;
4637 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4638 = SRS_CYCLIC_SHIFT_N2;
4640 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4641 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4642 SRS_Resource__resourceMapping__nrofSymbols_n1;
4643 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4644 SRS_Resource__resourceMapping__repetitionFactor_n1;
4646 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4647 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4648 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4649 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4650 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4651 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4652 SRS_Resource__groupOrSequenceHopping_neither;
4654 /* Setting resource type to aperiodic for intergration purposes */
4655 resourceList->list.array[rsrcIdx]->resourceType.present = \
4656 SRS_Resource__resourceType_PR_aperiodic;
4657 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4658 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4659 sizeof(struct SRS_Resource__resourceType__aperiodic));
4660 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4662 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4665 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4670 /*******************************************************************
4672 * @brief Build SRS resource set Add/mod list
4676 * Function : BuildSrsRsrcSetAddModList
4678 * Functionality: Build SRS resource set Add/mod list
4681 * @return ROK - success
4684 * ****************************************************************/
4685 uint8_t BuildSrsRsrcSetAddModList
4687 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4693 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4696 rsrcSetList->list.count = elementCnt;
4697 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4698 rsrcSetList->list.array = NULLP;
4699 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4700 if(!rsrcSetList->list.array)
4702 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4706 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4708 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4709 if(!rsrcSetList->list.array[rSetIdx])
4711 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4717 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4719 /* Fill Resource Id list in resource set */
4720 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4721 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4722 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4723 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4725 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4730 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4731 rsrcIdList->list.count = elementCnt;
4732 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4733 rsrcIdList->list.array = NULLP;
4734 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4735 if(!rsrcIdList->list.array)
4737 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4741 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4743 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4744 if(!rsrcIdList->list.array[rsrcIdx])
4746 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4752 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4754 /* Fill resource type */
4755 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4756 SRS_ResourceSet__resourceType_PR_aperiodic;
4758 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4759 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4760 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4761 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4763 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4766 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4767 = APERIODIC_SRS_RESRC_TRIGGER;
4769 /* TODO : Fill values for below IEs as expected by Viavi */
4770 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4771 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4774 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4775 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4776 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4777 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4778 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4783 /*******************************************************************
4785 * @brief Builds BWP UL dedicated SRS Config
4789 * Function : BuildBWPUlDedSrsCfg
4791 * Functionality: Builds BWP UL dedicated SRS Config
4793 * @params[in] SRS Config
4794 * @return ROK - success
4797 * ****************************************************************/
4798 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4800 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4801 srsCfg->srs_ResourceSetToAddModList = NULLP;
4802 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4803 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4804 if(!srsCfg->srs_ResourceSetToAddModList)
4806 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4809 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4814 srsCfg->srs_ResourceToReleaseList = NULLP;
4816 /* Resource to Add/Modify list */
4817 srsCfg->srs_ResourceToAddModList = NULLP;
4818 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4819 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4820 if(!srsCfg->srs_ResourceToAddModList)
4822 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4826 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4831 srsCfg->tpc_Accumulation = NULLP;
4836 /*******************************************************************
4838 * @brief Builds inital UL BWP
4842 * Function : BuildInitialUlBWP
4844 * Functionality: Builds initial UL BWP
4846 * @params[in] BWP_UplinkDedicated_t *ulBwp
4847 * @return ROK - success
4850 * ****************************************************************/
4851 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4853 ulBwp->pucch_Config = NULLP;
4854 ulBwp->pucch_Config = NULLP;
4855 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4856 if(!ulBwp->pucch_Config)
4858 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4862 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4863 ulBwp->pucch_Config->choice.setup = NULLP;
4864 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4865 if(!ulBwp->pucch_Config->choice.setup)
4867 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4871 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4876 /* Fill BWP UL dedicated PUSCH config */
4877 ulBwp->pusch_Config = NULLP;
4878 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4879 if(!ulBwp->pusch_Config)
4881 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4885 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4886 ulBwp->pusch_Config->choice.setup = NULLP;
4887 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4888 if(!ulBwp->pusch_Config->choice.setup)
4890 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4894 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4899 ulBwp->configuredGrantConfig = NULLP;
4901 /* Fill BPW UL dedicated SRS config */
4902 ulBwp->srs_Config = NULLP;
4903 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4904 if(!ulBwp->srs_Config)
4906 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4910 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4911 ulBwp->srs_Config->choice.setup = NULLP;
4912 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4913 if(!ulBwp->srs_Config->choice.setup)
4915 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4919 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4924 ulBwp->beamFailureRecoveryConfig = NULLP;
4929 /*******************************************************************
4931 * @brief Builds Pusch Serving cell Config
4935 * Function : BuildPuschSrvCellCfg
4937 * Functionality: Builds Pusch Serving cell Config
4939 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4941 * @return ROK - success
4944 * ****************************************************************/
4945 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4947 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4948 puschCfg->choice.setup = NULLP;
4949 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4950 if(!puschCfg->choice.setup)
4952 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4956 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4957 puschCfg->choice.setup->rateMatching = NULLP;
4958 puschCfg->choice.setup->xOverhead = NULLP;
4959 puschCfg->choice.setup->ext1 = NULLP;
4960 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4961 if(!puschCfg->choice.setup->ext1)
4963 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4967 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4968 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4969 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4971 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4974 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4976 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4977 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4978 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4980 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4983 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4987 /*******************************************************************
4989 * @brief Builds UL config
4992 * Function : BuildUlCfg
4994 * Functionality: Builds UL config in spCellCfgDed
4996 * @params[in] UplinkConfig_t *ulCfg
4998 * @return ROK - success
5001 * ****************************************************************/
5002 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
5004 ulCfg->initialUplinkBWP = NULLP;
5005 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5006 if(!ulCfg->initialUplinkBWP)
5008 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5012 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
5017 ulCfg->uplinkBWP_ToReleaseList = NULLP;
5018 ulCfg->uplinkBWP_ToAddModList = NULLP;
5019 ulCfg->firstActiveUplinkBWP_Id = NULLP;
5020 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5021 if(!ulCfg->firstActiveUplinkBWP_Id)
5023 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5026 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5028 ulCfg->pusch_ServingCellConfig = NULLP;
5029 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
5030 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5031 if(!ulCfg->pusch_ServingCellConfig)
5033 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5037 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5042 ulCfg->carrierSwitching = NULLP;
5043 ulCfg->ext1 = NULLP;
5047 /*******************************************************************
5049 * @brief Builds PDSCH serving cell config
5052 * Function : BuildPdschSrvCellCfg
5054 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5056 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5058 * @return ROK - success
5061 * ****************************************************************/
5062 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5064 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5065 pdschCfg->choice.setup = NULLP;
5066 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5067 if(!pdschCfg->choice.setup)
5069 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5073 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5074 pdschCfg->choice.setup->xOverhead = NULLP;
5075 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5076 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5077 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5079 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5082 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5083 pdschCfg->choice.setup->pucch_Cell = NULLP;
5084 pdschCfg->choice.setup->ext1 = NULLP;
5089 /*******************************************************************
5091 * @brief Builds CSI Meas config
5094 * Function : BuildCsiMeasCfg
5096 * Functionality: Builds CSI Meas config in spCellCfgDed
5098 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5100 * @return ROK - success
5103 * ****************************************************************/
5104 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5110 /*******************************************************************
5112 * @brief Builds Spcell config dedicated
5115 * Function : BuildSpCellCfgDed
5117 * Functionality: Builds sp cell config dedicated in spCellCfg
5119 * @params[in] ServingCellConfig_t srvCellCfg
5121 * @return ROK - success
5124 * ****************************************************************/
5125 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5127 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5129 srvCellCfg->initialDownlinkBWP = NULLP;
5130 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5131 if(!srvCellCfg->initialDownlinkBWP)
5133 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5137 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5139 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5142 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5143 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5145 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5146 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5147 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5149 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5152 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5154 srvCellCfg->bwp_InactivityTimer = NULLP;
5156 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5157 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5158 if(!srvCellCfg->defaultDownlinkBWP_Id)
5160 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5163 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5165 srvCellCfg->uplinkConfig = NULLP;
5166 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5167 if(!srvCellCfg->uplinkConfig)
5169 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5173 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5175 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5178 srvCellCfg->supplementaryUplink = NULLP;
5179 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5181 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5182 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5183 if(!srvCellCfg->pdsch_ServingCellConfig)
5185 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5189 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5191 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5195 srvCellCfg->csi_MeasConfig = NULLP;
5197 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5198 if(!srvCellCfg->csi_MeasConfig)
5200 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5204 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5206 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5210 srvCellCfg->sCellDeactivationTimer = NULLP;
5211 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5212 srvCellCfg->tag_Id = TAG_ID;
5213 srvCellCfg->dummy = NULLP;
5214 srvCellCfg->pathlossReferenceLinking = NULLP;
5215 srvCellCfg->servingCellMO = NULLP;
5216 srvCellCfg->ext1 = NULLP;
5220 /*******************************************************************
5222 * @brief Builds Spcell config
5226 * Function : BuildSpCellCfg
5228 * Functionality: Builds sp cell config in DuToCuRrcContainer
5230 * @params[in] SpCellConfig_t spCellCfg
5232 * @return ROK - success
5235 * ****************************************************************/
5236 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5239 spCellCfg->servCellIndex = NULLP;
5240 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5241 if(!spCellCfg->servCellIndex)
5243 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5246 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5248 spCellCfg->reconfigurationWithSync = NULLP;
5249 spCellCfg->rlf_TimersAndConstants = NULLP;
5250 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5251 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5252 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5254 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5257 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5259 spCellCfg->spCellConfigDedicated = NULLP;
5260 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5261 if(!spCellCfg->spCellConfigDedicated)
5263 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5266 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5268 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5273 /*******************************************************************
5275 * @brief Builds Phy cell group config
5279 * Function : BuildPhyCellGrpCfg
5281 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5283 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5285 * @return ROK - success
5288 * ****************************************************************/
5289 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5291 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5292 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5294 phyCellGrpCfg->p_NR_FR1 = NULLP;
5295 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5296 if(!phyCellGrpCfg->p_NR_FR1)
5298 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5301 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5302 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5303 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5304 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5305 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5306 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5307 phyCellGrpCfg->cs_RNTI = NULLP;
5308 phyCellGrpCfg->ext1 = NULLP;
5309 phyCellGrpCfg->ext2 = NULLP;
5314 /*******************************************************************
5316 * @brief Builds tag config
5320 * Function : BuildTagConfig
5322 * Functionality: Builds tag config in MacCellGroupConfig
5324 * @params[in] TAG_Config *tag_Config
5326 * @return ROK - success
5329 * ****************************************************************/
5330 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5332 struct TAG_Config__tag_ToAddModList *tagList;
5333 uint8_t idx, elementCnt;
5335 tagConfig->tag_ToReleaseList = NULLP;
5336 tagConfig->tag_ToAddModList = NULLP;
5337 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5338 if(!tagConfig->tag_ToAddModList)
5340 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5344 elementCnt = 1; //ODU_VALUE_ONE;
5345 tagList = tagConfig->tag_ToAddModList;
5346 tagList->list.count = elementCnt;
5347 tagList->list.size = elementCnt * sizeof(struct TAG *);
5349 tagList->list.array = NULLP;
5350 CU_ALLOC(tagList->list.array, tagList->list.size);
5351 if(!tagList->list.array)
5353 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5357 for(idx=0; idx<tagList->list.count; idx++)
5359 tagList->list.array[idx] = NULLP;
5360 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5361 if(!tagList->list.array[idx])
5363 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5369 tagList->list.array[idx]->tag_Id = TAG_ID;
5370 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5375 /*******************************************************************
5377 * @brief Builds PHR Config
5381 * Function : BuildPhrConfig
5383 * Functionality: Builds phrConfig in MacCellGroupConfig
5385 * @params[in] PHR Config *
5387 * @return ROK - success
5390 * ****************************************************************/
5391 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5394 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5395 phrConfig->choice.setup = NULLP;
5396 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5397 if(!phrConfig->choice.setup)
5399 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5403 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5404 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5405 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5406 phrConfig->choice.setup->multiplePHR = false;
5407 phrConfig->choice.setup->dummy = false;
5408 phrConfig->choice.setup->phr_Type2OtherCell = false;
5409 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5414 /*******************************************************************
5416 * @brief Builds BSR Config
5420 * Function : BuildBsrConfig
5422 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5424 * @params[in] BSR_Config *bsrConfig
5426 * @return ROK - success
5429 * ****************************************************************/
5430 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5432 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5433 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5434 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5439 /*******************************************************************
5441 * @brief Builds scheduling request config
5445 * Function : BuildSchedulingReqConfig
5447 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5449 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5451 * @return ROK - success
5454 * ****************************************************************/
5455 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5457 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5458 uint8_t idx, elementCnt;
5460 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5461 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5462 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5463 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5465 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5469 elementCnt = 1; //ODU_VALUE_ONE;
5470 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5471 schReqList->list.count = elementCnt;
5472 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5474 schReqList->list.array = NULLP;
5475 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5476 if(!schReqList->list.array)
5478 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5482 for(idx=0;idx<schReqList->list.count; idx++)
5484 schReqList->list.array[idx] = NULLP;
5485 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5486 if(!schReqList->list.array[idx])
5488 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5494 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5496 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5497 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5498 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5500 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5503 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5504 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5505 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5509 /*******************************************************************
5511 * @brief Builds Mac cell group config
5515 * Function : BuildMacCellGrpCfg
5517 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5519 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5521 * @return ROK - success
5524 * ****************************************************************/
5525 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5527 macCellGrpCfg->drx_ConfigRrc = NULLP;
5528 macCellGrpCfg->schedulingRequestConfig = NULLP;
5529 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5530 if(!macCellGrpCfg->schedulingRequestConfig)
5532 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5536 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5538 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5542 macCellGrpCfg->bsr_Config = NULLP;
5543 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5544 if(!macCellGrpCfg->bsr_Config)
5546 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5550 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5552 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5556 macCellGrpCfg->tag_Config = NULLP;
5557 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5558 if(!macCellGrpCfg->tag_Config)
5560 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5564 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5566 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5570 macCellGrpCfg->phr_Config = NULLP;
5571 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5572 if(!macCellGrpCfg->phr_Config)
5574 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5578 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5580 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5584 macCellGrpCfg->skipUplinkTxDynamic = false;
5585 macCellGrpCfg->ext1 = NULLP;
5589 /*******************************************************************
5591 * @brief Frees memeory allocated for SearchSpcToAddModList
5595 * Function : FreeSearchSpcToAddModList
5597 * Functionality: Deallocating memory of SearchSpcToAddModList
5599 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5603 4221 * ****************************************************************/
5604 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5608 struct SearchSpace *searchSpc=NULLP;
5610 if(searchSpcList->list.array)
5612 if(searchSpcList->list.array[idx2])
5614 searchSpc = searchSpcList->list.array[idx2];
5615 if(searchSpc->controlResourceSetId)
5617 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5619 if(searchSpc->monitoringSymbolsWithinSlot)
5621 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5623 if(searchSpc->nrofCandidates)
5625 if(searchSpc->searchSpaceType)
5627 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5628 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5629 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5630 SearchSpace__searchSpaceType));
5632 CU_FREE(searchSpc->nrofCandidates,
5633 sizeof(struct SearchSpace__nrofCandidates));
5635 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5636 searchSpc->monitoringSymbolsWithinSlot->size);
5638 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5639 sizeof(BIT_STRING_t));
5641 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5642 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5644 CU_FREE(searchSpc->controlResourceSetId,
5645 sizeof(ControlResourceSetId_t));
5648 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5650 CU_FREE(searchSpcList->list.array[idx1],
5651 sizeof(struct SearchSpace));
5653 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5656 /*******************************************************************
5658 * @brief Frees memory allocated for PdschTimeDomAllocList
5662 * Function : FreePdschTimeDomAllocList
5664 * Functionality: Deallocating memory of PdschTimeDomAllocList
5666 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5670 4221 * ****************************************************************/
5671 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5675 if(timeDomAllocList->choice.setup)
5677 if(timeDomAllocList->choice.setup->list.array)
5679 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5681 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5682 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5684 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5685 timeDomAllocList->choice.setup->list.size);
5687 CU_FREE(timeDomAllocList->choice.setup,\
5688 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5691 /*******************************************************************
5693 * @brief Frees memory allocated for PuschTimeDomAllocList
5697 * Function : FreePuschTimeDomAllocList
5699 * Functionality: Deallocating memory of PuschTimeDomAllocList
5701 * @params[in] PUSCH_Config_t *puschCfg
5705 ***********************************************************************/
5706 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5710 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5712 if(puschCfg->pusch_TimeDomainAllocationList)
5714 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5715 if(timeDomAllocList_t->choice.setup)
5717 if(timeDomAllocList_t->choice.setup->list.array)
5719 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5720 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5722 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5723 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5725 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5726 timeDomAllocList_t->choice.setup->list.size);
5728 CU_FREE(timeDomAllocList_t->choice.setup, \
5729 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5731 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5732 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5733 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5738 /*******************************************************************
5740 * @brief Frees memory allocated for Dedicated PUCCH config
5744 * Function : FreeBWPUlDedPucchCfg
5746 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5748 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5752 * ****************************************************************/
5753 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5755 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5756 PUCCH_Config_t *pucchCfg = NULLP;
5757 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5758 PUCCH_Resource_t *rsrc = NULLP;
5762 if(ulBwpPucchCfg->choice.setup)
5764 pucchCfg = ulBwpPucchCfg->choice.setup;
5766 //Free resource set list
5767 if(pucchCfg->resourceSetToAddModList)
5769 if(pucchCfg->resourceSetToAddModList->list.array)
5771 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5773 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5774 if(rsrcSet->resourceList.list.array)
5776 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5778 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5780 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5782 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5784 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5786 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5789 //Free resource list
5790 if(pucchCfg->resourceToAddModList)
5792 if(pucchCfg->resourceToAddModList->list.array)
5794 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5796 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5797 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5798 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5800 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5802 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5806 if(pucchCfg->format1)
5808 if(pucchCfg->format1->choice.setup)
5810 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5811 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5813 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5817 if(pucchCfg->dl_DataToUL_ACK)
5819 if(pucchCfg->dl_DataToUL_ACK->list.array)
5821 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5823 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5825 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5827 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5830 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5832 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5836 /*******************************************************************
5838 * @brief Frees memory allocated for InitialUlBWP
5842 * Function : FreeInitialUlBWP
5844 * Functionality: Deallocating memory of InitialUlBWP
5846 * @params[in] BWP_UplinkDedicated_t *ulBwp
5850 * ****************************************************************/
5851 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5853 uint8_t rSetIdx, rsrcIdx;
5854 SRS_Config_t *srsCfg = NULLP;
5855 PUSCH_Config_t *puschCfg = NULLP;
5856 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5857 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5858 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5859 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5861 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5863 if(ulBwp->pusch_Config)
5865 if(ulBwp->pusch_Config->choice.setup)
5867 puschCfg=ulBwp->pusch_Config->choice.setup;
5868 if(puschCfg->dataScramblingIdentityPUSCH)
5870 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5872 FreePuschTimeDomAllocList(puschCfg);
5873 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5874 if(dmrsUlCfg->choice.setup)
5876 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5878 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5880 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5882 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5883 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5885 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5888 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5890 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5891 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5893 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5895 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5897 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5899 /* Free SRS-Config */
5900 if(ulBwp->srs_Config)
5902 if(ulBwp->srs_Config->choice.setup)
5904 srsCfg = ulBwp->srs_Config->choice.setup;
5906 /* Free Resource Set to add/mod list */
5907 if(srsCfg->srs_ResourceSetToAddModList)
5909 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5910 if(rsrcSetList->list.array)
5914 /* Free SRS resource Id list in this SRS resource set */
5915 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5917 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5919 if(rsrcIdList->list.array)
5921 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5923 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5925 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5927 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5928 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5931 /* Free resource type info for this SRS resource set */
5932 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5933 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5935 /* Free memory for each resource set */
5936 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5938 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5940 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5942 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5943 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5946 /* Free resource to add/modd list */
5947 if(srsCfg->srs_ResourceToAddModList)
5949 resourceList = srsCfg->srs_ResourceToAddModList;
5950 if(resourceList->list.array)
5953 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5954 sizeof(struct SRS_Resource__transmissionComb__n2));
5955 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5956 sizeof(struct SRS_Resource__resourceType__aperiodic));
5958 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5960 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5962 CU_FREE(resourceList->list.array, resourceList->list.size);
5964 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5965 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5968 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5970 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5974 /*******************************************************************
5976 * @brief Frees memory allocated for initialUplinkBWP
5980 * Function : FreeinitialUplinkBWP
5982 * Functionality: Deallocating memory of initialUplinkBWP
5984 * @params[in] UplinkConfig_t *ulCfg
5989 * ****************************************************************/
5990 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5992 BWP_UplinkDedicated_t *ulBwp=NULLP;
5993 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5995 if(ulCfg->initialUplinkBWP)
5997 ulBwp=ulCfg->initialUplinkBWP;
5998 if(ulCfg->firstActiveUplinkBWP_Id)
6000 if(ulCfg->pusch_ServingCellConfig)
6002 puschCfg=ulCfg->pusch_ServingCellConfig;
6003 if(puschCfg->choice.setup)
6005 if(puschCfg->choice.setup->ext1)
6007 CU_FREE(puschCfg->choice.setup->ext1->\
6008 processingType2Enabled,sizeof(BOOLEAN_t));
6009 CU_FREE(puschCfg->choice.setup->ext1->\
6010 maxMIMO_Layers,sizeof(long));
6011 CU_FREE(puschCfg->choice.setup->ext1, \
6012 sizeof(struct PUSCH_ServingCellConfig__ext1));
6014 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
6016 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
6018 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
6020 FreeInitialUlBWP(ulBwp);
6021 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6024 /*******************************************************************
6026 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6030 * Function : FreeBWPDlDedPdschCfg
6032 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6034 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6039 * ****************************************************************/
6040 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6042 struct PDSCH_Config *pdschCfg=NULLP;
6043 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6044 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6045 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6047 if(dlBwp->pdsch_Config->choice.setup)
6049 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6050 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6052 if(pdschCfg->pdsch_TimeDomainAllocationList)
6054 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6055 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6057 prbBndlType=&pdschCfg->prb_BundlingType;
6058 CU_FREE(prbBndlType->choice.staticBundling,\
6059 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6060 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6062 FreePdschTimeDomAllocList(timeDomAllocList);
6063 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6064 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6066 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6067 if(dmrsDlCfg->choice.setup)
6069 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6071 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6073 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6074 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6076 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6079 /*******************************************************************
6081 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6085 * Function : FreeBWPDlDedPdcchCfg
6087 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6089 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6094 * ****************************************************************/
6095 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6099 struct PDCCH_Config *pdcchCfg=NULLP;
6100 struct ControlResourceSet *controlRSet=NULLP;
6101 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6103 if(dlBwp->pdcch_Config->choice.setup)
6105 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6106 if(pdcchCfg->controlResourceSetToAddModList)
6108 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6109 if(controlRSetList->list.array)
6111 controlRSet = controlRSetList->list.array[idx2];
6114 if(controlRSet->frequencyDomainResources.buf)
6116 if(controlRSet->pdcch_DMRS_ScramblingID)
6118 if(pdcchCfg->searchSpacesToAddModList)
6120 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6121 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6122 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6124 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6126 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6127 controlRSet->frequencyDomainResources.size);
6130 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6132 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6134 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6136 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6137 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6139 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6142 /*******************************************************************
6144 * @brief Builds RLC Config
6148 * Function : BuildRlcConfig
6150 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6152 * @params[in] RLC_Config *rlcConfig
6154 * @return ROK - success
6157 * ****************************************************************/
6158 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6160 rlcConfig->present = rlcLcCfgDb.rlcMode;
6162 switch(rlcConfig->present)
6164 case RLC_Config_PR_am:
6166 rlcConfig->choice.am = NULLP;
6167 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6168 if(!rlcConfig->choice.am)
6170 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6175 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6176 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6177 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6179 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6182 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6183 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6184 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6185 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6186 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6189 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6190 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6191 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6193 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6196 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6197 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6198 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6203 case RLC_Config_PR_um_Bi_Directional:
6205 rlcConfig->choice.um_Bi_Directional = NULLP;
6206 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6207 if(!rlcConfig->choice.um_Bi_Directional)
6209 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6214 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6215 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6216 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6218 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6221 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6224 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6225 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6226 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6228 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6231 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6232 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6239 /*******************************************************************
6241 * @brief Builds MAC LC Config
6245 * Function : BuildMacLCConfig
6247 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6249 * @params[in] struct LogicalChannelConfig macLcConfig
6251 * @return ROK - success
6254 * ****************************************************************/
6255 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6258 macLcConfig->ul_SpecificParameters = NULLP;
6259 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6260 if(!macLcConfig->ul_SpecificParameters)
6262 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6266 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6267 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6268 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6269 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6270 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6271 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6272 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6274 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6275 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6276 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6278 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6281 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6283 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6284 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6285 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6287 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6290 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6292 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6293 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6294 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6298 /*******************************************************************
6300 * @brief Builds RLC Bearer to Add/Mod list
6304 * Function :BuildRlcBearerToAddModList
6306 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6308 * @params[in] rlc_BearerToAddModList
6310 * @return ROK - success
6313 * ****************************************************************/
6314 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6316 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6319 elementCnt = ueCb->numSrb + ueCb->numDrb;
6322 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6324 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6328 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6330 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6337 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6340 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6343 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6346 rlcBearerList->list.count = elementCnt;
6347 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6349 rlcBearerList->list.array = NULLP;
6350 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6351 if(!rlcBearerList->list.array)
6353 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6357 for(idx=0; idx<rlcBearerList->list.count; idx++)
6359 rlcBearerList->list.array[idx] = NULLP;
6360 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6361 if(!rlcBearerList->list.array[idx])
6363 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6370 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6372 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6375 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6377 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6378 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6380 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6384 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6385 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6387 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6388 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6389 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6390 if(!rlcBearerList->list.array[idx]->rlc_Config)
6392 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6396 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6398 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6402 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6403 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6404 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6406 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6410 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6412 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6418 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6420 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6423 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6425 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6426 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6428 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6432 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6433 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6435 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6436 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6437 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6438 if(!rlcBearerList->list.array[idx]->rlc_Config)
6440 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6444 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6446 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6450 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6451 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6452 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6454 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6458 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6460 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6468 /*******************************************************************
6470 * @brief Free memory allocated for CellGroupConfig
6474 * Function : FreeMemCellGrpCfg
6476 * Functionality: Deallocating memory of CellGroupConfig
6478 * @params[in] pointer to CellGroupConfigRrc_t
6480 * @return ROK - success
6483 ******************************************************************/
6484 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6487 SpCellConfig_t *spCellCfg=NULLP;
6488 ServingCellConfig_t *srvCellCfg=NULLP;
6489 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6490 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6491 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6492 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6493 struct RLC_Config *rlcConfig=NULLP;
6494 struct LogicalChannelConfig *macLcConfig=NULLP;
6495 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6496 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6497 struct TAG_Config *tagConfig=NULLP;
6498 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6499 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6500 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6502 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6505 if(rlcBearerList->list.array)
6507 for(idx=0; idx<rlcBearerList->list.count; idx++)
6509 if(rlcBearerList->list.array[idx])
6511 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6512 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6515 if(rlcConfig->choice.am)
6517 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6518 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6519 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6521 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6523 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6526 if(macLcConfig->ul_SpecificParameters)
6528 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6529 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6530 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6532 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6534 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6537 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6539 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6542 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6545 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6546 if(schedulingRequestConfig)
6548 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6551 if(schReqList->list.array)
6553 for(idx=0;idx<schReqList->list.count; idx++)
6555 if(schReqList->list.array[idx])
6557 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6558 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6561 CU_FREE(schReqList->list.array, schReqList->list.size);
6563 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6564 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6565 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6567 if(macCellGrpCfg->bsr_Config)
6569 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6571 tagConfig = macCellGrpCfg->tag_Config;
6574 tagList = tagConfig->tag_ToAddModList;
6577 if(tagList->list.array)
6579 for(idx=0; idx<tagList->list.count; idx++)
6581 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6583 CU_FREE(tagList->list.array, tagList->list.size);
6585 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6587 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6590 phrConfig = macCellGrpCfg->phr_Config;
6593 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6594 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6597 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6600 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6603 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6604 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6607 spCellCfg = cellGrpCfg->spCellConfig;
6610 if(spCellCfg->servCellIndex)
6612 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6614 if(spCellCfg->spCellConfigDedicated)
6616 srvCellCfg = spCellCfg->spCellConfigDedicated;
6617 if(srvCellCfg->initialDownlinkBWP)
6619 dlBwp = srvCellCfg->initialDownlinkBWP;
6620 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6622 if(srvCellCfg->defaultDownlinkBWP_Id)
6624 if(srvCellCfg->uplinkConfig)
6626 if(srvCellCfg->pdsch_ServingCellConfig)
6628 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6629 if(pdschCfg->choice.setup)
6631 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6632 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6634 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6635 ServingCellConfig__pdsch_ServingCellConfig));
6637 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6638 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6640 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6642 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6644 if(dlBwp->pdcch_Config)
6646 if(dlBwp->pdsch_Config)
6648 FreeBWPDlDedPdschCfg(dlBwp);
6649 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6651 FreeBWPDlDedPdcchCfg(dlBwp);
6652 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6654 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6656 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6658 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6660 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6662 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6667 /*******************************************************************
6669 * @brief Fills CellGroupConfig
6673 * Function : fillCellGrpCfg
6675 * Functionality: Fills CellGroupConfig
6677 * @params[in] pointer to CellGroupConfigRrc_t
6679 * @return ROK - success
6682 ******************************************************************/
6684 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6686 uint8_t ret = RFAILED;
6687 CellGroupConfigRrc_t cellGrpCfg;
6688 asn_enc_rval_t encRetVal;
6692 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6694 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6696 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6698 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6702 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6703 cellGrpCfg.mac_CellGroupConfig = NULLP;
6704 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6705 if(!cellGrpCfg.mac_CellGroupConfig)
6707 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6710 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6712 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6716 cellGrpCfg.physicalCellGroupConfig = NULLP;
6717 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6718 if(!cellGrpCfg.physicalCellGroupConfig)
6720 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6723 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6725 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6729 cellGrpCfg.spCellConfig = NULLP;
6730 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6731 if(!cellGrpCfg.spCellConfig)
6733 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6736 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6738 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6742 cellGrpCfg.sCellToAddModList = NULLP;
6743 cellGrpCfg.sCellToReleaseList = NULLP;
6744 cellGrpCfg.ext1 = NULLP;
6746 /* encode cellGrpCfg into duToCuRrcContainer */
6747 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6748 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6750 encRetVal = uper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6751 /* Encode results */
6752 if(encRetVal.encoded == ENCODE_FAIL)
6754 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6755 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6760 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6761 for(int i=0; i< encBufSize; i++)
6763 DU_LOG("%x",encBuf[i]);
6767 cellGrp->size = encBufSize;
6768 CU_ALLOC(cellGrp->buf, cellGrp->size);
6771 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6774 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6778 FreeMemCellGrpCfg(&cellGrpCfg);
6782 /*******************************************************************
6784 * @brief Free UE Capability RAT container
6788 * Function : freeUeCapRatCont
6791 * Free UE Capability RAT conatiner
6794 * @return ROK - success
6797 * ****************************************************************/
6798 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6801 FeatureSets_t *featureSets;
6803 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6805 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6807 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6808 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6810 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6813 if(ueNrCap->featureSets)
6815 featureSets = ueNrCap->featureSets;
6816 if(featureSets->featureSetsDownlinkPerCC)
6818 if(featureSets->featureSetsDownlinkPerCC->list.array)
6820 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6822 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6823 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6824 sizeof(ModulationOrder_t));
6825 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6827 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6829 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6832 if(featureSets->featureSetsUplinkPerCC)
6834 if(featureSets->featureSetsUplinkPerCC->list.array)
6836 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6838 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6840 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6841 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6842 sizeof(ModulationOrder_t));
6843 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6846 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6848 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6850 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6854 /*******************************************************************
6856 * @brief Free UE capability RAT container list
6860 * Function : freeUeCapRatContList
6862 * Functionality: Free UE capability RAT container list
6865 * @return ROK - success
6868 * ****************************************************************/
6869 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6872 if(ueCapablityList->list.array)
6874 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6876 if(ueCapablityList->list.array[idx])
6877 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6879 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6883 /*******************************************************************
6885 * @brief Free Handover preparation information
6889 * Function : freeHOPreparationInfo
6891 * Functionality: Free Handover preparation information
6894 * @return ROK - success
6897 * ****************************************************************/
6898 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6900 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6902 if(hoPrep->criticalExtensions.choice.c1)
6904 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6906 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6907 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6908 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6909 sizeof(HandoverPreparationInformationRrc_IEs_t));
6911 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6915 /*******************************************************************
6917 * @brief Fill feature sets
6921 * Function : fillFeatureSets
6923 * Functionality: Fill feature sets
6926 * @return ROK - success
6929 * ****************************************************************/
6930 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6932 uint8_t idx, elementCnt;
6934 featureSets->featureSetsDownlink = NULLP;
6935 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6936 if(!featureSets->featureSetsDownlinkPerCC)
6938 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6943 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6944 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6945 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6946 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6948 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6952 for(idx = 0; idx < elementCnt; idx++)
6954 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6955 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6957 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6963 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6964 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6965 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6966 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6967 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6969 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6970 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6972 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6975 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6977 featureSets->featureSetsUplink = NULLP;
6978 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6979 if(!featureSets->featureSetsUplinkPerCC)
6981 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6986 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6987 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6988 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6989 if(!featureSets->featureSetsUplinkPerCC->list.array)
6991 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6995 for(idx = 0; idx < elementCnt; idx++)
6997 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6998 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
7000 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7006 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
7007 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
7008 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
7009 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
7010 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
7011 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
7013 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
7014 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
7016 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7019 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
7024 /*******************************************************************
7026 * @brief Fill UE capability RAT container
7030 * Function : fillUeCapRatCont
7032 * Functionality: Fill UE capability RAT container
7034 * @params[in] UE Capability RAT container buffer
7035 * @return ROK - success
7038 * ****************************************************************/
7039 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
7042 uint8_t idx, elementCnt;
7043 asn_enc_rval_t encRetVal;
7044 UE_NR_Capability_t ueNrCap;
7048 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7050 /* Filling PDCP parameters */
7051 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7052 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7053 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7054 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7055 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7056 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7057 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7058 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7059 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7060 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7061 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7062 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7063 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7064 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7065 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7066 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7067 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7069 ueNrCap.rlc_Parameters = NULLP;
7070 ueNrCap.mac_Parameters = NULLP;
7072 /* Filling PHY parameters */
7073 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7074 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7075 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7076 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7077 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7079 /* Filling RF parameters */
7081 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7082 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7083 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7084 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7086 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7091 for(idx = 0; idx < elementCnt; idx++)
7093 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7094 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7104 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7105 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7106 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7108 ueNrCap.measAndMobParameters = NULLP;
7109 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7110 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7111 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7112 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7113 ueNrCap.featureSets = NULLP;
7115 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7116 if(!ueNrCap.featureSets)
7118 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7123 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7125 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7130 ueNrCap.featureSetCombinations = NULLP;
7131 ueNrCap.lateNonCriticalExtension = NULLP;
7132 ueNrCap.nonCriticalExtension = NULLP;
7134 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7135 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7136 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7138 encRetVal = uper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7140 /* Encode results */
7141 if(encRetVal.encoded == ENCODE_FAIL)
7143 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7144 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7149 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7150 for(int i=0; i< encBufSize; i++)
7152 DU_LOG("%x",encBuf[i]);
7156 ueCapRatContBuf->size = encBufSize;
7157 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7158 if(!ueCapRatContBuf->buf)
7160 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7163 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7167 freeUeCapRatCont(&ueNrCap);
7171 /*******************************************************************
7173 * @brief Fill UE Capability RAT container list
7177 * Function : fillUeCapRatContList
7179 * Functionality: Fill UE Capability RAT container list
7182 * @params[in] UE capability RAT container list
7183 * @return ROK - success
7186 * ****************************************************************/
7187 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7189 uint8_t ret = RFAILED;
7190 uint8_t idx, elementCnt;
7195 ueCapablityList->list.count = elementCnt;
7196 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7198 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7199 if(!ueCapablityList->list.array)
7201 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7206 for(idx=0; idx<elementCnt; idx++)
7208 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7209 if(ueCapablityList->list.array[idx] == NULLP)
7211 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7217 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7218 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7220 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7231 /*******************************************************************
7233 * @brief Fill UE Capability RAT container list octet string
7237 * Function : fillUeCapRatContListBuf
7239 * Functionality: Fill UE Capability RAT container list octet string
7242 * @params[in] UE capability RAT container list buffer
7243 * @return ROK - success
7246 * ****************************************************************/
7247 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7249 uint8_t ret = RFAILED;
7250 asn_enc_rval_t encRetVal;
7251 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7255 ret = fillUeCapRatContList(&ueCapablityList);
7258 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7262 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7263 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7264 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7266 encRetVal = uper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7267 &ueCapablityList, PrepFinalEncBuf, encBuf);
7269 /* Encode results */
7270 if(encRetVal.encoded == ENCODE_FAIL)
7272 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7273 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7278 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7279 for(int i=0; i< encBufSize; i++)
7281 DU_LOG("%x",encBuf[i]);
7285 ueCapablityListBuf->size = encBufSize;
7286 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7287 if(!ueCapablityListBuf->buf)
7289 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7292 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7296 freeUeCapRatContList(&ueCapablityList);
7300 /*******************************************************************
7302 * @brief Free Measurement Timing Configuration
7306 * Function : freeMeasuementTimingConfig
7308 * Functionality: Free Measurement Timing Configuration
7310 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7313 * ****************************************************************/
7314 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7317 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7318 MeasTiming_t *measTiming = NULLP;
7320 if(measTimingConfig.criticalExtensions.choice.c1)
7322 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7324 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7325 if(measTimingCfg->measTiming)
7327 if(measTimingCfg->measTiming->list.array)
7329 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7331 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7332 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7333 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7335 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7337 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7339 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7341 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7345 /*******************************************************************
7347 * @brief Fill Measurement Timing Configuration
7351 * Function : fillMeasTimingCfg
7353 * Functionality: Fill Measurement Timing Configuration
7355 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7356 * @return ROK - success
7359 * ****************************************************************/
7360 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7362 uint8_t elementCnt = 0;
7363 uint8_t measCfgIdx = 0;
7364 MeasTiming_t *measTiming;
7367 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7368 if(!measTimingCfg->measTiming)
7370 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7375 measTimingCfg->measTiming->list.count = elementCnt;
7376 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7377 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7378 if(!measTimingCfg->measTiming->list.array)
7380 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7384 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7386 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7387 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7389 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7395 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7396 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7397 if(!measTiming->frequencyAndTiming)
7399 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7403 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7404 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7406 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7407 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7408 smtc->periodicityAndOffset.choice.sf20 = 0;
7409 smtc->duration = SSB_MTC__duration_sf1;
7413 /*******************************************************************
7415 * @brief Fill Measurement Timing Configuration Octet string
7419 * Function : fillMeasConfigBuf
7421 * Functionality: Fill Measurement Timing Configuration Octet string
7424 * @params[in] MeasConfig_t *measConfgBuf
7425 * @return ROK - success
7428 * ****************************************************************/
7429 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7431 uint8_t ret = RFAILED;
7432 asn_enc_rval_t encRetVal;
7433 MeasurementTimingConfigurationRrc_t measTimingConfig;
7437 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7438 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7439 if(!measTimingConfig.criticalExtensions.choice.c1)
7441 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7444 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7446 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7447 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7449 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7453 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7456 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7460 /* Encode measurement timing configuration into octet string */
7461 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7462 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7464 encRetVal = uper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7466 /* Encode results */
7467 if(encRetVal.encoded == ENCODE_FAIL)
7469 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7470 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7475 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7476 for(int i=0; i< encBufSize; i++)
7478 DU_LOG("%x",encBuf[i]);
7482 measTimingConfigBuf->size = encBufSize;
7483 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7484 if(!measTimingConfigBuf->buf)
7486 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7489 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7493 freeMeasuementTimingConfig(measTimingConfig);
7497 /******************************************************************
7499 * @brief Free RRC reconfiguration non-critical extension
7503 * Function : freeRrcReconfigNonCriticalExt
7505 * Functionality: Free RRC reconfiguration non-critical extension
7507 * @params[in] RRC reconfiguration IE
7510 * ****************************************************************/
7511 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7513 if(rrcRecfg->masterCellGroup)
7515 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7519 /******************************************************************
7521 * @brief Free measurement object addmod list
7525 * Function : freeMeasObjToAddModList
7527 * Functionality: Free measurement object add mod list
7529 * @params[in] Measurement object add/mod list
7532 * ****************************************************************/
7533 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7536 MeasObjectNR_t *measObject;
7538 if(measObjList->list.array)
7540 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7542 if(measObjList->list.array[objIdx])
7544 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7546 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7547 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7548 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7549 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7550 if(measObject->absThreshSS_BlocksConsolidation)
7552 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7553 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7554 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7555 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7557 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7558 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7559 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7560 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7561 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7563 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7566 CU_FREE(measObjList->list.array, measObjList->list.size);
7570 /******************************************************************
7572 * @brief Free report config add mod list
7576 * Function : freeReportCfgToAddModList
7578 * Functionality: Free report config add mod list
7580 * @params[in] Report config list
7583 * ****************************************************************/
7584 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7586 uint8_t reportCfgIdx;
7587 ReportConfigToAddMod_t *reportCfg;
7588 ReportConfigNR_t *reportCfgNr;
7589 EventTriggerConfig_t *eventTriggCfg;
7591 if(reportCfgList->list.array)
7593 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7595 if(reportCfgList->list.array[reportCfgIdx])
7597 reportCfg = reportCfgList->list.array[reportCfgIdx];
7598 if(reportCfg->reportConfig.choice.reportConfigNR)
7600 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7601 if(reportCfgNr->reportType.choice.eventTriggered)
7603 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7604 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7605 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7606 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7607 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7611 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7613 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7617 /******************************************************************
7619 * @brief Free measurement id to add mod list
7623 * Function : freeMeasIdToAddModList
7625 * Functionality: Free measurement id to add mod list
7627 * @params[in] Measurement id to add mod list
7630 * ****************************************************************/
7631 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7634 if(measIdList->list.array)
7636 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7638 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7640 CU_FREE(measIdList->list.array, measIdList->list.size);
7644 /*******************************************************************
7646 * @brief Free quantity config
7650 * Function : freeQunatityConfig
7652 * Functionality: Free quantity config
7654 * @params[in] Quantity Config
7657 * ****************************************************************/
7658 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7661 QuantityConfigNR_t *quantityCfgNr;
7663 if(quantityCfg->quantityConfigNR_List)
7665 if(quantityCfg->quantityConfigNR_List->list.array)
7667 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7669 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7671 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7672 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7673 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7674 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7675 if(quantityCfgNr->quantityConfigRS_Index)
7677 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7678 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7679 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7680 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7682 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7685 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7687 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7691 /******************************************************************
7693 * @brief Free measurement Config
7697 * Function : freeMeasConfig
7699 * Functionality: Free measurement config
7701 * @params[in] Measurement config
7704 * ****************************************************************/
7705 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7707 if(measConfig->measObjectToAddModList)
7709 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7710 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7712 if(measConfig->reportConfigToAddModList)
7714 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7715 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7717 if(measConfig->measIdToAddModList)
7719 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7720 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7722 if(measConfig->s_MeasureConfig)
7724 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7726 if(measConfig->quantityConfig)
7728 freeQuantityConfig(measConfig->quantityConfig);
7729 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7732 /******************************************************************
7734 * @brief Free DRB to AddMod List
7738 * Function : freeDrbToAddModList
7740 * Functionality: Free SRB to AddMod List
7742 * @params[in] SBR to add/mod list
7745 * ****************************************************************/
7746 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7749 if(drbToAddList->list.array)
7751 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7753 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7755 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7757 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7758 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7759 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7760 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7762 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7763 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7765 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7767 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7771 /******************************************************************
7773 * @brief Free SRB to AddMod List
7777 * Function : freeSrbToAddModList
7779 * Functionality: Free SRB to AddMod List
7781 * @params[in] SBR to add/mod list
7784 * ****************************************************************/
7785 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7788 if(srbToAddList->list.array)
7790 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7792 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7793 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7795 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7796 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7799 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7801 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7805 /******************************************************************
7807 * @brief Free Radio Bearer Config
7811 * Function : freeRadioBearerConfig
7813 * Functionality: Free Radio Bearer config
7815 * @params[in] Radio bearer config
7818 * ****************************************************************/
7819 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7821 if(radioBearerConfig->srb_ToAddModList)
7823 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7824 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7826 if(radioBearerConfig->drb_ToAddModList)
7828 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7829 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7833 /******************************************************************
7835 * @brief Free reconfiguration message
7839 * Function : freeRrcReconfig
7841 * Functionality: Free reconfiguration message
7843 * @params[in] RRC Reconfiguration message
7846 * ****************************************************************/
7847 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7849 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7851 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7853 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7854 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7856 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7858 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7859 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7861 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7863 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7864 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7866 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7870 /******************************************************************
7872 * @brief Fill SRB To Add Mod list
7876 * Function : fillSrbToAddModList
7878 * Functionality: fill SRB to Add Mod list
7880 * @params[in] UE control block
7881 * SRB to Add/Mod list
7882 * @return ROK - success
7885 * ****************************************************************/
7886 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7888 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7891 elementCnt = ueCb->numSrb;
7894 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7896 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7903 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7907 srbToAddList->list.count = elementCnt;
7908 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7910 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7911 if(!srbToAddList->list.array)
7913 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7918 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7920 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7923 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7924 if(!srbToAddList->list.array[srbIdx])
7926 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7930 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7932 /* Reestablish PDCP */
7933 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7934 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7936 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7939 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7941 /* PDCP configuration */
7942 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7943 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7945 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7949 /* Reordering timer */
7950 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7951 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7953 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7956 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7963 /******************************************************************
7965 * @biief Fill DRBeTo Add Mod list
7969 * Function : fillDrbToAddModList
7971 * Functionality: fill DRB to Add Mod list
7973 * @params[in] UE control block
7974 * DRB to Add/Mod list
7975 * @return ROK - success
7978 * ****************************************************************/
7979 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7981 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7984 elementCnt = ueCb->numDrb;
7987 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7989 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7996 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
8001 drbToAddList->list.count = elementCnt;
8002 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
8004 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
8005 if(!drbToAddList->list.array)
8007 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
8012 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8014 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
8017 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
8018 if(!drbToAddList->list.array[drbIdx])
8020 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
8025 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
8028 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
8029 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
8031 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
8035 /* PDCP Config -> DRB */
8036 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
8037 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
8039 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8043 /* DRB -> Discard Timer */
8044 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8045 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8047 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8050 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8052 /* UL PDCP SN length */
8053 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8054 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8056 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8059 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8061 /* DL PDCP SN length */
8062 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8063 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8065 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8068 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8070 /* Header Compression */
8071 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8072 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8074 /* Reordering timer */
8075 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8076 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8078 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8081 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8089 /******************************************************************
8091 * @brief Fill Radio bearer configuration
8095 * Function : fillRadioBearerConfig
8097 * Functionality: Fill Radio bearer configuration
8099 * @params[in] UE control block
8100 * Radio bearer config pointer
8101 * @return ROK - success
8104 * ****************************************************************/
8105 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8107 /* SRB To Add/Mod List */
8108 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8109 if(!radioBearerConfig->srb_ToAddModList)
8111 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8114 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8116 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8120 /* DRB To Add/Mod List */
8121 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8122 if(!radioBearerConfig->drb_ToAddModList)
8124 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8127 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8129 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8136 /*******************************************************************
8138 * @brief Fill measurement object to add/mod list
8142 * Function : fillMeasObjToAddModList
8144 * Functionality: Fill measurement object to add/mod list
8146 * @params[in] Measurement object to add/mod list
8147 * @return ROK - success
8150 * ****************************************************************/
8151 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8153 uint8_t elementCnt, objIdx;
8154 MeasObjectNR_t *measObject;
8157 measObjList->list.count = elementCnt;
8158 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8160 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8161 if(!measObjList->list.array)
8163 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8167 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8169 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8170 if(!measObjList->list.array[objIdx])
8172 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8178 measObjList->list.array[objIdx]->measObjectId = 1;
8179 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8180 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8181 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8183 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8187 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8190 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8191 if(!measObject->ssbFrequency)
8193 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8196 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8198 /* Subcarrier spacing */
8199 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8200 if(!measObject->ssbSubcarrierSpacing)
8202 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8205 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8208 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8209 if(!measObject->smtc1)
8211 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8214 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8215 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8216 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8218 /* Absoulute threshold SSB consolidation */
8219 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8220 if(!measObject->absThreshSS_BlocksConsolidation)
8222 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8226 /* RSRP threshold */
8227 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8228 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8230 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8233 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8235 /* RSRQ threshold */
8236 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8237 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8239 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8242 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8244 /* SINR threshold */
8245 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8246 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8248 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8251 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8253 /* Number of SSBs to average */
8254 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8255 if(!measObject->nrofSS_BlocksToAverage)
8257 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8260 *(measObject->nrofSS_BlocksToAverage) = 2;
8262 /* Quantity Config index */
8263 measObject->quantityConfigIndex = 1;
8266 /* RSRP offset for SSB */
8267 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8268 if(!measObject->offsetMO.rsrpOffsetSSB)
8270 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8273 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8275 /* RSRQ offset for SSB */
8276 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8277 if(!measObject->offsetMO.rsrqOffsetSSB)
8279 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8282 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8284 /* SINR offset for SSB */
8285 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8286 if(!measObject->offsetMO.sinrOffsetSSB)
8288 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8291 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8296 /*******************************************************************
8298 * @brief Fill Report configuration to Add/mod list
8302 * Function : fillReportCfgToAddModList
8304 * Functionality: Fill Report configuration to Add/mod list
8306 * @params[in] Report Config To Add/Mod List
8307 * @return ROK - success
8310 * ****************************************************************/
8311 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8314 uint8_t reportCfgIdx;
8315 ReportConfigToAddMod_t *reportCfg;
8316 ReportConfigNR_t *reportCfgNr;
8317 EventTriggerConfig_t *eventTriggCfg;
8320 reportCfgList->list.count = elementCnt;
8321 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8323 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8324 if(!reportCfgList->list.array)
8326 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8330 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8332 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8333 if(!reportCfgList->list.array[reportCfgIdx])
8335 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8341 reportCfg = reportCfgList->list.array[reportCfgIdx];
8342 reportCfg->reportConfigId = 1;
8343 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8345 /* Report Configuration for NR */
8346 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8347 if(!reportCfg->reportConfig.choice.reportConfigNR)
8349 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8352 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8355 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8356 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8357 if(!reportCfgNr->reportType.choice.eventTriggered)
8359 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8362 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8365 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8366 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8367 if(!eventTriggCfg->eventId.choice.eventA3)
8369 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8373 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8374 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8375 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8376 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8377 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8378 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8380 /* Reference Signal Type */
8381 eventTriggCfg->rsType = NR_RS_Type_ssb;
8383 /* Report Interval */
8384 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8387 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8389 /* Report Quantity cell */
8390 eventTriggCfg->reportQuantityCell.rsrp = true;
8391 eventTriggCfg->reportQuantityCell.rsrq = false;
8392 eventTriggCfg->reportQuantityCell.sinr = false;
8394 /* Maximum reported cells */
8395 eventTriggCfg->maxReportCells = 3;
8397 /* Report qunatity RS Indexes */
8398 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8399 if(!eventTriggCfg->reportQuantityRS_Indexes)
8401 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8404 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8405 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8406 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8408 /* Maximum number of RS indexes to report */
8409 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8410 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8412 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8415 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8417 /* Include Beam measurement */
8418 eventTriggCfg->includeBeamMeasurements = false;
8423 /*******************************************************************
8425 * @brief Fill measurement Id to add/mod list
8429 * Function : fillMeasIdToAddModList
8431 * Functionality: Fill measurement Id to add/mod list
8433 * @params[in] Measurement Id to add/mod list
8434 * @return ROK - success
8437 * ****************************************************************/
8438 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8444 measIdList->list.count = elementCnt;
8445 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8447 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8448 if(!measIdList->list.array)
8453 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8455 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8456 if(!measIdList->list.array[measIdIdx])
8462 measIdList->list.array[measIdIdx]->measId = 1;
8463 measIdList->list.array[measIdIdx]->measObjectId = 1;
8464 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8469 /*******************************************************************
8471 * @brief Fill s-measurement configuration
8475 * Function : fillSMeasConfig
8477 * Functionality: Fill s-measurement configuration
8479 * @params[in] s-Measurement config
8480 * @return ROK - success
8483 * ****************************************************************/
8484 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8486 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8487 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8492 /*******************************************************************
8494 * @brief Fill quantity config
8498 * Function : fillQunatityConfig
8500 * Functionality: Fill quantity config
8502 * @params[in] Quantity Config
8503 * @return ROK - success
8506 * ****************************************************************/
8507 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8509 uint8_t elementCnt = 0;
8510 uint8_t quanCfgIdx = 0;
8511 QuantityConfigNR_t *quantityCfgNr;
8513 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8514 if(!quantityCfg->quantityConfigNR_List)
8520 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8521 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8523 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8524 if(!quantityCfg->quantityConfigNR_List->list.array)
8529 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8531 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8532 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8539 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8541 /* Quantity Config of Reference signal */
8542 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8543 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8547 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8549 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8550 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8554 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8556 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8557 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8561 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8563 /* Quantity Config RS index */
8564 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8565 if(!quantityCfgNr->quantityConfigRS_Index)
8570 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8571 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8575 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8577 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8578 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8582 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8584 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8585 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8589 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8594 /*******************************************************************
8596 * @brief Fill measurement configuration
8600 * Function : fillMeasConfig
8602 * Functionality: Fill measurement configuration
8604 * @params[in] Measurement config
8605 * @return ROK - success
8608 * ****************************************************************/
8609 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8611 /* Measurement object to add/mod list */
8612 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8613 if(!measConfig->measObjectToAddModList)
8615 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8618 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8620 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8624 /* Report Config To add/mod list */
8625 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8626 if(!measConfig->reportConfigToAddModList)
8628 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8631 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8633 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8637 /* Measurement Id to add/mod list */
8638 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8639 if(!measConfig->measIdToAddModList)
8641 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8644 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8646 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8650 /* S-Measurement config */
8651 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8652 if(!measConfig->s_MeasureConfig)
8654 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8657 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8659 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8663 /* Qunatity Config */
8664 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8665 if(!measConfig->quantityConfig)
8667 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8670 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8672 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8679 /*******************************************************************
8681 * @brief Fill RRC reconfiguration non-critical extension IE
8685 * Function : fillRrcReconfigNonCriticalExt
8687 * Functionality: Fill RRC reconfiguration non-critical extension
8689 * @params[in] RRC Reconfig Non-critical extension
8690 * @return ROK - success
8693 * ****************************************************************/
8694 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8696 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8697 if(!rrcRecfg->masterCellGroup)
8699 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8703 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8704 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8705 if(!rrcRecfg->masterCellGroup->buf)
8707 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8710 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8713 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8714 * received from DU */
8715 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8717 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8725 /*******************************************************************
8727 * @brief Fill RRC reconfiguration structure
8731 * Function : fillRrcReconfig
8733 * Functionality: Fill RRC reconfiguration
8737 * RRC reconfiguration structure
8738 * @return ROK - success
8741 * ****************************************************************/
8742 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8744 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8746 rrcReconfig->rrc_TransactionIdentifier = 1;
8747 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8749 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8750 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8752 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8756 /* Radio Bearer Configuration */
8757 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8758 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8760 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8763 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8765 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8769 /* Measurement Configuration */
8770 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8771 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8773 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8776 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8778 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8782 /* Non Critical extension */
8783 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8784 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8786 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8789 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8791 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8797 /*******************************************************************
8799 * @brief Fill RRC reconfiguration Octet string
8803 * Function : fillRrcReconfigBuf
8805 * Functionality: Fill RRC reconfiguration octet string
8808 * @params[in] OCTET_STRING_t buffer
8809 * @return ROK - success
8812 * ****************************************************************/
8813 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8815 uint8_t ret = RFAILED;
8816 asn_enc_rval_t encRetVal;
8817 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8818 rrcReconfig = &rrcRecfg;
8822 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8824 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8828 /* Encode RRC Reconfiguration */
8829 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8830 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8832 encRetVal = uper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8834 /* Encode results */
8835 if(encRetVal.encoded == ENCODE_FAIL)
8837 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8838 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8843 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8844 for(int i=0; i< encBufSize; i++)
8846 DU_LOG("%x",encBuf[i]);
8850 rrcReconfigBuf->size = encBufSize;
8851 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8852 if(!rrcReconfigBuf->buf)
8854 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8857 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8862 freeRrcReconfig(rrcReconfig);
8866 /*******************************************************************
8868 * @brief Fill HO preparation information Octet string
8872 * Function : fillHOPreparationInfoBuf
8874 * Functionality: Fill HO preparation information Octet string
8877 * @params[in] HandoverPreparationInformation_t buffer
8878 * @return ROK - success
8881 * ****************************************************************/
8882 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8884 uint8_t ret = RFAILED;
8885 asn_enc_rval_t encRetVal;
8886 HandoverPreparationInformationRrc_t hoPrepInfo;
8887 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8892 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8893 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8894 if(!hoPrepInfo.criticalExtensions.choice.c1)
8896 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8899 hoPrepInfo.criticalExtensions.choice.c1->present = \
8900 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8902 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8903 sizeof(HandoverPreparationInformationRrc_IEs_t));
8904 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8906 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8909 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8911 /* Fill UE Capability RAT container list */
8912 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8915 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8919 /* Fill Source config */
8920 hoPrepInfoIe->sourceConfig = NULLP;
8921 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8922 if(!hoPrepInfoIe->sourceConfig)
8924 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8927 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8931 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8935 hoPrepInfoIe->rrm_Config = NULLP;
8936 hoPrepInfoIe->as_Context = NULLP;
8937 hoPrepInfoIe->nonCriticalExtension = NULLP;
8939 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8940 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8941 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8943 encRetVal = uper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8944 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8946 /* Encode results */
8947 if(encRetVal.encoded == ENCODE_FAIL)
8949 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8950 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8955 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8956 for(int i=0; i< encBufSize; i++)
8958 DU_LOG("%x",encBuf[i]);
8962 hoPrepInfoBuf->size = encBufSize;
8963 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8964 if(!hoPrepInfoBuf->buf)
8966 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8969 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8973 freeHOPreparationInfo(&hoPrepInfo);
8977 /*******************************************************************
8979 * @brief Fills CuToDuContainer
8983 * Function : fillCuToDuContainer
8985 * Functionality: Fills CuToDuContainer
8987 * @params[in] pointer to CUtoDURRCInformation_t
8989 * @return ROK - success
8992 ******************************************************************/
8994 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8996 uint8_t elementCnt = 0;
9000 /* UE Capabulity RAT Container List */
9001 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9002 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
9004 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
9007 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
9011 /* Commenting this because:
9012 * CUToDURRCInformation->MeasConfig contains measurement gap configurations.
9013 * Howeever measurement gap is not supported in our code. Measurement Gap will
9014 * be required if we want to support inter-RAT handover or handover to
9015 * neighbouring cells operating on a different frequency than serving cell.
9017 * In case we plan to use this IE in future, following fixes are required:
9018 * As of now, we are filling MeasurementTimingConfigurationRrc_t into rrcMsg->measConfig.
9019 * This is incorrect. We must fill MeasConfigRrc_t in rrcMsg->measConfig.
9020 * MeasurementTimingConfigurationRrc_t should be filled in
9021 * rrcMsg->iE_Extensions->MeasurementTimingConfiguration, if required.
9024 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
9025 if(!rrcMsg->measConfig)
9027 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
9030 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
9033 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9036 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9037 if(rrcMsg->iE_Extensions)
9040 rrcMsg->iE_Extensions->list.count = elementCnt;
9041 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9043 /* Initialize the CUtoDURRCInformation_ExtIEs */
9044 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9046 if(rrcMsg->iE_Extensions->list.array == NULLP)
9048 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9052 for(idx=0; idx<elementCnt; idx++)
9054 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9055 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9057 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9064 /* Cell Group Configuration */
9065 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9066 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9067 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9068 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9069 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9072 /* Handover Preparation Information */
9073 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9074 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9075 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9076 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9077 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9082 /*******************************************************************
9084 * @brief Build the drx cycle
9088 * Function : BuildDrxCycle
9090 * Functionality: Build drx cycle IE
9092 * @params[in] pointer to DRXCycle_t
9094 * @return ROK - success
9097 ******************************************************************/
9098 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9100 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms80;
9101 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9102 if(!drxCycle->shortDRXCycleLength)
9104 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9107 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9109 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9110 if(!drxCycle->shortDRXCycleTimer)
9112 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9115 *(drxCycle->shortDRXCycleTimer) = 4;
9118 /*******************************************************************
9120 * @brief Free CuToDuContainer
9124 * Function : FreeCuToDuInfo
9126 * Functionality: Free CuToDuContainer
9128 * @params[in] pointer to CUtoDURRCInformation_t
9130 * @return ROK - success
9133 ******************************************************************/
9135 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9139 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9141 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9142 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9143 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9145 if(rrcMsg->iE_Extensions)
9147 if(rrcMsg->iE_Extensions->list.array)
9149 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9151 if(rrcMsg->iE_Extensions->list.array[idx])
9153 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9155 case ProtocolIE_ID_id_CellGroupConfig:
9156 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9158 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9159 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9164 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9165 rrcMsg->iE_Extensions->list.array[idx]->id);
9171 for(idx2 = 0; idx2 < idx; idx2++)
9173 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9175 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9179 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9182 /*******************************************************************
9184 * @brief Builds and sends the UE Setup Request
9188 * Function : BuildAndSendUeContextSetupReq
9190 * Functionality: Constructs the UE Setup Request and sends
9191 * it to the CU through SCTP.
9195 * @return ROK - success
9198 * ****************************************************************/
9199 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9201 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9202 uint8_t ret= RFAILED, ret1;
9204 uint8_t idx, idx1, bufLen, duIdx;
9206 DuDb *targetDuDb = NULLP;
9207 F1AP_PDU_t *f1apMsg = NULLP;
9208 UEContextSetupRequest_t *ueSetReq = NULLP;
9209 asn_enc_rval_t encRetVal; /* Encoder return value */
9210 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9214 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9216 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9217 if(f1apMsg == NULLP)
9219 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9223 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9224 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9225 if(f1apMsg->choice.initiatingMessage == NULLP)
9227 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9231 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9232 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9233 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9235 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9237 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9247 ueSetReq->protocolIEs.list.count = elementCnt;
9248 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9250 /* Initialize the UESetup members */
9251 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9253 if(ueSetReq->protocolIEs.list.array == NULLP)
9255 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9259 for(idx1=0; idx1<elementCnt; idx1++)
9261 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9262 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9270 /*GNB CU UE F1AP ID*/
9271 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9272 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9273 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9274 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9276 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9278 /*GNB DU UE F1AP ID*/
9280 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9281 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9282 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9283 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9288 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9289 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9290 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9291 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9293 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9294 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
9295 /* Since we are supporting only one cell per DU, accessing 0th index to
9296 * get target cell info */
9297 spCellId = targetDuDb->cellCb[0].nrCellId;
9300 spCellId = ueCb->cellCb->nrCellId;
9301 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9307 /*Served Cell Index*/
9309 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9310 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9311 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9312 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9314 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9316 /*CellULConfigured*/
9318 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9319 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9320 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9321 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9324 /*CUtoDURRCContainer*/
9326 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9327 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9328 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9329 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9334 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9339 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9340 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9341 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9342 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9344 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9348 /*Special Cells to be SetupList*/
9350 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9351 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9352 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9353 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9354 if(SplCellListret != ROK)
9360 /*SRBs To Be Setup List*/
9362 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9363 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9364 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9365 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9366 if(SrbSetupret != ROK)
9371 /*DRBs to Be Setup List*/
9373 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9374 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9375 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9376 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9382 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9384 /* RRC delivery status request */
9386 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9387 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9388 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9389 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9392 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9394 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9395 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9396 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9398 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9400 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9401 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9402 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9403 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9405 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9408 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9409 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9411 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9413 /* Encode the F1SetupRequest type as APER */
9414 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9416 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9418 /* Encode results */
9419 if(encRetVal.encoded == ENCODE_FAIL)
9421 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9422 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9427 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9428 for(int i=0; i< encBufSize; i++)
9430 DU_LOG("%x",encBuf[i]);
9435 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9437 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9443 FreeUeContextSetupReq(f1apMsg);
9446 }/* End of BuildAndSendUeContextSetupReq*/
9448 /**********************************************************************
9449 * @brief Function to extractTeId received in UE context setup Response
9453 * Function : extractTeId
9456 * - Function to extract TeId
9459 * @return ROK - success
9462 **********************************************************************/
9463 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9467 GTPTunnel_t *gtpDl = NULLP;
9469 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9471 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9473 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9475 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9476 if(gtpDl->gTP_TEID.size > 0)
9478 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9481 DU_LOG("\nERROR --> EGTP: No TeId received");
9489 /****************************************************************
9490 * @brief Function to add Drb tunnels
9494 * Function : addDrbTunnels
9497 * - Function to add Drb tunnels
9500 * @return ROK - success
9503 * ****************************************************************/
9504 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9509 if(teId > MAX_TEID || teId < MIN_TEID)
9511 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9513 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9514 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9515 tnlEvt.lclTeid = teId;
9516 tnlEvt.remTeid = teId;
9517 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9520 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9525 /****************************************************************
9526 * @brief Function to process Drb Setup List
9530 * Function : procDrbSetupList
9533 * - Function to process DRB Setup List
9536 * @return ROK - success
9539 * ****************************************************************/
9540 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9542 uint8_t arrIdx = 0, drbIdx = 0;
9544 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9546 if(drbSetupList != NULLP)
9548 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9550 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9551 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9553 /* extracting teId */
9554 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9557 if(addDrbTunnels(duId, teId)== ROK)
9559 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9561 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9562 * are sent to CU for setting up of Tunnels in DL direction.
9563 * Search for DRB ID in CU databse */
9564 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9566 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9568 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9581 /****************************************************************
9582 * @brief Function to process Ue Context Setup Response
9586 * Function : procUeContextSetupResponse
9589 * - Function to process Ue Context Setup Response
9592 * @return ROK - success
9595 * ****************************************************************/
9596 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9598 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9599 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9601 CuUeCb *ueCb = NULLP;
9602 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9603 OCTET_STRING_t *duToCuRrcContainer;
9605 SEARCH_DU_DB(duIdx, duId, duDb);
9606 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9608 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9610 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9612 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9614 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9617 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9619 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9620 ueCb = &duDb->ueCb[duUeF1apId-1];
9621 /* If ue context is not present in du db, then create UE context
9622 * here. This flow is hit in case of UE handover where UE
9623 * context is created before UE performs RACH on target DU */
9624 if(ueCb->gnbDuUeF1apId == 0)
9626 /* Creating UE context in target DU */
9627 memset(ueCb, 0, sizeof(CuUeCb));
9628 ueCb->cellCb = &duDb->cellCb[0];
9629 ueCb->gnbDuUeF1apId = duUeF1apId;
9630 ueCb->gnbCuUeF1apId = cuUeF1apId;
9631 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9632 ueCb->hoInfo.targetDuId = duId;
9635 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9636 ueCb->cellCb->numUe++;
9640 case ProtocolIE_ID_id_C_RNTI:
9642 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9645 case ProtocolIE_ID_id_DRBs_Setup_List:
9647 /* Adding Tunnels for successful DRB */
9648 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9651 case ProtocolIE_ID_id_DUtoCURRCInformation:
9653 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9654 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9655 DUtoCURRCInformation.cellGroupConfig;
9656 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9657 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9659 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9667 /* If the UE is in handover, UE context modification request is to be sent to
9668 * source DU once UE context setup response is received from target DU */
9669 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9671 DuDb *srcDuDb = NULLP;
9672 CuUeCb *ueCbInSrcDu = NULLP;
9674 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9675 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9676 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9678 /* UE context setup response is received from target DU. Search all
9679 * DUs to find source DU except this target DU Id.*/
9680 if(cuCb.duInfo[duIdx].duId != duId)
9682 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9685 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9686 * received in UE context setup response since CU UE F1AP ID does not
9687 * change for UE in handover.
9688 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9690 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9691 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9693 srcDuDb = &cuCb.duInfo[duIdx];
9694 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9696 /* Store source DU info in the new UE context created in
9698 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9700 /* Copy the received container to UeCb */
9701 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9703 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9705 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9712 if(srcDuDb && ueCbInSrcDu)
9718 ueCb->f1apMsgDb.dlRrcMsgCount++;
9719 rrcMsgType = setDlRRCMsgType(ueCb);
9721 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9722 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9724 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9732 /****************************************************************
9733 * @brief Function to process Ul Rrc Msg received from DU
9737 * Function : procUlRrcMsg
9740 * - Function to process Ul Rrc Msg received from DU
9743 * @return ROK - success
9746 * ****************************************************************/
9748 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9750 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9751 uint8_t *rrcContainer = NULLP;
9752 uint16_t rrcContLen = 0;
9753 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9755 CuUeCb *ueCb = NULLP;
9756 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9759 SEARCH_DU_DB(duIdx, duId, duDb);
9760 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9762 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9764 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9766 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9768 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9771 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9773 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9776 case ProtocolIE_ID_id_SRBID:
9777 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9780 case ProtocolIE_ID_id_RRCContainer:
9782 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9783 CU_ALLOC(rrcContainer, rrcContLen);
9786 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9789 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9791 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9794 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
9795 DuDb *srcDuDb = NULLP;
9797 /* In target DU DB, mark UE as active and delete HO info */
9798 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9799 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9801 /* Release UE context in source DU because the UE is now
9802 * attached to target DU */
9803 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9804 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9806 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9808 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9811 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9822 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9829 ueCb = &duDb->ueCb[duUeF1apId-1];
9830 ueCb->f1apMsgDb.dlRrcMsgCount++;
9831 rrcMsgType = setDlRRCMsgType(ueCb);
9832 if(rrcMsgType == RRC_SETUP_COMPLETE)
9834 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for NAS Security Mode Command");
9835 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9837 if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
9839 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Security Mode Command");
9840 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9842 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
9844 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9845 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9847 else if(rrcMsgType == REGISTRATION_COMPLETE)
9849 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9850 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9852 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9854 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9855 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9861 /****************************************************************
9862 * @brief Build And Send F1ResetAck
9866 * Function : FreeF1ResetAck
9869 * - Build And Send F1ResetRSP
9872 * @return ROK - success
9875 * ****************************************************************/
9876 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9879 ResetAcknowledge_t *f1ResetAck;
9883 if(f1apMsg->choice.successfulOutcome)
9885 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9887 if(f1ResetAck->protocolIEs.list.array)
9889 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9891 if(f1ResetAck->protocolIEs.list.array[idx])
9893 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9896 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9898 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9900 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9904 /****************************************************************
9905 * @brief Build And Send F1ResetAck
9909 * Function : BuildAndSendF1ResetAck
9912 * - Build And Send F1ResetRSP
9915 * @return ROK - success
9918 * ****************************************************************/
9920 uint8_t BuildAndSendF1ResetAck()
9923 uint8_t elementCnt = 0;
9924 uint8_t ret = RFAILED;
9925 F1AP_PDU_t *f1apMsg = NULL;
9926 ResetAcknowledge_t *f1ResetAck = NULLP;
9927 asn_enc_rval_t encRetVal;
9928 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9931 /* Allocate the memory for F1ResetRequest_t */
9932 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9933 if(f1apMsg == NULLP)
9935 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9939 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9941 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9942 if(f1apMsg->choice.successfulOutcome == NULLP)
9944 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9948 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9949 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9950 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9951 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9955 f1ResetAck->protocolIEs.list.count = elementCnt;
9956 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9958 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9959 if(f1ResetAck->protocolIEs.list.array == NULLP)
9961 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9965 for(idx=0; idx<elementCnt; idx++)
9967 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9968 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9975 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9976 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9977 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9978 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9980 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9982 /* Encode the F1SetupRequest type as UPER */
9983 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9985 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9987 /* Check encode results */
9988 if(encRetVal.encoded == ENCODE_FAIL)
9990 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9991 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9996 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9997 for(int i=0; i< encBufSize; i++)
9999 DU_LOG("%x",encBuf[i]);
10004 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10005 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
10007 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
10015 FreeF1ResetAck(f1apMsg);
10019 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
10023 if(ulInfo->list.array)
10025 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
10027 if(ulInfo->list.array[arrIdx])
10029 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
10031 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
10033 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
10035 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10036 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10037 gTPTunnel->gTP_TEID.size);
10039 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10040 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10041 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10043 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10044 sizeof(GTPTunnel_t));
10046 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10049 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10053 /*******************************************************************
10055 * @brief Deletes the EGTP tunnel
10059 * Function : deleteEgtpTunnel
10061 * Functionality: Deletes the EGTP tunnel
10063 * @params[in] uint8_t *buf
10065 * @return ROK - success
10066 * RFAILED - failure
10068 * ****************************************************************/
10069 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10074 teIdStringToInt(buf, &teId);
10075 if(teId > MAX_TEID || teId < MIN_TEID)
10077 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10080 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10081 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10082 tnlEvt.lclTeid = teId;
10083 tnlEvt.remTeid = teId;
10084 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10086 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10091 /*******************************************************************
10093 * @brief Builds the Uplink Tunnel Info
10097 * Function : BuildUlTnlInfoforSetupMod
10099 * Functionality: Constructs the UL TnlInfo For DRB list
10101 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10103 * @return ROK - success
10104 * RFAILED - failure
10106 * ****************************************************************/
10107 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10113 ulInfo->list.count = ulCnt;
10114 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10115 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10116 if(ulInfo->list.array == NULLP)
10118 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10121 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10123 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10124 if(ulInfo->list.array[arrIdx] == NULLP)
10126 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10132 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10133 UPTransportLayerInformation_PR_gTPTunnel;
10136 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10137 sizeof(GTPTunnel_t));
10138 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10140 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10143 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10144 transportLayerAddress.size = 4*sizeof(uint8_t);
10145 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10146 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10147 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10148 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10149 transportLayerAddress.buf == NULLP)
10151 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10155 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10156 transportLayerAddress.buf[0] = 192;
10157 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10158 transportLayerAddress.buf[1] = 168;
10159 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10160 transportLayerAddress.buf[2] = 130;
10161 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10162 transportLayerAddress.buf[3] = 82;
10163 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10164 transportLayerAddress.bits_unused = 0;
10166 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10167 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10168 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10169 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10172 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10173 = 4 * sizeof(uint8_t);
10174 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10175 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10176 gTPTunnel->gTP_TEID.size);
10177 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10180 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10183 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10184 gTP_TEID.buf[0] = 0;
10185 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10186 gTP_TEID.buf[1] = 0;
10187 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10188 gTP_TEID.buf[2] = 0;
10189 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10191 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10192 * fetched based on the Drb Id */
10194 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10195 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10196 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10200 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10201 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10204 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10205 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10206 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10207 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10209 }/*End of BuildULTnlInfo*/
10211 /*******************************************************************
10213 * @brief freeing the DRB item
10217 * Function : FreeDrbItem
10219 * Functionality: freeing the DRB item
10221 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10223 * @return ROK - success
10224 * RFAILED - failure
10226 * ****************************************************************/
10228 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10231 SNSSAI_t *snssai =NULLP;
10232 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10234 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10235 switch(drbItem->qoSInformation.present)
10237 case QoSInformation_PR_NOTHING:
10239 case QoSInformation_PR_eUTRANQoS:
10241 if(drbItem->qoSInformation.choice.eUTRANQoS)
10243 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10247 case QoSInformation_PR_choice_extension:
10249 if(drbItem->qoSInformation.choice.choice_extension)
10251 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10253 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10254 if(snssai->sST.buf)
10256 CU_FREE(snssai->sST.buf,snssai->sST.size);
10260 if(snssai->sD->buf)
10262 CU_FREE(snssai->sD->buf,snssai->sD->size);
10264 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10267 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10268 if(flowMap->list.array)
10270 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10272 if(flowMap->list.array[arrIdx] )
10274 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10275 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10278 CU_FREE(flowMap->list.array,flowMap->list.size);
10281 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10287 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10288 if(drbItem->uLConfiguration)
10290 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10294 /*******************************************************************
10296 * @brief filling the DRB setup Mod item
10300 * Function : FillDrbItemToSetupMod
10302 * Functionality: filling the DRB setup Mod item
10305 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10307 * @return ROK - success
10308 * RFAILED - failure
10310 * ****************************************************************/
10312 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10317 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10318 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10321 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10323 switch(drbItem->qoSInformation.present)
10325 case QoSInformation_PR_NOTHING:
10329 case QoSInformation_PR_eUTRANQoS:
10332 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10333 if(drbItem->qoSInformation.choice.eUTRANQoS)
10335 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10338 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10339 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10340 PriorityLevel_no_priority;
10342 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10343 Pre_emptionCapability_may_trigger_pre_emption;
10345 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10346 Pre_emptionVulnerability_pre_emptable;
10350 case QoSInformation_PR_choice_extension:
10352 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10353 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10355 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10359 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10360 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10361 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10362 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10363 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10366 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10371 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10372 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10375 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10379 /*Flows mapped to DRB List*/
10380 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10381 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10382 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10385 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10391 /*ULUPTNLInformation To Be Setup List*/
10392 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10393 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10396 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10401 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10402 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10408 /*******************************************************************
10410 * @brief Builds the DRB to be Setup Mod ItemIes
10414 * Function : FillDrbItemList
10416 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10418 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10420 * @return ROK - success
10421 * RFAILED - failure
10423 * ****************************************************************/
10425 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10427 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10428 drbItemIe->criticality = Criticality_reject;
10429 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10431 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10433 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10438 /*******************************************************************
10440 * @brief free the DRB to be Setup Mod list
10444 * Function : FreeDrbToBeSetupModList
10446 * Functionality: free the DRB to be Setup Mod list
10448 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10450 * @return ROK - success
10451 * RFAILED - failure
10453 * ****************************************************************/
10454 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10457 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10459 if(drbSet->list.array)
10461 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10463 if(drbSet->list.array[arrIdx] != NULLP)
10467 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10468 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10470 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10473 CU_FREE(drbSet->list.array, drbSet->list.size);
10478 /*******************************************************************
10480 * @brief Builds the DRB to be Setup Mod list
10484 * Function : BuildDrbToBeSetupList
10486 * Functionality: Constructs the DRB to be Setup Mod list
10488 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10490 * @return ROK - success
10491 * RFAILED - failure
10493 * ****************************************************************/
10495 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10501 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10502 drbSet->list.count = drbCnt;
10503 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10504 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10505 if(drbSet->list.array == NULLP)
10507 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10511 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10513 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10514 if(drbSet->list.array[arrIdx] == NULLP)
10516 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10520 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10523 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10530 /*******************************************************************
10532 * @brief Filling the DRB to be modified item
10536 * Function : FillDrbToBeModItem
10538 * Functionality: filling the DRB to be modified item
10540 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10542 * @return ROK - success
10543 * RFAILED - failure
10545 * ****************************************************************/
10547 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10551 DrbInfo *drbToBeMod;
10554 drbItem->dRBID = DRB2 + arrIdx;
10556 /* Search for DRB ID in CU databse */
10557 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10559 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10561 drbToBeMod = &ueCb->drbList[drbIdx];
10567 drbItem->qoSInformation = NULLP;
10568 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10569 if(drbItem->qoSInformation != NULLP)
10571 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10573 switch(drbItem->qoSInformation->present)
10575 case QoSInformation_PR_NOTHING:
10579 case QoSInformation_PR_eUTRANQoS:
10582 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10583 if(drbItem->qoSInformation->choice.eUTRANQoS)
10585 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10588 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10589 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10590 PriorityLevel_no_priority;
10592 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10593 Pre_emptionCapability_may_trigger_pre_emption;
10595 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10596 Pre_emptionVulnerability_pre_emptable;
10600 case QoSInformation_PR_choice_extension:
10602 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10603 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10605 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10609 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10610 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10611 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10612 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10613 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10616 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10621 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10622 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10625 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10629 /*Flows mapped to DRB List*/
10630 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10631 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10632 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10635 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10642 /*ULUPTNLInformation To Be Setup List*/
10643 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10644 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10647 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10653 /*******************************************************************
10655 * @brief Builds the DRB to be modified Item IE
10659 * Function : FillDrbToBeModItemList
10661 * Functionality: Constructs the DRB to be modified Mod Item Ies
10663 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10665 * @return ROK - success
10666 * RFAILED - failure
10668 * ****************************************************************/
10670 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10672 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10673 drbItemIe->criticality = Criticality_reject;
10674 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10675 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10677 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10684 /*******************************************************************
10686 * @brief Builds the DRB to be modified list
10690 * Function : BuildDrbToBeModList
10692 * Functionality: Constructs the DRB to be modified list
10694 * @params[in] DRBs_ToBeModified_List_t *drbSet
10696 * @return ROK - success
10697 * RFAILED - failure
10699 * ****************************************************************/
10701 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10707 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10708 drbSet->list.count = drbCnt;
10709 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10710 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10711 if(drbSet->list.array == NULLP)
10713 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10716 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10718 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10719 if(drbSet->list.array[arrIdx] == NULLP)
10721 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10725 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10728 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10735 /*******************************************************************
10737 * @brief Builds the DRB to be released Item IE
10741 * Function : FillDrbToBeRelItemList
10743 * Functionality: Constructs the DRB to be modified Mod Item Ies
10745 * @params[in] struct DRBs_ToBeReleased_ItemIEs *drbItemIe
10747 * @return ROK - success
10748 * RFAILED - failure
10750 * ****************************************************************/
10752 uint8_t FillDrbToBeRelItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeReleased_ItemIEs *drbItemIe)
10756 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
10757 drbItemIe->criticality = Criticality_reject;
10758 drbItemIe->value.present = DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
10759 drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID = DRB1 + arrIdx;
10761 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10763 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID)
10765 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
10766 CU_FREE(ueCb->drbList[drbIdx].snssai, sizeof(Snssai));
10773 /*******************************************************************
10775 * @brief Builds the DRB to be released list
10779 * Function : BuildDrbToBeReleasedList
10781 * Functionality: Constructs the DRB to be released list
10783 * @params[in] DRBs_ToBeReleased_List_t *drbSet
10785 * @return ROK - success
10786 * RFAILED - failure
10788 * ****************************************************************/
10790 uint8_t BuildDrbToBeReleasedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeReleased_List_t *drbSet)
10796 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10797 drbSet->list.count = drbCnt;
10798 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeReleased_ItemIEs_t *);
10799 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10800 if(drbSet->list.array == NULLP)
10802 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10805 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10807 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
10808 if(drbSet->list.array[arrIdx] == NULLP)
10810 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10814 ret = FillDrbToBeRelItemList(duId, ueCb, arrIdx, (DRBs_ToBeReleased_ItemIEs_t *)drbSet->list.array[arrIdx]);
10817 DU_LOG("\nERROR --> F1AP : FillDrbToBeRelItemList failed");
10824 /*******************************************************************
10826 * @brief freeing the DRB item
10830 * Function : FreeModifiedDrbItem
10832 * Functionality: freeing the DRB 2 item
10834 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10836 * @return ROK - success
10837 * RFAILED - failure
10839 * ****************************************************************/
10841 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10844 SNSSAI_t *snssai =NULLP;
10845 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10847 if(drbItem->qoSInformation != NULLP)
10849 switch(drbItem->qoSInformation->present)
10851 case QoSInformation_PR_NOTHING:
10853 case QoSInformation_PR_eUTRANQoS:
10855 if(drbItem->qoSInformation->choice.eUTRANQoS)
10857 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10861 case QoSInformation_PR_choice_extension:
10863 if(drbItem->qoSInformation->choice.choice_extension)
10865 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10867 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10868 if(snssai->sST.buf)
10870 CU_FREE(snssai->sST.buf,snssai->sST.size);
10874 if(snssai->sD->buf)
10876 CU_FREE(snssai->sD->buf,snssai->sD->size);
10878 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10881 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10882 if(flowMap->list.array)
10884 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10886 if(flowMap->list.array[arrIdx] )
10888 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10889 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10892 CU_FREE(flowMap->list.array,flowMap->list.size);
10895 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10901 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10902 if(drbItem->uLConfiguration)
10904 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10908 /*******************************************************************
10910 * @brief free the DRB to be modfified list
10914 * Function : FreeDrbToBeModifiedList
10916 * Functionality: free the DRB to be Setup Mod list
10918 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10920 * @return ROK - success
10921 * RFAILED - failure
10923 * ****************************************************************/
10924 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10927 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10929 if(drbSet->list.array)
10931 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10933 if(drbSet->list.array[arrIdx] != NULLP)
10935 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10936 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10937 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10940 CU_FREE(drbSet->list.array, drbSet->list.size);
10945 /*******************************************************************
10947 * @brief free the DRB to be modfified list
10951 * Function : FreeDrbToBeReleasedList
10953 * Functionality: free the DRB to be Release list
10955 * @params[in] FreeDrbToBeReleasedList_t *drbSet
10957 * @return ROK - success
10958 * RFAILED - failure
10960 * ****************************************************************/
10961 void FreeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet)
10964 struct DRBs_ToBeReleased_ItemIEs *drbItemIe;
10966 if(drbSet->list.array)
10968 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10970 if(drbSet->list.array[arrIdx] != NULLP)
10972 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
10975 CU_FREE(drbSet->list.array, drbSet->list.size);
10979 /*******************************************************************
10981 * @brief free the UeContextModification Request
10985 * Function : FreeUeContextModicationRequest
10987 * Functionality : deallocation of memory allocated in UeContextModiification
10990 * @params[in] F1AP_PDU_t *f1apMsg
10994 * ****************************************************************/
10995 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10997 uint8_t arrIdx =0 , ieId=0;
10998 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11002 if(f1apMsg->choice.initiatingMessage)
11004 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11005 if(ueContextModifyReq->protocolIEs.list.array)
11007 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
11009 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
11011 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
11014 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11016 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11018 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
11020 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11021 choice.DRBs_ToBeSetupMod_List);
11024 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
11026 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11027 choice.DRBs_ToBeModified_List);
11030 case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
11032 FreeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11033 choice.DRBs_ToBeReleased_List);
11036 case ProtocolIE_ID_id_TransmissionActionIndicator:
11038 case ProtocolIE_ID_id_RRCContainer:
11040 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
11041 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
11045 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
11048 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11050 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11052 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11056 /*******************************************************************
11058 * @brief Builds the Ue Context Modification Req
11062 * Function : BuildAndSendUeContextModificationReq
11064 * Functionality: Constructs the Ue Context Modification Req
11068 * @return ROK - success
11069 * RFAILED - failure
11071 * ****************************************************************/
11072 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
11075 uint8_t elementCnt = 0;
11076 uint8_t ret = RFAILED;
11077 uint16_t tmpBufIdx = 0, bufIdx = 0;
11078 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
11079 F1AP_PDU_t *f1apMsg = NULLP;
11080 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11081 RRCContainer_t rrcContainerTmp, *rrcContainer = NULLP;
11082 asn_enc_rval_t encRetVal;
11083 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
11086 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11087 if(f1apMsg == NULLP)
11089 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11093 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11095 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11096 if(f1apMsg->choice.initiatingMessage == NULLP)
11098 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11101 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
11102 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11103 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
11105 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11107 if(action == MODIFY_UE)
11109 else if(action == QUERY_CONFIG)
11111 else if(action == RRC_RECONFIG_COMPLETE_IND)
11113 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11117 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11120 ueContextModifyReq->protocolIEs.list.count = elementCnt;
11121 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
11123 /* Initialize the UE context modification members */
11124 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11125 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
11127 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11131 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11133 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
11134 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
11136 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11142 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11143 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11144 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11145 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
11146 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
11149 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11150 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11151 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
11152 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
11153 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
11155 if(action == MODIFY_UE)
11157 /* DRB to be setup list */
11159 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
11160 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11161 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11162 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
11163 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11164 value.choice.DRBs_ToBeSetupMod_List));
11166 /* DRB to be modified list */
11168 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
11169 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11170 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11171 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11172 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11173 value.choice.DRBs_ToBeModified_List));
11177 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11181 /* DRB to be released list */
11183 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeReleased_List;
11184 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11185 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11186 UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
11187 ret = BuildDrbToBeReleasedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11188 value.choice.DRBs_ToBeReleased_List));
11192 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be deleted list");
11196 else if(action == QUERY_CONFIG)
11199 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11200 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11201 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11202 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11203 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11205 else if(action == RRC_RECONFIG_COMPLETE_IND)
11208 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11209 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11210 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11211 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11212 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11213 RRCReconfigurationCompleteIndicator_true;
11215 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11218 if(action == STOP_DATA_TX)
11220 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11221 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11222 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11223 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11224 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11225 TransmissionActionIndicator_stop;
11227 else if (action == RESTART_DATA_TX)
11229 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11230 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11231 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11232 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11233 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11234 TransmissionActionIndicator_restart;
11238 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11239 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11240 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCContainer;
11241 if(fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, true) != ROK)
11243 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11247 rrcContainer = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
11248 rrcContainer->size = rrcContainerTmp.size + 2; /* 2 bytes of PDCP SN */
11249 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
11250 memset(rrcContainer->buf, 0, rrcContainer->size);
11251 rrcContainer->buf[0] = 0x00;
11252 rrcContainer->buf[1] = ueCb->pdcpSn; //PDCP SN
11253 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
11255 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
11258 /* RRC delivery status request */
11260 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11261 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11262 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11263 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11267 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11269 /* DRX Configuration Indicator */
11271 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator;
11272 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11273 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator;
11274 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release;
11275 ueCb->drxCfgPresent = false;
11276 memset(&ueCb->drxCfg, 0, sizeof(DrxCfg));
11280 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11282 /* Encode the F1SetupRequest type as APER */
11283 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11285 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11287 /* Encode results */
11288 if(encRetVal.encoded == ENCODE_FAIL)
11290 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11291 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11296 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11298 /* This for loop was going into an infinite loop even though encBufSize
11299 * has a small value. Hence commented this
11301 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11303 DU_LOG("%x",encBuf[ieIdx]);
11308 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11309 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11311 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11319 FreeUeContextModicationRequest(f1apMsg);
11323 /*****************************************************************i
11325 * @brief Free memory allocated for UE Context Release Command
11329 * Function : FreeUeContextReleaseCommand
11332 * - Free memory allocated for UE Context Release Command
11334 * @params[in] F1AP_PDU_t *f1apMsg
11337 * *************************************************************/
11338 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11341 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11345 if(f1apMsg->choice.initiatingMessage)
11347 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11348 if(ueReleaseCommand->protocolIEs.list.array)
11350 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11352 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11354 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11356 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11358 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11361 /*******************************************************************
11363 * @brief Builds the Ue Context Release Command
11367 * Function : BuildAndSendUeContextReleaseCommand
11369 * Functionality: Constructs the Ue Context Release Command
11373 * @return ROK - success
11374 * RFAILED - failure
11376 * ****************************************************************/
11377 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11379 bool memAllocFailed = false;
11380 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11383 F1AP_PDU_t *f1apMsg = NULLP;
11384 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11386 asn_enc_rval_t encRetVal;
11387 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11391 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11392 if(f1apMsg == NULLP)
11394 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11398 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11400 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11401 if(f1apMsg->choice.initiatingMessage == NULLP)
11403 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11406 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11407 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11408 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11410 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11412 SEARCH_DU_DB(duIdx, duId, duDb);
11413 ueCb = &duDb->ueCb[duUeF1apId-1];
11414 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11419 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11420 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11422 /* Initialize the UE context modification members */
11423 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11424 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11426 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11430 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11432 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11433 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11435 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11436 memAllocFailed = true;
11441 if(memAllocFailed == true)
11447 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11448 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11449 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11450 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11451 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11454 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11455 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11456 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11457 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11458 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11460 /* Cause of UE context release */
11462 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11463 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11464 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11465 UEContextReleaseCommandIEs__value_PR_Cause;
11466 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11467 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11468 CauseRadioNetwork_normal_release;
11469 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11471 /* RRC Container for RRC release */
11473 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11474 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11475 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11476 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11477 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11479 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11480 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11481 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11482 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11484 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11487 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11488 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11490 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11492 /* Encode the UE Context Release Command type as APER */
11493 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11495 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11498 /* Encode results */
11499 if(encRetVal.encoded == ENCODE_FAIL)
11501 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11502 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11507 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11508 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11510 DU_LOG("%x",encBuf[ieIdx]);
11514 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11515 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11517 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11525 FreeUeContextReleaseCommand(f1apMsg);
11528 /*******************************************************************
11530 * @brief process Ue context release request
11534 * Function : procUeContextReleaseReq
11537 * - process Ue context release request
11539 * @params[in] F1AP_PDU_t *f1apMsg
11540 * @return ROK - success
11541 * RFAILED - failure
11543 * ****************************************************************/
11544 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11546 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11548 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11549 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11551 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11553 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11555 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11557 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11560 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11562 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11570 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11572 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11577 /*******************************************************************
11579 * @brief processing of Gnb-DU config update
11583 * Function : procGnbDuUpdate
11586 * - processing of Gnb-DU config update
11588 * @params[in] F1AP_PDU_t *f1apMsg
11589 * @return ROK - success
11590 * RFAILED - failure
11592 * ****************************************************************/
11593 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11595 bool cellToBeDelete = false;
11596 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11600 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11602 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11603 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11605 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11607 case ProtocolIE_ID_id_TransactionID:
11609 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11611 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11613 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11614 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11615 Served_Cells_To_Delete_List.list.array[0];
11616 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11617 cellToBeDelete = true;
11620 case ProtocolIE_ID_id_gNB_DU_ID:
11624 if(BuildAndSendDUUpdateAck(duId) != ROK)
11626 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11630 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11631 * commented this trigger for now */
11633 if(cellToBeDelete == false)
11635 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11636 if(BuildAndSendF1ResetReq() != ROK)
11638 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11643 if(cellToBeDelete == true)
11645 SEARCH_DU_DB(duIdx, duId, duDb);
11646 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11647 if(cellCb->numUe == 0)
11649 memset(cellCb, 0, sizeof(CuCellCb));
11653 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11658 /*******************************************************************
11660 * @brief storing slice list in CU database
11664 * Function : buildSliceList
11667 * - storing slice list in CU database
11669 * @params[in] SliceSupportList_t *sliceSupportList
11670 * @return ROK - success
11671 * RFAILED - failure
11673 * ****************************************************************/
11674 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11676 uint8_t sliceListIdx = 0;
11678 if(sliceSupportList)
11680 if(sliceSupportList->list.array)
11682 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11683 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11685 if(sliceSupportList->list.array[sliceListIdx])
11687 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11688 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11690 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11693 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11695 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11696 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11698 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11700 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11701 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11702 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11711 /****************************************************************
11712 * @brief Function to process Srb Setup Mod List
11716 * Function : procSrbSetupModList
11719 * - Function to process SRB Setup Mod List
11722 * @return ROK - success
11723 * RFAILED - failure
11725 * ****************************************************************/
11726 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11728 uint8_t arrIdx = 0, srbIdx;
11729 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11731 if(srbSetupList != NULLP)
11733 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11735 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11736 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11738 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11740 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11742 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11754 /****************************************************************
11755 * @brief Function to process Drb Setup Mod List
11759 * Function : procDrbSetupModList
11762 * - Function to process DRB Setup Mod List
11765 * @return ROK - success
11766 * RFAILED - failure
11768 * ****************************************************************/
11769 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11771 uint8_t arrIdx = 0, drbIdx;
11773 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11775 if(drbSetupList != NULLP)
11777 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11779 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11780 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11782 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11784 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11786 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11787 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11792 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11794 /* extracting teId */
11795 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11798 if(addDrbTunnels(duId, teId)== ROK)
11800 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11812 /*******************************************************************
11814 * @brief processing of GNB_DU_Served_Cells Plmn list information
11818 * Function : procServedCellPlmnList
11821 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11824 * @params[in] F1AP_PDU_t *f1apMsg
11825 * @return ROK - success
11826 * RFAILED - failure
11828 * ****************************************************************/
11829 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11831 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11832 ProtocolExtensionContainer_4624P3_t **ieExtend;
11834 if(srvPlmn->list.array)
11836 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11838 if(srvPlmn->list.array[srvPlmnIdx])
11840 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11843 if((*ieExtend)->list.array)
11845 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11847 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11849 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11851 case ProtocolIE_ID_id_TAISliceSupportList:
11853 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11854 extensionValue.choice.SliceSupportList) != ROK)
11856 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11871 /****************************************************************
11872 * @brief Function to process Ue Context Modification Response
11876 * Function : procUeContextModificationResponse
11879 * - Function to process Ue Context Modification Response
11882 * @return ROK - success
11883 * RFAILED - failure
11885 * ****************************************************************/
11886 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11888 uint8_t idx=0, duIdx=0;
11889 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11890 DuDb *duDb = NULLP;
11891 CuUeCb *ueCb = NULLP;
11892 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11894 SEARCH_DU_DB(duIdx, duId, duDb);
11895 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11897 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11899 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11901 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11903 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11906 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11908 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11909 ueCb = &duDb->ueCb[duUeF1apId-1];
11912 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11914 /* Adding Tunnels for successful DRB */
11915 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11919 case ProtocolIE_ID_id_DRBs_Modified_List:
11921 DU_LOG("\nINFO --> Received DRBs Modified List");
11924 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11926 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11929 case ProtocolIE_ID_id_DUtoCURRCInformation:
11931 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11932 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11933 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11935 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11944 /* If UE is in handover and UE context is not yet created at target DU, then send
11945 * UE context setup request to target DU */
11946 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11949 DuDb *tgtDuDb = NULLP;
11950 CuUeCb *ueCbInTgtDu = NULLP;
11952 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11955 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11956 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11958 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11960 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11962 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11967 /* If UE context is not found in Target DU DU, send UE context setup
11969 if(ueCbInTgtDu == NULLP)
11971 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
11973 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11980 #ifdef START_DL_UL_DATA
11987 /*******************************************************************
11989 * @brief processing of F1 setup request
11993 * Function : procF1SetupReq
11996 * - processing of F1 setup request
11998 * @params[in] F1AP_PDU_t *f1apMsg
11999 * @return ROK - success
12000 * RFAILED - failure
12002 * ****************************************************************/
12003 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
12005 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
12007 uint64_t nrCellId = 0;
12008 DuDb *duDb = NULLP;
12009 CuCellCb *cellCb = NULLP;
12010 BIT_STRING_t nrcellIdentity;
12011 F1SetupRequest_t *f1SetupReq = NULLP;
12012 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
12013 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
12015 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
12016 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
12018 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
12020 case ProtocolIE_ID_id_gNB_DU_ID:
12022 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
12023 SEARCH_DU_DB(duIdx, duId, duDb);
12026 duDb = &cuCb.duInfo[cuCb.numDu];
12029 memset(duDb, 0, sizeof(DuDb));
12034 case ProtocolIE_ID_id_gNB_DU_Name:
12036 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
12039 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
12041 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
12042 if(duServedCell->list.array)
12044 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
12046 if(duServedCell->list.array[plmnidx])
12048 switch(duServedCell->list.array[plmnidx]->id)
12050 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
12052 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
12053 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
12054 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
12056 bitStringToInt(&nrcellIdentity, &nrCellId);
12057 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
12058 if(cellCb == NULLP)
12060 cellCb = &duDb->cellCb[duDb->numCells];
12061 memset(cellCb, 0, sizeof(CuCellCb));
12062 cellCb->nrCellId = nrCellId;
12063 cellCb->cellStatus = CELL_ACTIVE;
12076 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
12080 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
12084 /****************************************************************
12086 * @brief processing of UE Context Release Complete
12090 * Function : procUeContextReleaseComplete
12093 * - processing of UE Context Release Complete
12095 * @params[in] F1AP_PDU_t *f1apMsg
12096 * @return ROK - success
12097 * RFAILED - failure
12099 * ****************************************************************/
12100 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
12102 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
12103 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
12104 DuDb *duDb = NULLP;
12105 CuUeCb *ueCb = NULLP;
12106 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
12108 SEARCH_DU_DB(duIdx, duId, duDb);
12111 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
12115 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
12116 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
12118 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
12120 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12122 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
12125 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12127 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
12128 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
12129 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
12131 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
12133 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
12134 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
12136 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
12138 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
12140 ueCb->cellCb->ueCb[ueIdx] = NULLP;
12141 ueCb->cellCb->numUe--;
12142 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
12144 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
12151 memset(ueCb, 0, sizeof(CuUeCb));
12159 /*******************************************************************
12161 * @brief Builds the Paging cell list
12165 * Function : BuildPagingCellList
12167 * Functionality: Build the paging cell list
12169 * @params[in] PagingCell_list_t *pagingCelllist,
12171 * @return ROK - success
12172 * RFAILED - failure
12174 * ****************************************************************/
12175 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
12177 uint8_t cellIdx =0;
12178 PagingCell_ItemIEs_t *pagingCellItemIes;
12179 PagingCell_Item_t *pagingCellItem;
12181 pagingCelllist->list.count = numCells;
12182 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
12183 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
12184 if(pagingCelllist->list.array == NULLP)
12186 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12190 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12192 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12193 if(pagingCelllist->list.array[cellIdx] == NULLP)
12195 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12200 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12202 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12203 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
12204 pagingCellItemIes->criticality = Criticality_ignore;
12205 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
12206 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12208 /* Fill NrCgi Information */
12209 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
12215 /*******************************************************************
12217 * @brief Deallocation of memory allocated in paging msg
12221 * Function :FreePagingMsg
12223 * Functionality: Deallocation of memory allocated in paging msg
12225 * @params[in] F1AP_PDU_t *f1apMsg
12229 * ****************************************************************/
12230 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12232 uint8_t ieIdx, cellIdx;
12234 PagingCell_ItemIEs_t *pagingCellItemIes;
12235 PagingCell_Item_t *pagingCellItem;
12236 PagingCell_list_t *pagingCelllist;
12240 if(f1apMsg->choice.initiatingMessage)
12242 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12243 if(paging->protocolIEs.list.array)
12245 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12247 if(paging->protocolIEs.list.array[ieIdx])
12249 switch(paging->protocolIEs.list.array[ieIdx]->id)
12251 case ProtocolIE_ID_id_UEIdentityIndexValue:
12253 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12254 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12258 case ProtocolIE_ID_id_PagingIdentity:
12260 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12262 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12264 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12266 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12267 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12269 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12270 sizeof(struct CNUEPagingIdentity));
12276 case ProtocolIE_ID_id_PagingCell_List:
12278 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12279 if(pagingCelllist->list.array)
12281 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12283 if(pagingCelllist->list.array[cellIdx])
12285 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12286 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12288 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12289 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12290 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12292 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12295 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12300 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12303 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12305 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12307 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12310 /*******************************************************************
12312 * @brief Builds and sends the paging message if UE is in idle mode
12316 * Function : BuildAndSendPagingMsg
12318 * Functionality: Builds and sends the paging message
12320 * @params[in] uint32_t duId, uint8_t gsTmsi
12322 * @return ROK - success
12323 * RFAILED - failure
12325 * ****************************************************************/
12326 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12328 bool memAllocFailed = false;
12329 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12330 uint16_t ueId = 0, duIdx = 0;
12332 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12333 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12334 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12335 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12337 F1AP_PDU_t *f1apMsg = NULLP;
12338 Paging_t *paging = NULLP;
12340 asn_enc_rval_t encRetVal;
12342 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12344 SEARCH_DU_DB(duIdx, duId, duDb);
12347 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12350 if(duDb->numCells == 0)
12352 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): No CELL is UP!");
12358 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12359 if(f1apMsg == NULLP)
12361 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12365 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12367 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12368 if(f1apMsg->choice.initiatingMessage == NULLP)
12370 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12373 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12374 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12375 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12377 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12380 paging->protocolIEs.list.count = elementCnt;
12381 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12383 /* Initialize the Paging Message members */
12384 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12385 if(paging->protocolIEs.list.array == NULLP)
12387 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12391 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12393 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12394 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12396 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12397 memAllocFailed = true;
12402 if(memAllocFailed == true)
12407 /* UE Identity Index Value */
12409 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12410 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12411 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12412 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12413 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12414 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12415 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12416 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12418 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12422 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12423 ueId = gsTmsi % 1024;
12424 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12426 /* Paging Identity */
12428 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12429 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12430 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12431 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12432 PagingIdentity_PR_cNUEPagingIdentity;
12433 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12434 sizeof(struct CNUEPagingIdentity));
12435 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12437 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12441 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12442 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12444 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12445 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12446 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12447 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12449 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12453 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12454 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12458 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12459 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12460 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12461 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12463 /* Paging Priority */
12465 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12466 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12467 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12468 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12470 /* Paging Cell List */
12472 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12473 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12474 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12475 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12477 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12481 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12483 /* Encode the UE Context Release Command type as APER */
12484 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12486 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12489 /* Encode results */
12490 if(encRetVal.encoded == ENCODE_FAIL)
12492 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12493 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12498 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12499 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12501 DU_LOG("%x",encBuf[ieIdx]);
12505 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12507 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12516 FreePagingMsg(f1apMsg);
12520 /*******************************************************************
12522 * @brief Handles received F1AP message and sends back response
12526 * Function : F1APMsgHdlr
12529 * - Decodes received F1AP control message
12530 * - Prepares response message, encodes and sends to SCTP
12533 * @return ROK - success
12534 * RFAILED - failure
12536 * ****************************************************************/
12537 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12543 F1AP_PDU_t *f1apMsg = NULLP;
12544 asn_dec_rval_t rval; /* Decoder return value */
12545 F1AP_PDU_t f1apasnmsg ;
12547 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12548 ODU_PRINT_MSG(mBuf, 0,0);
12550 /* Copy mBuf into char array to decode it */
12551 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12552 CU_ALLOC(recvBuf, (Size)recvBufLen);
12554 if(recvBuf == NULLP)
12556 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12559 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12561 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12565 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12566 for(i=0; i< recvBufLen; i++)
12568 DU_LOG("%x",recvBuf[i]);
12571 /* Decoding flat buffer into F1AP messsage */
12572 f1apMsg = &f1apasnmsg;
12573 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12575 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12576 CU_FREE(recvBuf, (Size)recvBufLen);
12578 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12580 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12584 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12586 switch(f1apMsg->present)
12588 case F1AP_PDU_PR_initiatingMessage:
12590 switch(f1apMsg->choice.initiatingMessage->value.present)
12592 case InitiatingMessage__value_PR_Reset:
12594 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12595 BuildAndSendF1ResetAck();
12599 case InitiatingMessage__value_PR_F1SetupRequest:
12601 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12602 procF1SetupReq(duId, f1apMsg);
12606 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12608 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12609 procGnbDuUpdate(*duId, f1apMsg);
12612 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12614 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12615 procInitULRRCMsg(*duId, f1apMsg);
12618 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12620 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12621 procUlRrcMsg(*duId, f1apMsg);
12625 case InitiatingMessage__value_PR_RRCDeliveryReport:
12627 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12630 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12632 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12633 procUeContextReleaseReq(*duId, f1apMsg);
12638 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12639 f1apMsg->choice.initiatingMessage->value.present);
12642 }/* End of switch(initiatingMessage) */
12646 case F1AP_PDU_PR_successfulOutcome:
12648 switch(f1apMsg->choice.successfulOutcome->value.present)
12650 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12652 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12655 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12657 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12658 procUeContextSetupResponse(*duId, f1apMsg);
12661 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12663 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12664 procUeContextModificationResponse(*duId, f1apMsg);
12667 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12669 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12670 procUeContextReleaseComplete(*duId, f1apMsg);
12675 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12676 f1apMsg->choice.successfulOutcome->value.present);
12679 }/* End of switch(successfulOutcome) */
12684 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12687 }/* End of switch(f1apMsg->present) */
12689 } /* End of F1APMsgHdlr */
12691 /**********************************************************************
12693 **********************************************************************/