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 /* UE Capabulity RAT Container List */
9028 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9029 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
9031 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
9034 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
9038 /* Commenting this because:
9039 * CUToDURRCInformation->MeasConfig contains measurement gap configurations.
9040 * Howeever measurement gap is not supported in our code. Measurement Gap will
9041 * be required if we want to support inter-RAT handover or handover to
9042 * neighbouring cells operating on a different frequency than serving cell.
9044 * In case we plan to use this IE in future, following fixes are required:
9045 * As of now, we are filling MeasurementTimingConfigurationRrc_t into rrcMsg->measConfig.
9046 * This is incorrect. We must fill MeasConfigRrc_t in rrcMsg->measConfig.
9047 * MeasurementTimingConfigurationRrc_t should be filled in
9048 * rrcMsg->iE_Extensions->MeasurementTimingConfiguration, if required.
9051 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
9052 if(!rrcMsg->measConfig)
9054 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
9057 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
9060 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9063 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9064 if(rrcMsg->iE_Extensions)
9067 rrcMsg->iE_Extensions->list.count = elementCnt;
9068 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9070 /* Initialize the CUtoDURRCInformation_ExtIEs */
9071 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9073 if(rrcMsg->iE_Extensions->list.array == NULLP)
9075 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9079 for(idx=0; idx<elementCnt; idx++)
9081 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9082 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9084 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9091 /* Cell Group Configuration */
9092 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9093 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9094 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9095 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9096 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9099 /* Handover Preparation Information */
9100 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9101 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9102 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9103 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9104 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9109 /*******************************************************************
9111 * @brief Build the drx cycle
9115 * Function : BuildDrxCycle
9117 * Functionality: Build drx cycle IE
9119 * @params[in] pointer to DRXCycle_t
9121 * @return ROK - success
9124 ******************************************************************/
9125 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9127 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms80;
9128 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9129 if(!drxCycle->shortDRXCycleLength)
9131 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9134 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9136 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9137 if(!drxCycle->shortDRXCycleTimer)
9139 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9142 *(drxCycle->shortDRXCycleTimer) = 4;
9145 /*******************************************************************
9147 * @brief Free CuToDuContainer
9151 * Function : FreeCuToDuInfo
9153 * Functionality: Free CuToDuContainer
9155 * @params[in] pointer to CUtoDURRCInformation_t
9157 * @return ROK - success
9160 ******************************************************************/
9162 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9166 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9168 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9169 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9170 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9172 if(rrcMsg->iE_Extensions)
9174 if(rrcMsg->iE_Extensions->list.array)
9176 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9178 if(rrcMsg->iE_Extensions->list.array[idx])
9180 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9182 case ProtocolIE_ID_id_CellGroupConfig:
9183 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9185 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9186 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9191 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9192 rrcMsg->iE_Extensions->list.array[idx]->id);
9198 for(idx2 = 0; idx2 < idx; idx2++)
9200 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9202 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9206 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9209 /*******************************************************************
9211 * @brief Builds and sends the UE Setup Request
9215 * Function : BuildAndSendUeContextSetupReq
9217 * Functionality: Constructs the UE Setup Request and sends
9218 * it to the CU through SCTP.
9222 * @return ROK - success
9225 * ****************************************************************/
9226 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9228 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9229 uint8_t ret= RFAILED, ret1;
9231 uint8_t idx, idx1, bufLen, duIdx;
9233 uint32_t targetDuId;
9234 DuDb *targetDuDb = NULLP;
9235 F1AP_PDU_t *f1apMsg = NULLP;
9236 UEContextSetupRequest_t *ueSetReq = NULLP;
9237 asn_enc_rval_t encRetVal; /* Encoder return value */
9238 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9242 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9244 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9245 if(f1apMsg == NULLP)
9247 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9251 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9252 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9253 if(f1apMsg->choice.initiatingMessage == NULLP)
9255 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9259 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9260 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9261 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9263 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9265 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9275 ueSetReq->protocolIEs.list.count = elementCnt;
9276 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9278 /* Initialize the UESetup members */
9279 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9281 if(ueSetReq->protocolIEs.list.array == NULLP)
9283 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9287 for(idx1=0; idx1<elementCnt; idx1++)
9289 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9290 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9298 /*GNB CU UE F1AP ID*/
9299 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9300 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9301 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9302 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9304 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9306 /*GNB DU UE F1AP ID*/
9308 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9309 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9310 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9311 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9316 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9317 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9318 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9320 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9321 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9323 if(ueCb->hoInfo.HOType == Inter_DU_HO)
9324 targetDuId = ueCb->hoInfo.tgtNodeId;
9328 SEARCH_DU_DB(duIdx, targetDuId, targetDuDb);
9329 /* Since we are supporting only one cell per DU, accessing 0th index to
9330 * get target cell info */
9331 spCellId = targetDuDb->cellCb[0].nrCellId;
9334 spCellId = ueCb->cellCb->nrCellId;
9336 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9342 /*Served Cell Index*/
9344 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9345 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9346 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9347 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9349 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9351 /*CellULConfigured*/
9353 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9354 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9355 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9356 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9359 /*CUtoDURRCContainer*/
9361 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9362 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9363 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9364 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9369 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9374 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9375 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9376 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9377 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9379 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9383 /*Special Cells to be SetupList*/
9385 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9386 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9387 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9388 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9389 if(SplCellListret != ROK)
9395 /*SRBs To Be Setup List*/
9397 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9398 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9399 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9400 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9401 if(SrbSetupret != ROK)
9406 /*DRBs to Be Setup List*/
9408 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9409 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9410 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9411 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9417 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9419 /* RRC delivery status request */
9421 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9422 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9423 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9424 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9427 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9429 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9430 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9431 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9433 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9435 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9436 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9437 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9438 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9440 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9443 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9444 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9446 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9448 /* Encode the F1SetupRequest type as APER */
9449 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9451 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9453 /* Encode results */
9454 if(encRetVal.encoded == ENCODE_FAIL)
9456 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9457 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9462 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9463 for(int i=0; i< encBufSize; i++)
9465 DU_LOG("%x",encBuf[i]);
9470 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9472 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9478 FreeUeContextSetupReq(f1apMsg);
9481 }/* End of BuildAndSendUeContextSetupReq*/
9483 /**********************************************************************
9484 * @brief Function to extractTeId received in UE context setup Response
9488 * Function : extractTeId
9491 * - Function to extract TeId
9494 * @return ROK - success
9497 **********************************************************************/
9498 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9502 GTPTunnel_t *gtpDl = NULLP;
9504 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9506 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9508 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9510 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9511 if(gtpDl->gTP_TEID.size > 0)
9513 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9516 DU_LOG("\nERROR --> EGTP: No TeId received");
9524 /****************************************************************
9525 * @brief Function to add Drb tunnels
9529 * Function : addDrbTunnels
9532 * - Function to add Drb tunnels
9535 * @return ROK - success
9538 * ****************************************************************/
9539 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9544 if(teId > MAX_TEID || teId < MIN_TEID)
9546 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9548 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9549 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9550 tnlEvt.lclTeid = teId;
9551 tnlEvt.remTeid = teId;
9552 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9555 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9560 /****************************************************************
9561 * @brief Function to process Drb Setup List
9565 * Function : procDrbSetupList
9568 * - Function to process DRB Setup List
9571 * @return ROK - success
9574 * ****************************************************************/
9575 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9577 uint8_t arrIdx = 0, drbIdx = 0;
9579 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9581 if(drbSetupList != NULLP)
9583 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9585 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9586 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9588 /* extracting teId */
9589 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9592 if(addDrbTunnels(duId, teId)== ROK)
9594 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9596 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9597 * are sent to CU for setting up of Tunnels in DL direction.
9598 * Search for DRB ID in CU databse */
9599 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9601 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9603 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9616 /****************************************************************
9617 * @brief Function to process Ue Context Setup Response
9621 * Function : procUeContextSetupResponse
9624 * - Function to process Ue Context Setup Response
9627 * @return ROK - success
9630 * ****************************************************************/
9631 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *recvBuf, MsgLen recvBufLen)
9633 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9634 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9636 CuUeCb *ueCb = NULLP;
9637 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9638 OCTET_STRING_t *duToCuRrcContainer;
9640 SEARCH_DU_DB(duIdx, duId, duDb);
9641 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9643 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9645 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9647 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9649 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9652 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9654 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9655 ueCb = &duDb->ueCb[duUeF1apId-1];
9656 /* If ue context is not present in du db, then create UE context
9657 * here. This flow is hit in case of UE handover where UE
9658 * context is created before UE performs RACH on target DU */
9659 if(ueCb->gnbDuUeF1apId == 0)
9661 /* Creating UE context in target DU */
9662 memset(ueCb, 0, sizeof(CuUeCb));
9664 /* Check if UE is under Inter-CU handover */
9665 if(duDb->tempUeCtxtInHo && (duDb->tempUeCtxtInHo->gnbCuUeF1apId == cuUeF1apId))
9667 memcpy(ueCb, duDb->tempUeCtxtInHo, sizeof(CuUeCb));
9668 ueCb->gnbDuUeF1apId = duUeF1apId;
9669 CU_FREE(duDb->tempUeCtxtInHo, sizeof(CuUeCb));
9673 /* In case of Inter DU Handover */
9674 ueCb->cellCb = &duDb->cellCb[0];
9675 ueCb->gnbDuUeF1apId = duUeF1apId;
9676 ueCb->gnbCuUeF1apId = cuUeF1apId;
9677 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9678 ueCb->hoInfo.HOType = Inter_DU_HO;
9679 ueCb->hoInfo.tgtNodeId = duId;
9683 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9684 ueCb->cellCb->numUe++;
9688 case ProtocolIE_ID_id_C_RNTI:
9690 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9693 case ProtocolIE_ID_id_DRBs_Setup_List:
9695 /* Adding Tunnels for successful DRB */
9696 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9699 case ProtocolIE_ID_id_DUtoCURRCInformation:
9701 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9702 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9703 DUtoCURRCInformation.cellGroupConfig;
9704 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9705 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9707 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9715 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9717 ueCb->f1apMsgDb.dlRrcMsgCount++;
9718 rrcMsgType = setDlRRCMsgType(ueCb);
9720 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9721 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9723 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9727 else if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9729 if(ueCb->hoInfo.HOType == Inter_DU_HO)
9731 /* If the UE is in Inter-DU handover, UE context modification request is to be sent to
9732 * source DU once UE context setup response is received from target DU */
9734 DuDb *srcDuDb = NULLP;
9735 CuUeCb *ueCbInSrcDu = NULLP;
9737 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9738 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9739 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9741 /* UE context setup response is received from target DU. Search all
9742 * DUs to find source DU except this target DU Id.*/
9743 if(cuCb.duInfo[duIdx].duId != duId)
9745 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9748 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9749 * received in UE context setup response since CU UE F1AP ID does not
9750 * change for UE in handover.
9751 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9753 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9754 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9756 srcDuDb = &cuCb.duInfo[duIdx];
9757 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9759 /* Store source DU info in the new UE context created in
9761 ueCb->hoInfo.srcNodeId = srcDuDb->duId;
9763 /* Copy the received container to UeCb */
9764 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9766 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9768 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9775 if(srcDuDb && ueCbInSrcDu)
9779 else if(ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO)
9781 BuildAndSendHOReqAck(ueCb, recvBuf, recvBufLen);
9788 /****************************************************************
9789 * @brief Function to process Ul Rrc Msg received from DU
9793 * Function : procUlRrcMsg
9796 * - Function to process Ul Rrc Msg received from DU
9799 * @return ROK - success
9802 * ****************************************************************/
9804 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9806 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9807 uint8_t *rrcContainer = NULLP;
9808 uint16_t rrcContLen = 0;
9809 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9811 CuUeCb *ueCb = NULLP;
9812 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9815 SEARCH_DU_DB(duIdx, duId, duDb);
9816 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9818 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9820 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9822 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9824 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9827 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9829 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9832 case ProtocolIE_ID_id_SRBID:
9833 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9836 case ProtocolIE_ID_id_RRCContainer:
9838 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9839 CU_ALLOC(rrcContainer, rrcContLen);
9842 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9845 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9847 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9850 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.srcNodeId;
9851 DuDb *srcDuDb = NULLP;
9853 /* In target DU DB, mark UE as active and delete HO info */
9854 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9855 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9857 /* Release UE context in source DU because the UE is now
9858 * attached to target DU */
9859 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9860 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9862 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9864 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9867 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9878 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9885 ueCb = &duDb->ueCb[duUeF1apId-1];
9886 ueCb->f1apMsgDb.dlRrcMsgCount++;
9887 rrcMsgType = setDlRRCMsgType(ueCb);
9888 if(rrcMsgType == REGISTRATION_COMPLETE)
9890 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9891 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9893 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9895 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9896 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9900 /* In case rrcMsgType is RRC_SETUP_COMPLETE / NAS_AUTHENTICATION_RSP / NAS_SECURITY_MODE_COMPLETE / RRC_SECURITY_MODE_COMPLETE */
9901 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9907 /****************************************************************
9908 * @brief Build And Send F1ResetAck
9912 * Function : FreeF1ResetAck
9915 * - Build And Send F1ResetRSP
9918 * @return ROK - success
9921 * ****************************************************************/
9922 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9925 ResetAcknowledge_t *f1ResetAck;
9929 if(f1apMsg->choice.successfulOutcome)
9931 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9933 if(f1ResetAck->protocolIEs.list.array)
9935 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9937 if(f1ResetAck->protocolIEs.list.array[idx])
9939 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9942 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9944 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9946 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9950 /****************************************************************
9951 * @brief Build And Send F1ResetAck
9955 * Function : BuildAndSendF1ResetAck
9958 * - Build And Send F1ResetRSP
9961 * @return ROK - success
9964 * ****************************************************************/
9966 uint8_t BuildAndSendF1ResetAck()
9969 uint8_t elementCnt = 0;
9970 uint8_t ret = RFAILED;
9971 F1AP_PDU_t *f1apMsg = NULL;
9972 ResetAcknowledge_t *f1ResetAck = NULLP;
9973 asn_enc_rval_t encRetVal;
9974 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9977 /* Allocate the memory for F1ResetRequest_t */
9978 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9979 if(f1apMsg == NULLP)
9981 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9985 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9987 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9988 if(f1apMsg->choice.successfulOutcome == NULLP)
9990 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9994 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9995 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9996 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9997 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10001 f1ResetAck->protocolIEs.list.count = elementCnt;
10002 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
10004 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10005 if(f1ResetAck->protocolIEs.list.array == NULLP)
10007 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
10011 for(idx=0; idx<elementCnt; idx++)
10013 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10014 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
10021 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10022 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10023 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
10024 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
10026 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10028 /* Encode the F1SetupRequest type as UPER */
10029 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10031 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10033 /* Check encode results */
10034 if(encRetVal.encoded == ENCODE_FAIL)
10036 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
10037 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10042 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
10043 for(int i=0; i< encBufSize; i++)
10045 DU_LOG("%x",encBuf[i]);
10050 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10051 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
10053 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
10061 FreeF1ResetAck(f1apMsg);
10065 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
10069 if(ulInfo->list.array)
10071 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
10073 if(ulInfo->list.array[arrIdx])
10075 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
10077 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
10079 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
10081 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10082 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10083 gTPTunnel->gTP_TEID.size);
10085 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10086 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10087 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10089 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10090 sizeof(GTPTunnel_t));
10092 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10095 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10099 /*******************************************************************
10101 * @brief Deletes the EGTP tunnel
10105 * Function : deleteEgtpTunnel
10107 * Functionality: Deletes the EGTP tunnel
10109 * @params[in] uint8_t *buf
10111 * @return ROK - success
10112 * RFAILED - failure
10114 * ****************************************************************/
10115 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10120 teIdStringToInt(buf, &teId);
10121 if(teId > MAX_TEID || teId < MIN_TEID)
10123 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10126 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10127 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10128 tnlEvt.lclTeid = teId;
10129 tnlEvt.remTeid = teId;
10130 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10132 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10137 /*******************************************************************
10139 * @brief Builds the Uplink Tunnel Info
10143 * Function : BuildUlTnlInfoforSetupMod
10145 * Functionality: Constructs the UL TnlInfo For DRB list
10147 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10149 * @return ROK - success
10150 * RFAILED - failure
10152 * ****************************************************************/
10153 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10159 ulInfo->list.count = ulCnt;
10160 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10161 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10162 if(ulInfo->list.array == NULLP)
10164 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10167 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10169 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10170 if(ulInfo->list.array[arrIdx] == NULLP)
10172 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10178 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10179 UPTransportLayerInformation_PR_gTPTunnel;
10182 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10183 sizeof(GTPTunnel_t));
10184 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10186 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10189 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10190 transportLayerAddress.size = 4*sizeof(uint8_t);
10191 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10192 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10193 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10194 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10195 transportLayerAddress.buf == NULLP)
10197 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10201 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10202 transportLayerAddress.buf[0] = 192;
10203 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10204 transportLayerAddress.buf[1] = 168;
10205 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10206 transportLayerAddress.buf[2] = 130;
10207 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10208 transportLayerAddress.buf[3] = 82;
10209 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10210 transportLayerAddress.bits_unused = 0;
10212 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10213 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10214 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10215 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10218 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10219 = 4 * sizeof(uint8_t);
10220 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10221 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10222 gTPTunnel->gTP_TEID.size);
10223 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10226 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10229 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10230 gTP_TEID.buf[0] = 0;
10231 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10232 gTP_TEID.buf[1] = 0;
10233 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10234 gTP_TEID.buf[2] = 0;
10235 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10237 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10238 * fetched based on the Drb Id */
10240 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10241 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10242 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10246 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10247 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10250 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10251 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10252 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10253 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10255 }/*End of BuildULTnlInfo*/
10257 /*******************************************************************
10259 * @brief freeing the DRB item
10263 * Function : FreeDrbItem
10265 * Functionality: freeing the DRB item
10267 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10269 * @return ROK - success
10270 * RFAILED - failure
10272 * ****************************************************************/
10274 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10277 SNSSAI_t *snssai =NULLP;
10278 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10280 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10281 switch(drbItem->qoSInformation.present)
10283 case QoSInformation_PR_NOTHING:
10285 case QoSInformation_PR_eUTRANQoS:
10287 if(drbItem->qoSInformation.choice.eUTRANQoS)
10289 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10293 case QoSInformation_PR_choice_extension:
10295 if(drbItem->qoSInformation.choice.choice_extension)
10297 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10299 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10300 if(snssai->sST.buf)
10302 CU_FREE(snssai->sST.buf,snssai->sST.size);
10306 if(snssai->sD->buf)
10308 CU_FREE(snssai->sD->buf,snssai->sD->size);
10310 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10313 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10314 if(flowMap->list.array)
10316 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10318 if(flowMap->list.array[arrIdx] )
10320 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10321 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10324 CU_FREE(flowMap->list.array,flowMap->list.size);
10327 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10333 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10334 if(drbItem->uLConfiguration)
10336 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10340 /*******************************************************************
10342 * @brief filling the DRB setup Mod item
10346 * Function : FillDrbItemToSetupMod
10348 * Functionality: filling the DRB setup Mod item
10351 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10353 * @return ROK - success
10354 * RFAILED - failure
10356 * ****************************************************************/
10358 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10363 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10364 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10367 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10369 switch(drbItem->qoSInformation.present)
10371 case QoSInformation_PR_NOTHING:
10375 case QoSInformation_PR_eUTRANQoS:
10378 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10379 if(drbItem->qoSInformation.choice.eUTRANQoS)
10381 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10384 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10385 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10386 PriorityLevel_no_priority;
10388 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10389 Pre_emptionCapability_may_trigger_pre_emption;
10391 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10392 Pre_emptionVulnerability_pre_emptable;
10396 case QoSInformation_PR_choice_extension:
10398 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10399 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10401 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10405 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10406 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10407 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10408 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10409 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10412 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10417 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10418 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10421 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10425 /*Flows mapped to DRB List*/
10426 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10427 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10428 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10431 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10437 /*ULUPTNLInformation To Be Setup List*/
10438 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10439 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10442 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10447 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10448 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10454 /*******************************************************************
10456 * @brief Builds the DRB to be Setup Mod ItemIes
10460 * Function : FillDrbItemList
10462 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10464 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10466 * @return ROK - success
10467 * RFAILED - failure
10469 * ****************************************************************/
10471 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10473 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10474 drbItemIe->criticality = Criticality_reject;
10475 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10477 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10479 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10484 /*******************************************************************
10486 * @brief free the DRB to be Setup Mod list
10490 * Function : FreeDrbToBeSetupModList
10492 * Functionality: free the DRB to be Setup Mod list
10494 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10496 * @return ROK - success
10497 * RFAILED - failure
10499 * ****************************************************************/
10500 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10503 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10505 if(drbSet->list.array)
10507 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10509 if(drbSet->list.array[arrIdx] != NULLP)
10513 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10514 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10516 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10519 CU_FREE(drbSet->list.array, drbSet->list.size);
10524 /*******************************************************************
10526 * @brief Builds the DRB to be Setup Mod list
10530 * Function : BuildDrbToBeSetupList
10532 * Functionality: Constructs the DRB to be Setup Mod list
10534 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10536 * @return ROK - success
10537 * RFAILED - failure
10539 * ****************************************************************/
10541 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10547 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10548 drbSet->list.count = drbCnt;
10549 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10550 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10551 if(drbSet->list.array == NULLP)
10553 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10557 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10559 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10560 if(drbSet->list.array[arrIdx] == NULLP)
10562 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10566 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10569 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10576 /*******************************************************************
10578 * @brief Filling the DRB to be modified item
10582 * Function : FillDrbToBeModItem
10584 * Functionality: filling the DRB to be modified item
10586 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10588 * @return ROK - success
10589 * RFAILED - failure
10591 * ****************************************************************/
10593 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10597 DrbInfo *drbToBeMod;
10600 drbItem->dRBID = DRB2 + arrIdx;
10602 /* Search for DRB ID in CU databse */
10603 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10605 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10607 drbToBeMod = &ueCb->drbList[drbIdx];
10613 drbItem->qoSInformation = NULLP;
10614 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10615 if(drbItem->qoSInformation != NULLP)
10617 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10619 switch(drbItem->qoSInformation->present)
10621 case QoSInformation_PR_NOTHING:
10625 case QoSInformation_PR_eUTRANQoS:
10628 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10629 if(drbItem->qoSInformation->choice.eUTRANQoS)
10631 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10634 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10635 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10636 PriorityLevel_no_priority;
10638 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10639 Pre_emptionCapability_may_trigger_pre_emption;
10641 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10642 Pre_emptionVulnerability_pre_emptable;
10646 case QoSInformation_PR_choice_extension:
10648 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10649 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10651 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10655 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10656 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10657 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10658 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10659 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10662 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10667 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10668 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10671 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10675 /*Flows mapped to DRB List*/
10676 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10677 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10678 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10681 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10688 /*ULUPTNLInformation To Be Setup List*/
10689 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10690 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10693 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10699 /*******************************************************************
10701 * @brief Builds the DRB to be modified Item IE
10705 * Function : FillDrbToBeModItemList
10707 * Functionality: Constructs the DRB to be modified Mod Item Ies
10709 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10711 * @return ROK - success
10712 * RFAILED - failure
10714 * ****************************************************************/
10716 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10718 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10719 drbItemIe->criticality = Criticality_reject;
10720 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10721 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10723 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10730 /*******************************************************************
10732 * @brief Builds the DRB to be modified list
10736 * Function : BuildDrbToBeModList
10738 * Functionality: Constructs the DRB to be modified list
10740 * @params[in] DRBs_ToBeModified_List_t *drbSet
10742 * @return ROK - success
10743 * RFAILED - failure
10745 * ****************************************************************/
10747 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10753 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10754 drbSet->list.count = drbCnt;
10755 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10756 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10757 if(drbSet->list.array == NULLP)
10759 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10762 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10764 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10765 if(drbSet->list.array[arrIdx] == NULLP)
10767 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10771 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10774 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10781 /*******************************************************************
10783 * @brief Builds the DRB to be released Item IE
10787 * Function : FillDrbToBeRelItemList
10789 * Functionality: Constructs the DRB to be modified Mod Item Ies
10791 * @params[in] struct DRBs_ToBeReleased_ItemIEs *drbItemIe
10793 * @return ROK - success
10794 * RFAILED - failure
10796 * ****************************************************************/
10798 uint8_t FillDrbToBeRelItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeReleased_ItemIEs *drbItemIe)
10802 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
10803 drbItemIe->criticality = Criticality_reject;
10804 drbItemIe->value.present = DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
10805 drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID = DRB1 + arrIdx;
10807 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10809 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID)
10811 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
10812 CU_FREE(ueCb->drbList[drbIdx].snssai, sizeof(Snssai));
10819 /*******************************************************************
10821 * @brief Builds the DRB to be released list
10825 * Function : BuildDrbToBeReleasedList
10827 * Functionality: Constructs the DRB to be released list
10829 * @params[in] DRBs_ToBeReleased_List_t *drbSet
10831 * @return ROK - success
10832 * RFAILED - failure
10834 * ****************************************************************/
10836 uint8_t BuildDrbToBeReleasedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeReleased_List_t *drbSet)
10842 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10843 drbSet->list.count = drbCnt;
10844 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeReleased_ItemIEs_t *);
10845 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10846 if(drbSet->list.array == NULLP)
10848 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10851 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10853 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
10854 if(drbSet->list.array[arrIdx] == NULLP)
10856 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10860 ret = FillDrbToBeRelItemList(duId, ueCb, arrIdx, (DRBs_ToBeReleased_ItemIEs_t *)drbSet->list.array[arrIdx]);
10863 DU_LOG("\nERROR --> F1AP : FillDrbToBeRelItemList failed");
10870 /*******************************************************************
10872 * @brief freeing the DRB item
10876 * Function : FreeModifiedDrbItem
10878 * Functionality: freeing the DRB 2 item
10880 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10882 * @return ROK - success
10883 * RFAILED - failure
10885 * ****************************************************************/
10887 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10890 SNSSAI_t *snssai =NULLP;
10891 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10893 if(drbItem->qoSInformation != NULLP)
10895 switch(drbItem->qoSInformation->present)
10897 case QoSInformation_PR_NOTHING:
10899 case QoSInformation_PR_eUTRANQoS:
10901 if(drbItem->qoSInformation->choice.eUTRANQoS)
10903 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10907 case QoSInformation_PR_choice_extension:
10909 if(drbItem->qoSInformation->choice.choice_extension)
10911 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10913 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10914 if(snssai->sST.buf)
10916 CU_FREE(snssai->sST.buf,snssai->sST.size);
10920 if(snssai->sD->buf)
10922 CU_FREE(snssai->sD->buf,snssai->sD->size);
10924 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10927 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10928 if(flowMap->list.array)
10930 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10932 if(flowMap->list.array[arrIdx] )
10934 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10935 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10938 CU_FREE(flowMap->list.array,flowMap->list.size);
10941 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10947 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10948 if(drbItem->uLConfiguration)
10950 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10954 /*******************************************************************
10956 * @brief free the DRB to be modfified list
10960 * Function : FreeDrbToBeModifiedList
10962 * Functionality: free the DRB to be Setup Mod list
10964 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10966 * @return ROK - success
10967 * RFAILED - failure
10969 * ****************************************************************/
10970 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10973 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10975 if(drbSet->list.array)
10977 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10979 if(drbSet->list.array[arrIdx] != NULLP)
10981 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10982 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10983 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10986 CU_FREE(drbSet->list.array, drbSet->list.size);
10991 /*******************************************************************
10993 * @brief free the DRB to be modfified list
10997 * Function : FreeDrbToBeReleasedList
10999 * Functionality: free the DRB to be Release list
11001 * @params[in] FreeDrbToBeReleasedList_t *drbSet
11003 * @return ROK - success
11004 * RFAILED - failure
11006 * ****************************************************************/
11007 void FreeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet)
11010 struct DRBs_ToBeReleased_ItemIEs *drbItemIe;
11012 if(drbSet->list.array)
11014 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
11016 if(drbSet->list.array[arrIdx] != NULLP)
11018 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
11021 CU_FREE(drbSet->list.array, drbSet->list.size);
11025 /*******************************************************************
11027 * @brief free the UeContextModification Request
11031 * Function : FreeUeContextModicationRequest
11033 * Functionality : deallocation of memory allocated in UeContextModiification
11036 * @params[in] F1AP_PDU_t *f1apMsg
11040 * ****************************************************************/
11041 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
11043 uint8_t arrIdx =0 , ieId=0;
11044 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11048 if(f1apMsg->choice.initiatingMessage)
11050 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11051 if(ueContextModifyReq->protocolIEs.list.array)
11053 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
11055 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
11057 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
11060 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11062 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11064 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
11066 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11067 choice.DRBs_ToBeSetupMod_List);
11070 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
11072 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11073 choice.DRBs_ToBeModified_List);
11076 case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
11078 FreeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11079 choice.DRBs_ToBeReleased_List);
11082 case ProtocolIE_ID_id_TransmissionActionIndicator:
11084 case ProtocolIE_ID_id_RRCContainer:
11086 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
11087 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
11091 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
11094 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11096 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11098 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11102 /*******************************************************************
11104 * @brief Builds the Ue Context Modification Req
11108 * Function : BuildAndSendUeContextModificationReq
11110 * Functionality: Constructs the Ue Context Modification Req
11114 * @return ROK - success
11115 * RFAILED - failure
11117 * ****************************************************************/
11118 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
11121 uint8_t elementCnt = 0;
11122 uint8_t ret = RFAILED;
11123 uint16_t tmpBufIdx = 0, bufIdx = 0;
11124 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
11125 F1AP_PDU_t *f1apMsg = NULLP;
11126 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11127 RRCContainer_t rrcContainerTmp, *rrcContainer = NULLP;
11128 asn_enc_rval_t encRetVal;
11129 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
11132 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11133 if(f1apMsg == NULLP)
11135 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11139 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11141 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11142 if(f1apMsg->choice.initiatingMessage == NULLP)
11144 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11147 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
11148 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11149 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
11151 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11153 if(action == MODIFY_UE)
11155 else if(action == QUERY_CONFIG)
11157 else if(action == RRC_RECONFIG_COMPLETE_IND)
11159 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11163 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11166 ueContextModifyReq->protocolIEs.list.count = elementCnt;
11167 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
11169 /* Initialize the UE context modification members */
11170 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11171 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
11173 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11177 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11179 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
11180 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
11182 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11188 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11189 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11190 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11191 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
11192 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
11195 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11196 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11197 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
11198 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
11199 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
11201 if(action == MODIFY_UE)
11203 /* DRB to be setup list */
11205 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
11206 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11207 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11208 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
11209 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11210 value.choice.DRBs_ToBeSetupMod_List));
11212 /* DRB to be modified list */
11214 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
11215 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11216 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11217 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11218 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11219 value.choice.DRBs_ToBeModified_List));
11223 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11227 /* DRB to be released list */
11229 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeReleased_List;
11230 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11231 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11232 UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
11233 ret = BuildDrbToBeReleasedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11234 value.choice.DRBs_ToBeReleased_List));
11238 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be deleted list");
11242 else if(action == QUERY_CONFIG)
11245 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11246 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11247 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11248 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11249 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11251 else if(action == RRC_RECONFIG_COMPLETE_IND)
11254 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11255 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11256 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11257 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11258 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11259 RRCReconfigurationCompleteIndicator_true;
11261 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11264 if(action == STOP_DATA_TX)
11266 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11267 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11268 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11269 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11270 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11271 TransmissionActionIndicator_stop;
11273 else if (action == RESTART_DATA_TX)
11275 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11276 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11277 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11278 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11279 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11280 TransmissionActionIndicator_restart;
11284 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11285 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11286 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCContainer;
11287 if(fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, true) != ROK)
11289 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11293 rrcContainer = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
11294 rrcContainer->size = rrcContainerTmp.size + 2; /* 2 bytes of PDCP SN */
11295 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
11296 memset(rrcContainer->buf, 0, rrcContainer->size);
11297 rrcContainer->buf[0] = 0x00;
11298 rrcContainer->buf[1] = ueCb->pdcpSn; //PDCP SN
11299 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
11301 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
11304 /* RRC delivery status request */
11306 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11307 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11308 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11309 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11313 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11315 /* DRX Configuration Indicator */
11317 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator;
11318 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11319 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator;
11320 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release;
11321 ueCb->drxCfgPresent = false;
11322 memset(&ueCb->drxCfg, 0, sizeof(DrxCfg));
11326 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11328 /* Encode the F1SetupRequest type as APER */
11329 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11331 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11333 /* Encode results */
11334 if(encRetVal.encoded == ENCODE_FAIL)
11336 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11337 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11342 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11344 /* This for loop was going into an infinite loop even though encBufSize
11345 * has a small value. Hence commented this
11347 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11349 DU_LOG("%x",encBuf[ieIdx]);
11354 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11355 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11357 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11365 FreeUeContextModicationRequest(f1apMsg);
11369 /*****************************************************************i
11371 * @brief Free memory allocated for UE Context Release Command
11375 * Function : FreeUeContextReleaseCommand
11378 * - Free memory allocated for UE Context Release Command
11380 * @params[in] F1AP_PDU_t *f1apMsg
11383 * *************************************************************/
11384 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11387 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11391 if(f1apMsg->choice.initiatingMessage)
11393 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11394 if(ueReleaseCommand->protocolIEs.list.array)
11396 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11398 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11400 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11402 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11404 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11407 /*******************************************************************
11409 * @brief Builds the Ue Context Release Command
11413 * Function : BuildAndSendUeContextReleaseCommand
11415 * Functionality: Constructs the Ue Context Release Command
11419 * @return ROK - success
11420 * RFAILED - failure
11422 * ****************************************************************/
11423 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11425 bool memAllocFailed = false;
11426 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11429 F1AP_PDU_t *f1apMsg = NULLP;
11430 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11432 asn_enc_rval_t encRetVal;
11433 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11437 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11438 if(f1apMsg == NULLP)
11440 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11444 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11446 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11447 if(f1apMsg->choice.initiatingMessage == NULLP)
11449 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11452 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11453 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11454 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11456 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11458 SEARCH_DU_DB(duIdx, duId, duDb);
11459 ueCb = &duDb->ueCb[duUeF1apId-1];
11460 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11465 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11466 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11468 /* Initialize the UE context modification members */
11469 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11470 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11472 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11476 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11478 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11479 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11481 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11482 memAllocFailed = true;
11487 if(memAllocFailed == true)
11493 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11494 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11495 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11496 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11497 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11500 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11501 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11502 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11503 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11504 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11506 /* Cause of UE context release */
11508 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11509 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11510 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11511 UEContextReleaseCommandIEs__value_PR_Cause;
11512 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11513 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11514 CauseRadioNetwork_normal_release;
11515 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11517 /* RRC Container for RRC release */
11519 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11520 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11521 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11522 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11523 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11525 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11526 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11527 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11528 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11530 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11533 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11534 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11536 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11538 /* Encode the UE Context Release Command type as APER */
11539 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11541 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11544 /* Encode results */
11545 if(encRetVal.encoded == ENCODE_FAIL)
11547 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11548 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11553 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11554 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11556 DU_LOG("%x",encBuf[ieIdx]);
11560 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11561 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11563 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11571 FreeUeContextReleaseCommand(f1apMsg);
11574 /*******************************************************************
11576 * @brief process Ue context release request
11580 * Function : procUeContextReleaseReq
11583 * - process Ue context release request
11585 * @params[in] F1AP_PDU_t *f1apMsg
11586 * @return ROK - success
11587 * RFAILED - failure
11589 * ****************************************************************/
11590 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11592 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11594 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11595 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11597 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11599 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11601 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11603 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11606 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11608 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11616 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11618 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11623 /*******************************************************************
11625 * @brief processing of Gnb-DU config update
11629 * Function : procGnbDuUpdate
11632 * - processing of Gnb-DU config update
11634 * @params[in] F1AP_PDU_t *f1apMsg
11635 * @return ROK - success
11636 * RFAILED - failure
11638 * ****************************************************************/
11639 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11641 bool cellToBeDelete = false;
11642 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11646 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11648 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11649 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11651 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11653 case ProtocolIE_ID_id_TransactionID:
11655 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11657 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11659 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11660 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11661 Served_Cells_To_Delete_List.list.array[0];
11662 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11663 cellToBeDelete = true;
11666 case ProtocolIE_ID_id_gNB_DU_ID:
11670 if(BuildAndSendDUUpdateAck(duId) != ROK)
11672 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11676 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11677 * commented this trigger for now */
11679 if(cellToBeDelete == false)
11681 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11682 if(BuildAndSendF1ResetReq() != ROK)
11684 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11689 if(cellToBeDelete == true)
11691 SEARCH_DU_DB(duIdx, duId, duDb);
11692 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11693 if(cellCb->numUe == 0)
11695 memset(cellCb, 0, sizeof(CuCellCb));
11699 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11704 /*******************************************************************
11706 * @brief storing slice list in CU database
11710 * Function : buildSliceList
11713 * - storing slice list in CU database
11715 * @params[in] SliceSupportList_t *sliceSupportList
11716 * @return ROK - success
11717 * RFAILED - failure
11719 * ****************************************************************/
11720 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11722 uint8_t sliceListIdx = 0;
11724 if(sliceSupportList)
11726 if(sliceSupportList->list.array)
11728 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11729 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11731 if(sliceSupportList->list.array[sliceListIdx])
11733 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11734 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11736 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11739 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11741 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11742 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11744 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11746 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11747 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11748 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11757 /****************************************************************
11758 * @brief Function to process Srb Setup Mod List
11762 * Function : procSrbSetupModList
11765 * - Function to process SRB Setup Mod List
11768 * @return ROK - success
11769 * RFAILED - failure
11771 * ****************************************************************/
11772 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11774 uint8_t arrIdx = 0, srbIdx;
11775 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11777 if(srbSetupList != NULLP)
11779 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11781 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11782 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11784 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11786 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11788 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11800 /****************************************************************
11801 * @brief Function to process Drb Setup Mod List
11805 * Function : procDrbSetupModList
11808 * - Function to process DRB Setup Mod List
11811 * @return ROK - success
11812 * RFAILED - failure
11814 * ****************************************************************/
11815 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11817 uint8_t arrIdx = 0, drbIdx;
11819 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11821 if(drbSetupList != NULLP)
11823 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11825 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11826 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11828 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11830 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11832 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11833 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11838 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11840 /* extracting teId */
11841 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11844 if(addDrbTunnels(duId, teId)== ROK)
11846 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11858 /*******************************************************************
11860 * @brief processing of GNB_DU_Served_Cells Plmn list information
11864 * Function : procServedCellPlmnList
11867 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11870 * @params[in] F1AP_PDU_t *f1apMsg
11871 * @return ROK - success
11872 * RFAILED - failure
11874 * ****************************************************************/
11875 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11877 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11878 ProtocolExtensionContainer_4624P3_t **ieExtend;
11880 if(srvPlmn->list.array)
11882 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11884 if(srvPlmn->list.array[srvPlmnIdx])
11886 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11889 if((*ieExtend)->list.array)
11891 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11893 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11895 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11897 case ProtocolIE_ID_id_TAISliceSupportList:
11899 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11900 extensionValue.choice.SliceSupportList) != ROK)
11902 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11917 /****************************************************************
11918 * @brief Function to process Ue Context Modification Response
11922 * Function : procUeContextModificationResponse
11925 * - Function to process Ue Context Modification Response
11928 * @return ROK - success
11929 * RFAILED - failure
11931 * ****************************************************************/
11932 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *recvBuf, MsgLen recvBufLen)
11934 uint8_t idx=0, duIdx=0;
11935 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11936 DuDb *duDb = NULLP;
11937 CuUeCb *ueCb = NULLP;
11938 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11940 SEARCH_DU_DB(duIdx, duId, duDb);
11941 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11943 /* In case of Inter-CU Handover request received from peer CU */
11944 if(duDb->tempUeCtxtInHo)
11945 ueCb = duDb->tempUeCtxtInHo;
11947 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11949 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11951 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11955 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11959 /* In case of Inter-CU Handover request received from peer CU */
11960 cuUeF1apId = ueCb->gnbCuUeF1apId;
11964 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11968 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11969 ueCb = &duDb->ueCb[duUeF1apId-1];
11971 if((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO))
11973 BuildAndSendHOReq(ueCb, recvBuf, recvBufLen);
11978 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11980 /* Adding Tunnels for successful DRB */
11981 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11985 case ProtocolIE_ID_id_DRBs_Modified_List:
11987 DU_LOG("\nINFO --> Received DRBs Modified List");
11990 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11992 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11995 case ProtocolIE_ID_id_DUtoCURRCInformation:
11997 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11998 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11999 DUtoCURRCInformation.cellGroupConfig)) != ROK)
12001 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
12010 /* If UE is in handover and UE context is not yet created at target DU, then send
12011 * UE context setup request to target DU */
12012 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
12015 uint8_t tgtDuId = 0;
12016 DuDb *tgtDuDb = NULLP;
12017 CuUeCb *ueCbInTgtDu = NULLP;
12019 if(ueCb->hoInfo.HOType == Inter_DU_HO)
12021 tgtDuId = ueCb->hoInfo.tgtNodeId;
12023 else if (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO)
12028 SEARCH_DU_DB(duIdx, tgtDuId, tgtDuDb);
12031 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
12032 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
12034 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
12036 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
12038 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
12043 /* If UE context is not found in Target DU, send UE context setup
12045 if(ueCbInTgtDu == NULLP)
12047 if((BuildAndSendUeContextSetupReq(tgtDuId, ueCb)) != ROK)
12049 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
12056 #ifdef START_DL_UL_DATA
12063 /*******************************************************************
12065 * @brief processing of F1 setup request
12069 * Function : procF1SetupReq
12072 * - processing of F1 setup request
12074 * @params[in] F1AP_PDU_t *f1apMsg
12075 * @return ROK - success
12076 * RFAILED - failure
12078 * ****************************************************************/
12079 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
12081 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
12083 uint64_t nrCellId = 0;
12084 DuDb *duDb = NULLP;
12085 CuCellCb *cellCb = NULLP;
12086 BIT_STRING_t nrcellIdentity;
12087 F1SetupRequest_t *f1SetupReq = NULLP;
12088 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
12089 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
12091 /* Triggering XN setup request before F1 setup establishment */
12092 if(LOCAL_NODE_TYPE == CLIENT)
12093 BuildAndSendXnSetupReq();
12095 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
12096 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
12098 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
12100 case ProtocolIE_ID_id_gNB_DU_ID:
12102 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
12103 SEARCH_DU_DB(duIdx, duId, duDb);
12106 duDb = &cuCb.duInfo[cuCb.numDu];
12109 memset(duDb, 0, sizeof(DuDb));
12114 case ProtocolIE_ID_id_gNB_DU_Name:
12116 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
12119 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
12121 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
12122 if(duServedCell->list.array)
12124 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
12126 if(duServedCell->list.array[plmnidx])
12128 switch(duServedCell->list.array[plmnidx]->id)
12130 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
12132 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
12133 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
12134 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
12136 bitStringToInt(&nrcellIdentity, &nrCellId);
12137 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
12138 if(cellCb == NULLP)
12140 cellCb = &duDb->cellCb[duDb->numCells];
12141 memset(cellCb, 0, sizeof(CuCellCb));
12142 cellCb->nrCellId = nrCellId;
12143 cellCb->cellStatus = CELL_ACTIVE;
12156 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
12160 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
12164 /****************************************************************
12166 * @brief processing of UE Context Release Complete
12170 * Function : procUeContextReleaseComplete
12173 * - processing of UE Context Release Complete
12175 * @params[in] F1AP_PDU_t *f1apMsg
12176 * @return ROK - success
12177 * RFAILED - failure
12179 * ****************************************************************/
12180 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
12182 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
12183 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
12184 DuDb *duDb = NULLP;
12185 CuUeCb *ueCb = NULLP;
12186 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
12188 SEARCH_DU_DB(duIdx, duId, duDb);
12191 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
12195 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
12196 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
12198 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
12200 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12202 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
12205 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12207 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
12208 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
12209 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
12211 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
12213 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
12214 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
12216 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
12218 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
12220 ueCb->cellCb->ueCb[ueIdx] = NULLP;
12221 ueCb->cellCb->numUe--;
12222 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
12224 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
12231 memset(ueCb, 0, sizeof(CuUeCb));
12239 /*******************************************************************
12241 * @brief Builds the Paging cell list
12245 * Function : BuildPagingCellList
12247 * Functionality: Build the paging cell list
12249 * @params[in] PagingCell_list_t *pagingCelllist,
12251 * @return ROK - success
12252 * RFAILED - failure
12254 * ****************************************************************/
12255 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
12257 uint8_t cellIdx =0;
12258 PagingCell_ItemIEs_t *pagingCellItemIes;
12259 PagingCell_Item_t *pagingCellItem;
12261 pagingCelllist->list.count = numCells;
12262 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
12263 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
12264 if(pagingCelllist->list.array == NULLP)
12266 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12270 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12272 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12273 if(pagingCelllist->list.array[cellIdx] == NULLP)
12275 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12280 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12282 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12283 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
12284 pagingCellItemIes->criticality = Criticality_ignore;
12285 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
12286 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12288 /* Fill NrCgi Information */
12289 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
12295 /*******************************************************************
12297 * @brief Deallocation of memory allocated in paging msg
12301 * Function :FreePagingMsg
12303 * Functionality: Deallocation of memory allocated in paging msg
12305 * @params[in] F1AP_PDU_t *f1apMsg
12309 * ****************************************************************/
12310 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12312 uint8_t ieIdx, cellIdx;
12314 PagingCell_ItemIEs_t *pagingCellItemIes;
12315 PagingCell_Item_t *pagingCellItem;
12316 PagingCell_list_t *pagingCelllist;
12320 if(f1apMsg->choice.initiatingMessage)
12322 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12323 if(paging->protocolIEs.list.array)
12325 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12327 if(paging->protocolIEs.list.array[ieIdx])
12329 switch(paging->protocolIEs.list.array[ieIdx]->id)
12331 case ProtocolIE_ID_id_UEIdentityIndexValue:
12333 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12334 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12338 case ProtocolIE_ID_id_PagingIdentity:
12340 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12342 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12344 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12346 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12347 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12349 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12350 sizeof(struct CNUEPagingIdentity));
12356 case ProtocolIE_ID_id_PagingCell_List:
12358 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12359 if(pagingCelllist->list.array)
12361 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12363 if(pagingCelllist->list.array[cellIdx])
12365 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12366 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12368 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12369 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12370 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12372 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12375 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12380 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12383 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12385 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12387 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12390 /*******************************************************************
12392 * @brief Builds and sends the paging message if UE is in idle mode
12396 * Function : BuildAndSendPagingMsg
12398 * Functionality: Builds and sends the paging message
12400 * @params[in] uint32_t duId, uint8_t gsTmsi
12402 * @return ROK - success
12403 * RFAILED - failure
12405 * ****************************************************************/
12406 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12408 bool memAllocFailed = false;
12409 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12410 uint16_t ueId = 0, duIdx = 0;
12412 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12413 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12414 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12415 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12417 F1AP_PDU_t *f1apMsg = NULLP;
12418 Paging_t *paging = NULLP;
12420 asn_enc_rval_t encRetVal;
12422 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12424 SEARCH_DU_DB(duIdx, duId, duDb);
12427 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12430 if(duDb->numCells == 0)
12432 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): No CELL is UP!");
12438 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12439 if(f1apMsg == NULLP)
12441 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12445 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12447 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12448 if(f1apMsg->choice.initiatingMessage == NULLP)
12450 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12453 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12454 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12455 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12457 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12460 paging->protocolIEs.list.count = elementCnt;
12461 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12463 /* Initialize the Paging Message members */
12464 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12465 if(paging->protocolIEs.list.array == NULLP)
12467 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12471 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12473 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12474 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12476 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12477 memAllocFailed = true;
12482 if(memAllocFailed == true)
12487 /* UE Identity Index Value */
12489 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12490 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12491 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12492 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12493 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12494 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12495 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12496 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12498 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12502 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12503 ueId = gsTmsi % 1024;
12504 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12506 /* Paging Identity */
12508 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12509 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12510 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12511 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12512 PagingIdentity_PR_cNUEPagingIdentity;
12513 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12514 sizeof(struct CNUEPagingIdentity));
12515 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12517 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12521 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12522 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12524 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12525 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12526 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12527 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12529 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12533 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12534 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12538 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12539 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12540 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12541 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12543 /* Paging Priority */
12545 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12546 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12547 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12548 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12550 /* Paging Cell List */
12552 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12553 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12554 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12555 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12557 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12561 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12563 /* Encode the UE Context Release Command type as APER */
12564 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12566 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12569 /* Encode results */
12570 if(encRetVal.encoded == ENCODE_FAIL)
12572 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12573 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12578 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12579 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12581 DU_LOG("%x",encBuf[ieIdx]);
12585 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12587 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12596 FreePagingMsg(f1apMsg);
12600 /*******************************************************************
12602 * @brief Decode received character string into F1AP message
12606 * Function : F1APMsgHdlr
12609 * - Decodes received F1AP control message
12612 * @return ROK - success
12613 * RFAILED - failure
12615 * ****************************************************************/
12616 uint8_t F1APDecodeMsg(F1AP_PDU_t *f1apMsg, Buffer *mBuf, char **recvBuf, MsgLen *recvBufLen)
12620 asn_dec_rval_t rval; /* Decoder return value */
12622 /* Copy mBuf into char array to decode it */
12623 ODU_GET_MSG_LEN(mBuf, recvBufLen);
12624 CU_ALLOC(*recvBuf, (Size)(*recvBufLen));
12625 if(*recvBuf == NULLP)
12627 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12630 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, *recvBufLen, (Data *)*recvBuf, ©Cnt) != ROK)
12632 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12636 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : \n");
12637 for(i=0; i< *recvBufLen; i++)
12639 DU_LOG("%x ",(*recvBuf)[i]);
12642 /* Decoding flat buffer into F1AP messsage */
12643 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, *recvBuf, *recvBufLen, 0, 0);
12644 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12646 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12650 /* Printing the decoded F1AP PDU */
12652 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12656 /*******************************************************************
12658 * @brief Handles received F1AP message and sends back response
12662 * Function : F1APMsgHdlr
12665 * - Decodes received F1AP control message
12666 * - Prepares response message, encodes and sends to SCTP
12669 * @return ROK - success
12670 * RFAILED - failure
12672 * ****************************************************************/
12673 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12677 F1AP_PDU_t *f1apMsg = NULLP;
12678 F1AP_PDU_t f1apasnmsg ;
12680 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12681 ODU_PRINT_MSG(mBuf, 0,0);
12683 f1apMsg = &f1apasnmsg;
12684 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12685 if(F1APDecodeMsg(f1apMsg, mBuf, &recvBuf, &recvBufLen) != ROK)
12687 DU_LOG("\nERROR --> F1AP : F1AP PDU decode failed");
12691 switch(f1apMsg->present)
12693 case F1AP_PDU_PR_initiatingMessage:
12695 switch(f1apMsg->choice.initiatingMessage->value.present)
12697 case InitiatingMessage__value_PR_Reset:
12699 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12700 BuildAndSendF1ResetAck();
12704 case InitiatingMessage__value_PR_F1SetupRequest:
12706 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12707 procF1SetupReq(duId, f1apMsg);
12711 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12713 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12714 procGnbDuUpdate(*duId, f1apMsg);
12717 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12719 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12720 procInitULRRCMsg(*duId, f1apMsg);
12723 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12725 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12726 procUlRrcMsg(*duId, f1apMsg);
12730 case InitiatingMessage__value_PR_RRCDeliveryReport:
12732 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12735 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12737 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12738 procUeContextReleaseReq(*duId, f1apMsg);
12743 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12744 f1apMsg->choice.initiatingMessage->value.present);
12747 }/* End of switch(initiatingMessage) */
12751 case F1AP_PDU_PR_successfulOutcome:
12753 switch(f1apMsg->choice.successfulOutcome->value.present)
12755 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12757 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12760 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12762 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12763 procUeContextSetupResponse(*duId, f1apMsg, recvBuf, recvBufLen);
12766 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12768 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12769 procUeContextModificationResponse(*duId, f1apMsg, recvBuf, recvBufLen);
12772 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12774 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12775 procUeContextReleaseComplete(*duId, f1apMsg);
12780 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12781 f1apMsg->choice.successfulOutcome->value.present);
12784 }/* End of switch(successfulOutcome) */
12789 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12792 }/* End of switch(f1apMsg->present) */
12794 CU_FREE(recvBuf, (Size)(recvBufLen));
12795 } /* End of F1APMsgHdlr */
12797 /**********************************************************************
12799 **********************************************************************/