1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ProtocolIE-Field.h"
25 #include "ProtocolExtensionField.h"
26 #include "ProtocolIE-SingleContainer.h"
27 #include "F1SetupResponse.h"
28 #include "SuccessfulOutcome.h"
29 #include "InitiatingMessage.h"
30 #include "NonDynamic5QIDescriptor.h"
31 #include "AveragingWindow.h"
32 #include "MaxDataBurstVolume.h"
33 #include "Flows-Mapped-To-DRB-Item.h"
34 #include "SliceSupportItem.h"
35 #include "ServedPLMNs-Item.h"
37 #include "ULUPTNLInformation-ToBeSetup-Item.h"
38 #include "ULConfiguration.h"
39 #include "ModulationOrder.h"
41 #include "UE-CapabilityRAT-Container.h"
42 #include "UE-CapabilityRAT-ContainerList.h"
43 #include "UE-CapabilityRAT-ContainerListRRC.h"
44 #include "HandoverPreparationInformationRrc-IEs.h"
45 #include "HandoverPreparationInformationRrc.h"
46 #include "SupportedBandwidth.h"
47 #include "FeatureSetUplinkPerCC.h"
48 #include "FeatureSetDownlinkPerCC.h"
49 #include "FeatureSets.h"
50 #include "RF-Parameters.h"
51 #include "UE-NR-Capability.h"
52 #include "ProtocolExtensionContainer.h"
53 #include "CellGroupConfigRrc.h"
54 #include "MAC-CellGroupConfig.h"
55 #include "SchedulingRequestConfig.h"
56 #include "SchedulingRequestToAddMod.h"
57 #include "BSR-Config.h"
58 #include "TAG-Config.h"
60 #include "PHR-Config.h"
61 #include "RLC-Config.h"
62 #include "UL-AM-RLC.h"
63 #include "DL-AM-RLC.h"
64 #include "LogicalChannelConfig.h"
65 #include "RLC-BearerConfig.h"
66 #include "PhysicalCellGroupConfig.h"
67 #include "SpCellConfig.h"
68 #include "ServingCellConfig.h"
69 #include "ControlResourceSet.h"
70 #include "SearchSpace.h"
71 #include "PDCCH-Config.h"
72 #include "PDSCH-TimeDomainResourceAllocation.h"
73 #include "PDSCH-TimeDomainResourceAllocationList.h"
74 #include "DMRS-DownlinkConfig.h"
75 #include "PDSCH-Config.h"
76 #include "BWP-DownlinkDedicated.h"
77 #include "PUSCH-TimeDomainResourceAllocation.h"
78 #include "PUSCH-TimeDomainResourceAllocationList.h"
79 #include "DMRS-UplinkConfig.h"
80 #include "PUSCH-Config.h"
81 #include "SRS-ResourceId.h"
82 #include "SRS-Resource.h"
83 #include "SRS-ResourceSet.h"
84 #include "SRS-Config.h"
85 #include "PUCCH-Config.h"
86 #include "PUCCH-ResourceSet.h"
87 #include "PUCCH-Resource.h"
88 #include "PUCCH-format1.h"
89 #include "PUCCH-FormatConfig.h"
90 #include "BWP-UplinkDedicated.h"
91 #include "PUSCH-ServingCellConfig.h"
92 #include "UplinkConfig.h"
93 #include "PDSCH-ServingCellConfig.h"
94 #include "EUTRANQoS.h"
95 #include "GBR-QosInformation.h"
96 #include "DRBs-ToBeSetupMod-List.h"
97 #include "DRBs-ToBeSetupMod-Item.h"
98 #include "DRBs-Setup-Item.h"
99 #include "DLUPTNLInformation-ToBeSetup-List.h"
100 #include "DLUPTNLInformation-ToBeSetup-Item.h"
101 #include "UPTransportLayerInformation.h"
102 #include "GTPTunnel.h"
103 #include "QoSInformation.h"
104 #include "Cells-to-be-Activated-List.h"
105 #include "DL-CCCH-Message.h"
106 #include "SRB-ToAddModList.h"
107 #include "SRB-ToAddMod.h"
108 #include "RRCSetup-IEs.h"
109 #include "RRCSetup.h"
110 #include "DL-DCCH-Message.h"
111 #include "RRCReconfiguration-IEs.h"
112 #include "RRCReconfiguration.h"
113 #include "DRB-ToAddModList.h"
114 #include "DRB-ToAddMod.h"
115 #include "SDAP-Config.h"
117 #include "MeasTiming.h"
118 #include "MeasTimingList.h"
119 #include "MeasurementTimingConfigurationRrc-IEs.h"
120 #include "MeasurementTimingConfigurationRrc.h"
121 #include "PDCP-Config.h"
122 #include "RSRP-Range.h"
123 #include "RSRQ-Range.h"
124 #include "SINR-Range.h"
125 #include "ThresholdNR.h"
126 #include "MeasObjectToAddMod.h"
127 #include "MeasObjectNR.h"
128 #include "MeasObjectToAddModList.h"
129 #include "EventTriggerConfig.h"
130 #include "ReportConfigNR.h"
131 #include "ReportConfigToAddMod.h"
132 #include "ReportConfigToAddModList.h"
133 #include "MeasIdToAddMod.h"
134 #include "MeasIdToAddModList.h"
135 #include "FilterCoefficient.h"
136 #include "QuantityConfigNR.h"
137 #include "QuantityConfig.h"
138 #include "MeasConfigRrc.h"
139 #include "AS-Config.h"
140 #include "RRCReconfiguration-v1530-IEs.h"
141 #include "CNUEPagingIdentity.h"
142 #include "PagingCell-Item.h"
143 #include "UL-DCCH-Message.h"
144 #include "DRX-ConfigRrc.h"
146 #include "cu_stub_sctp.h"
147 #include "cu_stub_egtp.h"
148 #include "cu_f1ap_msg_hdl.h"
151 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
152 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
154 /*******************************************************************
156 * @brief Sends F1 msg over SCTP
160 * Function : SendF1APMsg
162 * Functionality: Sends F1 msg over SCTP
164 * @params[in] Region region
166 * @return ROK - success
169 * ****************************************************************/
170 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
172 Buffer *mBuf = NULLP;
174 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
176 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
178 ODU_PRINT_MSG(mBuf, 0,0);
180 if(sctpSend(F1_INTERFACE, duId, mBuf) != ROK)
182 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
183 ODU_PUT_MSG_BUF(mBuf);
189 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
190 ODU_PUT_MSG_BUF(mBuf);
193 ODU_PUT_MSG_BUF(mBuf);
197 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
204 /********************************************************************
206 * @brief Builds and sends the F1SetupResponse
210 * Function : BuildAndSendF1SetupRsp
212 * Functionality: Constructs the F1SetupResponse message and sends
213 * it back to the DU through SCTP.
215 * @params[in] void **buf,Buffer to which encoded pattern is written into
216 * @params[in] int *size,size of buffer
218 * @return ROK - success
221 * ****************************************************************/
222 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
225 uint8_t elementCnt,cellCnt;
226 F1AP_PDU_t *f1apMsg = NULL;
227 F1SetupResponse_t *f1SetupRsp = NULL;
228 GNB_CU_Name_t *cuName = NULL;
229 Cells_to_be_Activated_List_t *cellToActivate;
230 RRC_Version_t *rrcVer = NULL;
231 asn_enc_rval_t encRetVal;
232 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
234 /* Allocate the memory for F1SetupRequest_t */
235 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
238 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
241 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
243 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
244 if(f1apMsg->choice.successfulOutcome == NULLP)
246 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
247 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
251 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
252 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
253 f1apMsg->choice.successfulOutcome->value.present = \
254 SuccessfulOutcome__value_PR_F1SetupResponse;
255 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
258 f1SetupRsp->protocolIEs.list.count = elementCnt;
259 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
261 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
262 elementCnt * sizeof(F1SetupResponseIEs_t *));
263 if(f1SetupRsp->protocolIEs.list.array == NULLP)
265 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
266 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
267 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
271 for(idx=0; idx<elementCnt; idx++)
273 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
274 sizeof(F1SetupResponseIEs_t));
275 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
277 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
278 elementCnt * sizeof(F1SetupResponseIEs_t *));
279 CU_FREE(f1apMsg->choice.successfulOutcome, \
280 sizeof(SuccessfulOutcome_t));
281 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
288 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
289 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
290 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
291 F1SetupResponseIEs__value_PR_TransactionID;
292 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
295 /* CU name IE is of type printableString_t which wireshark is unable to decode.
296 * However this string is decoded successfully on online decoders.
297 * Since this is an optional IE and the value received in it are not
298 * used as of now, eliminating this IE for now to avoid wireshark error.
302 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
303 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
304 f1SetupRsp->protocolIEs.list.array[idx]->value.present = F1SetupResponseIEs__value_PR_GNB_CU_Name;
305 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
306 cuName->size = strlen((char *)cuCb.cuCfgParams.cuName);
308 CU_ALLOC(cuName->buf, cuName->size);
309 if(cuName->buf == NULLP)
311 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
313 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
315 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
316 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
317 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
320 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
323 /*Cells to be activated list*/
325 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cells_to_be_Activated_List ;
326 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
327 f1SetupRsp->protocolIEs.list.array[idx]->value.present = F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
328 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.Cells_to_be_Activated_List;
331 cellToActivate->list.count = cellCnt;
332 cellToActivate->list.size = cellCnt * sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
333 CU_ALLOC(cellToActivate->list.array, sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
334 if(cellToActivate->list.array == NULLP)
336 CU_FREE(cuName->buf, sizeof(cuName->size));
337 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
339 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
341 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
342 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
343 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
346 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
348 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
349 if(cellToActivate->list.array[ieIdx] == NULLP)
351 CU_FREE(cellToActivate->list.array, sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
352 CU_FREE(cuName->buf, sizeof(cuName->size));
353 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
355 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
357 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
358 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
359 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
363 cellToActivate->list.array[0]->id = \
364 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
365 cellToActivate->list.array[0]->criticality = Criticality_ignore;
366 cellToActivate->list.array[0]->value.present = \
367 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
368 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
369 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
370 CU_ALLOC(cellToActivate->list.array[0]->\
371 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
373 if(cellToActivate->list.array[0]->value.choice.\
374 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
377 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
379 CU_FREE(cellToActivate->list.array[ieIdx],\
380 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
383 CU_FREE(cellToActivate->list.array,\
384 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
385 CU_FREE(cuName->buf, sizeof(cuName->size));
386 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
388 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
389 sizeof(F1SetupResponseIEs_t));
391 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
392 elementCnt * sizeof(F1SetupResponseIEs_t *));
393 CU_FREE(f1apMsg->choice.successfulOutcome, \
394 sizeof(SuccessfulOutcome_t));
395 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
398 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
399 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
400 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
401 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
402 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
403 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
404 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
405 nRCGI.nRCellIdentity.size);
406 if(cellToActivate->list.array[0]->value.choice.\
407 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
409 CU_FREE(cellToActivate->list.array[0]->\
410 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
412 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
414 CU_FREE(cellToActivate->list.array[ieIdx],\
415 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
418 CU_FREE(cellToActivate->list.array,\
419 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
420 CU_FREE(cuName->buf, sizeof(cuName->size));
421 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
423 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
424 sizeof(F1SetupResponseIEs_t));
426 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
427 elementCnt * sizeof(F1SetupResponseIEs_t *));
428 CU_FREE(f1apMsg->choice.successfulOutcome, \
429 sizeof(SuccessfulOutcome_t));
430 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
433 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
437 f1SetupRsp->protocolIEs.list.array[idx]->id = \
438 ProtocolIE_ID_id_GNB_CU_RRC_Version;
439 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
440 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
441 F1SetupResponseIEs__value_PR_RRC_Version;
442 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
443 rrcVer->latest_RRC_Version.size = RRC_SIZE;
445 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
446 if(rrcVer->latest_RRC_Version.buf == NULLP)
448 CU_FREE(cuName->buf, sizeof(cuName->size));
449 for(ieIdx=0; ieIdx<elementCnt; idx++)
451 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
452 sizeof(F1SetupResponseIEs_t));
454 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
455 elementCnt * sizeof(F1SetupResponseIEs_t *));
456 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
457 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
461 /* Need to check RRC Version */
462 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
463 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
464 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
465 if(rrcVer->iE_Extensions == NULLP)
467 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
468 CU_FREE(cuName->buf, sizeof(cuName->size));
469 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
471 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
472 sizeof(F1SetupResponseIEs_t));
474 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
475 elementCnt * sizeof(F1SetupResponseIEs_t *));
476 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
477 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
480 rrcVer->iE_Extensions->list.count = 1;
481 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
482 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
483 sizeof(struct RRC_Version_ExtIEs *));
484 if(rrcVer->iE_Extensions->list.array == NULLP)
486 CU_FREE(rrcVer->iE_Extensions,\
487 sizeof(ProtocolExtensionContainer_4624P81_t));
488 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
489 CU_FREE(cuName->buf, sizeof(cuName->size));
490 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
492 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
493 sizeof(F1SetupResponseIEs_t));
495 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
496 elementCnt * sizeof(F1SetupResponseIEs_t *));
497 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
498 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
501 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
502 sizeof(struct RRC_Version_ExtIEs));
503 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
505 CU_FREE(rrcVer->iE_Extensions->list.array,\
506 sizeof(struct RRC_Version_ExtIEs *));
507 CU_FREE(rrcVer->iE_Extensions,\
508 sizeof(ProtocolExtensionContainer_4624P81_t));
509 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
510 CU_FREE(cuName->buf, sizeof(cuName->size));
511 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
513 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
514 sizeof(F1SetupResponseIEs_t));
516 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
517 elementCnt * sizeof(F1SetupResponseIEs_t *));
518 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
519 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
522 rrcVer->iE_Extensions->list.array[0]->id = \
523 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
524 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
525 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
526 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
527 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
528 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
529 CU_ALLOC(rrcVer->iE_Extensions->list.\
530 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
532 if(rrcVer->iE_Extensions->list.\
533 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
535 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
536 sizeof(struct RRC_Version_ExtIEs));
537 CU_FREE(rrcVer->iE_Extensions->list.array,\
538 sizeof(struct RRC_Version_ExtIEs *));
539 CU_FREE(rrcVer->iE_Extensions,\
540 sizeof(ProtocolExtensionContainer_4624P81_t));
541 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
542 CU_FREE(cuName->buf, sizeof(cuName->size));
543 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
545 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
546 sizeof(F1SetupResponseIEs_t));
548 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
549 elementCnt * sizeof(F1SetupResponseIEs_t *));
550 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
551 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
554 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
555 Latest_RRC_Version_Enhanced.buf[0] = 0;
556 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
557 Latest_RRC_Version_Enhanced.buf[1] = 5;
558 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
559 Latest_RRC_Version_Enhanced.buf[2] = 15;
561 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
563 /* Encode the F1SetupRequest type as UPER */
564 memset(encBuf, 0, ENC_BUF_MAX_LEN);
566 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
570 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
572 CU_FREE(cuName->buf, cuName->size);
573 for(idx=0; idx<elementCnt; idx++)
575 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
577 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
578 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
579 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
581 /* Check encode results */
582 if(encRetVal.encoded == ENCODE_FAIL)
584 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
585 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
590 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
591 for(int i=0; i< encBufSize; i++)
593 DU_LOG("%x",encBuf[i]);
598 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
600 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
605 }/* End of BuildAndSendF1SetupRsp */
607 /*******************************************************************
609 * @brief Builds and sends the DUUpdateAcknowledge
613 * Function : BuildAndSendDUUpdateAck
615 * Functionality: Constructs the DU Update Acknowledge message and sends
616 * it to the DU through SCTP.
620 * @return ROK - success
623 * ****************************************************************/
625 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
629 F1AP_PDU_t *f1apMsg = NULL;
630 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
631 asn_enc_rval_t enRetVal; /* Encoder return value */
633 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
635 /* Allocate the memory for F1SetupRequest_t */
636 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
639 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
643 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
645 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
646 if(f1apMsg->choice.successfulOutcome == NULLP)
648 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
649 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
653 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
654 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
655 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
656 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
659 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
660 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
662 /* Initialize the F1Setup members */
663 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
664 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
666 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
667 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
668 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
672 for(idx=0; idx<elementCnt; idx++)
674 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
675 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
677 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
678 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
679 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
686 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
687 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
688 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
689 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
690 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
692 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
694 /* Encode the F1SetupRequest type as UPER */
695 memset(encBuf, 0, ENC_BUF_MAX_LEN);
697 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
700 for(idx=0; idx<elementCnt; idx++)
702 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
704 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
705 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
706 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
708 /* Checking encode results */
709 if(enRetVal.encoded == ENCODE_FAIL)
711 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
712 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
717 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
718 for(int i=0; i< encBufSize; i++)
720 DU_LOG("%x",encBuf[i]);
725 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
726 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
728 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
734 }/* End of BuildAndSendDUUpdateAck*/
736 /*******************************************************************
738 * @brief deallocating the memory of F1reset msg
742 * Function : FreeF1ResetReq
745 * - freeing memory of F1reset request msg
751 * ****************************************************************/
752 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
755 Reset_t *f1ResetMsg = NULLP;
759 if(f1apMsg->choice.initiatingMessage)
761 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
762 if(f1ResetMsg->protocolIEs.list.array)
764 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
766 if(f1ResetMsg->protocolIEs.list.array[idx])
768 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
771 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
773 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
775 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
778 /*******************************************************************
780 * @brief build ansld ans send f1reset msg
784 * Function : BuildAndSendF1ResetReq
786 * Functionality: build and send f1reset msg
788 * @return ROK - success
791 * ****************************************************************/
792 uint8_t BuildAndSendF1ResetReq()
794 uint8_t elementCnt=0;
796 uint8_t ret= RFAILED;
797 Reset_t *f1ResetMsg = NULLP;
798 F1AP_PDU_t *f1apMsg = NULLP;
799 asn_enc_rval_t encRetVal;
800 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
803 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
806 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
809 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
810 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
811 if(f1apMsg->choice.initiatingMessage == NULLP)
813 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
816 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
817 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
818 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
820 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
823 f1ResetMsg->protocolIEs.list.count = elementCnt;
824 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
826 /* Initialize the F1Reset members */
827 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
828 if(f1ResetMsg->protocolIEs.list.array == NULLP)
830 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
833 for(idx=0; idx<elementCnt; idx++)
835 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
836 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
838 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
845 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
846 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
847 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
848 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
852 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
853 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
854 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
855 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
856 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
860 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
861 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
862 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
863 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
864 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
866 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
868 /* Encode the F1SetupRequest type as APER */
869 memset(encBuf, 0, ENC_BUF_MAX_LEN);
871 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
875 if(encRetVal.encoded == ENCODE_FAIL)
877 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
878 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
883 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
884 for(idx=0; idx< encBufSize; idx++)
886 DU_LOG("%x",encBuf[idx]);
890 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
891 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
893 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
901 FreeF1ResetReq(f1apMsg);
905 /*******************************************************************
907 * @brief Fills Radio Bearer Config
911 * Function : fillSrbCfg
913 * Functionality: Fills Radio Bearer Config
915 * @params[in] SRB_ToAddModList *
917 * @return ROK - success
920 * ****************************************************************/
921 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
923 uint8_t elementCnt = 0;
924 uint8_t idx, ieId, srbIdx = 0;
926 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
928 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
932 if(bearerCfg != NULLP)
934 bearerCfg->list.count = elementCnt;
935 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
936 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
937 if(bearerCfg->list.array != NULLP)
939 for(idx = 0; idx < elementCnt; idx++)
941 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
942 if(bearerCfg->list.array[idx] == NULLP)
944 for(ieId = 0; ieId < idx; ieId++)
946 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
948 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
955 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
960 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
962 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
963 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
969 /*******************************************************************
971 * @brief Fills Master CellGroup Info
975 * Function : fillMasterCellGroup
977 * Functionality: Fills Master Cell Group IE
979 * @params[in] RRCSetup_IEs_t *
981 * @return ROK - success
984 * ****************************************************************/
986 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
989 masterCellGroup->buf = NULLP;
990 if(ueCb->f1apMsgDb.duToCuContainer.buf)
992 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
993 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
994 if(masterCellGroup->buf != NULLP)
996 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1000 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1011 /*******************************************************************
1013 * @brief Fills RRC setup IE
1017 * Function : fillRRCSetupIE
1019 * Functionality: Fills RRC Setup IE
1021 * @params[in] RRCSetup_IEs_t *
1023 * @return ROK - success
1026 * ****************************************************************/
1028 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1030 uint8_t ret = ROK, srbIdx = 0;
1033 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1034 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1036 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1040 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1044 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1048 /* If SRB configuration are filled successfully in RRC Setup, mark these
1049 * configurartion as sent to UE */
1050 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1052 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1053 ueCb->srbList[srbIdx].cfgSentToUe = true;
1058 /*******************************************************************
1060 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1064 * Function : fillDlCcchRrcMsg
1066 * Functionality: Fills DL DCCCH Message required for
1067 * DLRRCMessageTransfer
1069 * @params[in] RRCContainer_t *rrcContainer
1071 * @return ROK - success
1074 * ****************************************************************/
1076 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1080 DL_CCCH_Message_t dl_CCCH_Msg;
1081 asn_enc_rval_t encRetVal;
1083 if(rrcContainer != NULLP)
1085 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1087 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1088 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1090 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1091 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1092 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1094 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1095 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1096 RRCSetup__criticalExtensions_PR_rrcSetup;
1098 /* Fill RRC Setup IE */
1099 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1100 sizeof(RRCSetup_IEs_t));
1101 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1103 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1107 /* encode DL-CCCH message into RRC Container */
1108 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1109 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1111 encRetVal = uper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1112 /* Encode results */
1113 if(encRetVal.encoded == ENCODE_FAIL)
1115 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1116 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1121 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1122 for(int i = 0; i< encBufSize; i++)
1124 DU_LOG("%x",encBuf[i]);
1126 rrcContainer->size = encBufSize;
1127 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1128 if(rrcContainer->buf != NULLP)
1130 memset(rrcContainer->buf, 0, encBufSize);
1131 for(idx2 = 0; idx2 < encBufSize; idx2++)
1133 rrcContainer->buf[idx2] = encBuf[idx2];
1145 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1151 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1157 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1163 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1168 /*******************************************************************
1170 * @brief Fills QOS flow configuration
1174 * Function : fillQosFlowsToAdd
1176 * Functionality: Fills QOS flow configuration
1178 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1180 * @return ROK - success
1183 * ****************************************************************/
1184 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1186 uint8_t idx, ied, elementCnt;
1189 qosFlow->list.count = elementCnt;
1190 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1191 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1192 if(qosFlow->list.array != NULLP)
1194 for(idx = 0; idx < elementCnt; idx++)
1196 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1197 if(qosFlow->list.array[idx] == NULLP)
1199 for(ied = 0; ied < idx; ied++)
1201 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1203 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1209 *qosFlow->list.array[idx] = 9;
1213 /*******************************************************************
1215 * @brief Fills CN Assoc for Drb to Add/Mod List
1219 * Function : fillCnAssoc
1221 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1223 * @params[in] struct DRB_ToAddMod__cnAssociation *
1225 * @return ROK - success
1228 * ****************************************************************/
1230 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1234 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1235 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1237 cnAssoc->choice.eps_BearerIdentity = 5;
1239 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1241 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1242 if(cnAssoc->choice.sdap_Config)
1244 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1245 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1246 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1247 cnAssoc->choice.sdap_Config->defaultDRB = true;
1248 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1249 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1250 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1251 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1252 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1254 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1258 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1259 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1265 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1272 /*******************************************************************
1274 * @brief Fills Radio Bearer Config for Drb
1278 * Function : fillDrbCfg
1280 * Functionality: Fills Radio Bearer Config for Drb
1282 * @params[in] drbId, DRB_ToAddModList *
1284 * @return ROK - success
1287 * ****************************************************************/
1288 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1290 uint8_t idx, ied, ret, elementCnt;
1296 drbCfg->list.count = elementCnt;
1297 drbCfg->list.size =\
1298 elementCnt * sizeof(DRB_ToAddMod_t *);
1299 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1300 if(drbCfg->list.array != NULLP)
1302 for(idx = 0; idx < elementCnt; idx++)
1304 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1305 if(drbCfg->list.array[idx] == NULLP)
1307 for(ied = 0; ied < idx; ied++)
1309 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1311 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1321 /* CN ASSOCIATION */
1322 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1323 if(drbCfg->list.array[idx]->cnAssociation)
1325 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1328 drbCfg->list.array[idx]->drb_Identity = drbId;
1333 /*******************************************************************
1335 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1339 * Function : fillRrcReconfigIE
1341 * Functionality: Fills RRC Reconfig Message required for
1342 * DLRRCMessageTransfer
1344 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1346 * @return ROK - success
1349 * ****************************************************************/
1351 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1354 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1355 if(rrcReconfigMsg->radioBearerConfig)
1357 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1358 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1360 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1365 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1366 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1368 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1371 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1372 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1373 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1379 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1380 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1386 /*******************************************************************
1388 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1392 * Function : fillDlDcchRrcMsg
1394 * Functionality: Fills DL DCCH Message required for
1395 * DLRRCMessageTransfer
1397 * @params[in] RRCContainer_t *rrcContainer
1399 * @return ROK - success
1402 * ****************************************************************/
1404 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer, bool updateAllRbCfg)
1407 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1408 DL_DCCH_Message_t dl_DCCH_Msg;
1409 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1410 asn_enc_rval_t encRetVal;
1412 if(rrcContainer != NULLP)
1414 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1416 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1417 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1419 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1420 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1421 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1423 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1424 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, updateAllRbCfg);
1427 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1428 * configurartion as sent to UE */
1429 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1431 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1432 ueCb->srbList[srbIdx].cfgSentToUe = true;
1434 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1436 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1437 ueCb->drbList[drbIdx].cfgSentToUe = true;
1440 /* encode DL-DCCH message into RRC Container */
1441 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1442 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1444 encRetVal = uper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1445 /* Encode results */
1446 if(encRetVal.encoded == ENCODE_FAIL)
1448 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1449 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1454 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1455 for(int i = 0; i< encBufSize; i++)
1457 DU_LOG("%x",encBuf[i]);
1459 rrcContainer->size = encBufSize;
1460 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1461 if(rrcContainer->buf != NULLP)
1463 memset(rrcContainer->buf, 0, encBufSize);
1464 for(idx2 = 0; idx2 < encBufSize; idx2++)
1466 rrcContainer->buf[idx2] = encBuf[idx2];
1474 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1480 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1486 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1492 /*******************************************************************
1494 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1498 * Function : BuildDLRRCContainer
1500 * Functionality: Builds RRC Container IE required for
1501 * DLRRCMessageTransfer
1505 * @return ROK - success
1508 * ****************************************************************/
1510 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1512 uint8_t ret, bufLen;
1515 if(rrcMsgType == RRC_SETUP)
1517 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1519 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1521 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1523 DU_LOG("\nINFO --> F1AP : Sending NAS Authentication Request");
1524 char authReqBuf[51] = {0x00, ueCb->pdcpSn++, 0x2a, 0x85, 0x4f, 0xc0, 0x0a, 0xc0, 0x40, 0x40, 0x00, 0x04, 0x2f, 0x58, 0x39, 0x12,\
1525 0x37, 0x15, 0x74, 0x16, 0x4c, 0x8d, 0xd3, 0x95, 0xa6, 0x9e, 0x94, 0x03, 0x24, 0x02, 0x00, 0x6f,\
1526 0x0b, 0x39, 0x5e, 0xbc, 0xb0, 0x00, 0x1a, 0xb1, 0xc1, 0x3f, 0x84, 0x4f, 0x77, 0xe3, 0x20, 0x00,\
1529 rrcContainer->size = bufLen;
1530 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1531 if(rrcContainer->buf != NULLP)
1533 memset(rrcContainer->buf, 0, bufLen);
1534 memcpy(rrcContainer->buf, authReqBuf, bufLen);
1538 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1543 else if(rrcMsgType == NAS_AUTHENTICATION_RSP)
1545 DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
1546 char secModeBuf[30]={0x00, ueCb->pdcpSn++, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1547 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1549 rrcContainer->size = bufLen;
1550 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1551 if(rrcContainer->buf != NULLP)
1553 memset(rrcContainer->buf, 0, bufLen);
1554 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1558 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1562 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1564 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1565 char secModeBuf[9]={0x00, ueCb->pdcpSn++, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1567 rrcContainer->size = bufLen;
1568 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1569 if(rrcContainer->buf != NULLP)
1571 memset(rrcContainer->buf, 0, bufLen);
1572 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1576 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1580 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1582 /*Hardcoded RRC Container from reference logs*/
1583 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1584 char buf[14] ={0x00, ueCb->pdcpSn++, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1586 rrcContainer->size = bufLen;
1587 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1588 if(rrcContainer->buf != NULLP)
1590 memset(rrcContainer->buf, 0, bufLen);
1591 memcpy(rrcContainer->buf, buf, bufLen);
1595 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1599 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1601 uint16_t tmpBufIdx = 0, bufIdx = 0;
1602 RRCContainer_t rrcContainerTmp;
1603 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1604 ret = fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, false);
1605 rrcContainer->size = rrcContainerTmp.size + 2;
1606 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1607 if(rrcContainer->buf != NULLP)
1609 memset(rrcContainer->buf, 0, rrcContainer->size);
1610 rrcContainer->buf[0] = 0x00;
1611 rrcContainer->buf[1] = ueCb->pdcpSn++; //PDCP SN
1612 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
1614 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
1618 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1624 /*******************************************************************
1626 * @brief Frees the DLRRCMessageTransfer
1630 * Function : freeDlRrcMessageTransfer
1632 * Functionality: Frees the DLRRCMessageTransfer
1636 * @return ROK - success
1639 * ****************************************************************/
1640 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1643 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1647 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1648 if(dlRRCMsg->protocolIEs.list.array)
1651 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1652 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1653 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1655 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1657 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1659 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1663 /*******************************************************************
1665 * @brief Builds and sends the DLRRCMessageTransfer
1669 * Function : BuildAndSendDLRRCMessageTransfer
1671 * Functionality: Constructs the DL RRC Message Transfer and sends
1672 * it to the CU through SCTP.
1676 * @return ROK - success
1679 * ****************************************************************/
1680 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1682 uint8_t elementCnt = 0;
1685 F1AP_PDU_t *f1apMsg = NULLP;
1686 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1687 asn_enc_rval_t encRetVal; /* Encoder return value */
1689 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1691 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1692 if(f1apMsg == NULLP)
1694 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1698 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1699 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1700 if(f1apMsg->choice.initiatingMessage == NULLP)
1702 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1703 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1707 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1708 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1709 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1710 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1713 dlRRCMsg->protocolIEs.list.count = elementCnt;
1714 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1716 /* Initialize the F1Setup members */
1717 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1718 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1720 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1721 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1722 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1726 for(idx=0; idx<elementCnt; idx++)
1728 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1729 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1731 for(ieId=0; ieId<idx; ieId++)
1733 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1735 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1736 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1737 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1742 /* GNB CU UE F1AP ID */
1744 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1745 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1746 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1747 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1749 /* GNB DU UE F1AP ID */
1751 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1752 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1753 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1754 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1758 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1759 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1760 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1761 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1765 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1766 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1767 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1768 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1770 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1772 /* Encode the F1SetupRequest type as APER */
1773 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1775 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1777 /* Encode results */
1778 if(encRetVal.encoded == ENCODE_FAIL)
1780 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1781 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1786 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1787 for(int i=0; i< encBufSize; i++)
1789 DU_LOG("%x",encBuf[i]);
1794 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1796 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1799 freeDlRrcMessageTransfer(f1apMsg);
1801 }/* End of BuildAndSendDLRRCMessageTransfer */
1803 /*******************************************************************
1805 * @brief Function to set the Dl RRC Msg Type
1809 * Function : setDlRRCMsgType
1811 * Functionality: Constructs the UE Setup Response and sends
1812 * it to the DU through SCTP.
1816 * @return ROK - success
1819 * ****************************************************************/
1821 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1823 uint8_t rrcMsgType = 0;
1824 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1827 rrcMsgType = RRC_SETUP;
1829 case RRC_SETUP_COMPLETE:
1830 rrcMsgType = RRC_SETUP_COMPLETE;
1832 case NAS_AUTHENTICATION_RSP:
1833 rrcMsgType = NAS_AUTHENTICATION_RSP;
1835 case NAS_SECURITY_MODE_COMPLETE:
1836 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1838 case RRC_SECURITY_MODE_COMPLETE:
1839 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1841 case REGISTRATION_COMPLETE:
1842 rrcMsgType = REGISTRATION_COMPLETE;
1844 case UE_CONTEXT_SETUP_RSP:
1845 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1847 case RRC_RECONFIG_COMPLETE:
1848 rrcMsgType = RRC_RECONFIG_COMPLETE;
1857 /*******************************************************************
1859 * @brief fill long cycle offset value of drx
1863 * Function : fillLongCycleOffsetValue
1865 * Functionality: fill long cycle offset value of drx
1867 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1868 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1870 * @return ROK - success
1873 * ****************************************************************/
1874 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *recvedLongCycleOffsetVal)
1877 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1878 switch(recvedLongCycleOffsetVal->present)
1880 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10:
1882 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1885 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20:
1887 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1890 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32:
1892 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1895 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40:
1897 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1900 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60:
1902 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1905 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64:
1907 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1910 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70:
1912 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1915 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80:
1917 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1920 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128:
1922 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1925 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160:
1927 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1930 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256:
1932 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1935 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320:
1937 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1940 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512:
1942 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1945 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640:
1947 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1950 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024:
1952 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1955 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280:
1957 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1960 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048:
1962 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1965 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560:
1967 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1970 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120:
1972 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1975 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240:
1977 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1985 /*******************************************************************
1987 * @brief Extract configuration from DRX_ConfigRrc
1988 * and store the drx configuration in UeCb
1992 * Function : storeDrxCfgInUeCb
1994 * Functionality: Store drx configuration in UeCb
1996 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
1999 * ****************************************************************/
2000 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
2002 switch(drxSetup->drx_onDurationTimer.present)
2004 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
2006 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
2008 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
2009 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
2012 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
2014 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
2015 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
2019 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
2020 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
2021 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
2022 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
2023 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
2024 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
2025 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
2026 if(drxSetup->shortDRX)
2028 drxCfg->shortDrxPres=true;
2029 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
2030 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
2033 drxCfg->shortDrxPres=false;
2037 /*******************************************************************
2039 * @brief Extract configuration from CellGroupConfig
2043 * Function : extractCellGroupConfig
2045 * Functionality: Extract configuration from CellGroupConfig
2046 * and store in local database
2048 * @params[in] UE control block
2051 * @return ROK - success
2054 * ****************************************************************/
2055 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
2057 uint8_t rbIdx, srbIdx, drbIdx;
2058 bool srbFound, drbFound;
2059 SrbInfo *srbCfgDb = NULLP;
2060 DrbInfo *drbCfgDb = NULLP;
2061 RlcLcCfg *rlcLcCfgDb = NULLP;
2062 MacLcCfg *macLcCfgDb = NULLP;
2063 RLC_BearerConfig_t *rlcCfg = NULLP;
2064 RLC_Config_t *rlcLcCfg = NULLP;
2065 LogicalChannelConfig_t *macLcCfg = NULLP;
2072 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2076 if(cellGrpCfg == NULLP)
2078 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2083 if(cellGrpCfg->mac_CellGroupConfig)
2085 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2087 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2089 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2092 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2094 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup)
2096 ueCb->drxCfgPresent = true;
2097 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2102 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2109 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2114 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2116 /* Update SRB configuration in local DB */
2117 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2119 /* Search if SRB entry is already present in DB */
2120 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2122 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2124 srbCfgDb = &ueCb->srbList[srbIdx];
2130 /* If not, add SRB to UE CB's SRB list */
2133 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2134 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2138 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2139 srbCfgDb->cfgSentToUe = false;
2140 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2141 macLcCfgDb = &srbCfgDb->macLcCfg;
2144 /* Update DRB configuration in local DB */
2145 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2147 /* Search if DRB entry is already present in DB */
2148 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2150 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2152 drbCfgDb = &ueCb->drbList[drbIdx];
2158 /* If not, add DRB to UE CB's SRB list */
2161 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2162 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2166 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2167 drbCfgDb->cfgSentToUe = false;
2168 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2169 macLcCfgDb = &drbCfgDb->macLcCfg;
2173 /* Update RLC configuration for this RB */
2174 rlcLcCfg = rlcCfg->rlc_Config;
2175 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2176 switch(rlcLcCfgDb->rlcMode)
2178 case RLC_Config_PR_am:
2180 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2181 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2182 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2183 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2184 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2186 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2187 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2188 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2192 case RLC_Config_PR_um_Bi_Directional:
2194 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2196 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2197 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2202 /* Update MAC configuration for this LC */
2203 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2204 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2205 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2206 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2207 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2208 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2213 /*******************************************************************
2215 * @brief Function to decode DU to CU RRC container
2219 * Function : extractDuToCuRrcCont
2221 * Functionality: Function to decode DU to CU RRC container
2224 * RRC conatiner octect string to be decoded
2226 * @return ROK - success
2229 * ****************************************************************/
2230 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2232 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2233 asn_dec_rval_t rval; /* Decoder return value */
2235 /* Copy the received container to UeCb */
2236 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2238 /* Decoding DU to CU RRC container octet string to cell group config */
2239 cellGrpCfgMsg = &cellGrpCfg;
2240 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2242 rval = uper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2244 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2246 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2250 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2252 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2254 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2261 /*******************************************************************
2263 * @brief Function to build Initial UL RRC Message
2267 * Function : procInitULRRCMsg
2269 * Functionality: Function to build Initial UL RRC Message
2273 * @return ROK - success
2276 * ****************************************************************/
2278 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2280 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2282 uint16_t cellIdx=0, nrCellId = 0;
2287 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2289 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2291 SEARCH_DU_DB(duIdx, duId, duDb);
2292 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2294 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2296 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2298 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2299 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2302 case ProtocolIE_ID_id_NRCGI:
2303 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2304 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2309 case ProtocolIE_ID_id_C_RNTI:
2310 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2311 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2313 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2314 memset(ueCb, 0, sizeof(CuUeCb));
2315 ueCb->cellCb = cellCb;
2316 ueCb->crnti = crnti;
2317 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2318 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2319 ueCb->state = UE_ATTACH_IN_PROGRESS;
2322 cellCb->ueCb[cellCb->numUe] = ueCb;
2327 case ProtocolIE_ID_id_RRCContainer:
2330 case ProtocolIE_ID_id_DUtoCURRCContainer:
2332 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2333 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2335 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2336 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2337 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2338 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2340 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2341 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2342 ueCb->f1apMsgDb.duToCuContainer.size);
2344 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2346 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2352 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2359 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2368 ueCb->f1apMsgDb.dlRrcMsgCount++;
2369 rrcMsgType = setDlRRCMsgType(ueCb);
2370 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2375 /*******************************************************************
2377 * @brief Builds Nrcgi
2381 * Function : BuildNrcgi
2383 * Functionality: Building the PLMN ID and NR Cell id
2385 * @params[in] NRCGI_t *nrcgi
2386 * @return ROK - success
2389 * ****************************************************************/
2390 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2393 uint8_t unused_bits = 4;
2394 uint8_t byteSize = 5;
2396 /* Allocate Buffer Memory */
2397 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2398 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2399 if(nrcgi->pLMN_Identity.buf == NULLP)
2403 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2409 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2410 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2411 if(nrcgi->nRCellIdentity.buf == NULLP)
2415 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2419 /*******************************************************************
2421 * @brief Builds Special cell list for UE Setup Request
2425 * Function : BuildSplCellList
2427 * Functionality: Constructs the Special Cell list for UESetReq
2429 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2431 * @return ROK - success
2434 * ****************************************************************/
2435 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2441 spCellLst->list.count = cellCnt;
2442 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2443 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2444 if(spCellLst->list.array == NULLP)
2448 for(idx=0; idx<cellCnt; idx++)
2450 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2451 if(spCellLst->list.array[idx] == NULLP)
2457 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2458 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2459 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2461 /* Special Cell ID -NRCGI */
2462 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2467 /*Special Cell Index*/
2468 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2470 }/* End of BuildSplCellList*/
2472 /*******************************************************************
2474 * @brief Builds SRBS to be setup
2478 * Function : BuildSRBSetup
2480 * Functionality: Constructs the SRB's for UESetReq
2482 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2484 * @return ROK - success
2487 * ****************************************************************/
2488 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2493 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2494 srbCnt = ueCb->numSrb;
2497 srbSet->list.count = srbCnt;
2498 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2499 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2500 if(srbSet->list.array == NULLP)
2502 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2506 for(idx=0; idx<srbCnt; idx++)
2508 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2509 if(srbSet->list.array[idx] == NULLP)
2511 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2516 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2519 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2520 srbSet->list.array[idx]->criticality = Criticality_ignore;
2521 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2522 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2523 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2528 for(idx=0; idx<srbCnt; idx++)
2530 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2531 srbSet->list.array[idx]->criticality = Criticality_ignore;
2532 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2533 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2537 }/* End of BuildSRBSetup*/
2539 /*******************************************************************
2541 * @brief Builds QOS Info for DRB Setum Item
2545 * Function : BuildQOSInfo
2547 * Functionality: Constructs the QOS Info for DRB Setup Item
2549 * @params[in] QoSInformation_t *qosinfo
2550 * int16_t pduSessionID
2552 * @return ROK - success
2555 * ****************************************************************/
2556 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2558 uint8_t elementCnt = 0, qosCntIdx = 0;
2559 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2561 /* NonDynamic5QIDescriptor */
2562 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2563 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2564 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2569 if(hoInProgress == Inter_DU_HO)
2570 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2571 else if(hoInProgress == false || hoInProgress == Xn_Based_Inter_CU_HO)
2574 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2575 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2577 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2579 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2585 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2586 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2590 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2591 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2593 /*MaxDataBurstVolume*/
2594 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2595 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2599 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2600 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2603 /*nRGRAN Allocation Retention Priority*/
2606 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2607 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2608 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2610 else if((hoInProgress == false) || (hoInProgress == Xn_Based_Inter_CU_HO))
2612 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2613 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2614 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2616 qosInfo->priorityLevel = PriorityLevel_lowest;
2617 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2618 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2621 /* PDU session ID */
2624 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2625 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2627 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2631 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2632 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2636 elementCnt = NUM_QOS_EXT;
2637 qosIeExt->list.count = elementCnt;
2638 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2640 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2641 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2643 if(qosIeExt->list.array == NULLP)
2645 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2649 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2651 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2652 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2654 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2657 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2658 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2659 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2660 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2661 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2662 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2663 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2664 qosInfo->pduSessionId = pduSessionID;
2669 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2674 }/*End of BuildQOSInfo*/
2676 /*******************************************************************
2678 * @brief Builds SNSSAI
2682 * Function : BuildSNSSAI
2684 * Functionality: Constructs the SNSSAI For DRB list
2686 * @params[in] SNSSAI_t *snssai
2687 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2689 * @return ROK - success
2692 * ****************************************************************/
2693 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2696 /* In case of non-HO UE context creation and Xn Based HO, DRB's SNSSAI
2697 * configuration is not known beforehand. In these 2 case, the following
2698 * condition will hit */
2699 if(!hoInProgress || (hoInProgress == Xn_Based_Inter_CU_HO))
2700 drbInfo->snssai = snssaiToCopy;
2703 snssai->sST.size = sizeof(uint8_t);
2704 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2705 if(snssai->sST.buf == NULLP)
2709 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2712 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2713 if(snssai->sD == NULLP)
2717 snssai->sD->size = 3 * sizeof(uint8_t);
2718 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2719 if(snssai->sD->buf == NULLP)
2723 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2726 }/*End of BuildSNSSAI*/
2728 /*******************************************************************
2730 * @brief Builds the flow map.
2734 * Function : BuildFlowsMap
2736 * Functionality: Constructs the flowmap For DRB list
2738 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2740 * @return ROK - success
2743 * ****************************************************************/
2744 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2746 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2747 FlowsMapped *qosFlow;
2749 /* In case of non-HO UE context creation and Xn Based HO, DRB's SNSSAI
2750 * configuration is not known beforehand. In these 2 case, the following
2751 * condition will hit */
2752 if(!hoInProgress || (hoInProgress == Xn_Based_Inter_CU_HO))
2755 flowCnt = drbInfo->numFlowMap;
2757 flowMap->list.count = flowCnt;
2758 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2759 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2760 if(flowMap->list.array == NULLP)
2762 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2765 for(idx=0; idx<flowCnt; idx++)
2767 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2768 if(flowMap->list.array[idx] == NULLP)
2770 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2774 if(!hoInProgress || (hoInProgress == Xn_Based_Inter_CU_HO))
2776 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2777 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2779 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2781 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2783 qosFlow = &drbInfo->flowMapList[flowIdx];
2790 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2791 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2796 qosFlow = &drbInfo->flowMapList[idx];
2797 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2800 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2801 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2804 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2808 if(((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item)) || (hoInProgress == Xn_Based_Inter_CU_HO))
2809 drbInfo->numFlowMap++;
2812 }/*End of BuildFlowsMap*/
2814 /*******************************************************************
2816 * @brief Builds the Uplink Tunnel Info
2820 * Function : BuildULTnlInfo
2822 * Functionality: Constructs the UL TnlInfo For DRB list
2824 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2826 * @return ROK - success
2829 * ****************************************************************/
2830 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2836 ulInfo->list.count = ulCnt;
2837 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2838 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2839 if(ulInfo->list.array == NULLP)
2841 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2844 for(idx=0; idx<ulCnt; idx++)
2846 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2847 if(ulInfo->list.array[idx] == NULLP)
2849 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2854 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2856 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2857 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2859 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2862 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2863 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2864 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2865 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2867 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2871 if((!hoInProgress) || (hoInProgress == Xn_Based_Inter_CU_HO))
2873 /* NOTE: Below IP address must be changed if running on different IP configuration */
2874 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2875 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2876 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2877 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2878 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2880 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2881 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2882 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2883 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2887 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2888 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2889 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2890 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2891 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2895 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2896 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2897 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2898 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2900 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2904 if((!hoInProgress) || (hoInProgress == Xn_Based_Inter_CU_HO))
2906 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2907 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2908 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2909 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2911 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2912 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2913 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2914 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2918 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2919 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2920 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2921 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2924 }/*End of BuildULTnlInfo*/
2926 /*******************************************************************
2928 * @brief Builds DRBS to be setup
2932 * Function : BuildDRBSetup
2934 * Functionality: Constructs the DRB's for UESetReq
2936 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2938 * @return ROK - success
2941 * ****************************************************************/
2942 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2944 uint16_t snssaiIdx=0;
2945 uint8_t idx = 0, extIeIdx = 0;
2946 uint8_t elementCnt = 0, drbCnt = 0;
2947 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2948 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2949 DRBs_ToBeSetup_Item_t *drbSetItem;
2950 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2951 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2953 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2954 drbCnt = ueCb->numDrb;
2956 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2957 drbSet->list.count = drbCnt;
2959 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2960 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2961 if(drbSet->list.array == NULLP)
2963 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2967 for(idx=0; idx<drbCnt; idx++)
2969 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2970 if(drbSet->list.array[idx] == NULLP)
2972 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2976 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2977 drbSet->list.array[idx]->criticality = Criticality_ignore;
2978 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2979 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2981 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2983 drbSetItem->dRBID = idx + 1;
2984 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2987 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2990 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2991 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2992 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2994 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2997 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2998 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2999 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
3000 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3001 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
3002 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
3004 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
3005 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, ueCb->hoInfo.HOType);
3006 if(BuildQOSInforet != ROK)
3008 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
3013 snssaiIdx = (idx% cuCb.numSnssaiSupported);
3014 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3015 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
3016 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
3018 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
3019 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], ueCb->hoInfo.HOType);
3020 if(BuildSNSSAIret != ROK)
3022 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
3026 /*Flows mapped to DRB List*/
3027 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3028 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
3029 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
3031 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
3032 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, ueCb->hoInfo.HOType);
3033 if(BuildFlowsMapret != ROK)
3035 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
3039 /*ULUPTNLInformation To Be Setup List*/
3040 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3041 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3044 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3045 ueCb->hoInfo.HOType);
3046 if(BuildULTnlInforet != ROK)
3048 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
3053 if((ueCb->state != UE_HANDOVER_IN_PROGRESS) || (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO))
3055 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3056 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
3059 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
3061 /* DL PDCP SN Length */
3062 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
3064 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
3065 if(!drbToBeSetupExt)
3067 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3072 drbToBeSetupExt->list.count = elementCnt;
3073 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3075 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3076 if(!drbToBeSetupExt->list.array)
3078 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3082 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3084 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3085 if(!drbToBeSetupExt->list.array[extIeIdx])
3087 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3093 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3095 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3096 drbToBeSetupExtIe->criticality = Criticality_ignore;
3097 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3098 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3099 drbSetItem->iE_Extensions = drbToBeSetupExt;
3102 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3106 }/* End of BuildDRBSetup*/
3108 /*******************************************************************
3110 * @brief Deallocating memory of function BuildAndSendUESetReq
3114 * Function : FreeNrcgi
3116 * Functionality: Deallocating memory for function BuildNrcgi
3118 * @params[in] NRCGI_t *nrcgi
3122 *******************************************************************/
3123 void FreeNrcgi(NRCGI_t *nrcgi)
3125 if(nrcgi->pLMN_Identity.buf != NULLP)
3127 if(nrcgi->nRCellIdentity.buf != NULLP)
3129 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3131 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3134 /*******************************************************************
3136 * @brief Deallocating memory of function BuildAndSendUESetReq
3140 * Function : FreeSplCellList
3142 * Functionality: Deallocating memory for function BuildSplCellList
3144 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3149 * *****************************************************************/
3150 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3153 if(spCellLst->list.array != NULLP)
3155 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3157 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3159 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3161 if(spCellLst->list.array[cellidx]!=NULLP)
3163 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3166 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3169 /*******************************************************************
3171 * @brief Deallocating memory of function BuildAndSendUESetReq
3175 * Function : FreeSRBSetup
3177 * Functionality: Deallocating memory for function BuildSRBSetup
3179 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3184 * ******************************************************************/
3185 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3188 if(srbSet->list.array != NULLP)
3190 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3192 if(srbSet->list.array[srbidx]!=NULLP)
3194 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3197 CU_FREE(srbSet->list.array,srbSet->list.size);
3200 /*******************************************************************
3202 * @brief Deallocating memory of function BuildAndSendUESetReq
3206 * Function : FreeQOSInfo
3208 * Functionality: Deallocating memory for function BuildQOSInfo
3210 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3214 * ****************************************************************/
3215 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3217 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3218 uint8_t qosCntIdx = 0;
3220 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3222 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3224 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3226 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3227 sizeof(MaxDataBurstVolume_t));
3229 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3230 sizeof(AveragingWindow_t));
3232 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3233 sizeof(NonDynamic5QIDescriptor_t));
3235 if(drbQos->iE_Extensions)
3237 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3238 if(qosIeExt->list.array != NULLP)
3240 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3242 if(qosIeExt->list.array[qosCntIdx])
3244 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3247 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3250 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3253 /*******************************************************************
3255 * @brief Deallocating memory of function BuildAndSendUESetReq
3259 * Function : FreeULTnlInfo
3261 * Functionality: Deallocating memory for function BuildULTnlInfo
3263 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3268 * ****************************************************************/
3269 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3272 if(ulInfo->list.array != NULLP)
3274 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3276 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3278 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3280 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3281 transportLayerAddress.buf != NULLP)
3283 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3286 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3287 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3288 gTPTunnel->gTP_TEID.size);
3290 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3291 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3292 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3294 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3295 sizeof(GTPTunnel_t));
3298 if(ulInfo->list.array[ulidx]!=NULLP)
3300 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3303 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3306 /*******************************************************************
3308 * @brief Deallocating memory for BuildAndSendUESetReq
3312 * Function : FreeDRBSetup
3314 * Functionality: Deallocating memory for BuildDRBSetup
3316 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3320 * ****************************************************************/
3321 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3323 DRBs_ToBeSetup_Item_t *drbSetItem;
3324 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3326 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3328 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3329 if(drbSet->list.array != NULLP)
3331 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3333 if(drbSet->list.array[drbidx] != NULLP)
3335 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3336 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3338 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3339 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3341 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3342 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3344 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3345 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3347 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3349 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3351 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3353 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3354 flows_Mapped_To_DRB_List.list.array != NULLP)
3356 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3357 flows_Mapped_To_DRB_List.list.count; flowidx++)
3359 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3360 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3362 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3363 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3364 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3366 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3367 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3368 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3370 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3371 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3372 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3374 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3375 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3377 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3378 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3379 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3380 sizeof(MaxDataBurstVolume_t));
3382 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3383 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3384 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3386 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3387 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3388 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3391 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3392 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3394 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3395 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3398 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3399 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3400 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3402 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3403 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3405 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3406 sizeof(OCTET_STRING_t));
3408 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3409 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3411 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3412 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3414 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3415 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3417 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3418 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3420 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3421 iE_Extensions != NULLP)
3423 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3424 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3425 if(qosIeExt->list.array != NULLP)
3427 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3429 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3431 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3434 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3436 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3437 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3440 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3442 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3445 CU_FREE(drbSet->list.array,drbSet->list.size);
3450 /*******************************************************************
3452 * @brief Free the UE Setup Request
3456 * Function : FreeUeContextSetupReq
3458 * Functionality: Deallocate the memory of BuildUESetReq
3460 * @params[in] F1AP_PDU_t *f1apMsg
3465 * ****************************************************************/
3466 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3469 UEContextSetupRequest_t *ueSetReq = NULLP;
3471 if(f1apMsg != NULLP)
3473 if(f1apMsg->choice.initiatingMessage != NULLP)
3475 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3476 if(ueSetReq->protocolIEs.list.array != NULLP)
3478 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3480 if(ueSetReq->protocolIEs.list.array[idx])
3482 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3484 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3486 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3488 case ProtocolIE_ID_id_SpCell_ID:
3489 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3491 case ProtocolIE_ID_id_ServCellIndex:
3493 case ProtocolIE_ID_id_SpCellULConfigured:
3495 case ProtocolIE_ID_id_CUtoDURRCInformation:
3496 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3498 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3499 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3501 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3502 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3504 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3505 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3507 case ProtocolIE_ID_id_RRCContainer:
3508 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3510 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3511 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3514 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3515 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3516 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3519 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3523 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3525 for(ieId=0; ieId<idx; ieId++)
3527 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3529 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3532 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3534 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3536 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3540 /**Filling cell group info **/
3541 /*******************************************************************
3543 * @brief Build Control resource set to add/modify list
3547 * Function : BuildControlRSetToAddModList
3549 * Functionality: Build Control resource set to add/modify list
3552 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3554 * @return ROK - success
3557 * ****************************************************************/
3558 uint8_t BuildControlRSetToAddModList
3560 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3565 uint8_t numBytes, bitsUnused;
3566 struct ControlResourceSet *controlRSet;
3567 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3568 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3571 controlRSetList->list.count = elementCnt;
3572 controlRSetList->list.size = \
3573 elementCnt * sizeof(struct ControlResourceSet *);
3575 controlRSetList->list.array = NULLP;
3576 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3577 if(!controlRSetList->list.array)
3579 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3583 for(idx = 0; idx < elementCnt; idx++)
3585 controlRSetList->list.array[idx] = NULLP;
3586 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3587 if(!controlRSetList->list.array[idx])
3589 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3595 controlRSet = controlRSetList->list.array[idx];
3596 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3598 /* Values harcoded according to our design:
3601 * Bit string stored ff0000000000
3605 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3606 controlRSet->frequencyDomainResources.buf = NULLP;
3607 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3608 controlRSet->frequencyDomainResources.size);
3609 if(!controlRSet->frequencyDomainResources.buf)
3611 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3615 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3616 coreset0EndPrb = CORESET0_END_PRB;
3617 coreset1StartPrb = coreset0EndPrb + 6;
3618 coreset1NumPrb = CORESET1_NUM_PRB;
3619 /* calculate the PRBs */
3620 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3621 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3622 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3624 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3625 controlRSet->cce_REG_MappingType.present = \
3626 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3628 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3629 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3630 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3631 controlRSet->tci_PresentInDCI = NULLP;
3633 uint8_t tciStateIdx;
3635 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3636 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3637 if(!controlRset->tci_StatesPDCCH_ToAddList)
3639 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3644 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3645 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3646 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3647 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3648 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3650 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3654 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3656 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3657 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3659 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3666 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3668 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3669 if(!controlRset->tci_PresentInDCI)
3671 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3675 *(controlRset->tci_PresentInDCI);
3678 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3679 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3680 if(!controlRSet->pdcch_DMRS_ScramblingID)
3682 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3685 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3688 } /* End BuildControlRSetToAddModList */
3690 /*******************************************************************
3692 * @brief Build search space to add/modify list
3696 * Function : BuildSearchSpcToAddModList
3698 * Functionality: Build search space to add/modify list
3701 * @return ROK - success
3704 * ****************************************************************/
3705 uint8_t BuildSearchSpcToAddModList
3707 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3715 struct SearchSpace *searchSpc;
3718 searchSpcList->list.count = elementCnt;
3719 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3721 searchSpcList->list.array = NULLP;
3722 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3723 if(!searchSpcList->list.array)
3725 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3729 for(idx = 0; idx < elementCnt; idx++)
3731 searchSpcList->list.array[idx] = NULLP;
3732 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3733 if(!searchSpcList->list.array[idx])
3735 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3741 searchSpc = searchSpcList->list.array[idx];
3743 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3745 searchSpc->controlResourceSetId = NULLP;
3746 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3747 if(!searchSpc->controlResourceSetId)
3749 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3752 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3754 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3755 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3756 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3757 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3759 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3762 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3763 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3765 searchSpc->duration = NULLP;
3766 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3767 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3768 if(!searchSpc->monitoringSymbolsWithinSlot)
3770 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3774 /* Values taken from reference logs :
3777 * Bit string stores 8000
3782 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3783 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3784 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3785 searchSpc->monitoringSymbolsWithinSlot->size);
3786 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3788 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3793 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3794 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3795 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3796 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3798 searchSpc->nrofCandidates = NULLP;
3799 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3800 if(!searchSpc->nrofCandidates)
3802 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3806 searchSpc->nrofCandidates->aggregationLevel1 = \
3807 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3808 searchSpc->nrofCandidates->aggregationLevel2 = \
3809 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3810 searchSpc->nrofCandidates->aggregationLevel4 = \
3811 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3812 searchSpc->nrofCandidates->aggregationLevel8 = \
3813 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3814 searchSpc->nrofCandidates->aggregationLevel16 = \
3815 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3817 searchSpc->searchSpaceType = NULLP;
3818 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3819 if(!searchSpc->searchSpaceType)
3821 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3825 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3827 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3828 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3829 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3830 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3832 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3835 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3836 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3839 }/* End BuildSearchSpcToAddModList */
3841 /*******************************************************************
3843 * @brief Builds BWP DL dedicated PDCCH config
3847 * Function : BuildBWPDlDedPdcchCfg
3849 * Functionality: Builds BWP DL dedicated PDCCH config
3851 * @params[in] struct PDCCH_Config *pdcchCfg
3853 * @return ROK - success
3856 * ****************************************************************/
3857 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3859 pdcchCfg->controlResourceSetToAddModList = NULLP;
3860 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3861 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3862 if(!pdcchCfg->controlResourceSetToAddModList)
3864 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3868 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3873 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3875 pdcchCfg->searchSpacesToAddModList = NULLP;
3876 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3877 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3878 if(!pdcchCfg->searchSpacesToAddModList)
3880 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3884 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3889 pdcchCfg->searchSpacesToReleaseList = NULLP;
3890 pdcchCfg->downlinkPreemption = NULLP;
3891 pdcchCfg->tpc_PUSCH = NULLP;
3892 pdcchCfg->tpc_PUCCH = NULLP;
3893 pdcchCfg->tpc_SRS = NULLP;
3898 /*******************************************************************
3900 * @brief Builds DMRS DL PDSCH Mapping type A
3904 * Function : BuildDMRSDLPdschMapTypeA
3906 * Functionality: Builds DMRS DL PDSCH Mapping type A
3909 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3910 * @return ROK - success
3913 * ****************************************************************/
3914 uint8_t BuildDMRSDLPdschMapTypeA
3916 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3919 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3920 dmrsDlCfg->choice.setup = NULLP;
3921 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3922 if(!dmrsDlCfg->choice.setup)
3924 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3928 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3929 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3930 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3931 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3933 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3936 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3938 dmrsDlCfg->choice.setup->maxLength = NULLP;
3939 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3940 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3941 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3946 /*******************************************************************
3948 * @brief Builds TCI states to add/modify list
3952 * Function : BuildTCIStatesToAddModList
3954 * Functionality:Builds TCI states to add/modify list
3957 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3959 * @return ROK - success
3962 * ****************************************************************/
3963 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3968 /*******************************************************************
3970 * @brief Builds PDSCH time domain allocation list
3974 * Function : BuildPdschTimeDomAllocList
3976 * Functionality: Builds PDSCH time domain allocation list
3979 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3981 * @return ROK - success
3984 * ****************************************************************/
3985 uint8_t BuildPdschTimeDomAllocList
3987 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3992 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3994 timeDomAllocList->present = \
3995 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3997 timeDomAllocList->choice.setup = NULLP;
3998 CU_ALLOC(timeDomAllocList->choice.setup, \
3999 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4000 if(!timeDomAllocList->choice.setup)
4002 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4007 timeDomAllocList->choice.setup->list.count = elementCnt;
4008 timeDomAllocList->choice.setup->list.size = \
4009 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
4011 timeDomAllocList->choice.setup->list.array = NULLP;
4012 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4013 timeDomAllocList->choice.setup->list.size);
4014 if(!timeDomAllocList->choice.setup->list.array)
4016 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4020 for(idx = 0; idx < elementCnt; idx++)
4022 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4023 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
4024 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4025 if(!timeDomAllocList->choice.setup->list.array[idx])
4027 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4033 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4034 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4035 if(!timeDomAlloc->k0)
4037 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4040 *(timeDomAlloc->k0) = 0;
4041 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4042 timeDomAlloc->startSymbolAndLength = 66;
4045 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4046 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4047 if(!timeDomAlloc->k0)
4049 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4052 *(timeDomAlloc->k0) = 1;
4053 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4054 timeDomAlloc->startSymbolAndLength = 66;
4059 /*******************************************************************
4061 * @brief Builds PDSCH PRB Bundling type
4065 * Function : BuildPdschPrbBundlingType
4067 * Functionality: Builds PDSCH PRB Bundling type
4070 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4072 * @return ROK - success
4075 * ****************************************************************/
4076 uint8_t BuildPdschPrbBundlingType
4078 struct PDSCH_Config__prb_BundlingType *prbBndlType
4081 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4083 prbBndlType->choice.staticBundling = NULLP;
4084 CU_ALLOC(prbBndlType->choice.staticBundling, \
4085 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4086 if(!prbBndlType->choice.staticBundling)
4088 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4091 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4096 /*******************************************************************
4098 * @brief Builds BWP DL dedicated PDSCH config
4102 * Function : BuildBWPDlDedPdschCfg
4104 * Functionality: Builds BWP DL dedicated PDSCH config
4106 * @params[in] struct PDSCH_Config *pdschCfg
4108 * @return ROK - success
4111 * ****************************************************************/
4112 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4114 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4116 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4117 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4118 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4119 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4121 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4125 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4130 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4131 pdschCfg->tci_StatesToAddModList = NULLP;
4132 pdschCfg->tci_StatesToReleaseList = NULLP;
4133 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4135 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4136 if(!pdschCfg->tci_StatesToAddModList)
4138 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4141 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4147 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4149 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4150 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4151 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4152 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4154 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4157 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4161 pdschCfg->pdsch_AggregationFactor = NULLP;
4162 pdschCfg->rateMatchPatternToAddModList = NULLP;
4163 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4164 pdschCfg->rateMatchPatternGroup1 = NULLP;
4165 pdschCfg->rateMatchPatternGroup2 = NULLP;
4166 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4167 pdschCfg->mcs_Table = NULLP;
4169 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4170 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4171 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4173 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4176 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4178 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4183 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4184 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4185 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4186 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4187 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4188 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4189 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4194 /*******************************************************************
4196 * @brief Builds intitial DL BWP
4199 * Function : BuildInitialDlBWP
4201 * Functionality: Builds intitial DL BWP in spCellCfgDed
4203 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4205 * @return ROK - success
4208 * ****************************************************************/
4209 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4211 dlBwp->pdcch_Config = NULLP;
4212 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4213 if(!dlBwp->pdcch_Config)
4215 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4218 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4220 dlBwp->pdcch_Config->choice.setup = NULLP;
4221 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4222 if(!dlBwp->pdcch_Config->choice.setup)
4224 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4227 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4232 dlBwp->pdsch_Config = NULLP;
4233 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4234 if(!dlBwp->pdsch_Config)
4236 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4239 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4241 dlBwp->pdsch_Config->choice.setup = NULLP;
4242 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4243 if(!dlBwp->pdsch_Config->choice.setup)
4245 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4249 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4254 dlBwp->sps_Config = NULLP;
4255 dlBwp->radioLinkMonitoringConfig = NULLP;
4259 /*******************************************************************
4261 * @brief Builds DMRS UL Pusch Mapping type A
4265 * Function : BuildDMRSULPuschMapTypeA
4267 * Functionality: Builds DMRS UL Pusch Mapping type A
4270 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4271 * @return ROK - success
4274 * ****************************************************************/
4275 uint8_t BuildDMRSULPuschMapTypeA
4277 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4280 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4281 dmrsUlCfg->choice.setup= NULLP;
4282 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4283 if(!dmrsUlCfg->choice.setup)
4285 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4289 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4290 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4291 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4292 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4294 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4297 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4299 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4300 dmrsUlCfg->choice.setup->maxLength = NULLP;
4301 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4302 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4303 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4304 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4306 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4310 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4311 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4313 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4315 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4318 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4320 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4321 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4325 /*******************************************************************
4327 * @brief Build PUSCH time domain allocation list
4331 * Function : BuildPuschTimeDomAllocList
4333 * Functionality: Build PUSCH time domain allocation list
4336 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4338 * @return ROK - success
4341 * ****************************************************************/
4342 uint8_t BuildPuschTimeDomAllocList
4344 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4349 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4351 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4352 timeDomAllocList->choice.setup = NULLP;
4353 CU_ALLOC(timeDomAllocList->choice.setup, \
4354 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4355 if(!timeDomAllocList->choice.setup)
4357 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4362 timeDomAllocList->choice.setup->list.count = elementCnt;
4363 timeDomAllocList->choice.setup->list.size = \
4364 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4365 timeDomAllocList->choice.setup->list.array = NULLP;
4366 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4367 timeDomAllocList->choice.setup->list.size);
4368 if(!timeDomAllocList->choice.setup->list.array)
4370 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4374 for(idx = 0; idx < elementCnt; idx++)
4376 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4377 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4378 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4379 if(!timeDomAllocList->choice.setup->list.array[idx])
4381 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4387 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4388 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4389 if(!timeDomAlloc->k2)
4391 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4394 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4395 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4396 timeDomAlloc->startSymbolAndLength = 66;
4399 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4400 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4401 if(!timeDomAlloc->k2)
4403 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4406 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4407 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4408 timeDomAlloc->startSymbolAndLength = 66;
4413 /*******************************************************************
4415 * @brief Builds BWP UL dedicated PUSCH Config
4419 * Function : BuildBWPUlDedPuschCfg
4422 * Builds BWP UL dedicated PUSCH Config
4424 * @params[in] : PUSCH_Config_t *puschCfg
4426 * @return ROK - success
4429 * ****************************************************************/
4430 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4432 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4433 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4434 if(!puschCfg->dataScramblingIdentityPUSCH)
4436 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4439 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4441 puschCfg->txConfig = NULLP;
4442 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4443 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4444 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4445 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4447 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4451 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4456 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4457 puschCfg->pusch_PowerControl = NULLP;
4458 puschCfg->frequencyHopping = NULLP;
4459 puschCfg->frequencyHoppingOffsetLists = NULLP;
4460 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4462 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4463 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4464 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4465 if(!puschCfg->pusch_TimeDomainAllocationList)
4467 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4471 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4476 puschCfg->pusch_AggregationFactor = NULLP;
4477 puschCfg->mcs_Table = NULLP;
4478 puschCfg->mcs_TableTransformPrecoder = NULLP;
4479 puschCfg->transformPrecoder = NULLP;
4480 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4481 if(!puschCfg->transformPrecoder)
4483 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4486 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4488 puschCfg->codebookSubset = NULLP;
4489 puschCfg->maxRank = NULLP;
4490 puschCfg->rbg_Size = NULLP;
4491 puschCfg->uci_OnPUSCH = NULLP;
4492 puschCfg->tp_pi2BPSK = NULLP;
4497 /*******************************************************************
4499 * @brief Builds BWP UL dedicated PUCCH Config
4503 * Function : BuildBWPUlDedPucchCfg
4506 * Builds BWP UL dedicated PUCCH Config
4508 * @params[in] : PUCCH_Config_t *pucchCfg
4510 * @return ROK - success
4513 * ****************************************************************/
4514 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4516 uint8_t arrIdx, elementCnt;
4517 uint8_t rsrcIdx, rsrcSetIdx;
4518 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4519 PUCCH_Resource_t *rsrc = NULLP;
4523 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4524 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4525 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4526 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4527 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4529 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4532 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4533 rsrcSet->pucch_ResourceSetId = 1;
4535 rsrcSet->resourceList.list.count = elementCnt;
4536 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4537 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4538 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4540 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4543 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4547 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4548 pucchCfg->resourceToAddModList->list.count = elementCnt;
4549 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4550 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4551 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4553 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4556 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4557 rsrc->pucch_ResourceId = 1;
4558 rsrc->startingPRB = 0;
4559 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4560 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4561 rsrc->format.choice.format1->initialCyclicShift = 0;
4562 rsrc->format.choice.format1->nrofSymbols = 4;
4563 rsrc->format.choice.format1->startingSymbolIndex = 0;
4564 rsrc->format.choice.format1->timeDomainOCC = 0;
4567 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4568 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4569 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4570 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4571 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4574 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4575 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4577 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4582 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4583 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4584 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4585 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4587 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4591 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4593 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4594 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4596 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4602 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4603 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4608 /*******************************************************************
4610 * @brief Fills SRS resource to add/modify list
4614 * Function : BuildSrsRsrcAddModList
4616 * Functionality: Fills SRS resource to add/modify list
4619 * @return ROK - success
4622 * ****************************************************************/
4623 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4629 resourceList->list.count = elementCnt;
4630 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4631 resourceList->list.array = NULLP;
4632 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4633 if(!resourceList->list.array)
4635 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4639 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4641 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4642 if(!resourceList->list.array[rsrcIdx])
4644 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4650 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4651 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4652 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4654 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4655 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4656 sizeof(struct SRS_Resource__transmissionComb__n2));
4657 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4659 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4662 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4663 = SRS_COMB_OFFSET_N2;
4664 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4665 = SRS_CYCLIC_SHIFT_N2;
4667 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4668 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4669 SRS_Resource__resourceMapping__nrofSymbols_n1;
4670 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4671 SRS_Resource__resourceMapping__repetitionFactor_n1;
4673 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4674 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4675 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4676 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4677 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4678 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4679 SRS_Resource__groupOrSequenceHopping_neither;
4681 /* Setting resource type to aperiodic for intergration purposes */
4682 resourceList->list.array[rsrcIdx]->resourceType.present = \
4683 SRS_Resource__resourceType_PR_aperiodic;
4684 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4685 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4686 sizeof(struct SRS_Resource__resourceType__aperiodic));
4687 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4689 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4692 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4697 /*******************************************************************
4699 * @brief Build SRS resource set Add/mod list
4703 * Function : BuildSrsRsrcSetAddModList
4705 * Functionality: Build SRS resource set Add/mod list
4708 * @return ROK - success
4711 * ****************************************************************/
4712 uint8_t BuildSrsRsrcSetAddModList
4714 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4720 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4723 rsrcSetList->list.count = elementCnt;
4724 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4725 rsrcSetList->list.array = NULLP;
4726 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4727 if(!rsrcSetList->list.array)
4729 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4733 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4735 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4736 if(!rsrcSetList->list.array[rSetIdx])
4738 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4744 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4746 /* Fill Resource Id list in resource set */
4747 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4748 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4749 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4750 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4752 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4757 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4758 rsrcIdList->list.count = elementCnt;
4759 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4760 rsrcIdList->list.array = NULLP;
4761 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4762 if(!rsrcIdList->list.array)
4764 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4768 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4770 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4771 if(!rsrcIdList->list.array[rsrcIdx])
4773 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4779 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4781 /* Fill resource type */
4782 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4783 SRS_ResourceSet__resourceType_PR_aperiodic;
4785 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4786 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4787 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4788 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4790 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4793 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4794 = APERIODIC_SRS_RESRC_TRIGGER;
4796 /* TODO : Fill values for below IEs as expected by Viavi */
4797 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4798 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4801 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4802 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4803 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4804 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4805 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4810 /*******************************************************************
4812 * @brief Builds BWP UL dedicated SRS Config
4816 * Function : BuildBWPUlDedSrsCfg
4818 * Functionality: Builds BWP UL dedicated SRS Config
4820 * @params[in] SRS Config
4821 * @return ROK - success
4824 * ****************************************************************/
4825 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4827 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4828 srsCfg->srs_ResourceSetToAddModList = NULLP;
4829 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4830 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4831 if(!srsCfg->srs_ResourceSetToAddModList)
4833 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4836 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4841 srsCfg->srs_ResourceToReleaseList = NULLP;
4843 /* Resource to Add/Modify list */
4844 srsCfg->srs_ResourceToAddModList = NULLP;
4845 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4846 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4847 if(!srsCfg->srs_ResourceToAddModList)
4849 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4853 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4858 srsCfg->tpc_Accumulation = NULLP;
4863 /*******************************************************************
4865 * @brief Builds inital UL BWP
4869 * Function : BuildInitialUlBWP
4871 * Functionality: Builds initial UL BWP
4873 * @params[in] BWP_UplinkDedicated_t *ulBwp
4874 * @return ROK - success
4877 * ****************************************************************/
4878 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4880 ulBwp->pucch_Config = NULLP;
4881 ulBwp->pucch_Config = NULLP;
4882 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4883 if(!ulBwp->pucch_Config)
4885 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4889 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4890 ulBwp->pucch_Config->choice.setup = NULLP;
4891 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4892 if(!ulBwp->pucch_Config->choice.setup)
4894 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4898 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4903 /* Fill BWP UL dedicated PUSCH config */
4904 ulBwp->pusch_Config = NULLP;
4905 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4906 if(!ulBwp->pusch_Config)
4908 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4912 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4913 ulBwp->pusch_Config->choice.setup = NULLP;
4914 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4915 if(!ulBwp->pusch_Config->choice.setup)
4917 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4921 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4926 ulBwp->configuredGrantConfig = NULLP;
4928 /* Fill BPW UL dedicated SRS config */
4929 ulBwp->srs_Config = NULLP;
4930 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4931 if(!ulBwp->srs_Config)
4933 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4937 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4938 ulBwp->srs_Config->choice.setup = NULLP;
4939 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4940 if(!ulBwp->srs_Config->choice.setup)
4942 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4946 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4951 ulBwp->beamFailureRecoveryConfig = NULLP;
4956 /*******************************************************************
4958 * @brief Builds Pusch Serving cell Config
4962 * Function : BuildPuschSrvCellCfg
4964 * Functionality: Builds Pusch Serving cell Config
4966 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4968 * @return ROK - success
4971 * ****************************************************************/
4972 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4974 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4975 puschCfg->choice.setup = NULLP;
4976 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4977 if(!puschCfg->choice.setup)
4979 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4983 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4984 puschCfg->choice.setup->rateMatching = NULLP;
4985 puschCfg->choice.setup->xOverhead = NULLP;
4986 puschCfg->choice.setup->ext1 = NULLP;
4987 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4988 if(!puschCfg->choice.setup->ext1)
4990 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4994 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4995 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4996 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4998 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5001 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
5003 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
5004 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
5005 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
5007 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5010 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
5014 /*******************************************************************
5016 * @brief Builds UL config
5019 * Function : BuildUlCfg
5021 * Functionality: Builds UL config in spCellCfgDed
5023 * @params[in] UplinkConfig_t *ulCfg
5025 * @return ROK - success
5028 * ****************************************************************/
5029 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
5031 ulCfg->initialUplinkBWP = NULLP;
5032 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5033 if(!ulCfg->initialUplinkBWP)
5035 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5039 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
5044 ulCfg->uplinkBWP_ToReleaseList = NULLP;
5045 ulCfg->uplinkBWP_ToAddModList = NULLP;
5046 ulCfg->firstActiveUplinkBWP_Id = NULLP;
5047 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5048 if(!ulCfg->firstActiveUplinkBWP_Id)
5050 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5053 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5055 ulCfg->pusch_ServingCellConfig = NULLP;
5056 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
5057 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5058 if(!ulCfg->pusch_ServingCellConfig)
5060 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5064 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5069 ulCfg->carrierSwitching = NULLP;
5070 ulCfg->ext1 = NULLP;
5074 /*******************************************************************
5076 * @brief Builds PDSCH serving cell config
5079 * Function : BuildPdschSrvCellCfg
5081 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5083 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5085 * @return ROK - success
5088 * ****************************************************************/
5089 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5091 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5092 pdschCfg->choice.setup = NULLP;
5093 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5094 if(!pdschCfg->choice.setup)
5096 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5100 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5101 pdschCfg->choice.setup->xOverhead = NULLP;
5102 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5103 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5104 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5106 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5109 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5110 pdschCfg->choice.setup->pucch_Cell = NULLP;
5111 pdschCfg->choice.setup->ext1 = NULLP;
5116 /*******************************************************************
5118 * @brief Builds CSI Meas config
5121 * Function : BuildCsiMeasCfg
5123 * Functionality: Builds CSI Meas config in spCellCfgDed
5125 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5127 * @return ROK - success
5130 * ****************************************************************/
5131 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5137 /*******************************************************************
5139 * @brief Builds Spcell config dedicated
5142 * Function : BuildSpCellCfgDed
5144 * Functionality: Builds sp cell config dedicated in spCellCfg
5146 * @params[in] ServingCellConfig_t srvCellCfg
5148 * @return ROK - success
5151 * ****************************************************************/
5152 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5154 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5156 srvCellCfg->initialDownlinkBWP = NULLP;
5157 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5158 if(!srvCellCfg->initialDownlinkBWP)
5160 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5164 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5166 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5169 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5170 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5172 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5173 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5174 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5176 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5179 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5181 srvCellCfg->bwp_InactivityTimer = NULLP;
5183 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5184 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5185 if(!srvCellCfg->defaultDownlinkBWP_Id)
5187 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5190 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5192 srvCellCfg->uplinkConfig = NULLP;
5193 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5194 if(!srvCellCfg->uplinkConfig)
5196 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5200 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5202 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5205 srvCellCfg->supplementaryUplink = NULLP;
5206 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5208 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5209 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5210 if(!srvCellCfg->pdsch_ServingCellConfig)
5212 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5216 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5218 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5222 srvCellCfg->csi_MeasConfig = NULLP;
5224 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5225 if(!srvCellCfg->csi_MeasConfig)
5227 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5231 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5233 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5237 srvCellCfg->sCellDeactivationTimer = NULLP;
5238 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5239 srvCellCfg->tag_Id = TAG_ID;
5240 srvCellCfg->dummy = NULLP;
5241 srvCellCfg->pathlossReferenceLinking = NULLP;
5242 srvCellCfg->servingCellMO = NULLP;
5243 srvCellCfg->ext1 = NULLP;
5247 /*******************************************************************
5249 * @brief Builds Spcell config
5253 * Function : BuildSpCellCfg
5255 * Functionality: Builds sp cell config in DuToCuRrcContainer
5257 * @params[in] SpCellConfig_t spCellCfg
5259 * @return ROK - success
5262 * ****************************************************************/
5263 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5266 spCellCfg->servCellIndex = NULLP;
5267 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5268 if(!spCellCfg->servCellIndex)
5270 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5273 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5275 spCellCfg->reconfigurationWithSync = NULLP;
5276 spCellCfg->rlf_TimersAndConstants = NULLP;
5277 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5278 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5279 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5281 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5284 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5286 spCellCfg->spCellConfigDedicated = NULLP;
5287 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5288 if(!spCellCfg->spCellConfigDedicated)
5290 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5293 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5295 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5300 /*******************************************************************
5302 * @brief Builds Phy cell group config
5306 * Function : BuildPhyCellGrpCfg
5308 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5310 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5312 * @return ROK - success
5315 * ****************************************************************/
5316 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5318 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5319 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5321 phyCellGrpCfg->p_NR_FR1 = NULLP;
5322 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5323 if(!phyCellGrpCfg->p_NR_FR1)
5325 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5328 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5329 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5330 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5331 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5332 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5333 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5334 phyCellGrpCfg->cs_RNTI = NULLP;
5335 phyCellGrpCfg->ext1 = NULLP;
5336 phyCellGrpCfg->ext2 = NULLP;
5341 /*******************************************************************
5343 * @brief Builds tag config
5347 * Function : BuildTagConfig
5349 * Functionality: Builds tag config in MacCellGroupConfig
5351 * @params[in] TAG_Config *tag_Config
5353 * @return ROK - success
5356 * ****************************************************************/
5357 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5359 struct TAG_Config__tag_ToAddModList *tagList;
5360 uint8_t idx, elementCnt;
5362 tagConfig->tag_ToReleaseList = NULLP;
5363 tagConfig->tag_ToAddModList = NULLP;
5364 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5365 if(!tagConfig->tag_ToAddModList)
5367 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5371 elementCnt = 1; //ODU_VALUE_ONE;
5372 tagList = tagConfig->tag_ToAddModList;
5373 tagList->list.count = elementCnt;
5374 tagList->list.size = elementCnt * sizeof(struct TAG *);
5376 tagList->list.array = NULLP;
5377 CU_ALLOC(tagList->list.array, tagList->list.size);
5378 if(!tagList->list.array)
5380 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5384 for(idx=0; idx<tagList->list.count; idx++)
5386 tagList->list.array[idx] = NULLP;
5387 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5388 if(!tagList->list.array[idx])
5390 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5396 tagList->list.array[idx]->tag_Id = TAG_ID;
5397 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5402 /*******************************************************************
5404 * @brief Builds PHR Config
5408 * Function : BuildPhrConfig
5410 * Functionality: Builds phrConfig in MacCellGroupConfig
5412 * @params[in] PHR Config *
5414 * @return ROK - success
5417 * ****************************************************************/
5418 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5421 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5422 phrConfig->choice.setup = NULLP;
5423 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5424 if(!phrConfig->choice.setup)
5426 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5430 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5431 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5432 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5433 phrConfig->choice.setup->multiplePHR = false;
5434 phrConfig->choice.setup->dummy = false;
5435 phrConfig->choice.setup->phr_Type2OtherCell = false;
5436 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5441 /*******************************************************************
5443 * @brief Builds BSR Config
5447 * Function : BuildBsrConfig
5449 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5451 * @params[in] BSR_Config *bsrConfig
5453 * @return ROK - success
5456 * ****************************************************************/
5457 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5459 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5460 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5461 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5466 /*******************************************************************
5468 * @brief Builds scheduling request config
5472 * Function : BuildSchedulingReqConfig
5474 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5476 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5478 * @return ROK - success
5481 * ****************************************************************/
5482 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5484 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5485 uint8_t idx, elementCnt;
5487 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5488 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5489 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5490 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5492 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5496 elementCnt = 1; //ODU_VALUE_ONE;
5497 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5498 schReqList->list.count = elementCnt;
5499 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5501 schReqList->list.array = NULLP;
5502 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5503 if(!schReqList->list.array)
5505 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5509 for(idx=0;idx<schReqList->list.count; idx++)
5511 schReqList->list.array[idx] = NULLP;
5512 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5513 if(!schReqList->list.array[idx])
5515 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5521 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5523 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5524 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5525 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5527 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5530 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5531 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5532 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5536 /*******************************************************************
5538 * @brief Builds Mac cell group config
5542 * Function : BuildMacCellGrpCfg
5544 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5546 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5548 * @return ROK - success
5551 * ****************************************************************/
5552 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5554 macCellGrpCfg->drx_ConfigRrc = NULLP;
5555 macCellGrpCfg->schedulingRequestConfig = NULLP;
5556 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5557 if(!macCellGrpCfg->schedulingRequestConfig)
5559 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5563 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5565 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5569 macCellGrpCfg->bsr_Config = NULLP;
5570 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5571 if(!macCellGrpCfg->bsr_Config)
5573 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5577 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5579 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5583 macCellGrpCfg->tag_Config = NULLP;
5584 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5585 if(!macCellGrpCfg->tag_Config)
5587 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5591 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5593 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5597 macCellGrpCfg->phr_Config = NULLP;
5598 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5599 if(!macCellGrpCfg->phr_Config)
5601 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5605 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5607 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5611 macCellGrpCfg->skipUplinkTxDynamic = false;
5612 macCellGrpCfg->ext1 = NULLP;
5616 /*******************************************************************
5618 * @brief Frees memeory allocated for SearchSpcToAddModList
5622 * Function : FreeSearchSpcToAddModList
5624 * Functionality: Deallocating memory of SearchSpcToAddModList
5626 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5630 4221 * ****************************************************************/
5631 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5635 struct SearchSpace *searchSpc=NULLP;
5637 if(searchSpcList->list.array)
5639 if(searchSpcList->list.array[idx2])
5641 searchSpc = searchSpcList->list.array[idx2];
5642 if(searchSpc->controlResourceSetId)
5644 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5646 if(searchSpc->monitoringSymbolsWithinSlot)
5648 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5650 if(searchSpc->nrofCandidates)
5652 if(searchSpc->searchSpaceType)
5654 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5655 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5656 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5657 SearchSpace__searchSpaceType));
5659 CU_FREE(searchSpc->nrofCandidates,
5660 sizeof(struct SearchSpace__nrofCandidates));
5662 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5663 searchSpc->monitoringSymbolsWithinSlot->size);
5665 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5666 sizeof(BIT_STRING_t));
5668 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5669 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5671 CU_FREE(searchSpc->controlResourceSetId,
5672 sizeof(ControlResourceSetId_t));
5675 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5677 CU_FREE(searchSpcList->list.array[idx1],
5678 sizeof(struct SearchSpace));
5680 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5683 /*******************************************************************
5685 * @brief Frees memory allocated for PdschTimeDomAllocList
5689 * Function : FreePdschTimeDomAllocList
5691 * Functionality: Deallocating memory of PdschTimeDomAllocList
5693 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5697 4221 * ****************************************************************/
5698 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5702 if(timeDomAllocList->choice.setup)
5704 if(timeDomAllocList->choice.setup->list.array)
5706 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5708 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5709 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5711 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5712 timeDomAllocList->choice.setup->list.size);
5714 CU_FREE(timeDomAllocList->choice.setup,\
5715 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5718 /*******************************************************************
5720 * @brief Frees memory allocated for PuschTimeDomAllocList
5724 * Function : FreePuschTimeDomAllocList
5726 * Functionality: Deallocating memory of PuschTimeDomAllocList
5728 * @params[in] PUSCH_Config_t *puschCfg
5732 ***********************************************************************/
5733 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5737 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5739 if(puschCfg->pusch_TimeDomainAllocationList)
5741 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5742 if(timeDomAllocList_t->choice.setup)
5744 if(timeDomAllocList_t->choice.setup->list.array)
5746 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5747 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5749 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5750 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5752 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5753 timeDomAllocList_t->choice.setup->list.size);
5755 CU_FREE(timeDomAllocList_t->choice.setup, \
5756 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5758 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5759 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5760 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5765 /*******************************************************************
5767 * @brief Frees memory allocated for Dedicated PUCCH config
5771 * Function : FreeBWPUlDedPucchCfg
5773 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5775 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5779 * ****************************************************************/
5780 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5782 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5783 PUCCH_Config_t *pucchCfg = NULLP;
5784 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5785 PUCCH_Resource_t *rsrc = NULLP;
5789 if(ulBwpPucchCfg->choice.setup)
5791 pucchCfg = ulBwpPucchCfg->choice.setup;
5793 //Free resource set list
5794 if(pucchCfg->resourceSetToAddModList)
5796 if(pucchCfg->resourceSetToAddModList->list.array)
5798 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5800 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5801 if(rsrcSet->resourceList.list.array)
5803 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5805 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5807 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5809 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5811 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5813 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5816 //Free resource list
5817 if(pucchCfg->resourceToAddModList)
5819 if(pucchCfg->resourceToAddModList->list.array)
5821 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5823 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5824 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5825 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5827 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5829 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5833 if(pucchCfg->format1)
5835 if(pucchCfg->format1->choice.setup)
5837 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5838 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5840 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5844 if(pucchCfg->dl_DataToUL_ACK)
5846 if(pucchCfg->dl_DataToUL_ACK->list.array)
5848 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5850 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5852 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5854 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5857 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5859 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5863 /*******************************************************************
5865 * @brief Frees memory allocated for InitialUlBWP
5869 * Function : FreeInitialUlBWP
5871 * Functionality: Deallocating memory of InitialUlBWP
5873 * @params[in] BWP_UplinkDedicated_t *ulBwp
5877 * ****************************************************************/
5878 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5880 uint8_t rSetIdx, rsrcIdx;
5881 SRS_Config_t *srsCfg = NULLP;
5882 PUSCH_Config_t *puschCfg = NULLP;
5883 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5884 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5885 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5886 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5888 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5890 if(ulBwp->pusch_Config)
5892 if(ulBwp->pusch_Config->choice.setup)
5894 puschCfg=ulBwp->pusch_Config->choice.setup;
5895 if(puschCfg->dataScramblingIdentityPUSCH)
5897 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5899 FreePuschTimeDomAllocList(puschCfg);
5900 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5901 if(dmrsUlCfg->choice.setup)
5903 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5905 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5907 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5909 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5910 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5912 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5915 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5917 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5918 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5920 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5922 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5924 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5926 /* Free SRS-Config */
5927 if(ulBwp->srs_Config)
5929 if(ulBwp->srs_Config->choice.setup)
5931 srsCfg = ulBwp->srs_Config->choice.setup;
5933 /* Free Resource Set to add/mod list */
5934 if(srsCfg->srs_ResourceSetToAddModList)
5936 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5937 if(rsrcSetList->list.array)
5941 /* Free SRS resource Id list in this SRS resource set */
5942 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5944 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5946 if(rsrcIdList->list.array)
5948 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5950 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5952 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5954 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5955 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5958 /* Free resource type info for this SRS resource set */
5959 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5960 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5962 /* Free memory for each resource set */
5963 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5965 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5967 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5969 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5970 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5973 /* Free resource to add/modd list */
5974 if(srsCfg->srs_ResourceToAddModList)
5976 resourceList = srsCfg->srs_ResourceToAddModList;
5977 if(resourceList->list.array)
5980 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5981 sizeof(struct SRS_Resource__transmissionComb__n2));
5982 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5983 sizeof(struct SRS_Resource__resourceType__aperiodic));
5985 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5987 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5989 CU_FREE(resourceList->list.array, resourceList->list.size);
5991 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5992 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5995 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5997 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
6001 /*******************************************************************
6003 * @brief Frees memory allocated for initialUplinkBWP
6007 * Function : FreeinitialUplinkBWP
6009 * Functionality: Deallocating memory of initialUplinkBWP
6011 * @params[in] UplinkConfig_t *ulCfg
6016 * ****************************************************************/
6017 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
6019 BWP_UplinkDedicated_t *ulBwp=NULLP;
6020 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6022 if(ulCfg->initialUplinkBWP)
6024 ulBwp=ulCfg->initialUplinkBWP;
6025 if(ulCfg->firstActiveUplinkBWP_Id)
6027 if(ulCfg->pusch_ServingCellConfig)
6029 puschCfg=ulCfg->pusch_ServingCellConfig;
6030 if(puschCfg->choice.setup)
6032 if(puschCfg->choice.setup->ext1)
6034 CU_FREE(puschCfg->choice.setup->ext1->\
6035 processingType2Enabled,sizeof(BOOLEAN_t));
6036 CU_FREE(puschCfg->choice.setup->ext1->\
6037 maxMIMO_Layers,sizeof(long));
6038 CU_FREE(puschCfg->choice.setup->ext1, \
6039 sizeof(struct PUSCH_ServingCellConfig__ext1));
6041 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
6043 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
6045 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
6047 FreeInitialUlBWP(ulBwp);
6048 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6051 /*******************************************************************
6053 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6057 * Function : FreeBWPDlDedPdschCfg
6059 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6061 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6066 * ****************************************************************/
6067 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6069 struct PDSCH_Config *pdschCfg=NULLP;
6070 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6071 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6072 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6074 if(dlBwp->pdsch_Config->choice.setup)
6076 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6077 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6079 if(pdschCfg->pdsch_TimeDomainAllocationList)
6081 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6082 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6084 prbBndlType=&pdschCfg->prb_BundlingType;
6085 CU_FREE(prbBndlType->choice.staticBundling,\
6086 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6087 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6089 FreePdschTimeDomAllocList(timeDomAllocList);
6090 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6091 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6093 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6094 if(dmrsDlCfg->choice.setup)
6096 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6098 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6100 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6101 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6103 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6106 /*******************************************************************
6108 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6112 * Function : FreeBWPDlDedPdcchCfg
6114 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6116 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6121 * ****************************************************************/
6122 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6126 struct PDCCH_Config *pdcchCfg=NULLP;
6127 struct ControlResourceSet *controlRSet=NULLP;
6128 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6130 if(dlBwp->pdcch_Config->choice.setup)
6132 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6133 if(pdcchCfg->controlResourceSetToAddModList)
6135 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6136 if(controlRSetList->list.array)
6138 controlRSet = controlRSetList->list.array[idx2];
6141 if(controlRSet->frequencyDomainResources.buf)
6143 if(controlRSet->pdcch_DMRS_ScramblingID)
6145 if(pdcchCfg->searchSpacesToAddModList)
6147 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6148 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6149 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6151 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6153 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6154 controlRSet->frequencyDomainResources.size);
6157 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6159 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6161 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6163 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6164 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6166 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6169 /*******************************************************************
6171 * @brief Builds RLC Config
6175 * Function : BuildRlcConfig
6177 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6179 * @params[in] RLC_Config *rlcConfig
6181 * @return ROK - success
6184 * ****************************************************************/
6185 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6187 rlcConfig->present = rlcLcCfgDb.rlcMode;
6189 switch(rlcConfig->present)
6191 case RLC_Config_PR_am:
6193 rlcConfig->choice.am = NULLP;
6194 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6195 if(!rlcConfig->choice.am)
6197 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6202 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6203 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6204 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6206 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6209 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6210 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6211 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6212 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6213 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6216 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6217 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6218 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6220 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6223 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6224 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6225 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6230 case RLC_Config_PR_um_Bi_Directional:
6232 rlcConfig->choice.um_Bi_Directional = NULLP;
6233 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6234 if(!rlcConfig->choice.um_Bi_Directional)
6236 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6241 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6242 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6243 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6245 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6248 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6251 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6252 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6253 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6255 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6258 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6259 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6266 /*******************************************************************
6268 * @brief Builds MAC LC Config
6272 * Function : BuildMacLCConfig
6274 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6276 * @params[in] struct LogicalChannelConfig macLcConfig
6278 * @return ROK - success
6281 * ****************************************************************/
6282 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6285 macLcConfig->ul_SpecificParameters = NULLP;
6286 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6287 if(!macLcConfig->ul_SpecificParameters)
6289 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6293 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6294 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6295 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6296 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6297 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6298 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6299 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6301 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6302 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6303 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6305 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6308 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6310 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6311 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6312 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6314 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6317 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6319 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6320 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6321 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6325 /*******************************************************************
6327 * @brief Builds RLC Bearer to Add/Mod list
6331 * Function :BuildRlcBearerToAddModList
6333 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6335 * @params[in] rlc_BearerToAddModList
6337 * @return ROK - success
6340 * ****************************************************************/
6341 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6343 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6346 elementCnt = ueCb->numSrb + ueCb->numDrb;
6349 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6351 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6355 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6357 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6364 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6367 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6370 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6373 rlcBearerList->list.count = elementCnt;
6374 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6376 rlcBearerList->list.array = NULLP;
6377 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6378 if(!rlcBearerList->list.array)
6380 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6384 for(idx=0; idx<rlcBearerList->list.count; idx++)
6386 rlcBearerList->list.array[idx] = NULLP;
6387 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6388 if(!rlcBearerList->list.array[idx])
6390 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6397 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6399 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6402 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6404 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6405 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6407 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6411 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6412 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6414 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6415 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6416 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6417 if(!rlcBearerList->list.array[idx]->rlc_Config)
6419 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6423 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6425 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6429 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6430 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6431 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6433 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6437 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6439 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6445 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6447 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6450 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6452 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6453 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6455 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6459 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6460 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6462 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6463 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6464 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6465 if(!rlcBearerList->list.array[idx]->rlc_Config)
6467 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6471 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6473 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6477 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6478 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6479 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6481 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6485 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6487 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6495 /*******************************************************************
6497 * @brief Free memory allocated for CellGroupConfig
6501 * Function : FreeMemCellGrpCfg
6503 * Functionality: Deallocating memory of CellGroupConfig
6505 * @params[in] pointer to CellGroupConfigRrc_t
6507 * @return ROK - success
6510 ******************************************************************/
6511 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6514 SpCellConfig_t *spCellCfg=NULLP;
6515 ServingCellConfig_t *srvCellCfg=NULLP;
6516 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6517 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6518 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6519 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6520 struct RLC_Config *rlcConfig=NULLP;
6521 struct LogicalChannelConfig *macLcConfig=NULLP;
6522 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6523 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6524 struct TAG_Config *tagConfig=NULLP;
6525 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6526 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6527 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6529 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6532 if(rlcBearerList->list.array)
6534 for(idx=0; idx<rlcBearerList->list.count; idx++)
6536 if(rlcBearerList->list.array[idx])
6538 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6539 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6542 if(rlcConfig->choice.am)
6544 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6545 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6546 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6548 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6550 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6553 if(macLcConfig->ul_SpecificParameters)
6555 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6556 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6557 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6559 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6561 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6564 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6566 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6569 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6572 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6573 if(schedulingRequestConfig)
6575 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6578 if(schReqList->list.array)
6580 for(idx=0;idx<schReqList->list.count; idx++)
6582 if(schReqList->list.array[idx])
6584 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6585 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6588 CU_FREE(schReqList->list.array, schReqList->list.size);
6590 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6591 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6592 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6594 if(macCellGrpCfg->bsr_Config)
6596 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6598 tagConfig = macCellGrpCfg->tag_Config;
6601 tagList = tagConfig->tag_ToAddModList;
6604 if(tagList->list.array)
6606 for(idx=0; idx<tagList->list.count; idx++)
6608 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6610 CU_FREE(tagList->list.array, tagList->list.size);
6612 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6614 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6617 phrConfig = macCellGrpCfg->phr_Config;
6620 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6621 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6624 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6627 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6630 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6631 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6634 spCellCfg = cellGrpCfg->spCellConfig;
6637 if(spCellCfg->servCellIndex)
6639 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6641 if(spCellCfg->spCellConfigDedicated)
6643 srvCellCfg = spCellCfg->spCellConfigDedicated;
6644 if(srvCellCfg->initialDownlinkBWP)
6646 dlBwp = srvCellCfg->initialDownlinkBWP;
6647 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6649 if(srvCellCfg->defaultDownlinkBWP_Id)
6651 if(srvCellCfg->uplinkConfig)
6653 if(srvCellCfg->pdsch_ServingCellConfig)
6655 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6656 if(pdschCfg->choice.setup)
6658 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6659 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6661 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6662 ServingCellConfig__pdsch_ServingCellConfig));
6664 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6665 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6667 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6669 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6671 if(dlBwp->pdcch_Config)
6673 if(dlBwp->pdsch_Config)
6675 FreeBWPDlDedPdschCfg(dlBwp);
6676 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6678 FreeBWPDlDedPdcchCfg(dlBwp);
6679 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6681 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6683 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6685 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6687 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6689 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6694 /*******************************************************************
6696 * @brief Fills CellGroupConfig
6700 * Function : fillCellGrpCfg
6702 * Functionality: Fills CellGroupConfig
6704 * @params[in] pointer to CellGroupConfigRrc_t
6706 * @return ROK - success
6709 ******************************************************************/
6711 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6713 uint8_t ret = RFAILED;
6714 CellGroupConfigRrc_t cellGrpCfg;
6715 asn_enc_rval_t encRetVal;
6719 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6721 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6723 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6725 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6729 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6730 cellGrpCfg.mac_CellGroupConfig = NULLP;
6731 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6732 if(!cellGrpCfg.mac_CellGroupConfig)
6734 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6737 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6739 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6743 cellGrpCfg.physicalCellGroupConfig = NULLP;
6744 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6745 if(!cellGrpCfg.physicalCellGroupConfig)
6747 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6750 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6752 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6756 cellGrpCfg.spCellConfig = NULLP;
6757 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6758 if(!cellGrpCfg.spCellConfig)
6760 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6763 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6765 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6769 cellGrpCfg.sCellToAddModList = NULLP;
6770 cellGrpCfg.sCellToReleaseList = NULLP;
6771 cellGrpCfg.ext1 = NULLP;
6773 /* encode cellGrpCfg into duToCuRrcContainer */
6774 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6775 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6777 encRetVal = uper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6778 /* Encode results */
6779 if(encRetVal.encoded == ENCODE_FAIL)
6781 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6782 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6787 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6788 for(int i=0; i< encBufSize; i++)
6790 DU_LOG("%x",encBuf[i]);
6794 cellGrp->size = encBufSize;
6795 CU_ALLOC(cellGrp->buf, cellGrp->size);
6798 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6801 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6805 FreeMemCellGrpCfg(&cellGrpCfg);
6809 /*******************************************************************
6811 * @brief Free UE Capability RAT container
6815 * Function : freeUeCapRatCont
6818 * Free UE Capability RAT conatiner
6821 * @return ROK - success
6824 * ****************************************************************/
6825 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6828 FeatureSets_t *featureSets;
6830 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6832 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6834 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6835 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6837 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6840 if(ueNrCap->featureSets)
6842 featureSets = ueNrCap->featureSets;
6843 if(featureSets->featureSetsDownlinkPerCC)
6845 if(featureSets->featureSetsDownlinkPerCC->list.array)
6847 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6849 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6850 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6851 sizeof(ModulationOrder_t));
6852 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6854 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6856 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6859 if(featureSets->featureSetsUplinkPerCC)
6861 if(featureSets->featureSetsUplinkPerCC->list.array)
6863 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6865 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6867 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6868 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6869 sizeof(ModulationOrder_t));
6870 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6873 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6875 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6877 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6881 /*******************************************************************
6883 * @brief Free UE capability RAT container list
6887 * Function : freeUeCapRatContList
6889 * Functionality: Free UE capability RAT container list
6892 * @return ROK - success
6895 * ****************************************************************/
6896 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6899 if(ueCapablityList->list.array)
6901 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6903 if(ueCapablityList->list.array[idx])
6904 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6906 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6910 /*******************************************************************
6912 * @brief Free Handover preparation information
6916 * Function : freeHOPreparationInfo
6918 * Functionality: Free Handover preparation information
6921 * @return ROK - success
6924 * ****************************************************************/
6925 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6927 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6929 if(hoPrep->criticalExtensions.choice.c1)
6931 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6933 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6934 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6935 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6936 sizeof(HandoverPreparationInformationRrc_IEs_t));
6938 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6942 /*******************************************************************
6944 * @brief Fill feature sets
6948 * Function : fillFeatureSets
6950 * Functionality: Fill feature sets
6953 * @return ROK - success
6956 * ****************************************************************/
6957 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6959 uint8_t idx, elementCnt;
6961 featureSets->featureSetsDownlink = NULLP;
6962 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6963 if(!featureSets->featureSetsDownlinkPerCC)
6965 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6970 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6971 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6972 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6973 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6975 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6979 for(idx = 0; idx < elementCnt; idx++)
6981 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6982 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6984 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6990 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6991 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6992 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6993 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6994 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6996 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6997 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6999 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7002 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
7004 featureSets->featureSetsUplink = NULLP;
7005 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
7006 if(!featureSets->featureSetsUplinkPerCC)
7008 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7013 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
7014 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
7015 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
7016 if(!featureSets->featureSetsUplinkPerCC->list.array)
7018 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7022 for(idx = 0; idx < elementCnt; idx++)
7024 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
7025 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
7027 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7033 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
7034 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
7035 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
7036 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
7037 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
7038 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
7040 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
7041 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
7043 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7046 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
7051 /*******************************************************************
7053 * @brief Fill UE capability RAT container
7057 * Function : fillUeCapRatCont
7059 * Functionality: Fill UE capability RAT container
7061 * @params[in] UE Capability RAT container buffer
7062 * @return ROK - success
7065 * ****************************************************************/
7066 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
7069 uint8_t idx, elementCnt;
7070 asn_enc_rval_t encRetVal;
7071 UE_NR_Capability_t ueNrCap;
7075 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7077 /* Filling PDCP parameters */
7078 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7079 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7080 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7081 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7082 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7083 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7084 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7085 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7086 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7087 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7088 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7089 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7090 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7091 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7092 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7093 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7094 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7096 ueNrCap.rlc_Parameters = NULLP;
7097 ueNrCap.mac_Parameters = NULLP;
7099 /* Filling PHY parameters */
7100 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7101 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7102 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7103 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7104 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7106 /* Filling RF parameters */
7108 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7109 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7110 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7111 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7113 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7118 for(idx = 0; idx < elementCnt; idx++)
7120 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7121 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7131 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7132 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7133 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7135 ueNrCap.measAndMobParameters = NULLP;
7136 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7137 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7138 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7139 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7140 ueNrCap.featureSets = NULLP;
7142 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7143 if(!ueNrCap.featureSets)
7145 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7150 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7152 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7157 ueNrCap.featureSetCombinations = NULLP;
7158 ueNrCap.lateNonCriticalExtension = NULLP;
7159 ueNrCap.nonCriticalExtension = NULLP;
7161 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7162 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7163 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7165 encRetVal = uper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7167 /* Encode results */
7168 if(encRetVal.encoded == ENCODE_FAIL)
7170 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7171 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7176 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7177 for(int i=0; i< encBufSize; i++)
7179 DU_LOG("%x",encBuf[i]);
7183 ueCapRatContBuf->size = encBufSize;
7184 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7185 if(!ueCapRatContBuf->buf)
7187 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7190 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7194 freeUeCapRatCont(&ueNrCap);
7198 /*******************************************************************
7200 * @brief Fill UE Capability RAT container list
7204 * Function : fillUeCapRatContList
7206 * Functionality: Fill UE Capability RAT container list
7209 * @params[in] UE capability RAT container list
7210 * @return ROK - success
7213 * ****************************************************************/
7214 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7216 uint8_t ret = RFAILED;
7217 uint8_t idx, elementCnt;
7222 ueCapablityList->list.count = elementCnt;
7223 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7225 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7226 if(!ueCapablityList->list.array)
7228 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7233 for(idx=0; idx<elementCnt; idx++)
7235 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7236 if(ueCapablityList->list.array[idx] == NULLP)
7238 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7244 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7245 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7247 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7258 /*******************************************************************
7260 * @brief Fill UE Capability RAT container list octet string
7264 * Function : fillUeCapRatContListBuf
7266 * Functionality: Fill UE Capability RAT container list octet string
7269 * @params[in] UE capability RAT container list buffer
7270 * @return ROK - success
7273 * ****************************************************************/
7274 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7276 uint8_t ret = RFAILED;
7277 asn_enc_rval_t encRetVal;
7278 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7282 ret = fillUeCapRatContList(&ueCapablityList);
7285 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7289 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7290 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7291 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7293 encRetVal = uper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7294 &ueCapablityList, PrepFinalEncBuf, encBuf);
7296 /* Encode results */
7297 if(encRetVal.encoded == ENCODE_FAIL)
7299 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7300 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7305 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7306 for(int i=0; i< encBufSize; i++)
7308 DU_LOG("%x",encBuf[i]);
7312 ueCapablityListBuf->size = encBufSize;
7313 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7314 if(!ueCapablityListBuf->buf)
7316 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7319 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7323 freeUeCapRatContList(&ueCapablityList);
7327 /*******************************************************************
7329 * @brief Free Measurement Timing Configuration
7333 * Function : freeMeasuementTimingConfig
7335 * Functionality: Free Measurement Timing Configuration
7337 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7340 * ****************************************************************/
7341 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7344 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7345 MeasTiming_t *measTiming = NULLP;
7347 if(measTimingConfig.criticalExtensions.choice.c1)
7349 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7351 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7352 if(measTimingCfg->measTiming)
7354 if(measTimingCfg->measTiming->list.array)
7356 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7358 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7359 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7360 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7362 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7364 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7366 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7368 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7372 /*******************************************************************
7374 * @brief Fill Measurement Timing Configuration
7378 * Function : fillMeasTimingCfg
7380 * Functionality: Fill Measurement Timing Configuration
7382 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7383 * @return ROK - success
7386 * ****************************************************************/
7387 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7389 uint8_t elementCnt = 0;
7390 uint8_t measCfgIdx = 0;
7391 MeasTiming_t *measTiming;
7394 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7395 if(!measTimingCfg->measTiming)
7397 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7402 measTimingCfg->measTiming->list.count = elementCnt;
7403 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7404 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7405 if(!measTimingCfg->measTiming->list.array)
7407 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7411 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7413 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7414 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7416 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7422 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7423 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7424 if(!measTiming->frequencyAndTiming)
7426 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7430 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7431 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7433 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7434 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7435 smtc->periodicityAndOffset.choice.sf20 = 0;
7436 smtc->duration = SSB_MTC__duration_sf1;
7440 /*******************************************************************
7442 * @brief Fill Measurement Timing Configuration Octet string
7446 * Function : fillMeasConfigBuf
7448 * Functionality: Fill Measurement Timing Configuration Octet string
7451 * @params[in] MeasConfig_t *measConfgBuf
7452 * @return ROK - success
7455 * ****************************************************************/
7456 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7458 uint8_t ret = RFAILED;
7459 asn_enc_rval_t encRetVal;
7460 MeasurementTimingConfigurationRrc_t measTimingConfig;
7464 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7465 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7466 if(!measTimingConfig.criticalExtensions.choice.c1)
7468 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7471 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7473 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7474 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7476 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7480 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7483 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7487 /* Encode measurement timing configuration into octet string */
7488 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7489 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7491 encRetVal = uper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7493 /* Encode results */
7494 if(encRetVal.encoded == ENCODE_FAIL)
7496 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7497 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7502 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7503 for(int i=0; i< encBufSize; i++)
7505 DU_LOG("%x",encBuf[i]);
7509 measTimingConfigBuf->size = encBufSize;
7510 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7511 if(!measTimingConfigBuf->buf)
7513 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7516 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7520 freeMeasuementTimingConfig(measTimingConfig);
7524 /******************************************************************
7526 * @brief Free RRC reconfiguration non-critical extension
7530 * Function : freeRrcReconfigNonCriticalExt
7532 * Functionality: Free RRC reconfiguration non-critical extension
7534 * @params[in] RRC reconfiguration IE
7537 * ****************************************************************/
7538 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7540 if(rrcRecfg->masterCellGroup)
7542 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7546 /******************************************************************
7548 * @brief Free measurement object addmod list
7552 * Function : freeMeasObjToAddModList
7554 * Functionality: Free measurement object add mod list
7556 * @params[in] Measurement object add/mod list
7559 * ****************************************************************/
7560 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7563 MeasObjectNR_t *measObject;
7565 if(measObjList->list.array)
7567 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7569 if(measObjList->list.array[objIdx])
7571 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7573 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7574 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7575 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7576 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7577 if(measObject->absThreshSS_BlocksConsolidation)
7579 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7580 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7581 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7582 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7584 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7585 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7586 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7587 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7588 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7590 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7593 CU_FREE(measObjList->list.array, measObjList->list.size);
7597 /******************************************************************
7599 * @brief Free report config add mod list
7603 * Function : freeReportCfgToAddModList
7605 * Functionality: Free report config add mod list
7607 * @params[in] Report config list
7610 * ****************************************************************/
7611 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7613 uint8_t reportCfgIdx;
7614 ReportConfigToAddMod_t *reportCfg;
7615 ReportConfigNR_t *reportCfgNr;
7616 EventTriggerConfig_t *eventTriggCfg;
7618 if(reportCfgList->list.array)
7620 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7622 if(reportCfgList->list.array[reportCfgIdx])
7624 reportCfg = reportCfgList->list.array[reportCfgIdx];
7625 if(reportCfg->reportConfig.choice.reportConfigNR)
7627 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7628 if(reportCfgNr->reportType.choice.eventTriggered)
7630 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7631 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7632 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7633 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7634 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7638 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7640 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7644 /******************************************************************
7646 * @brief Free measurement id to add mod list
7650 * Function : freeMeasIdToAddModList
7652 * Functionality: Free measurement id to add mod list
7654 * @params[in] Measurement id to add mod list
7657 * ****************************************************************/
7658 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7661 if(measIdList->list.array)
7663 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7665 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7667 CU_FREE(measIdList->list.array, measIdList->list.size);
7671 /*******************************************************************
7673 * @brief Free quantity config
7677 * Function : freeQunatityConfig
7679 * Functionality: Free quantity config
7681 * @params[in] Quantity Config
7684 * ****************************************************************/
7685 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7688 QuantityConfigNR_t *quantityCfgNr;
7690 if(quantityCfg->quantityConfigNR_List)
7692 if(quantityCfg->quantityConfigNR_List->list.array)
7694 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7696 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7698 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7699 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7700 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7701 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7702 if(quantityCfgNr->quantityConfigRS_Index)
7704 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7705 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7706 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7707 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7709 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7712 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7714 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7718 /******************************************************************
7720 * @brief Free measurement Config
7724 * Function : freeMeasConfig
7726 * Functionality: Free measurement config
7728 * @params[in] Measurement config
7731 * ****************************************************************/
7732 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7734 if(measConfig->measObjectToAddModList)
7736 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7737 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7739 if(measConfig->reportConfigToAddModList)
7741 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7742 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7744 if(measConfig->measIdToAddModList)
7746 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7747 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7749 if(measConfig->s_MeasureConfig)
7751 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7753 if(measConfig->quantityConfig)
7755 freeQuantityConfig(measConfig->quantityConfig);
7756 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7759 /******************************************************************
7761 * @brief Free DRB to AddMod List
7765 * Function : freeDrbToAddModList
7767 * Functionality: Free SRB to AddMod List
7769 * @params[in] SBR to add/mod list
7772 * ****************************************************************/
7773 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7776 if(drbToAddList->list.array)
7778 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7780 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7782 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7784 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7785 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7786 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7787 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7789 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7790 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7792 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7794 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7798 /******************************************************************
7800 * @brief Free SRB to AddMod List
7804 * Function : freeSrbToAddModList
7806 * Functionality: Free SRB to AddMod List
7808 * @params[in] SBR to add/mod list
7811 * ****************************************************************/
7812 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7815 if(srbToAddList->list.array)
7817 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7819 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7820 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7822 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7823 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7826 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7828 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7832 /******************************************************************
7834 * @brief Free Radio Bearer Config
7838 * Function : freeRadioBearerConfig
7840 * Functionality: Free Radio Bearer config
7842 * @params[in] Radio bearer config
7845 * ****************************************************************/
7846 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7848 if(radioBearerConfig->srb_ToAddModList)
7850 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7851 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7853 if(radioBearerConfig->drb_ToAddModList)
7855 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7856 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7860 /******************************************************************
7862 * @brief Free reconfiguration message
7866 * Function : freeRrcReconfig
7868 * Functionality: Free reconfiguration message
7870 * @params[in] RRC Reconfiguration message
7873 * ****************************************************************/
7874 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7876 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7878 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7880 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7881 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7883 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7885 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7886 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7888 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7890 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7891 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7893 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7897 /******************************************************************
7899 * @brief Fill SRB To Add Mod list
7903 * Function : fillSrbToAddModList
7905 * Functionality: fill SRB to Add Mod list
7907 * @params[in] UE control block
7908 * SRB to Add/Mod list
7909 * @return ROK - success
7912 * ****************************************************************/
7913 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7915 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7918 elementCnt = ueCb->numSrb;
7921 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7923 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7930 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7934 srbToAddList->list.count = elementCnt;
7935 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7937 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7938 if(!srbToAddList->list.array)
7940 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7945 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7947 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7950 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7951 if(!srbToAddList->list.array[srbIdx])
7953 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7957 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7959 /* Reestablish PDCP */
7960 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7961 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7963 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7966 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7968 /* PDCP configuration */
7969 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7970 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7972 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7976 /* Reordering timer */
7977 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7978 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7980 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7983 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7990 /******************************************************************
7992 * @biief Fill DRBeTo Add Mod list
7996 * Function : fillDrbToAddModList
7998 * Functionality: fill DRB to Add Mod list
8000 * @params[in] UE control block
8001 * DRB to Add/Mod list
8002 * @return ROK - success
8005 * ****************************************************************/
8006 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
8008 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
8011 elementCnt = ueCb->numDrb;
8014 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8016 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
8023 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
8028 drbToAddList->list.count = elementCnt;
8029 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
8031 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
8032 if(!drbToAddList->list.array)
8034 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
8039 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8041 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
8044 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
8045 if(!drbToAddList->list.array[drbIdx])
8047 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
8052 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
8055 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
8056 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
8058 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
8062 /* PDCP Config -> DRB */
8063 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
8064 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
8066 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8070 /* DRB -> Discard Timer */
8071 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8072 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8074 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8077 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8079 /* UL PDCP SN length */
8080 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8081 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8083 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8086 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8088 /* DL PDCP SN length */
8089 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8090 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8092 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8095 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8097 /* Header Compression */
8098 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8099 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8101 /* Reordering timer */
8102 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8103 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8105 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8108 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8116 /******************************************************************
8118 * @brief Fill Radio bearer configuration
8122 * Function : fillRadioBearerConfig
8124 * Functionality: Fill Radio bearer configuration
8126 * @params[in] UE control block
8127 * Radio bearer config pointer
8128 * @return ROK - success
8131 * ****************************************************************/
8132 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8134 /* SRB To Add/Mod List */
8135 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8136 if(!radioBearerConfig->srb_ToAddModList)
8138 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8141 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8143 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8147 /* DRB To Add/Mod List */
8148 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8149 if(!radioBearerConfig->drb_ToAddModList)
8151 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8154 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8156 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8163 /*******************************************************************
8165 * @brief Fill measurement object to add/mod list
8169 * Function : fillMeasObjToAddModList
8171 * Functionality: Fill measurement object to add/mod list
8173 * @params[in] Measurement object to add/mod list
8174 * @return ROK - success
8177 * ****************************************************************/
8178 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8180 uint8_t elementCnt, objIdx;
8181 MeasObjectNR_t *measObject;
8184 measObjList->list.count = elementCnt;
8185 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8187 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8188 if(!measObjList->list.array)
8190 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8194 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8196 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8197 if(!measObjList->list.array[objIdx])
8199 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8205 measObjList->list.array[objIdx]->measObjectId = 1;
8206 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8207 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8208 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8210 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8214 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8217 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8218 if(!measObject->ssbFrequency)
8220 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8223 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8225 /* Subcarrier spacing */
8226 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8227 if(!measObject->ssbSubcarrierSpacing)
8229 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8232 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8235 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8236 if(!measObject->smtc1)
8238 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8241 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8242 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8243 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8245 /* Absoulute threshold SSB consolidation */
8246 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8247 if(!measObject->absThreshSS_BlocksConsolidation)
8249 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8253 /* RSRP threshold */
8254 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8255 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8257 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8260 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8262 /* RSRQ threshold */
8263 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8264 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8266 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8269 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8271 /* SINR threshold */
8272 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8273 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8275 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8278 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8280 /* Number of SSBs to average */
8281 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8282 if(!measObject->nrofSS_BlocksToAverage)
8284 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8287 *(measObject->nrofSS_BlocksToAverage) = 2;
8289 /* Quantity Config index */
8290 measObject->quantityConfigIndex = 1;
8293 /* RSRP offset for SSB */
8294 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8295 if(!measObject->offsetMO.rsrpOffsetSSB)
8297 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8300 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8302 /* RSRQ offset for SSB */
8303 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8304 if(!measObject->offsetMO.rsrqOffsetSSB)
8306 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8309 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8311 /* SINR offset for SSB */
8312 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8313 if(!measObject->offsetMO.sinrOffsetSSB)
8315 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8318 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8323 /*******************************************************************
8325 * @brief Fill Report configuration to Add/mod list
8329 * Function : fillReportCfgToAddModList
8331 * Functionality: Fill Report configuration to Add/mod list
8333 * @params[in] Report Config To Add/Mod List
8334 * @return ROK - success
8337 * ****************************************************************/
8338 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8341 uint8_t reportCfgIdx;
8342 ReportConfigToAddMod_t *reportCfg;
8343 ReportConfigNR_t *reportCfgNr;
8344 EventTriggerConfig_t *eventTriggCfg;
8347 reportCfgList->list.count = elementCnt;
8348 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8350 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8351 if(!reportCfgList->list.array)
8353 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8357 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8359 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8360 if(!reportCfgList->list.array[reportCfgIdx])
8362 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8368 reportCfg = reportCfgList->list.array[reportCfgIdx];
8369 reportCfg->reportConfigId = 1;
8370 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8372 /* Report Configuration for NR */
8373 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8374 if(!reportCfg->reportConfig.choice.reportConfigNR)
8376 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8379 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8382 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8383 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8384 if(!reportCfgNr->reportType.choice.eventTriggered)
8386 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8389 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8392 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8393 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8394 if(!eventTriggCfg->eventId.choice.eventA3)
8396 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8400 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8401 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8402 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8403 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8404 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8405 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8407 /* Reference Signal Type */
8408 eventTriggCfg->rsType = NR_RS_Type_ssb;
8410 /* Report Interval */
8411 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8414 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8416 /* Report Quantity cell */
8417 eventTriggCfg->reportQuantityCell.rsrp = true;
8418 eventTriggCfg->reportQuantityCell.rsrq = false;
8419 eventTriggCfg->reportQuantityCell.sinr = false;
8421 /* Maximum reported cells */
8422 eventTriggCfg->maxReportCells = 3;
8424 /* Report qunatity RS Indexes */
8425 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8426 if(!eventTriggCfg->reportQuantityRS_Indexes)
8428 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8431 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8432 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8433 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8435 /* Maximum number of RS indexes to report */
8436 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8437 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8439 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8442 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8444 /* Include Beam measurement */
8445 eventTriggCfg->includeBeamMeasurements = false;
8450 /*******************************************************************
8452 * @brief Fill measurement Id to add/mod list
8456 * Function : fillMeasIdToAddModList
8458 * Functionality: Fill measurement Id to add/mod list
8460 * @params[in] Measurement Id to add/mod list
8461 * @return ROK - success
8464 * ****************************************************************/
8465 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8471 measIdList->list.count = elementCnt;
8472 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8474 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8475 if(!measIdList->list.array)
8480 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8482 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8483 if(!measIdList->list.array[measIdIdx])
8489 measIdList->list.array[measIdIdx]->measId = 1;
8490 measIdList->list.array[measIdIdx]->measObjectId = 1;
8491 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8496 /*******************************************************************
8498 * @brief Fill s-measurement configuration
8502 * Function : fillSMeasConfig
8504 * Functionality: Fill s-measurement configuration
8506 * @params[in] s-Measurement config
8507 * @return ROK - success
8510 * ****************************************************************/
8511 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8513 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8514 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8519 /*******************************************************************
8521 * @brief Fill quantity config
8525 * Function : fillQunatityConfig
8527 * Functionality: Fill quantity config
8529 * @params[in] Quantity Config
8530 * @return ROK - success
8533 * ****************************************************************/
8534 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8536 uint8_t elementCnt = 0;
8537 uint8_t quanCfgIdx = 0;
8538 QuantityConfigNR_t *quantityCfgNr;
8540 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8541 if(!quantityCfg->quantityConfigNR_List)
8547 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8548 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8550 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8551 if(!quantityCfg->quantityConfigNR_List->list.array)
8556 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8558 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8559 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8566 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8568 /* Quantity Config of Reference signal */
8569 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8570 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8574 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8576 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8577 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8581 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8583 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8584 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8588 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8590 /* Quantity Config RS index */
8591 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8592 if(!quantityCfgNr->quantityConfigRS_Index)
8597 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8598 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8602 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8604 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8605 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8609 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8611 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8612 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8616 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8621 /*******************************************************************
8623 * @brief Fill measurement configuration
8627 * Function : fillMeasConfig
8629 * Functionality: Fill measurement configuration
8631 * @params[in] Measurement config
8632 * @return ROK - success
8635 * ****************************************************************/
8636 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8638 /* Measurement object to add/mod list */
8639 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8640 if(!measConfig->measObjectToAddModList)
8642 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8645 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8647 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8651 /* Report Config To add/mod list */
8652 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8653 if(!measConfig->reportConfigToAddModList)
8655 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8658 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8660 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8664 /* Measurement Id to add/mod list */
8665 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8666 if(!measConfig->measIdToAddModList)
8668 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8671 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8673 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8677 /* S-Measurement config */
8678 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8679 if(!measConfig->s_MeasureConfig)
8681 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8684 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8686 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8690 /* Qunatity Config */
8691 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8692 if(!measConfig->quantityConfig)
8694 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8697 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8699 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8706 /*******************************************************************
8708 * @brief Fill RRC reconfiguration non-critical extension IE
8712 * Function : fillRrcReconfigNonCriticalExt
8714 * Functionality: Fill RRC reconfiguration non-critical extension
8716 * @params[in] RRC Reconfig Non-critical extension
8717 * @return ROK - success
8720 * ****************************************************************/
8721 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8723 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8724 if(!rrcRecfg->masterCellGroup)
8726 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8730 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8731 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8732 if(!rrcRecfg->masterCellGroup->buf)
8734 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8737 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8740 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8741 * received from DU */
8742 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8744 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8752 /*******************************************************************
8754 * @brief Fill RRC reconfiguration structure
8758 * Function : fillRrcReconfig
8760 * Functionality: Fill RRC reconfiguration
8764 * RRC reconfiguration structure
8765 * @return ROK - success
8768 * ****************************************************************/
8769 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8771 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8773 rrcReconfig->rrc_TransactionIdentifier = 1;
8774 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8776 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8777 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8779 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8783 /* Radio Bearer Configuration */
8784 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8785 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8787 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8790 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8792 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8796 /* Measurement Configuration */
8797 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8798 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8800 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8803 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8805 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8809 /* Non Critical extension */
8810 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8811 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8813 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8816 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8818 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8824 /*******************************************************************
8826 * @brief Fill RRC reconfiguration Octet string
8830 * Function : fillRrcReconfigBuf
8832 * Functionality: Fill RRC reconfiguration octet string
8835 * @params[in] OCTET_STRING_t buffer
8836 * @return ROK - success
8839 * ****************************************************************/
8840 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8842 uint8_t ret = RFAILED;
8843 asn_enc_rval_t encRetVal;
8844 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8845 rrcReconfig = &rrcRecfg;
8849 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8851 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8855 /* Encode RRC Reconfiguration */
8856 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8857 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8859 encRetVal = uper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8861 /* Encode results */
8862 if(encRetVal.encoded == ENCODE_FAIL)
8864 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8865 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8870 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8871 for(int i=0; i< encBufSize; i++)
8873 DU_LOG("%x",encBuf[i]);
8877 rrcReconfigBuf->size = encBufSize;
8878 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8879 if(!rrcReconfigBuf->buf)
8881 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8884 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8889 freeRrcReconfig(rrcReconfig);
8893 /*******************************************************************
8895 * @brief Fill HO preparation information Octet string
8899 * Function : fillHOPreparationInfoBuf
8901 * Functionality: Fill HO preparation information Octet string
8904 * @params[in] HandoverPreparationInformation_t buffer
8905 * @return ROK - success
8908 * ****************************************************************/
8909 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8911 uint8_t ret = RFAILED;
8912 asn_enc_rval_t encRetVal;
8913 HandoverPreparationInformationRrc_t hoPrepInfo;
8914 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8919 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8920 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8921 if(!hoPrepInfo.criticalExtensions.choice.c1)
8923 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8926 hoPrepInfo.criticalExtensions.choice.c1->present = \
8927 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8929 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8930 sizeof(HandoverPreparationInformationRrc_IEs_t));
8931 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8933 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8936 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8938 /* Fill UE Capability RAT container list */
8939 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8942 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8946 /* Fill Source config */
8947 hoPrepInfoIe->sourceConfig = NULLP;
8948 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8949 if(!hoPrepInfoIe->sourceConfig)
8951 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8954 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8958 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8962 hoPrepInfoIe->rrm_Config = NULLP;
8963 hoPrepInfoIe->as_Context = NULLP;
8964 hoPrepInfoIe->nonCriticalExtension = NULLP;
8966 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8967 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8968 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8970 encRetVal = uper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8971 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8973 /* Encode results */
8974 if(encRetVal.encoded == ENCODE_FAIL)
8976 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8977 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8982 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8983 for(int i=0; i< encBufSize; i++)
8985 DU_LOG("%x",encBuf[i]);
8989 hoPrepInfoBuf->size = encBufSize;
8990 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8991 if(!hoPrepInfoBuf->buf)
8993 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8996 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
9000 freeHOPreparationInfo(&hoPrepInfo);
9004 /*******************************************************************
9006 * @brief Fills CuToDuContainer
9010 * Function : fillCuToDuContainer
9012 * Functionality: Fills CuToDuContainer
9014 * @params[in] pointer to CUtoDURRCInformation_t
9016 * @return ROK - success
9019 ******************************************************************/
9021 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
9023 uint8_t elementCnt = 0;
9027 if((ueCb->state != UE_HANDOVER_IN_PROGRESS) || ((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Inter_DU_HO)))
9029 /* UE Capabulity RAT Container List */
9030 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9031 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
9033 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
9036 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
9041 /* Commenting this because:
9042 * CUToDURRCInformation->MeasConfig contains measurement gap configurations.
9043 * Howeever measurement gap is not supported in our code. Measurement Gap will
9044 * be required if we want to support inter-RAT handover or handover to
9045 * neighbouring cells operating on a different frequency than serving cell.
9047 * In case we plan to use this IE in future, following fixes are required:
9048 * As of now, we are filling MeasurementTimingConfigurationRrc_t into rrcMsg->measConfig.
9049 * This is incorrect. We must fill MeasConfigRrc_t in rrcMsg->measConfig.
9050 * MeasurementTimingConfigurationRrc_t should be filled in
9051 * rrcMsg->iE_Extensions->MeasurementTimingConfiguration, if required.
9054 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
9055 if(!rrcMsg->measConfig)
9057 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
9060 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
9063 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9066 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9067 if(rrcMsg->iE_Extensions)
9070 rrcMsg->iE_Extensions->list.count = elementCnt;
9071 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9073 /* Initialize the CUtoDURRCInformation_ExtIEs */
9074 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9076 if(rrcMsg->iE_Extensions->list.array == NULLP)
9078 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9082 for(idx=0; idx<elementCnt; idx++)
9084 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9085 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9087 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9094 /* Cell Group Configuration */
9095 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9096 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9097 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9098 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9099 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9102 /* Handover Preparation Information */
9103 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9104 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9105 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9106 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9107 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9112 /*******************************************************************
9114 * @brief Build the drx cycle
9118 * Function : BuildDrxCycle
9120 * Functionality: Build drx cycle IE
9122 * @params[in] pointer to DRXCycle_t
9124 * @return ROK - success
9127 ******************************************************************/
9128 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9130 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms80;
9131 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9132 if(!drxCycle->shortDRXCycleLength)
9134 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9137 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9139 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9140 if(!drxCycle->shortDRXCycleTimer)
9142 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9145 *(drxCycle->shortDRXCycleTimer) = 4;
9148 /*******************************************************************
9150 * @brief Free CuToDuContainer
9154 * Function : FreeCuToDuInfo
9156 * Functionality: Free CuToDuContainer
9158 * @params[in] pointer to CUtoDURRCInformation_t
9160 * @return ROK - success
9163 ******************************************************************/
9165 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9169 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9171 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9172 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9173 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9175 if(rrcMsg->iE_Extensions)
9177 if(rrcMsg->iE_Extensions->list.array)
9179 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9181 if(rrcMsg->iE_Extensions->list.array[idx])
9183 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9185 case ProtocolIE_ID_id_CellGroupConfig:
9186 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9188 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9189 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9194 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9195 rrcMsg->iE_Extensions->list.array[idx]->id);
9201 for(idx2 = 0; idx2 < idx; idx2++)
9203 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9205 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9209 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9212 /*******************************************************************
9214 * @brief Builds and sends the UE Setup Request
9218 * Function : BuildAndSendUeContextSetupReq
9220 * Functionality: Constructs the UE Setup Request and sends
9221 * it to the CU through SCTP.
9225 * @return ROK - success
9228 * ****************************************************************/
9229 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9231 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9232 uint8_t ret= RFAILED, ret1;
9234 uint8_t idx, idx1, bufLen, duIdx;
9236 uint32_t targetDuId;
9237 DuDb *targetDuDb = NULLP;
9238 F1AP_PDU_t *f1apMsg = NULLP;
9239 UEContextSetupRequest_t *ueSetReq = NULLP;
9240 asn_enc_rval_t encRetVal; /* Encoder return value */
9241 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9245 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9247 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9248 if(f1apMsg == NULLP)
9250 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9254 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9255 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9256 if(f1apMsg->choice.initiatingMessage == NULLP)
9258 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9262 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9263 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9264 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9266 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9268 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9278 ueSetReq->protocolIEs.list.count = elementCnt;
9279 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9281 /* Initialize the UESetup members */
9282 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9284 if(ueSetReq->protocolIEs.list.array == NULLP)
9286 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9290 for(idx1=0; idx1<elementCnt; idx1++)
9292 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9293 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9301 /*GNB CU UE F1AP ID*/
9302 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9303 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9304 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9305 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9307 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9309 /*GNB DU UE F1AP ID*/
9311 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9312 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9313 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9314 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9319 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9320 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9321 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9323 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9324 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9326 if(ueCb->hoInfo.HOType == Inter_DU_HO)
9327 targetDuId = ueCb->hoInfo.tgtNodeId;
9331 SEARCH_DU_DB(duIdx, targetDuId, targetDuDb);
9332 /* Since we are supporting only one cell per DU, accessing 0th index to
9333 * get target cell info */
9334 spCellId = targetDuDb->cellCb[0].nrCellId;
9337 spCellId = ueCb->cellCb->nrCellId;
9339 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9345 /*Served Cell Index*/
9347 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9348 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9349 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9350 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9352 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9354 /*CellULConfigured*/
9356 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9357 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9358 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9359 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9362 /*CUtoDURRCContainer*/
9364 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9365 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9366 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9367 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9372 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9377 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9378 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9379 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9380 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9382 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9386 /*Special Cells to be SetupList*/
9388 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9389 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9390 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9391 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9392 if(SplCellListret != ROK)
9398 /*SRBs To Be Setup List*/
9400 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9401 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9402 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9403 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9404 if(SrbSetupret != ROK)
9409 /*DRBs to Be Setup List*/
9411 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9412 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9413 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9414 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9420 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9422 /* RRC delivery status request */
9424 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9425 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9426 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9427 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9430 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9432 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9433 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9434 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9436 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9438 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9439 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9440 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9441 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9443 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9446 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9447 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9449 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9451 /* Encode the F1SetupRequest type as APER */
9452 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9454 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9456 /* Encode results */
9457 if(encRetVal.encoded == ENCODE_FAIL)
9459 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9460 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9465 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9466 for(int i=0; i< encBufSize; i++)
9468 DU_LOG("%x",encBuf[i]);
9473 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9475 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9481 FreeUeContextSetupReq(f1apMsg);
9484 }/* End of BuildAndSendUeContextSetupReq*/
9486 /**********************************************************************
9487 * @brief Function to extractTeId received in UE context setup Response
9491 * Function : extractTeId
9494 * - Function to extract TeId
9497 * @return ROK - success
9500 **********************************************************************/
9501 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9505 GTPTunnel_t *gtpDl = NULLP;
9507 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9509 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9511 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9513 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9514 if(gtpDl->gTP_TEID.size > 0)
9516 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9519 DU_LOG("\nERROR --> EGTP: No TeId received");
9527 /****************************************************************
9528 * @brief Function to add Drb tunnels
9532 * Function : addDrbTunnels
9535 * - Function to add Drb tunnels
9538 * @return ROK - success
9541 * ****************************************************************/
9542 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9547 if(teId > MAX_TEID || teId < MIN_TEID)
9549 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9551 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9552 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9553 tnlEvt.lclTeid = teId;
9554 tnlEvt.remTeid = teId;
9555 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9558 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9563 /****************************************************************
9564 * @brief Function to process Drb Setup List
9568 * Function : procDrbSetupList
9571 * - Function to process DRB Setup List
9574 * @return ROK - success
9577 * ****************************************************************/
9578 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9580 uint8_t arrIdx = 0, drbIdx = 0;
9582 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9584 if(drbSetupList != NULLP)
9586 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9588 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9589 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9591 /* extracting teId */
9592 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9595 if(addDrbTunnels(duId, teId)== ROK)
9597 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9599 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9600 * are sent to CU for setting up of Tunnels in DL direction.
9601 * Search for DRB ID in CU databse */
9602 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9604 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9606 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9619 /****************************************************************
9620 * @brief Function to process Ue Context Setup Response
9624 * Function : procUeContextSetupResponse
9627 * - Function to process Ue Context Setup Response
9630 * @return ROK - success
9633 * ****************************************************************/
9634 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *recvBuf, MsgLen recvBufLen)
9636 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9637 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9639 CuUeCb *ueCb = NULLP;
9640 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9641 OCTET_STRING_t *duToCuRrcContainer;
9643 SEARCH_DU_DB(duIdx, duId, duDb);
9644 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9646 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9648 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9650 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9652 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9655 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9657 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9658 ueCb = &duDb->ueCb[duUeF1apId-1];
9659 /* If ue context is not present in du db, then create UE context
9660 * here. This flow is hit in case of UE handover where UE
9661 * context is created before UE performs RACH on target DU */
9662 if(ueCb->gnbDuUeF1apId == 0)
9664 /* Creating UE context in target DU */
9665 memset(ueCb, 0, sizeof(CuUeCb));
9667 /* Check if UE is under Inter-CU handover */
9668 if(duDb->tempUeCtxtInHo && (duDb->tempUeCtxtInHo->gnbCuUeF1apId == cuUeF1apId))
9670 memcpy(ueCb, duDb->tempUeCtxtInHo, sizeof(CuUeCb));
9671 ueCb->gnbDuUeF1apId = duUeF1apId;
9672 CU_FREE(duDb->tempUeCtxtInHo, sizeof(CuUeCb));
9676 /* In case of Inter DU Handover */
9677 ueCb->cellCb = &duDb->cellCb[0];
9678 ueCb->gnbDuUeF1apId = duUeF1apId;
9679 ueCb->gnbCuUeF1apId = cuUeF1apId;
9680 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9681 ueCb->hoInfo.HOType = Inter_DU_HO;
9682 ueCb->hoInfo.tgtNodeId = duId;
9686 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9687 ueCb->cellCb->numUe++;
9691 case ProtocolIE_ID_id_C_RNTI:
9693 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9696 case ProtocolIE_ID_id_DRBs_Setup_List:
9698 /* Adding Tunnels for successful DRB */
9699 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9702 case ProtocolIE_ID_id_DUtoCURRCInformation:
9704 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9705 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9706 DUtoCURRCInformation.cellGroupConfig;
9707 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9708 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9710 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9718 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9720 ueCb->f1apMsgDb.dlRrcMsgCount++;
9721 rrcMsgType = setDlRRCMsgType(ueCb);
9723 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9724 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9726 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9732 if(ueCb->hoInfo.HOType == Inter_DU_HO)
9734 /* If the UE is in Inter-DU handover, UE context modification request is to be sent to
9735 * source DU once UE context setup response is received from target DU */
9737 DuDb *srcDuDb = NULLP;
9738 CuUeCb *ueCbInSrcDu = NULLP;
9740 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9741 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9742 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9744 /* UE context setup response is received from target DU. Search all
9745 * DUs to find source DU except this target DU Id.*/
9746 if(cuCb.duInfo[duIdx].duId != duId)
9748 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9751 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9752 * received in UE context setup response since CU UE F1AP ID does not
9753 * change for UE in handover.
9754 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9756 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9757 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9759 srcDuDb = &cuCb.duInfo[duIdx];
9760 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9762 /* Store source DU info in the new UE context created in
9764 ueCb->hoInfo.srcNodeId = srcDuDb->duId;
9766 /* Copy the received container to UeCb */
9767 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9769 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9771 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9778 if(srcDuDb && ueCbInSrcDu)
9782 else if(ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO)
9784 BuildAndSendHOReqAck(ueCb, duToCuRrcContainer->buf, duToCuRrcContainer->size);
9791 /****************************************************************
9792 * @brief Function to process Ul Rrc Msg received from DU
9796 * Function : procUlRrcMsg
9799 * - Function to process Ul Rrc Msg received from DU
9802 * @return ROK - success
9805 * ****************************************************************/
9807 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9809 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9810 uint8_t *rrcContainer = NULLP;
9811 uint16_t rrcContLen = 0;
9812 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9814 CuUeCb *ueCb = NULLP;
9815 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9818 SEARCH_DU_DB(duIdx, duId, duDb);
9819 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9821 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9823 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9825 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9827 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9830 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9832 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9835 case ProtocolIE_ID_id_SRBID:
9836 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9839 case ProtocolIE_ID_id_RRCContainer:
9841 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9842 CU_ALLOC(rrcContainer, rrcContLen);
9845 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9848 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9850 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9852 if(duDb->ueCb[duUeF1apId-1].hoInfo.HOType == Inter_DU_HO)
9855 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.srcNodeId;
9856 DuDb *srcDuDb = NULLP;
9858 /* Release UE context in source DU because the UE is now
9859 * attached to target DU */
9860 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9861 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9863 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9865 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9868 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9876 BuildAndSendUeContextRelease(&duDb->ueCb[duUeF1apId-1]);
9879 /* In target DU DB, mark UE as active and delete HO info */
9880 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9881 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9888 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9895 ueCb = &duDb->ueCb[duUeF1apId-1];
9896 ueCb->f1apMsgDb.dlRrcMsgCount++;
9897 rrcMsgType = setDlRRCMsgType(ueCb);
9898 if(rrcMsgType == REGISTRATION_COMPLETE)
9900 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9901 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9903 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9905 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9906 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9910 /* In case rrcMsgType is RRC_SETUP_COMPLETE / NAS_AUTHENTICATION_RSP / NAS_SECURITY_MODE_COMPLETE / RRC_SECURITY_MODE_COMPLETE */
9911 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9917 /****************************************************************
9918 * @brief Build And Send F1ResetAck
9922 * Function : FreeF1ResetAck
9925 * - Build And Send F1ResetRSP
9928 * @return ROK - success
9931 * ****************************************************************/
9932 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9935 ResetAcknowledge_t *f1ResetAck;
9939 if(f1apMsg->choice.successfulOutcome)
9941 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9943 if(f1ResetAck->protocolIEs.list.array)
9945 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9947 if(f1ResetAck->protocolIEs.list.array[idx])
9949 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9952 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9954 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9956 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9960 /****************************************************************
9961 * @brief Build And Send F1ResetAck
9965 * Function : BuildAndSendF1ResetAck
9968 * - Build And Send F1ResetRSP
9971 * @return ROK - success
9974 * ****************************************************************/
9976 uint8_t BuildAndSendF1ResetAck()
9979 uint8_t elementCnt = 0;
9980 uint8_t ret = RFAILED;
9981 F1AP_PDU_t *f1apMsg = NULL;
9982 ResetAcknowledge_t *f1ResetAck = NULLP;
9983 asn_enc_rval_t encRetVal;
9984 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9987 /* Allocate the memory for F1ResetRequest_t */
9988 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9989 if(f1apMsg == NULLP)
9991 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9995 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9997 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9998 if(f1apMsg->choice.successfulOutcome == NULLP)
10000 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
10004 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
10005 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
10006 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
10007 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10011 f1ResetAck->protocolIEs.list.count = elementCnt;
10012 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
10014 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10015 if(f1ResetAck->protocolIEs.list.array == NULLP)
10017 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
10021 for(idx=0; idx<elementCnt; idx++)
10023 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10024 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
10031 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10032 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10033 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
10034 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
10036 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10038 /* Encode the F1SetupRequest type as UPER */
10039 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10041 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10043 /* Check encode results */
10044 if(encRetVal.encoded == ENCODE_FAIL)
10046 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
10047 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10052 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
10053 for(int i=0; i< encBufSize; i++)
10055 DU_LOG("%x",encBuf[i]);
10060 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10061 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
10063 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
10071 FreeF1ResetAck(f1apMsg);
10075 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
10079 if(ulInfo->list.array)
10081 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
10083 if(ulInfo->list.array[arrIdx])
10085 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
10087 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
10089 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
10091 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10092 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10093 gTPTunnel->gTP_TEID.size);
10095 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10096 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10097 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10099 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10100 sizeof(GTPTunnel_t));
10102 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10105 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10109 /*******************************************************************
10111 * @brief Deletes the EGTP tunnel
10115 * Function : deleteEgtpTunnel
10117 * Functionality: Deletes the EGTP tunnel
10119 * @params[in] uint8_t *buf
10121 * @return ROK - success
10122 * RFAILED - failure
10124 * ****************************************************************/
10125 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10130 teIdStringToInt(buf, &teId);
10131 if(teId > MAX_TEID || teId < MIN_TEID)
10133 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10136 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10137 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10138 tnlEvt.lclTeid = teId;
10139 tnlEvt.remTeid = teId;
10140 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10142 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10147 /*******************************************************************
10149 * @brief Builds the Uplink Tunnel Info
10153 * Function : BuildUlTnlInfoforSetupMod
10155 * Functionality: Constructs the UL TnlInfo For DRB list
10157 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10159 * @return ROK - success
10160 * RFAILED - failure
10162 * ****************************************************************/
10163 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10169 ulInfo->list.count = ulCnt;
10170 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10171 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10172 if(ulInfo->list.array == NULLP)
10174 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10177 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10179 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10180 if(ulInfo->list.array[arrIdx] == NULLP)
10182 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10188 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10189 UPTransportLayerInformation_PR_gTPTunnel;
10192 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10193 sizeof(GTPTunnel_t));
10194 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10196 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10199 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10200 transportLayerAddress.size = 4*sizeof(uint8_t);
10201 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10202 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10203 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10204 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10205 transportLayerAddress.buf == NULLP)
10207 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10211 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10212 transportLayerAddress.buf[0] = 192;
10213 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10214 transportLayerAddress.buf[1] = 168;
10215 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10216 transportLayerAddress.buf[2] = 130;
10217 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10218 transportLayerAddress.buf[3] = 82;
10219 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10220 transportLayerAddress.bits_unused = 0;
10222 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10223 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10224 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10225 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10228 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10229 = 4 * sizeof(uint8_t);
10230 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10231 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10232 gTPTunnel->gTP_TEID.size);
10233 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10236 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10239 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10240 gTP_TEID.buf[0] = 0;
10241 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10242 gTP_TEID.buf[1] = 0;
10243 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10244 gTP_TEID.buf[2] = 0;
10245 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10247 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10248 * fetched based on the Drb Id */
10250 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10251 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10252 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10256 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10257 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10260 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10261 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10262 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10263 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10265 }/*End of BuildULTnlInfo*/
10267 /*******************************************************************
10269 * @brief freeing the DRB item
10273 * Function : FreeDrbItem
10275 * Functionality: freeing the DRB item
10277 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10279 * @return ROK - success
10280 * RFAILED - failure
10282 * ****************************************************************/
10284 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10287 SNSSAI_t *snssai =NULLP;
10288 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10290 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10291 switch(drbItem->qoSInformation.present)
10293 case QoSInformation_PR_NOTHING:
10295 case QoSInformation_PR_eUTRANQoS:
10297 if(drbItem->qoSInformation.choice.eUTRANQoS)
10299 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10303 case QoSInformation_PR_choice_extension:
10305 if(drbItem->qoSInformation.choice.choice_extension)
10307 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10309 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10310 if(snssai->sST.buf)
10312 CU_FREE(snssai->sST.buf,snssai->sST.size);
10316 if(snssai->sD->buf)
10318 CU_FREE(snssai->sD->buf,snssai->sD->size);
10320 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10323 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10324 if(flowMap->list.array)
10326 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10328 if(flowMap->list.array[arrIdx] )
10330 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10331 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10334 CU_FREE(flowMap->list.array,flowMap->list.size);
10337 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10343 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10344 if(drbItem->uLConfiguration)
10346 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10350 /*******************************************************************
10352 * @brief filling the DRB setup Mod item
10356 * Function : FillDrbItemToSetupMod
10358 * Functionality: filling the DRB setup Mod item
10361 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10363 * @return ROK - success
10364 * RFAILED - failure
10366 * ****************************************************************/
10368 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10373 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10374 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10377 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10379 switch(drbItem->qoSInformation.present)
10381 case QoSInformation_PR_NOTHING:
10385 case QoSInformation_PR_eUTRANQoS:
10388 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10389 if(drbItem->qoSInformation.choice.eUTRANQoS)
10391 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10394 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10395 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10396 PriorityLevel_no_priority;
10398 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10399 Pre_emptionCapability_may_trigger_pre_emption;
10401 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10402 Pre_emptionVulnerability_pre_emptable;
10406 case QoSInformation_PR_choice_extension:
10408 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10409 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10411 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10415 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10416 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10417 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10418 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10419 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10422 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10427 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10428 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10431 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10435 /*Flows mapped to DRB List*/
10436 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10437 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10438 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10441 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10447 /*ULUPTNLInformation To Be Setup List*/
10448 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10449 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10452 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10457 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10458 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10464 /*******************************************************************
10466 * @brief Builds the DRB to be Setup Mod ItemIes
10470 * Function : FillDrbItemList
10472 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10474 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10476 * @return ROK - success
10477 * RFAILED - failure
10479 * ****************************************************************/
10481 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10483 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10484 drbItemIe->criticality = Criticality_reject;
10485 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10487 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10489 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10494 /*******************************************************************
10496 * @brief free the DRB to be Setup Mod list
10500 * Function : FreeDrbToBeSetupModList
10502 * Functionality: free the DRB to be Setup Mod list
10504 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10506 * @return ROK - success
10507 * RFAILED - failure
10509 * ****************************************************************/
10510 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10513 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10515 if(drbSet->list.array)
10517 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10519 if(drbSet->list.array[arrIdx] != NULLP)
10523 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10524 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10526 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10529 CU_FREE(drbSet->list.array, drbSet->list.size);
10534 /*******************************************************************
10536 * @brief Builds the DRB to be Setup Mod list
10540 * Function : BuildDrbToBeSetupList
10542 * Functionality: Constructs the DRB to be Setup Mod list
10544 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10546 * @return ROK - success
10547 * RFAILED - failure
10549 * ****************************************************************/
10551 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10557 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10558 drbSet->list.count = drbCnt;
10559 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10560 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10561 if(drbSet->list.array == NULLP)
10563 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10567 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10569 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10570 if(drbSet->list.array[arrIdx] == NULLP)
10572 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10576 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10579 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10586 /*******************************************************************
10588 * @brief Filling the DRB to be modified item
10592 * Function : FillDrbToBeModItem
10594 * Functionality: filling the DRB to be modified item
10596 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10598 * @return ROK - success
10599 * RFAILED - failure
10601 * ****************************************************************/
10603 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10607 DrbInfo *drbToBeMod;
10610 drbItem->dRBID = DRB2 + arrIdx;
10612 /* Search for DRB ID in CU databse */
10613 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10615 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10617 drbToBeMod = &ueCb->drbList[drbIdx];
10623 drbItem->qoSInformation = NULLP;
10624 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10625 if(drbItem->qoSInformation != NULLP)
10627 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10629 switch(drbItem->qoSInformation->present)
10631 case QoSInformation_PR_NOTHING:
10635 case QoSInformation_PR_eUTRANQoS:
10638 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10639 if(drbItem->qoSInformation->choice.eUTRANQoS)
10641 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10644 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10645 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10646 PriorityLevel_no_priority;
10648 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10649 Pre_emptionCapability_may_trigger_pre_emption;
10651 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10652 Pre_emptionVulnerability_pre_emptable;
10656 case QoSInformation_PR_choice_extension:
10658 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10659 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10661 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10665 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10666 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10667 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10668 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10669 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10672 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10677 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10678 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10681 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10685 /*Flows mapped to DRB List*/
10686 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10687 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10688 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10691 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10698 /*ULUPTNLInformation To Be Setup List*/
10699 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10700 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10703 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10709 /*******************************************************************
10711 * @brief Builds the DRB to be modified Item IE
10715 * Function : FillDrbToBeModItemList
10717 * Functionality: Constructs the DRB to be modified Mod Item Ies
10719 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10721 * @return ROK - success
10722 * RFAILED - failure
10724 * ****************************************************************/
10726 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10728 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10729 drbItemIe->criticality = Criticality_reject;
10730 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10731 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10733 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10740 /*******************************************************************
10742 * @brief Builds the DRB to be modified list
10746 * Function : BuildDrbToBeModList
10748 * Functionality: Constructs the DRB to be modified list
10750 * @params[in] DRBs_ToBeModified_List_t *drbSet
10752 * @return ROK - success
10753 * RFAILED - failure
10755 * ****************************************************************/
10757 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10763 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10764 drbSet->list.count = drbCnt;
10765 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10766 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10767 if(drbSet->list.array == NULLP)
10769 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10772 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10774 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10775 if(drbSet->list.array[arrIdx] == NULLP)
10777 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10781 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10784 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10791 /*******************************************************************
10793 * @brief Builds the DRB to be released Item IE
10797 * Function : FillDrbToBeRelItemList
10799 * Functionality: Constructs the DRB to be modified Mod Item Ies
10801 * @params[in] struct DRBs_ToBeReleased_ItemIEs *drbItemIe
10803 * @return ROK - success
10804 * RFAILED - failure
10806 * ****************************************************************/
10808 uint8_t FillDrbToBeRelItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeReleased_ItemIEs *drbItemIe)
10812 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
10813 drbItemIe->criticality = Criticality_reject;
10814 drbItemIe->value.present = DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
10815 drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID = DRB1 + arrIdx;
10817 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10819 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID)
10821 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
10822 CU_FREE(ueCb->drbList[drbIdx].snssai, sizeof(Snssai));
10829 /*******************************************************************
10831 * @brief Builds the DRB to be released list
10835 * Function : BuildDrbToBeReleasedList
10837 * Functionality: Constructs the DRB to be released list
10839 * @params[in] DRBs_ToBeReleased_List_t *drbSet
10841 * @return ROK - success
10842 * RFAILED - failure
10844 * ****************************************************************/
10846 uint8_t BuildDrbToBeReleasedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeReleased_List_t *drbSet)
10852 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10853 drbSet->list.count = drbCnt;
10854 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeReleased_ItemIEs_t *);
10855 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10856 if(drbSet->list.array == NULLP)
10858 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10861 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10863 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
10864 if(drbSet->list.array[arrIdx] == NULLP)
10866 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10870 ret = FillDrbToBeRelItemList(duId, ueCb, arrIdx, (DRBs_ToBeReleased_ItemIEs_t *)drbSet->list.array[arrIdx]);
10873 DU_LOG("\nERROR --> F1AP : FillDrbToBeRelItemList failed");
10880 /*******************************************************************
10882 * @brief freeing the DRB item
10886 * Function : FreeModifiedDrbItem
10888 * Functionality: freeing the DRB 2 item
10890 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10892 * @return ROK - success
10893 * RFAILED - failure
10895 * ****************************************************************/
10897 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10900 SNSSAI_t *snssai =NULLP;
10901 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10903 if(drbItem->qoSInformation != NULLP)
10905 switch(drbItem->qoSInformation->present)
10907 case QoSInformation_PR_NOTHING:
10909 case QoSInformation_PR_eUTRANQoS:
10911 if(drbItem->qoSInformation->choice.eUTRANQoS)
10913 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10917 case QoSInformation_PR_choice_extension:
10919 if(drbItem->qoSInformation->choice.choice_extension)
10921 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10923 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10924 if(snssai->sST.buf)
10926 CU_FREE(snssai->sST.buf,snssai->sST.size);
10930 if(snssai->sD->buf)
10932 CU_FREE(snssai->sD->buf,snssai->sD->size);
10934 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10937 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10938 if(flowMap->list.array)
10940 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10942 if(flowMap->list.array[arrIdx] )
10944 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10945 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10948 CU_FREE(flowMap->list.array,flowMap->list.size);
10951 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10957 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10958 if(drbItem->uLConfiguration)
10960 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10964 /*******************************************************************
10966 * @brief free the DRB to be modfified list
10970 * Function : FreeDrbToBeModifiedList
10972 * Functionality: free the DRB to be Setup Mod list
10974 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10976 * @return ROK - success
10977 * RFAILED - failure
10979 * ****************************************************************/
10980 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10983 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10985 if(drbSet->list.array)
10987 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10989 if(drbSet->list.array[arrIdx] != NULLP)
10991 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10992 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10993 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10996 CU_FREE(drbSet->list.array, drbSet->list.size);
11001 /*******************************************************************
11003 * @brief free the DRB to be modfified list
11007 * Function : FreeDrbToBeReleasedList
11009 * Functionality: free the DRB to be Release list
11011 * @params[in] FreeDrbToBeReleasedList_t *drbSet
11013 * @return ROK - success
11014 * RFAILED - failure
11016 * ****************************************************************/
11017 void FreeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet)
11020 struct DRBs_ToBeReleased_ItemIEs *drbItemIe;
11022 if(drbSet->list.array)
11024 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
11026 if(drbSet->list.array[arrIdx] != NULLP)
11028 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
11031 CU_FREE(drbSet->list.array, drbSet->list.size);
11035 /*******************************************************************
11037 * @brief free the UeContextModification Request
11041 * Function : FreeUeContextModicationRequest
11043 * Functionality : deallocation of memory allocated in UeContextModiification
11046 * @params[in] F1AP_PDU_t *f1apMsg
11050 * ****************************************************************/
11051 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
11053 uint8_t arrIdx =0 , ieId=0;
11054 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11058 if(f1apMsg->choice.initiatingMessage)
11060 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11061 if(ueContextModifyReq->protocolIEs.list.array)
11063 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
11065 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
11067 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
11070 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11072 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11074 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
11076 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11077 choice.DRBs_ToBeSetupMod_List);
11080 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
11082 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11083 choice.DRBs_ToBeModified_List);
11086 case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
11088 FreeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11089 choice.DRBs_ToBeReleased_List);
11092 case ProtocolIE_ID_id_TransmissionActionIndicator:
11094 case ProtocolIE_ID_id_RRCContainer:
11096 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
11097 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
11101 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
11104 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11106 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11108 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11112 /*******************************************************************
11114 * @brief Builds the Ue Context Modification Req
11118 * Function : BuildAndSendUeContextModificationReq
11120 * Functionality: Constructs the Ue Context Modification Req
11124 * @return ROK - success
11125 * RFAILED - failure
11127 * ****************************************************************/
11128 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
11131 uint8_t elementCnt = 0;
11132 uint8_t ret = RFAILED;
11133 uint16_t tmpBufIdx = 0, bufIdx = 0;
11134 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
11135 F1AP_PDU_t *f1apMsg = NULLP;
11136 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11137 RRCContainer_t rrcContainerTmp, *rrcContainer = NULLP;
11138 asn_enc_rval_t encRetVal;
11139 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
11142 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11143 if(f1apMsg == NULLP)
11145 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11149 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11151 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11152 if(f1apMsg->choice.initiatingMessage == NULLP)
11154 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11157 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
11158 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11159 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
11161 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11163 if(action == MODIFY_UE)
11165 else if(action == QUERY_CONFIG)
11167 else if(action == RRC_RECONFIG_COMPLETE_IND)
11169 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11171 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11178 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11181 ueContextModifyReq->protocolIEs.list.count = elementCnt;
11182 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
11184 /* Initialize the UE context modification members */
11185 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11186 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
11188 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11192 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11194 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
11195 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
11197 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11203 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11204 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11205 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11206 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
11207 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
11210 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11211 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11212 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
11213 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
11214 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
11216 if(action == MODIFY_UE)
11218 /* DRB to be setup list */
11220 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
11221 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11222 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11223 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
11224 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11225 value.choice.DRBs_ToBeSetupMod_List));
11227 /* DRB to be modified list */
11229 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
11230 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11231 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11232 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11233 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11234 value.choice.DRBs_ToBeModified_List));
11238 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11242 /* DRB to be released list */
11244 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeReleased_List;
11245 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11246 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11247 UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
11248 ret = BuildDrbToBeReleasedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11249 value.choice.DRBs_ToBeReleased_List));
11253 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be deleted list");
11257 else if(action == QUERY_CONFIG)
11260 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11261 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11262 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11263 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11264 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11266 else if(action == RRC_RECONFIG_COMPLETE_IND)
11269 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11270 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11271 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11272 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11273 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11274 RRCReconfigurationCompleteIndicator_true;
11276 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11279 if(action == STOP_DATA_TX)
11281 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11282 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11283 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11284 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11285 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11286 TransmissionActionIndicator_stop;
11288 else if (action == RESTART_DATA_TX)
11290 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11291 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11292 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11293 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11294 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11295 TransmissionActionIndicator_restart;
11299 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11300 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11301 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCContainer;
11302 if(fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, true) != ROK)
11304 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11308 rrcContainer = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
11309 rrcContainer->size = rrcContainerTmp.size + 2; /* 2 bytes of PDCP SN */
11310 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
11311 memset(rrcContainer->buf, 0, rrcContainer->size);
11312 rrcContainer->buf[0] = 0x00;
11313 rrcContainer->buf[1] = ueCb->pdcpSn; //PDCP SN
11314 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
11316 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
11319 /* RRC delivery status request */
11320 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11323 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11324 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11325 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11326 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11331 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11333 /* DRX Configuration Indicator */
11335 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator;
11336 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11337 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator;
11338 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release;
11339 ueCb->drxCfgPresent = false;
11340 memset(&ueCb->drxCfg, 0, sizeof(DrxCfg));
11344 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11346 /* Encode the F1SetupRequest type as APER */
11347 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11349 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11351 /* Encode results */
11352 if(encRetVal.encoded == ENCODE_FAIL)
11354 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11355 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11360 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11362 /* This for loop was going into an infinite loop even though encBufSize
11363 * has a small value. Hence commented this
11365 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11367 DU_LOG("%x",encBuf[ieIdx]);
11372 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11373 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11375 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11383 FreeUeContextModicationRequest(f1apMsg);
11387 /*****************************************************************i
11389 * @brief Free memory allocated for UE Context Release Command
11393 * Function : FreeUeContextReleaseCommand
11396 * - Free memory allocated for UE Context Release Command
11398 * @params[in] F1AP_PDU_t *f1apMsg
11401 * *************************************************************/
11402 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11405 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11409 if(f1apMsg->choice.initiatingMessage)
11411 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11412 if(ueReleaseCommand->protocolIEs.list.array)
11414 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11416 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11418 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11420 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11422 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11425 /*******************************************************************
11427 * @brief Builds the Ue Context Release Command
11431 * Function : BuildAndSendUeContextReleaseCommand
11433 * Functionality: Constructs the Ue Context Release Command
11437 * @return ROK - success
11438 * RFAILED - failure
11440 * ****************************************************************/
11441 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11443 bool memAllocFailed = false;
11444 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11447 F1AP_PDU_t *f1apMsg = NULLP;
11448 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11450 asn_enc_rval_t encRetVal;
11451 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11455 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11456 if(f1apMsg == NULLP)
11458 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11462 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11464 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11465 if(f1apMsg->choice.initiatingMessage == NULLP)
11467 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11470 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11471 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11472 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11474 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11476 SEARCH_DU_DB(duIdx, duId, duDb);
11477 ueCb = &duDb->ueCb[duUeF1apId-1];
11478 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11483 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11484 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11486 /* Initialize the UE context modification members */
11487 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11488 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11490 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11494 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11496 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11497 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11499 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11500 memAllocFailed = true;
11505 if(memAllocFailed == true)
11511 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11512 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11513 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11514 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11515 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11518 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11519 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11520 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11521 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11522 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11524 /* Cause of UE context release */
11526 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11527 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11528 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11529 UEContextReleaseCommandIEs__value_PR_Cause;
11530 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11531 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11532 CauseRadioNetwork_normal_release;
11533 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11535 /* RRC Container for RRC release */
11537 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11538 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11539 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11540 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11541 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11543 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11544 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11545 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11546 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11548 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11551 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11552 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11554 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11556 /* Encode the UE Context Release Command type as APER */
11557 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11559 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11562 /* Encode results */
11563 if(encRetVal.encoded == ENCODE_FAIL)
11565 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11566 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11571 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11572 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11574 DU_LOG("%x",encBuf[ieIdx]);
11578 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11579 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11581 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11589 FreeUeContextReleaseCommand(f1apMsg);
11592 /*******************************************************************
11594 * @brief process Ue context release request
11598 * Function : procUeContextReleaseReq
11601 * - process Ue context release request
11603 * @params[in] F1AP_PDU_t *f1apMsg
11604 * @return ROK - success
11605 * RFAILED - failure
11607 * ****************************************************************/
11608 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11610 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11612 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11613 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11615 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11617 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11619 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11621 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11624 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11626 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11634 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11636 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11641 /*******************************************************************
11643 * @brief processing of Gnb-DU config update
11647 * Function : procGnbDuUpdate
11650 * - processing of Gnb-DU config update
11652 * @params[in] F1AP_PDU_t *f1apMsg
11653 * @return ROK - success
11654 * RFAILED - failure
11656 * ****************************************************************/
11657 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11659 bool cellToBeDelete = false;
11660 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11664 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11666 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11667 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11669 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11671 case ProtocolIE_ID_id_TransactionID:
11673 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11675 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11677 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11678 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11679 Served_Cells_To_Delete_List.list.array[0];
11680 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11681 cellToBeDelete = true;
11684 case ProtocolIE_ID_id_gNB_DU_ID:
11688 if(BuildAndSendDUUpdateAck(duId) != ROK)
11690 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11694 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11695 * commented this trigger for now */
11697 if(cellToBeDelete == false)
11699 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11700 if(BuildAndSendF1ResetReq() != ROK)
11702 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11707 if(cellToBeDelete == true)
11709 SEARCH_DU_DB(duIdx, duId, duDb);
11710 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11711 if(cellCb->numUe == 0)
11713 memset(cellCb, 0, sizeof(CuCellCb));
11717 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11722 /*******************************************************************
11724 * @brief storing slice list in CU database
11728 * Function : buildSliceList
11731 * - storing slice list in CU database
11733 * @params[in] SliceSupportList_t *sliceSupportList
11734 * @return ROK - success
11735 * RFAILED - failure
11737 * ****************************************************************/
11738 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11740 uint8_t sliceListIdx = 0;
11742 if(sliceSupportList)
11744 if(sliceSupportList->list.array)
11746 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11747 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11749 if(sliceSupportList->list.array[sliceListIdx])
11751 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11752 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11754 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11757 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11759 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11760 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11762 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11764 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11765 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11766 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11775 /****************************************************************
11776 * @brief Function to process Srb Setup Mod List
11780 * Function : procSrbSetupModList
11783 * - Function to process SRB Setup Mod List
11786 * @return ROK - success
11787 * RFAILED - failure
11789 * ****************************************************************/
11790 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11792 uint8_t arrIdx = 0, srbIdx;
11793 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11795 if(srbSetupList != NULLP)
11797 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11799 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11800 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11802 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11804 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11806 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11818 /****************************************************************
11819 * @brief Function to process Drb Setup Mod List
11823 * Function : procDrbSetupModList
11826 * - Function to process DRB Setup Mod List
11829 * @return ROK - success
11830 * RFAILED - failure
11832 * ****************************************************************/
11833 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11835 uint8_t arrIdx = 0, drbIdx;
11837 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11839 if(drbSetupList != NULLP)
11841 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11843 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11844 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11846 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11848 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11850 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11851 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11856 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11858 /* extracting teId */
11859 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11862 if(addDrbTunnels(duId, teId)== ROK)
11864 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11876 /*******************************************************************
11878 * @brief processing of GNB_DU_Served_Cells Plmn list information
11882 * Function : procServedCellPlmnList
11885 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11888 * @params[in] F1AP_PDU_t *f1apMsg
11889 * @return ROK - success
11890 * RFAILED - failure
11892 * ****************************************************************/
11893 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11895 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11896 ProtocolExtensionContainer_4624P3_t **ieExtend;
11898 if(srvPlmn->list.array)
11900 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11902 if(srvPlmn->list.array[srvPlmnIdx])
11904 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11907 if((*ieExtend)->list.array)
11909 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11911 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11913 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11915 case ProtocolIE_ID_id_TAISliceSupportList:
11917 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11918 extensionValue.choice.SliceSupportList) != ROK)
11920 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11935 /****************************************************************
11936 * @brief Function to process Ue Context Modification Response
11940 * Function : procUeContextModificationResponse
11943 * - Function to process Ue Context Modification Response
11946 * @return ROK - success
11947 * RFAILED - failure
11949 * ****************************************************************/
11950 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *recvBuf, MsgLen recvBufLen)
11952 uint8_t idx=0, duIdx=0;
11953 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11954 DuDb *duDb = NULLP;
11955 CuUeCb *ueCb = NULLP;
11956 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11958 SEARCH_DU_DB(duIdx, duId, duDb);
11959 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11961 /* In case of Inter-CU Handover request received from peer CU */
11962 if(duDb->tempUeCtxtInHo)
11963 ueCb = duDb->tempUeCtxtInHo;
11965 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11967 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11969 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11973 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11977 /* In case of Inter-CU Handover request received from peer CU */
11978 cuUeF1apId = ueCb->gnbCuUeF1apId;
11982 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11986 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11987 ueCb = &duDb->ueCb[duUeF1apId-1];
11989 /* In case UE context modification response is received at source GNB CU from source GNB DU
11990 * for a UE in handover, send HO request to target GNB only if not sent already.
11991 * If HO Req is already sent to target GNB, and an HO Req Ack is received, then
11992 * ueCb->hoInfo.cuUeF1apIdTgt will be non-zero
11994 if((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO) && \
11995 (ueCb->hoInfo.cuUeF1apIdTgt == 0))
11997 BuildAndSendHOReq(ueCb, recvBuf, recvBufLen);
12002 case ProtocolIE_ID_id_DRBs_SetupMod_List:
12004 /* Adding Tunnels for successful DRB */
12005 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
12009 case ProtocolIE_ID_id_DRBs_Modified_List:
12011 DU_LOG("\nINFO --> Received DRBs Modified List");
12014 case ProtocolIE_ID_id_SRBs_SetupMod_List:
12016 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
12019 case ProtocolIE_ID_id_DUtoCURRCInformation:
12021 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
12022 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
12023 DUtoCURRCInformation.cellGroupConfig)) != ROK)
12025 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
12034 /* If UE is in handover and UE context is not yet created at target DU, then send
12035 * UE context setup request to target DU */
12036 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
12039 uint8_t tgtDuId = 0;
12040 DuDb *tgtDuDb = NULLP;
12041 CuUeCb *ueCbInTgtDu = NULLP;
12043 if(ueCb->hoInfo.HOType == Inter_DU_HO)
12045 tgtDuId = ueCb->hoInfo.tgtNodeId;
12047 else if (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO)
12052 SEARCH_DU_DB(duIdx, tgtDuId, tgtDuDb);
12055 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
12056 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
12058 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
12060 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
12062 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
12067 /* If UE context is not found in Target DU, send UE context setup
12069 if(ueCbInTgtDu == NULLP)
12071 if((BuildAndSendUeContextSetupReq(tgtDuId, ueCb)) != ROK)
12073 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
12080 #ifdef START_DL_UL_DATA
12087 /*******************************************************************
12089 * @brief processing of F1 setup request
12093 * Function : procF1SetupReq
12096 * - processing of F1 setup request
12098 * @params[in] F1AP_PDU_t *f1apMsg
12099 * @return ROK - success
12100 * RFAILED - failure
12102 * ****************************************************************/
12103 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
12105 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
12107 uint64_t nrCellId = 0;
12108 DuDb *duDb = NULLP;
12109 CuCellCb *cellCb = NULLP;
12110 BIT_STRING_t nrcellIdentity;
12111 F1SetupRequest_t *f1SetupReq = NULLP;
12112 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
12113 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
12115 /* Triggering XN setup request before F1 setup establishment */
12116 if(LOCAL_NODE_TYPE == CLIENT)
12117 BuildAndSendXnSetupReq();
12119 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
12120 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
12122 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
12124 case ProtocolIE_ID_id_gNB_DU_ID:
12126 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
12127 SEARCH_DU_DB(duIdx, duId, duDb);
12130 duDb = &cuCb.duInfo[cuCb.numDu];
12133 memset(duDb, 0, sizeof(DuDb));
12138 case ProtocolIE_ID_id_gNB_DU_Name:
12140 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
12143 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
12145 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
12146 if(duServedCell->list.array)
12148 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
12150 if(duServedCell->list.array[plmnidx])
12152 switch(duServedCell->list.array[plmnidx]->id)
12154 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
12156 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
12157 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
12158 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
12160 bitStringToInt(&nrcellIdentity, &nrCellId);
12161 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
12162 if(cellCb == NULLP)
12164 cellCb = &duDb->cellCb[duDb->numCells];
12165 memset(cellCb, 0, sizeof(CuCellCb));
12166 cellCb->nrCellId = nrCellId;
12167 cellCb->cellStatus = CELL_ACTIVE;
12180 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
12184 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
12188 /****************************************************************
12190 * @brief processing of UE Context Release Complete
12194 * Function : procUeContextReleaseComplete
12197 * - processing of UE Context Release Complete
12199 * @params[in] F1AP_PDU_t *f1apMsg
12200 * @return ROK - success
12201 * RFAILED - failure
12203 * ****************************************************************/
12204 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
12206 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
12207 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
12208 DuDb *duDb = NULLP;
12209 CuUeCb *ueCb = NULLP;
12210 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
12212 SEARCH_DU_DB(duIdx, duId, duDb);
12215 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
12219 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
12220 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
12222 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
12224 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12226 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
12229 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12231 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
12232 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
12233 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
12235 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
12237 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
12238 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
12240 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
12242 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
12244 ueCb->cellCb->ueCb[ueIdx] = NULLP;
12245 ueCb->cellCb->numUe--;
12246 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
12248 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
12255 memset(ueCb, 0, sizeof(CuUeCb));
12263 /*******************************************************************
12265 * @brief Builds the Paging cell list
12269 * Function : BuildPagingCellList
12271 * Functionality: Build the paging cell list
12273 * @params[in] PagingCell_list_t *pagingCelllist,
12275 * @return ROK - success
12276 * RFAILED - failure
12278 * ****************************************************************/
12279 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
12281 uint8_t cellIdx =0;
12282 PagingCell_ItemIEs_t *pagingCellItemIes;
12283 PagingCell_Item_t *pagingCellItem;
12285 pagingCelllist->list.count = numCells;
12286 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
12287 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
12288 if(pagingCelllist->list.array == NULLP)
12290 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12294 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12296 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12297 if(pagingCelllist->list.array[cellIdx] == NULLP)
12299 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12304 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12306 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12307 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
12308 pagingCellItemIes->criticality = Criticality_ignore;
12309 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
12310 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12312 /* Fill NrCgi Information */
12313 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
12319 /*******************************************************************
12321 * @brief Deallocation of memory allocated in paging msg
12325 * Function :FreePagingMsg
12327 * Functionality: Deallocation of memory allocated in paging msg
12329 * @params[in] F1AP_PDU_t *f1apMsg
12333 * ****************************************************************/
12334 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12336 uint8_t ieIdx, cellIdx;
12338 PagingCell_ItemIEs_t *pagingCellItemIes;
12339 PagingCell_Item_t *pagingCellItem;
12340 PagingCell_list_t *pagingCelllist;
12344 if(f1apMsg->choice.initiatingMessage)
12346 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12347 if(paging->protocolIEs.list.array)
12349 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12351 if(paging->protocolIEs.list.array[ieIdx])
12353 switch(paging->protocolIEs.list.array[ieIdx]->id)
12355 case ProtocolIE_ID_id_UEIdentityIndexValue:
12357 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12358 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12362 case ProtocolIE_ID_id_PagingIdentity:
12364 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12366 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12368 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12370 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12371 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12373 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12374 sizeof(struct CNUEPagingIdentity));
12380 case ProtocolIE_ID_id_PagingCell_List:
12382 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12383 if(pagingCelllist->list.array)
12385 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12387 if(pagingCelllist->list.array[cellIdx])
12389 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12390 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12392 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12393 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12394 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12396 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12399 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12404 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12407 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12409 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12411 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12414 /*******************************************************************
12416 * @brief Builds and sends the paging message if UE is in idle mode
12420 * Function : BuildAndSendPagingMsg
12422 * Functionality: Builds and sends the paging message
12424 * @params[in] uint32_t duId, uint8_t gsTmsi
12426 * @return ROK - success
12427 * RFAILED - failure
12429 * ****************************************************************/
12430 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12432 bool memAllocFailed = false;
12433 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12434 uint16_t ueId = 0, duIdx = 0;
12436 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12437 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12438 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12439 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12441 F1AP_PDU_t *f1apMsg = NULLP;
12442 Paging_t *paging = NULLP;
12444 asn_enc_rval_t encRetVal;
12446 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12448 SEARCH_DU_DB(duIdx, duId, duDb);
12451 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12454 if(duDb->numCells == 0)
12456 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): No CELL is UP!");
12462 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12463 if(f1apMsg == NULLP)
12465 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12469 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12471 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12472 if(f1apMsg->choice.initiatingMessage == NULLP)
12474 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12477 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12478 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12479 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12481 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12484 paging->protocolIEs.list.count = elementCnt;
12485 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12487 /* Initialize the Paging Message members */
12488 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12489 if(paging->protocolIEs.list.array == NULLP)
12491 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12495 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12497 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12498 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12500 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12501 memAllocFailed = true;
12506 if(memAllocFailed == true)
12511 /* UE Identity Index Value */
12513 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12514 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12515 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12516 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12517 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12518 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12519 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12520 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12522 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12526 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12527 ueId = gsTmsi % 1024;
12528 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12530 /* Paging Identity */
12532 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12533 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12534 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12535 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12536 PagingIdentity_PR_cNUEPagingIdentity;
12537 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12538 sizeof(struct CNUEPagingIdentity));
12539 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12541 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12545 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12546 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12548 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12549 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12550 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12551 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12553 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12557 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12558 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12562 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12563 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12564 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12565 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12567 /* Paging Priority */
12569 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12570 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12571 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12572 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12574 /* Paging Cell List */
12576 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12577 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12578 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12579 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12581 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12585 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12587 /* Encode the UE Context Release Command type as APER */
12588 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12590 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12593 /* Encode results */
12594 if(encRetVal.encoded == ENCODE_FAIL)
12596 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12597 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12602 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12603 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12605 DU_LOG("%x",encBuf[ieIdx]);
12609 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12611 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12620 FreePagingMsg(f1apMsg);
12624 /*******************************************************************
12626 * @brief Decode received character string into F1AP message
12630 * Function : F1APMsgHdlr
12633 * - Decodes received F1AP control message
12636 * @return ROK - success
12637 * RFAILED - failure
12639 * ****************************************************************/
12640 uint8_t F1APDecodeMsg(F1AP_PDU_t *f1apMsg, Buffer *mBuf, char **recvBuf, MsgLen *recvBufLen)
12644 asn_dec_rval_t rval; /* Decoder return value */
12646 /* Copy mBuf into char array to decode it */
12647 ODU_GET_MSG_LEN(mBuf, recvBufLen);
12648 CU_ALLOC(*recvBuf, (Size)(*recvBufLen));
12649 if(*recvBuf == NULLP)
12651 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12654 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, *recvBufLen, (Data *)*recvBuf, ©Cnt) != ROK)
12656 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12660 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : \n");
12661 for(i=0; i< *recvBufLen; i++)
12663 DU_LOG("%x ",(*recvBuf)[i]);
12666 /* Decoding flat buffer into F1AP messsage */
12667 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, *recvBuf, *recvBufLen, 0, 0);
12668 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12670 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12674 /* Printing the decoded F1AP PDU */
12676 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12680 /*******************************************************************
12682 * @brief Handles received F1AP message and sends back response
12686 * Function : F1APMsgHdlr
12689 * - Decodes received F1AP control message
12690 * - Prepares response message, encodes and sends to SCTP
12693 * @return ROK - success
12694 * RFAILED - failure
12696 * ****************************************************************/
12697 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12701 F1AP_PDU_t *f1apMsg = NULLP;
12702 F1AP_PDU_t f1apasnmsg ;
12704 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12705 ODU_PRINT_MSG(mBuf, 0,0);
12707 f1apMsg = &f1apasnmsg;
12708 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12709 if(F1APDecodeMsg(f1apMsg, mBuf, &recvBuf, &recvBufLen) != ROK)
12711 DU_LOG("\nERROR --> F1AP : F1AP PDU decode failed");
12715 switch(f1apMsg->present)
12717 case F1AP_PDU_PR_initiatingMessage:
12719 switch(f1apMsg->choice.initiatingMessage->value.present)
12721 case InitiatingMessage__value_PR_Reset:
12723 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12724 BuildAndSendF1ResetAck();
12728 case InitiatingMessage__value_PR_F1SetupRequest:
12730 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12731 procF1SetupReq(duId, f1apMsg);
12735 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12737 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12738 procGnbDuUpdate(*duId, f1apMsg);
12741 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12743 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12744 procInitULRRCMsg(*duId, f1apMsg);
12747 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12749 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12750 procUlRrcMsg(*duId, f1apMsg);
12754 case InitiatingMessage__value_PR_RRCDeliveryReport:
12756 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12759 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12761 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12762 procUeContextReleaseReq(*duId, f1apMsg);
12767 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12768 f1apMsg->choice.initiatingMessage->value.present);
12771 }/* End of switch(initiatingMessage) */
12775 case F1AP_PDU_PR_successfulOutcome:
12777 switch(f1apMsg->choice.successfulOutcome->value.present)
12779 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12781 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12784 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12786 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12787 procUeContextSetupResponse(*duId, f1apMsg, recvBuf, recvBufLen);
12790 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12792 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12793 procUeContextModificationResponse(*duId, f1apMsg, recvBuf, recvBufLen);
12796 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12798 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12799 procUeContextReleaseComplete(*duId, f1apMsg);
12804 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12805 f1apMsg->choice.successfulOutcome->value.present);
12808 }/* End of switch(successfulOutcome) */
12813 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12816 }/* End of switch(f1apMsg->present) */
12818 CU_FREE(recvBuf, (Size)(recvBufLen));
12819 } /* End of F1APMsgHdlr */
12821 /**********************************************************************
12823 **********************************************************************/