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"
152 char encBuf[ENC_BUF_MAX_LEN];
153 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
154 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
156 /*******************************************************************
158 * @brief Sends F1 msg over SCTP
162 * Function : SendF1APMsg
164 * Functionality: Sends F1 msg over SCTP
166 * @params[in] Region region
168 * @return ROK - success
171 * ****************************************************************/
172 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
174 Buffer *mBuf = NULLP;
176 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
178 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
180 ODU_PRINT_MSG(mBuf, 0,0);
182 if(sctpSend(F1_INTERFACE, duId, mBuf) != ROK)
184 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
185 ODU_PUT_MSG_BUF(mBuf);
191 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
192 ODU_PUT_MSG_BUF(mBuf);
195 ODU_PUT_MSG_BUF(mBuf);
199 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
206 /********************************************************************
208 * @brief Builds and sends the F1SetupResponse
212 * Function : BuildAndSendF1SetupRsp
214 * Functionality: Constructs the F1SetupResponse message and sends
215 * it back to the DU through SCTP.
217 * @params[in] void **buf,Buffer to which encoded pattern is written into
218 * @params[in] int *size,size of buffer
220 * @return ROK - success
223 * ****************************************************************/
224 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
227 uint8_t elementCnt,cellCnt;
228 F1AP_PDU_t *f1apMsg = NULL;
229 F1SetupResponse_t *f1SetupRsp = NULL;
230 GNB_CU_Name_t *cuName = NULL;
231 Cells_to_be_Activated_List_t *cellToActivate;
232 RRC_Version_t *rrcVer = NULL;
233 asn_enc_rval_t encRetVal;
234 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
236 /* Allocate the memory for F1SetupRequest_t */
237 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
240 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
243 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
245 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
246 if(f1apMsg->choice.successfulOutcome == NULLP)
248 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
249 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
253 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
254 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
255 f1apMsg->choice.successfulOutcome->value.present = \
256 SuccessfulOutcome__value_PR_F1SetupResponse;
257 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
260 f1SetupRsp->protocolIEs.list.count = elementCnt;
261 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
263 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
264 elementCnt * sizeof(F1SetupResponseIEs_t *));
265 if(f1SetupRsp->protocolIEs.list.array == NULLP)
267 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
268 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
269 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
273 for(idx=0; idx<elementCnt; idx++)
275 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
276 sizeof(F1SetupResponseIEs_t));
277 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
279 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
280 elementCnt * sizeof(F1SetupResponseIEs_t *));
281 CU_FREE(f1apMsg->choice.successfulOutcome, \
282 sizeof(SuccessfulOutcome_t));
283 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
290 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
291 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
292 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
293 F1SetupResponseIEs__value_PR_TransactionID;
294 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
297 /* CU name IE is of type printableString_t which wireshark is unable to decode.
298 * However this string is decoded successfully on online decoders.
299 * Since this is an optional IE and the value received in it are not
300 * used as of now, eliminating this IE for now to avoid wireshark error.
304 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
305 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
306 f1SetupRsp->protocolIEs.list.array[idx]->value.present = F1SetupResponseIEs__value_PR_GNB_CU_Name;
307 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
308 cuName->size = strlen((char *)cuCb.cuCfgParams.cuName);
310 CU_ALLOC(cuName->buf, cuName->size);
311 if(cuName->buf == NULLP)
313 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
315 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
317 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
318 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
319 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
322 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
325 /*Cells to be activated list*/
327 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cells_to_be_Activated_List ;
328 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
329 f1SetupRsp->protocolIEs.list.array[idx]->value.present = F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
330 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.Cells_to_be_Activated_List;
333 cellToActivate->list.count = cellCnt;
334 cellToActivate->list.size = cellCnt * sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
335 CU_ALLOC(cellToActivate->list.array, sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
336 if(cellToActivate->list.array == NULLP)
338 CU_FREE(cuName->buf, sizeof(cuName->size));
339 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
341 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
343 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
344 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
345 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
348 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
350 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
351 if(cellToActivate->list.array[ieIdx] == NULLP)
353 CU_FREE(cellToActivate->list.array, sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
354 CU_FREE(cuName->buf, sizeof(cuName->size));
355 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
357 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], sizeof(F1SetupResponseIEs_t));
359 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
360 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
361 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
365 cellToActivate->list.array[0]->id = \
366 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
367 cellToActivate->list.array[0]->criticality = Criticality_ignore;
368 cellToActivate->list.array[0]->value.present = \
369 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
370 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
371 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
372 CU_ALLOC(cellToActivate->list.array[0]->\
373 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
375 if(cellToActivate->list.array[0]->value.choice.\
376 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
379 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
381 CU_FREE(cellToActivate->list.array[ieIdx],\
382 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
385 CU_FREE(cellToActivate->list.array,\
386 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
387 CU_FREE(cuName->buf, sizeof(cuName->size));
388 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
390 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
391 sizeof(F1SetupResponseIEs_t));
393 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
394 elementCnt * sizeof(F1SetupResponseIEs_t *));
395 CU_FREE(f1apMsg->choice.successfulOutcome, \
396 sizeof(SuccessfulOutcome_t));
397 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
400 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
401 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
402 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
403 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
404 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
405 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
406 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
407 nRCGI.nRCellIdentity.size);
408 if(cellToActivate->list.array[0]->value.choice.\
409 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
411 CU_FREE(cellToActivate->list.array[0]->\
412 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
414 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
416 CU_FREE(cellToActivate->list.array[ieIdx],\
417 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
420 CU_FREE(cellToActivate->list.array,\
421 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
422 CU_FREE(cuName->buf, sizeof(cuName->size));
423 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
425 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
426 sizeof(F1SetupResponseIEs_t));
428 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
429 elementCnt * sizeof(F1SetupResponseIEs_t *));
430 CU_FREE(f1apMsg->choice.successfulOutcome, \
431 sizeof(SuccessfulOutcome_t));
432 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
435 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
439 f1SetupRsp->protocolIEs.list.array[idx]->id = \
440 ProtocolIE_ID_id_GNB_CU_RRC_Version;
441 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
442 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
443 F1SetupResponseIEs__value_PR_RRC_Version;
444 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
445 rrcVer->latest_RRC_Version.size = RRC_SIZE;
447 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
448 if(rrcVer->latest_RRC_Version.buf == NULLP)
450 CU_FREE(cuName->buf, sizeof(cuName->size));
451 for(ieIdx=0; ieIdx<elementCnt; idx++)
453 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
454 sizeof(F1SetupResponseIEs_t));
456 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
457 elementCnt * sizeof(F1SetupResponseIEs_t *));
458 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
459 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
463 /* Need to check RRC Version */
464 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
465 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
466 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
467 if(rrcVer->iE_Extensions == NULLP)
469 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
470 CU_FREE(cuName->buf, sizeof(cuName->size));
471 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
473 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
474 sizeof(F1SetupResponseIEs_t));
476 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
477 elementCnt * sizeof(F1SetupResponseIEs_t *));
478 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
479 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
482 rrcVer->iE_Extensions->list.count = 1;
483 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
484 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
485 sizeof(struct RRC_Version_ExtIEs *));
486 if(rrcVer->iE_Extensions->list.array == NULLP)
488 CU_FREE(rrcVer->iE_Extensions,\
489 sizeof(ProtocolExtensionContainer_4624P81_t));
490 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
491 CU_FREE(cuName->buf, sizeof(cuName->size));
492 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
494 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
495 sizeof(F1SetupResponseIEs_t));
497 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
498 elementCnt * sizeof(F1SetupResponseIEs_t *));
499 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
500 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
503 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
504 sizeof(struct RRC_Version_ExtIEs));
505 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
507 CU_FREE(rrcVer->iE_Extensions->list.array,\
508 sizeof(struct RRC_Version_ExtIEs *));
509 CU_FREE(rrcVer->iE_Extensions,\
510 sizeof(ProtocolExtensionContainer_4624P81_t));
511 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
512 CU_FREE(cuName->buf, sizeof(cuName->size));
513 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
515 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
516 sizeof(F1SetupResponseIEs_t));
518 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
519 elementCnt * sizeof(F1SetupResponseIEs_t *));
520 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
521 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
524 rrcVer->iE_Extensions->list.array[0]->id = \
525 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
526 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
527 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
528 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
529 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
530 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
531 CU_ALLOC(rrcVer->iE_Extensions->list.\
532 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
534 if(rrcVer->iE_Extensions->list.\
535 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
537 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
538 sizeof(struct RRC_Version_ExtIEs));
539 CU_FREE(rrcVer->iE_Extensions->list.array,\
540 sizeof(struct RRC_Version_ExtIEs *));
541 CU_FREE(rrcVer->iE_Extensions,\
542 sizeof(ProtocolExtensionContainer_4624P81_t));
543 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
544 CU_FREE(cuName->buf, sizeof(cuName->size));
545 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
547 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
548 sizeof(F1SetupResponseIEs_t));
550 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
551 elementCnt * sizeof(F1SetupResponseIEs_t *));
552 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
553 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
556 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
557 Latest_RRC_Version_Enhanced.buf[0] = 0;
558 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
559 Latest_RRC_Version_Enhanced.buf[1] = 5;
560 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
561 Latest_RRC_Version_Enhanced.buf[2] = 15;
563 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
565 /* Encode the F1SetupRequest type as UPER */
566 memset(encBuf, 0, ENC_BUF_MAX_LEN);
568 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
572 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
574 CU_FREE(cuName->buf, cuName->size);
575 for(idx=0; idx<elementCnt; idx++)
577 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
579 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
580 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
581 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
583 /* Check encode results */
584 if(encRetVal.encoded == ENCODE_FAIL)
586 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
587 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
592 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
593 for(int i=0; i< encBufSize; i++)
595 DU_LOG("%x",encBuf[i]);
600 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
602 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
607 }/* End of BuildAndSendF1SetupRsp */
609 /*******************************************************************
611 * @brief Builds and sends the DUUpdateAcknowledge
615 * Function : BuildAndSendDUUpdateAck
617 * Functionality: Constructs the DU Update Acknowledge message and sends
618 * it to the DU through SCTP.
622 * @return ROK - success
625 * ****************************************************************/
627 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
631 F1AP_PDU_t *f1apMsg = NULL;
632 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
633 asn_enc_rval_t enRetVal; /* Encoder return value */
635 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
637 /* Allocate the memory for F1SetupRequest_t */
638 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
641 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
645 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
647 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
648 if(f1apMsg->choice.successfulOutcome == NULLP)
650 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
651 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
655 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
656 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
657 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
658 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
661 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
662 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
664 /* Initialize the F1Setup members */
665 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
666 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
668 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
669 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
670 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
674 for(idx=0; idx<elementCnt; idx++)
676 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
677 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
679 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
680 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
681 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
688 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
689 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
690 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
691 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
692 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
694 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
696 /* Encode the F1SetupRequest type as UPER */
697 memset(encBuf, 0, ENC_BUF_MAX_LEN);
699 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
702 for(idx=0; idx<elementCnt; idx++)
704 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
706 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
707 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
708 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
710 /* Checking encode results */
711 if(enRetVal.encoded == ENCODE_FAIL)
713 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
714 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
719 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
720 for(int i=0; i< encBufSize; i++)
722 DU_LOG("%x",encBuf[i]);
727 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
728 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
730 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
736 }/* End of BuildAndSendDUUpdateAck*/
738 /*******************************************************************
740 * @brief deallocating the memory of F1reset msg
744 * Function : FreeF1ResetReq
747 * - freeing memory of F1reset request msg
753 * ****************************************************************/
754 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
757 Reset_t *f1ResetMsg = NULLP;
761 if(f1apMsg->choice.initiatingMessage)
763 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
764 if(f1ResetMsg->protocolIEs.list.array)
766 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
768 if(f1ResetMsg->protocolIEs.list.array[idx])
770 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
773 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
775 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
777 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
780 /*******************************************************************
782 * @brief build ansld ans send f1reset msg
786 * Function : BuildAndSendF1ResetReq
788 * Functionality: build and send f1reset msg
790 * @return ROK - success
793 * ****************************************************************/
794 uint8_t BuildAndSendF1ResetReq()
796 uint8_t elementCnt=0;
798 uint8_t ret= RFAILED;
799 Reset_t *f1ResetMsg = NULLP;
800 F1AP_PDU_t *f1apMsg = NULLP;
801 asn_enc_rval_t encRetVal;
802 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
805 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
808 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
811 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
812 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
813 if(f1apMsg->choice.initiatingMessage == NULLP)
815 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
818 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
819 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
820 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
822 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
825 f1ResetMsg->protocolIEs.list.count = elementCnt;
826 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
828 /* Initialize the F1Reset members */
829 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
830 if(f1ResetMsg->protocolIEs.list.array == NULLP)
832 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
835 for(idx=0; idx<elementCnt; idx++)
837 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
838 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
840 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
847 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
848 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
849 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
850 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
854 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
855 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
856 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
857 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
858 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
862 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
863 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
864 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
865 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
866 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
868 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
870 /* Encode the F1SetupRequest type as APER */
871 memset(encBuf, 0, ENC_BUF_MAX_LEN);
873 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
877 if(encRetVal.encoded == ENCODE_FAIL)
879 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
880 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
885 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
886 for(idx=0; idx< encBufSize; idx++)
888 DU_LOG("%x",encBuf[idx]);
892 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
893 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
895 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
903 FreeF1ResetReq(f1apMsg);
907 /*******************************************************************
909 * @brief Fills Radio Bearer Config
913 * Function : fillSrbCfg
915 * Functionality: Fills Radio Bearer Config
917 * @params[in] SRB_ToAddModList *
919 * @return ROK - success
922 * ****************************************************************/
923 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
925 uint8_t elementCnt = 0;
926 uint8_t idx, ieId, srbIdx = 0;
928 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
930 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
934 if(bearerCfg != NULLP)
936 bearerCfg->list.count = elementCnt;
937 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
938 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
939 if(bearerCfg->list.array != NULLP)
941 for(idx = 0; idx < elementCnt; idx++)
943 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
944 if(bearerCfg->list.array[idx] == NULLP)
946 for(ieId = 0; ieId < idx; ieId++)
948 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
950 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
957 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
962 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
964 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
965 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
971 /*******************************************************************
973 * @brief Fills Master CellGroup Info
977 * Function : fillMasterCellGroup
979 * Functionality: Fills Master Cell Group IE
981 * @params[in] RRCSetup_IEs_t *
983 * @return ROK - success
986 * ****************************************************************/
988 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
991 masterCellGroup->buf = NULLP;
992 if(ueCb->f1apMsgDb.duToCuContainer.buf)
994 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
995 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
996 if(masterCellGroup->buf != NULLP)
998 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1002 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1013 /*******************************************************************
1015 * @brief Fills RRC setup IE
1019 * Function : fillRRCSetupIE
1021 * Functionality: Fills RRC Setup IE
1023 * @params[in] RRCSetup_IEs_t *
1025 * @return ROK - success
1028 * ****************************************************************/
1030 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1032 uint8_t ret = ROK, srbIdx = 0;
1035 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1036 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1038 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1042 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1046 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1050 /* If SRB configuration are filled successfully in RRC Setup, mark these
1051 * configurartion as sent to UE */
1052 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1054 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1055 ueCb->srbList[srbIdx].cfgSentToUe = true;
1060 /*******************************************************************
1062 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1066 * Function : fillDlCcchRrcMsg
1068 * Functionality: Fills DL DCCCH Message required for
1069 * DLRRCMessageTransfer
1071 * @params[in] RRCContainer_t *rrcContainer
1073 * @return ROK - success
1076 * ****************************************************************/
1078 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1082 DL_CCCH_Message_t dl_CCCH_Msg;
1083 asn_enc_rval_t encRetVal;
1085 if(rrcContainer != NULLP)
1087 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1089 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1090 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1092 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1093 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1094 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1096 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1097 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1098 RRCSetup__criticalExtensions_PR_rrcSetup;
1100 /* Fill RRC Setup IE */
1101 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1102 sizeof(RRCSetup_IEs_t));
1103 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1105 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1109 /* encode DL-CCCH message into RRC Container */
1110 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1111 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1113 encRetVal = uper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1114 /* Encode results */
1115 if(encRetVal.encoded == ENCODE_FAIL)
1117 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1118 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1123 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1124 for(int i = 0; i< encBufSize; i++)
1126 DU_LOG("%x",encBuf[i]);
1128 rrcContainer->size = encBufSize;
1129 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1130 if(rrcContainer->buf != NULLP)
1132 memset(rrcContainer->buf, 0, encBufSize);
1133 for(idx2 = 0; idx2 < encBufSize; idx2++)
1135 rrcContainer->buf[idx2] = encBuf[idx2];
1147 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1153 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1159 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1165 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1170 /*******************************************************************
1172 * @brief Fills QOS flow configuration
1176 * Function : fillQosFlowsToAdd
1178 * Functionality: Fills QOS flow configuration
1180 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1182 * @return ROK - success
1185 * ****************************************************************/
1186 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1188 uint8_t idx, ied, elementCnt;
1191 qosFlow->list.count = elementCnt;
1192 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1193 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1194 if(qosFlow->list.array != NULLP)
1196 for(idx = 0; idx < elementCnt; idx++)
1198 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1199 if(qosFlow->list.array[idx] == NULLP)
1201 for(ied = 0; ied < idx; ied++)
1203 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1205 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1211 *qosFlow->list.array[idx] = 9;
1215 /*******************************************************************
1217 * @brief Fills CN Assoc for Drb to Add/Mod List
1221 * Function : fillCnAssoc
1223 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1225 * @params[in] struct DRB_ToAddMod__cnAssociation *
1227 * @return ROK - success
1230 * ****************************************************************/
1232 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1236 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1237 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1239 cnAssoc->choice.eps_BearerIdentity = 5;
1241 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1243 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1244 if(cnAssoc->choice.sdap_Config)
1246 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1247 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1248 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1249 cnAssoc->choice.sdap_Config->defaultDRB = true;
1250 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1251 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1252 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1253 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1254 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1256 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1260 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1261 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1267 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1274 /*******************************************************************
1276 * @brief Fills Radio Bearer Config for Drb
1280 * Function : fillDrbCfg
1282 * Functionality: Fills Radio Bearer Config for Drb
1284 * @params[in] drbId, DRB_ToAddModList *
1286 * @return ROK - success
1289 * ****************************************************************/
1290 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1292 uint8_t idx, ied, ret, elementCnt;
1298 drbCfg->list.count = elementCnt;
1299 drbCfg->list.size =\
1300 elementCnt * sizeof(DRB_ToAddMod_t *);
1301 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1302 if(drbCfg->list.array != NULLP)
1304 for(idx = 0; idx < elementCnt; idx++)
1306 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1307 if(drbCfg->list.array[idx] == NULLP)
1309 for(ied = 0; ied < idx; ied++)
1311 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1313 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1323 /* CN ASSOCIATION */
1324 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1325 if(drbCfg->list.array[idx]->cnAssociation)
1327 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1330 drbCfg->list.array[idx]->drb_Identity = drbId;
1335 /*******************************************************************
1337 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1341 * Function : fillRrcReconfigIE
1343 * Functionality: Fills RRC Reconfig Message required for
1344 * DLRRCMessageTransfer
1346 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1348 * @return ROK - success
1351 * ****************************************************************/
1353 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1356 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1357 if(rrcReconfigMsg->radioBearerConfig)
1359 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1360 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1362 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1367 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1368 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1370 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1373 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1374 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1375 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1381 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1382 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1388 /*******************************************************************
1390 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1394 * Function : fillDlDcchRrcMsg
1396 * Functionality: Fills DL DCCH Message required for
1397 * DLRRCMessageTransfer
1399 * @params[in] RRCContainer_t *rrcContainer
1401 * @return ROK - success
1404 * ****************************************************************/
1406 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer, bool updateAllRbCfg)
1409 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1410 DL_DCCH_Message_t dl_DCCH_Msg;
1411 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1412 asn_enc_rval_t encRetVal;
1414 if(rrcContainer != NULLP)
1416 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1418 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1419 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1421 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1422 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1423 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1425 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1426 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, updateAllRbCfg);
1429 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1430 * configurartion as sent to UE */
1431 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1433 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1434 ueCb->srbList[srbIdx].cfgSentToUe = true;
1436 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1438 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1439 ueCb->drbList[drbIdx].cfgSentToUe = true;
1442 /* encode DL-DCCH message into RRC Container */
1443 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1444 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1446 encRetVal = uper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1447 /* Encode results */
1448 if(encRetVal.encoded == ENCODE_FAIL)
1450 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1451 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1456 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1457 for(int i = 0; i< encBufSize; i++)
1459 DU_LOG("%x",encBuf[i]);
1461 rrcContainer->size = encBufSize;
1462 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1463 if(rrcContainer->buf != NULLP)
1465 memset(rrcContainer->buf, 0, encBufSize);
1466 for(idx2 = 0; idx2 < encBufSize; idx2++)
1468 rrcContainer->buf[idx2] = encBuf[idx2];
1476 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1482 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1488 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1494 /*******************************************************************
1496 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1500 * Function : BuildDLRRCContainer
1502 * Functionality: Builds RRC Container IE required for
1503 * DLRRCMessageTransfer
1507 * @return ROK - success
1510 * ****************************************************************/
1512 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1514 uint8_t ret, bufLen;
1517 if(rrcMsgType == RRC_SETUP)
1519 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1521 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1523 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1525 DU_LOG("\nINFO --> F1AP : Sending NAS Authentication Request");
1526 char authReqBuf[51] = {0x00, ueCb->pdcpSn++, 0x2a, 0x85, 0x4f, 0xc0, 0x0a, 0xc0, 0x40, 0x40, 0x00, 0x04, 0x2f, 0x58, 0x39, 0x12,\
1527 0x37, 0x15, 0x74, 0x16, 0x4c, 0x8d, 0xd3, 0x95, 0xa6, 0x9e, 0x94, 0x03, 0x24, 0x02, 0x00, 0x6f,\
1528 0x0b, 0x39, 0x5e, 0xbc, 0xb0, 0x00, 0x1a, 0xb1, 0xc1, 0x3f, 0x84, 0x4f, 0x77, 0xe3, 0x20, 0x00,\
1531 rrcContainer->size = bufLen;
1532 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1533 if(rrcContainer->buf != NULLP)
1535 memset(rrcContainer->buf, 0, bufLen);
1536 memcpy(rrcContainer->buf, authReqBuf, bufLen);
1540 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1545 else if(rrcMsgType == NAS_AUTHENTICATION_RSP)
1547 DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
1548 char secModeBuf[30]={0x00, ueCb->pdcpSn++, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1549 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1551 rrcContainer->size = bufLen;
1552 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1553 if(rrcContainer->buf != NULLP)
1555 memset(rrcContainer->buf, 0, bufLen);
1556 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1560 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1564 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1566 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1567 char secModeBuf[9]={0x00, ueCb->pdcpSn++, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1569 rrcContainer->size = bufLen;
1570 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1571 if(rrcContainer->buf != NULLP)
1573 memset(rrcContainer->buf, 0, bufLen);
1574 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1578 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1582 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1584 /*Hardcoded RRC Container from reference logs*/
1585 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1586 char buf[14] ={0x00, ueCb->pdcpSn++, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1588 rrcContainer->size = bufLen;
1589 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1590 if(rrcContainer->buf != NULLP)
1592 memset(rrcContainer->buf, 0, bufLen);
1593 memcpy(rrcContainer->buf, buf, bufLen);
1597 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1601 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1603 uint16_t tmpBufIdx = 0, bufIdx = 0;
1604 RRCContainer_t rrcContainerTmp;
1605 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1606 ret = fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, false);
1607 rrcContainer->size = rrcContainerTmp.size + 2;
1608 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1609 if(rrcContainer->buf != NULLP)
1611 memset(rrcContainer->buf, 0, rrcContainer->size);
1612 rrcContainer->buf[0] = 0x00;
1613 rrcContainer->buf[1] = ueCb->pdcpSn++; //PDCP SN
1614 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
1616 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
1620 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1626 /*******************************************************************
1628 * @brief Frees the DLRRCMessageTransfer
1632 * Function : freeDlRrcMessageTransfer
1634 * Functionality: Frees the DLRRCMessageTransfer
1638 * @return ROK - success
1641 * ****************************************************************/
1642 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1645 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1649 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1650 if(dlRRCMsg->protocolIEs.list.array)
1653 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1654 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1655 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1657 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1659 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1661 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1665 /*******************************************************************
1667 * @brief Builds and sends the DLRRCMessageTransfer
1671 * Function : BuildAndSendDLRRCMessageTransfer
1673 * Functionality: Constructs the DL RRC Message Transfer and sends
1674 * it to the CU through SCTP.
1678 * @return ROK - success
1681 * ****************************************************************/
1682 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1684 uint8_t elementCnt = 0;
1687 F1AP_PDU_t *f1apMsg = NULLP;
1688 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1689 asn_enc_rval_t encRetVal; /* Encoder return value */
1691 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1693 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1694 if(f1apMsg == NULLP)
1696 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1700 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1701 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1702 if(f1apMsg->choice.initiatingMessage == NULLP)
1704 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1705 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1709 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1710 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1711 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1712 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1715 dlRRCMsg->protocolIEs.list.count = elementCnt;
1716 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1718 /* Initialize the F1Setup members */
1719 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1720 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1722 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1723 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1724 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1728 for(idx=0; idx<elementCnt; idx++)
1730 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1731 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1733 for(ieId=0; ieId<idx; ieId++)
1735 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1737 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1738 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1739 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1744 /* GNB CU UE F1AP ID */
1746 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1747 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1748 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1749 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1751 /* GNB DU UE F1AP ID */
1753 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1754 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1755 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1756 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1760 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1761 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1762 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1763 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1767 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1768 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1769 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1770 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1772 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1774 /* Encode the F1SetupRequest type as APER */
1775 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1777 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1779 /* Encode results */
1780 if(encRetVal.encoded == ENCODE_FAIL)
1782 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1783 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1788 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1789 for(int i=0; i< encBufSize; i++)
1791 DU_LOG("%x",encBuf[i]);
1796 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1798 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1801 freeDlRrcMessageTransfer(f1apMsg);
1803 }/* End of BuildAndSendDLRRCMessageTransfer */
1805 /*******************************************************************
1807 * @brief Function to set the Dl RRC Msg Type
1811 * Function : setDlRRCMsgType
1813 * Functionality: Constructs the UE Setup Response and sends
1814 * it to the DU through SCTP.
1818 * @return ROK - success
1821 * ****************************************************************/
1823 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1825 uint8_t rrcMsgType = 0;
1826 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1829 rrcMsgType = RRC_SETUP;
1831 case RRC_SETUP_COMPLETE:
1832 rrcMsgType = RRC_SETUP_COMPLETE;
1834 case NAS_AUTHENTICATION_RSP:
1835 rrcMsgType = NAS_AUTHENTICATION_RSP;
1837 case NAS_SECURITY_MODE_COMPLETE:
1838 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1840 case RRC_SECURITY_MODE_COMPLETE:
1841 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1843 case REGISTRATION_COMPLETE:
1844 rrcMsgType = REGISTRATION_COMPLETE;
1846 case UE_CONTEXT_SETUP_RSP:
1847 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1849 case RRC_RECONFIG_COMPLETE:
1850 rrcMsgType = RRC_RECONFIG_COMPLETE;
1859 /*******************************************************************
1861 * @brief fill long cycle offset value of drx
1865 * Function : fillLongCycleOffsetValue
1867 * Functionality: fill long cycle offset value of drx
1869 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1870 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1872 * @return ROK - success
1875 * ****************************************************************/
1876 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *recvedLongCycleOffsetVal)
1879 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1880 switch(recvedLongCycleOffsetVal->present)
1882 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10:
1884 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1887 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20:
1889 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1892 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32:
1894 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1897 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40:
1899 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1902 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60:
1904 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1907 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64:
1909 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1912 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70:
1914 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1917 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80:
1919 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1922 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128:
1924 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1927 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160:
1929 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1932 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256:
1934 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1937 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320:
1939 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1942 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512:
1944 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1947 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640:
1949 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1952 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024:
1954 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1957 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280:
1959 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1962 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048:
1964 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1967 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560:
1969 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1972 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120:
1974 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1977 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240:
1979 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1987 /*******************************************************************
1989 * @brief Extract configuration from DRX_ConfigRrc
1990 * and store the drx configuration in UeCb
1994 * Function : storeDrxCfgInUeCb
1996 * Functionality: Store drx configuration in UeCb
1998 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
2001 * ****************************************************************/
2002 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
2004 switch(drxSetup->drx_onDurationTimer.present)
2006 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
2008 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
2010 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
2011 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
2014 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
2016 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
2017 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
2021 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
2022 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
2023 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
2024 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
2025 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
2026 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
2027 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
2028 if(drxSetup->shortDRX)
2030 drxCfg->shortDrxPres=true;
2031 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
2032 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
2035 drxCfg->shortDrxPres=false;
2039 /*******************************************************************
2041 * @brief Extract configuration from CellGroupConfig
2045 * Function : extractCellGroupConfig
2047 * Functionality: Extract configuration from CellGroupConfig
2048 * and store in local database
2050 * @params[in] UE control block
2053 * @return ROK - success
2056 * ****************************************************************/
2057 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
2059 uint8_t rbIdx, srbIdx, drbIdx;
2060 bool srbFound, drbFound;
2061 SrbInfo *srbCfgDb = NULLP;
2062 DrbInfo *drbCfgDb = NULLP;
2063 RlcLcCfg *rlcLcCfgDb = NULLP;
2064 MacLcCfg *macLcCfgDb = NULLP;
2065 RLC_BearerConfig_t *rlcCfg = NULLP;
2066 RLC_Config_t *rlcLcCfg = NULLP;
2067 LogicalChannelConfig_t *macLcCfg = NULLP;
2074 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2078 if(cellGrpCfg == NULLP)
2080 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2085 if(cellGrpCfg->mac_CellGroupConfig)
2087 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2089 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2091 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2094 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2096 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup)
2098 ueCb->drxCfgPresent = true;
2099 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2104 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2111 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2116 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2118 /* Update SRB configuration in local DB */
2119 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2121 /* Search if SRB entry is already present in DB */
2122 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2124 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2126 srbCfgDb = &ueCb->srbList[srbIdx];
2132 /* If not, add SRB to UE CB's SRB list */
2135 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2136 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2140 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2141 srbCfgDb->cfgSentToUe = false;
2142 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2143 macLcCfgDb = &srbCfgDb->macLcCfg;
2146 /* Update DRB configuration in local DB */
2147 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2149 /* Search if DRB entry is already present in DB */
2150 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2152 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2154 drbCfgDb = &ueCb->drbList[drbIdx];
2160 /* If not, add DRB to UE CB's SRB list */
2163 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2164 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2168 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2169 drbCfgDb->cfgSentToUe = false;
2170 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2171 macLcCfgDb = &drbCfgDb->macLcCfg;
2175 /* Update RLC configuration for this RB */
2176 rlcLcCfg = rlcCfg->rlc_Config;
2177 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2178 switch(rlcLcCfgDb->rlcMode)
2180 case RLC_Config_PR_am:
2182 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2183 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2184 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2185 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2186 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2188 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2189 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2190 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2194 case RLC_Config_PR_um_Bi_Directional:
2196 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2198 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2199 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2204 /* Update MAC configuration for this LC */
2205 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2206 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2207 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2208 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2209 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2210 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2215 /*******************************************************************
2217 * @brief Function to decode DU to CU RRC container
2221 * Function : extractDuToCuRrcCont
2223 * Functionality: Function to decode DU to CU RRC container
2226 * RRC conatiner octect string to be decoded
2228 * @return ROK - success
2231 * ****************************************************************/
2232 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2234 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2235 asn_dec_rval_t rval; /* Decoder return value */
2237 /* Copy the received container to UeCb */
2238 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2240 /* Decoding DU to CU RRC container octet string to cell group config */
2241 cellGrpCfgMsg = &cellGrpCfg;
2242 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2244 rval = uper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2246 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2248 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2252 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2254 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2256 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2263 /*******************************************************************
2265 * @brief Function to build Initial UL RRC Message
2269 * Function : procInitULRRCMsg
2271 * Functionality: Function to build Initial UL RRC Message
2275 * @return ROK - success
2278 * ****************************************************************/
2280 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2282 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2284 uint16_t cellIdx=0, nrCellId = 0;
2289 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2291 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2293 SEARCH_DU_DB(duIdx, duId, duDb);
2294 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2296 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2298 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2300 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2301 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2304 case ProtocolIE_ID_id_NRCGI:
2305 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2306 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2311 case ProtocolIE_ID_id_C_RNTI:
2312 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2313 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2315 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2316 memset(ueCb, 0, sizeof(CuUeCb));
2317 ueCb->cellCb = cellCb;
2318 ueCb->crnti = crnti;
2319 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2320 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2321 ueCb->state = UE_ATTACH_IN_PROGRESS;
2324 cellCb->ueCb[cellCb->numUe] = ueCb;
2329 case ProtocolIE_ID_id_RRCContainer:
2332 case ProtocolIE_ID_id_DUtoCURRCContainer:
2334 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2335 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2337 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2338 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2339 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2340 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2342 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2343 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2344 ueCb->f1apMsgDb.duToCuContainer.size);
2346 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2348 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2354 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2361 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2370 ueCb->f1apMsgDb.dlRrcMsgCount++;
2371 rrcMsgType = setDlRRCMsgType(ueCb);
2372 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2377 /*******************************************************************
2379 * @brief Builds Nrcgi
2383 * Function : BuildNrcgi
2385 * Functionality: Building the PLMN ID and NR Cell id
2387 * @params[in] NRCGI_t *nrcgi
2388 * @return ROK - success
2391 * ****************************************************************/
2392 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2395 uint8_t unused_bits = 4;
2396 uint8_t byteSize = 5;
2398 /* Allocate Buffer Memory */
2399 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2400 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2401 if(nrcgi->pLMN_Identity.buf == NULLP)
2405 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2411 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2412 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2413 if(nrcgi->nRCellIdentity.buf == NULLP)
2417 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2421 /*******************************************************************
2423 * @brief Builds Special cell list for UE Setup Request
2427 * Function : BuildSplCellList
2429 * Functionality: Constructs the Special Cell list for UESetReq
2431 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2433 * @return ROK - success
2436 * ****************************************************************/
2437 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2443 spCellLst->list.count = cellCnt;
2444 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2445 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2446 if(spCellLst->list.array == NULLP)
2450 for(idx=0; idx<cellCnt; idx++)
2452 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2453 if(spCellLst->list.array[idx] == NULLP)
2459 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2460 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2461 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2463 /* Special Cell ID -NRCGI */
2464 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2469 /*Special Cell Index*/
2470 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2472 }/* End of BuildSplCellList*/
2474 /*******************************************************************
2476 * @brief Builds SRBS to be setup
2480 * Function : BuildSRBSetup
2482 * Functionality: Constructs the SRB's for UESetReq
2484 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2486 * @return ROK - success
2489 * ****************************************************************/
2490 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2495 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2496 srbCnt = ueCb->numSrb;
2499 srbSet->list.count = srbCnt;
2500 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2501 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2502 if(srbSet->list.array == NULLP)
2504 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2508 for(idx=0; idx<srbCnt; idx++)
2510 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2511 if(srbSet->list.array[idx] == NULLP)
2513 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2518 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2521 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2522 srbSet->list.array[idx]->criticality = Criticality_ignore;
2523 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2524 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2525 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2530 for(idx=0; idx<srbCnt; idx++)
2532 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2533 srbSet->list.array[idx]->criticality = Criticality_ignore;
2534 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2535 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2539 }/* End of BuildSRBSetup*/
2541 /*******************************************************************
2543 * @brief Builds QOS Info for DRB Setum Item
2547 * Function : BuildQOSInfo
2549 * Functionality: Constructs the QOS Info for DRB Setup Item
2551 * @params[in] QoSInformation_t *qosinfo
2552 * int16_t pduSessionID
2554 * @return ROK - success
2557 * ****************************************************************/
2558 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2560 uint8_t elementCnt = 0, qosCntIdx = 0;
2561 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2563 /* NonDynamic5QIDescriptor */
2564 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2565 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2566 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2571 if(hoInProgress == Inter_DU_HO)
2572 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2573 else if(hoInProgress == false || hoInProgress == Xn_Based_Inter_CU_HO)
2576 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2577 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2579 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2581 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2587 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2588 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2592 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2593 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2595 /*MaxDataBurstVolume*/
2596 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2597 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2601 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2602 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2605 /*nRGRAN Allocation Retention Priority*/
2608 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2609 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2610 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2612 else if((hoInProgress == false) || (hoInProgress == Xn_Based_Inter_CU_HO))
2614 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2615 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2616 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2618 qosInfo->priorityLevel = PriorityLevel_lowest;
2619 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2620 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2623 /* PDU session ID */
2626 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2627 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2629 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2633 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2634 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2638 elementCnt = NUM_QOS_EXT;
2639 qosIeExt->list.count = elementCnt;
2640 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2642 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2643 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2645 if(qosIeExt->list.array == NULLP)
2647 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2651 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2653 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2654 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2656 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2659 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2660 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2661 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2662 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2663 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2664 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2665 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2666 qosInfo->pduSessionId = pduSessionID;
2671 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2676 }/*End of BuildQOSInfo*/
2678 /*******************************************************************
2680 * @brief Builds SNSSAI
2684 * Function : BuildSNSSAI
2686 * Functionality: Constructs the SNSSAI For DRB list
2688 * @params[in] SNSSAI_t *snssai
2689 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2691 * @return ROK - success
2694 * ****************************************************************/
2695 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2698 /* In case of non-HO UE context creation and Xn Based HO, DRB's SNSSAI
2699 * configuration is not known beforehand. In these 2 case, the following
2700 * condition will hit */
2701 if(!hoInProgress || (hoInProgress == Xn_Based_Inter_CU_HO))
2702 drbInfo->snssai = snssaiToCopy;
2705 snssai->sST.size = sizeof(uint8_t);
2706 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2707 if(snssai->sST.buf == NULLP)
2711 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2714 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2715 if(snssai->sD == NULLP)
2719 snssai->sD->size = 3 * sizeof(uint8_t);
2720 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2721 if(snssai->sD->buf == NULLP)
2725 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2728 }/*End of BuildSNSSAI*/
2730 /*******************************************************************
2732 * @brief Builds the flow map.
2736 * Function : BuildFlowsMap
2738 * Functionality: Constructs the flowmap For DRB list
2740 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2742 * @return ROK - success
2745 * ****************************************************************/
2746 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2748 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2749 FlowsMapped *qosFlow;
2751 /* In case of non-HO UE context creation and Xn Based HO, DRB's SNSSAI
2752 * configuration is not known beforehand. In these 2 case, the following
2753 * condition will hit */
2754 if(!hoInProgress || (hoInProgress == Xn_Based_Inter_CU_HO))
2757 flowCnt = drbInfo->numFlowMap;
2759 flowMap->list.count = flowCnt;
2760 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2761 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2762 if(flowMap->list.array == NULLP)
2764 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2767 for(idx=0; idx<flowCnt; idx++)
2769 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2770 if(flowMap->list.array[idx] == NULLP)
2772 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2776 if(!hoInProgress || (hoInProgress == Xn_Based_Inter_CU_HO))
2778 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2779 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2781 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2783 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2785 qosFlow = &drbInfo->flowMapList[flowIdx];
2792 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2793 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2798 qosFlow = &drbInfo->flowMapList[idx];
2799 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2802 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2803 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2806 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2810 if(((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item)) || (hoInProgress == Xn_Based_Inter_CU_HO))
2811 drbInfo->numFlowMap++;
2814 }/*End of BuildFlowsMap*/
2816 /*******************************************************************
2818 * @brief Builds the Uplink Tunnel Info
2822 * Function : BuildULTnlInfo
2824 * Functionality: Constructs the UL TnlInfo For DRB list
2826 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2828 * @return ROK - success
2831 * ****************************************************************/
2832 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2838 ulInfo->list.count = ulCnt;
2839 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2840 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2841 if(ulInfo->list.array == NULLP)
2843 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2846 for(idx=0; idx<ulCnt; idx++)
2848 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2849 if(ulInfo->list.array[idx] == NULLP)
2851 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2856 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2858 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2859 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2861 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2864 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2865 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2866 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2867 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2869 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2873 if((!hoInProgress) || (hoInProgress == Xn_Based_Inter_CU_HO))
2875 /* NOTE: Below IP address must be changed if running on different IP configuration */
2876 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2877 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2878 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2879 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2880 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2882 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2883 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2884 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2885 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2889 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2890 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2891 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2892 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2893 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2897 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2898 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2899 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2900 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2902 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2906 if((!hoInProgress) || (hoInProgress == Xn_Based_Inter_CU_HO))
2908 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2909 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2910 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2911 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2913 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2914 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2915 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2916 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2920 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2921 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2922 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2923 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2926 }/*End of BuildULTnlInfo*/
2928 /*******************************************************************
2930 * @brief Builds DRBS to be setup
2934 * Function : BuildDRBSetup
2936 * Functionality: Constructs the DRB's for UESetReq
2938 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2940 * @return ROK - success
2943 * ****************************************************************/
2944 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2946 uint16_t snssaiIdx=0;
2947 uint8_t idx = 0, extIeIdx = 0;
2948 uint8_t elementCnt = 0, drbCnt = 0;
2949 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2950 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2951 DRBs_ToBeSetup_Item_t *drbSetItem;
2952 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2953 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2955 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2956 drbCnt = ueCb->numDrb;
2958 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2959 drbSet->list.count = drbCnt;
2961 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2962 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2963 if(drbSet->list.array == NULLP)
2965 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2969 for(idx=0; idx<drbCnt; idx++)
2971 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2972 if(drbSet->list.array[idx] == NULLP)
2974 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2978 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2979 drbSet->list.array[idx]->criticality = Criticality_ignore;
2980 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2981 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2983 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2985 drbSetItem->dRBID = idx + 1;
2986 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2989 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2992 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2993 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2994 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2996 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2999 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
3000 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
3001 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
3002 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3003 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
3004 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
3006 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
3007 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, ueCb->hoInfo.HOType);
3008 if(BuildQOSInforet != ROK)
3010 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
3015 snssaiIdx = (idx% cuCb.numSnssaiSupported);
3016 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3017 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
3018 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
3020 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
3021 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], ueCb->hoInfo.HOType);
3022 if(BuildSNSSAIret != ROK)
3024 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
3028 /*Flows mapped to DRB List*/
3029 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3030 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
3031 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
3033 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
3034 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, ueCb->hoInfo.HOType);
3035 if(BuildFlowsMapret != ROK)
3037 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
3041 /*ULUPTNLInformation To Be Setup List*/
3042 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3043 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3046 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3047 ueCb->hoInfo.HOType);
3048 if(BuildULTnlInforet != ROK)
3050 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
3055 if((ueCb->state != UE_HANDOVER_IN_PROGRESS) || (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO))
3057 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3058 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
3061 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
3063 /* DL PDCP SN Length */
3064 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
3066 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
3067 if(!drbToBeSetupExt)
3069 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3074 drbToBeSetupExt->list.count = elementCnt;
3075 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3077 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3078 if(!drbToBeSetupExt->list.array)
3080 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3084 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3086 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3087 if(!drbToBeSetupExt->list.array[extIeIdx])
3089 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3095 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3097 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3098 drbToBeSetupExtIe->criticality = Criticality_ignore;
3099 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3100 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3101 drbSetItem->iE_Extensions = drbToBeSetupExt;
3104 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3108 }/* End of BuildDRBSetup*/
3110 /*******************************************************************
3112 * @brief Deallocating memory of function BuildAndSendUESetReq
3116 * Function : FreeNrcgi
3118 * Functionality: Deallocating memory for function BuildNrcgi
3120 * @params[in] NRCGI_t *nrcgi
3124 *******************************************************************/
3125 void FreeNrcgi(NRCGI_t *nrcgi)
3127 if(nrcgi->pLMN_Identity.buf != NULLP)
3129 if(nrcgi->nRCellIdentity.buf != NULLP)
3131 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3133 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3136 /*******************************************************************
3138 * @brief Deallocating memory of function BuildAndSendUESetReq
3142 * Function : FreeSplCellList
3144 * Functionality: Deallocating memory for function BuildSplCellList
3146 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3151 * *****************************************************************/
3152 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3155 if(spCellLst->list.array != NULLP)
3157 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3159 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3161 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3163 if(spCellLst->list.array[cellidx]!=NULLP)
3165 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3168 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3171 /*******************************************************************
3173 * @brief Deallocating memory of function BuildAndSendUESetReq
3177 * Function : FreeSRBSetup
3179 * Functionality: Deallocating memory for function BuildSRBSetup
3181 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3186 * ******************************************************************/
3187 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3190 if(srbSet->list.array != NULLP)
3192 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3194 if(srbSet->list.array[srbidx]!=NULLP)
3196 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3199 CU_FREE(srbSet->list.array,srbSet->list.size);
3202 /*******************************************************************
3204 * @brief Deallocating memory of function BuildAndSendUESetReq
3208 * Function : FreeQOSInfo
3210 * Functionality: Deallocating memory for function BuildQOSInfo
3212 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3216 * ****************************************************************/
3217 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3219 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3220 uint8_t qosCntIdx = 0;
3222 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3224 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3226 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3228 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3229 sizeof(MaxDataBurstVolume_t));
3231 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3232 sizeof(AveragingWindow_t));
3234 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3235 sizeof(NonDynamic5QIDescriptor_t));
3237 if(drbQos->iE_Extensions)
3239 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3240 if(qosIeExt->list.array != NULLP)
3242 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3244 if(qosIeExt->list.array[qosCntIdx])
3246 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3249 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3252 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3255 /*******************************************************************
3257 * @brief Deallocating memory of function BuildAndSendUESetReq
3261 * Function : FreeULTnlInfo
3263 * Functionality: Deallocating memory for function BuildULTnlInfo
3265 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3270 * ****************************************************************/
3271 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3274 if(ulInfo->list.array != NULLP)
3276 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3278 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3280 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3282 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3283 transportLayerAddress.buf != NULLP)
3285 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3288 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3289 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3290 gTPTunnel->gTP_TEID.size);
3292 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3293 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3294 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3296 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3297 sizeof(GTPTunnel_t));
3300 if(ulInfo->list.array[ulidx]!=NULLP)
3302 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3305 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3308 /*******************************************************************
3310 * @brief Deallocating memory for BuildAndSendUESetReq
3314 * Function : FreeDRBSetup
3316 * Functionality: Deallocating memory for BuildDRBSetup
3318 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3322 * ****************************************************************/
3323 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3325 DRBs_ToBeSetup_Item_t *drbSetItem;
3326 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3328 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3330 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3331 if(drbSet->list.array != NULLP)
3333 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3335 if(drbSet->list.array[drbidx] != NULLP)
3337 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3338 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3340 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3341 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3343 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3344 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3346 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3347 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3349 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3351 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3353 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3355 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3356 flows_Mapped_To_DRB_List.list.array != NULLP)
3358 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3359 flows_Mapped_To_DRB_List.list.count; flowidx++)
3361 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3362 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3364 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3365 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3366 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3368 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3369 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3370 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3372 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3373 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3374 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3376 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3377 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3379 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3380 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3381 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3382 sizeof(MaxDataBurstVolume_t));
3384 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3385 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3386 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3388 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3389 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3390 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3393 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3394 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3396 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3397 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3400 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3401 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3402 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3404 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3405 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3407 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3408 sizeof(OCTET_STRING_t));
3410 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3411 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3413 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3414 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3416 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3417 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3419 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3420 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3422 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3423 iE_Extensions != NULLP)
3425 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3426 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3427 if(qosIeExt->list.array != NULLP)
3429 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3431 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3433 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3436 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3438 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3439 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3442 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3444 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3447 CU_FREE(drbSet->list.array,drbSet->list.size);
3452 /*******************************************************************
3454 * @brief Free the UE Setup Request
3458 * Function : FreeUeContextSetupReq
3460 * Functionality: Deallocate the memory of BuildUESetReq
3462 * @params[in] F1AP_PDU_t *f1apMsg
3467 * ****************************************************************/
3468 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3471 UEContextSetupRequest_t *ueSetReq = NULLP;
3473 if(f1apMsg != NULLP)
3475 if(f1apMsg->choice.initiatingMessage != NULLP)
3477 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3478 if(ueSetReq->protocolIEs.list.array != NULLP)
3480 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3482 if(ueSetReq->protocolIEs.list.array[idx])
3484 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3486 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3488 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3490 case ProtocolIE_ID_id_SpCell_ID:
3491 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3493 case ProtocolIE_ID_id_ServCellIndex:
3495 case ProtocolIE_ID_id_SpCellULConfigured:
3497 case ProtocolIE_ID_id_CUtoDURRCInformation:
3498 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3500 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3501 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3503 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3504 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3506 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3507 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3509 case ProtocolIE_ID_id_RRCContainer:
3510 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3512 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3513 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3516 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3517 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3518 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3521 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3525 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3527 for(ieId=0; ieId<idx; ieId++)
3529 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3531 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3534 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3536 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3538 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3542 /**Filling cell group info **/
3543 /*******************************************************************
3545 * @brief Build Control resource set to add/modify list
3549 * Function : BuildControlRSetToAddModList
3551 * Functionality: Build Control resource set to add/modify list
3554 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3556 * @return ROK - success
3559 * ****************************************************************/
3560 uint8_t BuildControlRSetToAddModList
3562 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3567 uint8_t numBytes, bitsUnused;
3568 struct ControlResourceSet *controlRSet;
3569 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3570 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3573 controlRSetList->list.count = elementCnt;
3574 controlRSetList->list.size = \
3575 elementCnt * sizeof(struct ControlResourceSet *);
3577 controlRSetList->list.array = NULLP;
3578 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3579 if(!controlRSetList->list.array)
3581 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3585 for(idx = 0; idx < elementCnt; idx++)
3587 controlRSetList->list.array[idx] = NULLP;
3588 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3589 if(!controlRSetList->list.array[idx])
3591 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3597 controlRSet = controlRSetList->list.array[idx];
3598 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3600 /* Values harcoded according to our design:
3603 * Bit string stored ff0000000000
3607 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3608 controlRSet->frequencyDomainResources.buf = NULLP;
3609 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3610 controlRSet->frequencyDomainResources.size);
3611 if(!controlRSet->frequencyDomainResources.buf)
3613 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3617 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3618 coreset0EndPrb = CORESET0_END_PRB;
3619 coreset1StartPrb = coreset0EndPrb + 6;
3620 coreset1NumPrb = CORESET1_NUM_PRB;
3621 /* calculate the PRBs */
3622 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3623 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3624 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3626 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3627 controlRSet->cce_REG_MappingType.present = \
3628 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3630 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3631 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3632 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3633 controlRSet->tci_PresentInDCI = NULLP;
3635 uint8_t tciStateIdx;
3637 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3638 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3639 if(!controlRset->tci_StatesPDCCH_ToAddList)
3641 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3646 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3647 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3648 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3649 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3650 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3652 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3656 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3658 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3659 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3661 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3668 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3670 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3671 if(!controlRset->tci_PresentInDCI)
3673 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3677 *(controlRset->tci_PresentInDCI);
3680 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3681 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3682 if(!controlRSet->pdcch_DMRS_ScramblingID)
3684 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3687 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3690 } /* End BuildControlRSetToAddModList */
3692 /*******************************************************************
3694 * @brief Build search space to add/modify list
3698 * Function : BuildSearchSpcToAddModList
3700 * Functionality: Build search space to add/modify list
3703 * @return ROK - success
3706 * ****************************************************************/
3707 uint8_t BuildSearchSpcToAddModList
3709 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3717 struct SearchSpace *searchSpc;
3720 searchSpcList->list.count = elementCnt;
3721 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3723 searchSpcList->list.array = NULLP;
3724 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3725 if(!searchSpcList->list.array)
3727 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3731 for(idx = 0; idx < elementCnt; idx++)
3733 searchSpcList->list.array[idx] = NULLP;
3734 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3735 if(!searchSpcList->list.array[idx])
3737 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3743 searchSpc = searchSpcList->list.array[idx];
3745 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3747 searchSpc->controlResourceSetId = NULLP;
3748 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3749 if(!searchSpc->controlResourceSetId)
3751 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3754 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3756 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3757 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3758 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3759 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3761 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3764 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3765 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3767 searchSpc->duration = NULLP;
3768 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3769 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3770 if(!searchSpc->monitoringSymbolsWithinSlot)
3772 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3776 /* Values taken from reference logs :
3779 * Bit string stores 8000
3784 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3785 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3786 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3787 searchSpc->monitoringSymbolsWithinSlot->size);
3788 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3790 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3795 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3796 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3797 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3798 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3800 searchSpc->nrofCandidates = NULLP;
3801 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3802 if(!searchSpc->nrofCandidates)
3804 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3808 searchSpc->nrofCandidates->aggregationLevel1 = \
3809 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3810 searchSpc->nrofCandidates->aggregationLevel2 = \
3811 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3812 searchSpc->nrofCandidates->aggregationLevel4 = \
3813 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3814 searchSpc->nrofCandidates->aggregationLevel8 = \
3815 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3816 searchSpc->nrofCandidates->aggregationLevel16 = \
3817 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3819 searchSpc->searchSpaceType = NULLP;
3820 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3821 if(!searchSpc->searchSpaceType)
3823 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3827 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3829 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3830 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3831 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3832 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3834 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3837 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3838 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3841 }/* End BuildSearchSpcToAddModList */
3843 /*******************************************************************
3845 * @brief Builds BWP DL dedicated PDCCH config
3849 * Function : BuildBWPDlDedPdcchCfg
3851 * Functionality: Builds BWP DL dedicated PDCCH config
3853 * @params[in] struct PDCCH_Config *pdcchCfg
3855 * @return ROK - success
3858 * ****************************************************************/
3859 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3861 pdcchCfg->controlResourceSetToAddModList = NULLP;
3862 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3863 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3864 if(!pdcchCfg->controlResourceSetToAddModList)
3866 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3870 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3875 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3877 pdcchCfg->searchSpacesToAddModList = NULLP;
3878 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3879 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3880 if(!pdcchCfg->searchSpacesToAddModList)
3882 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3886 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3891 pdcchCfg->searchSpacesToReleaseList = NULLP;
3892 pdcchCfg->downlinkPreemption = NULLP;
3893 pdcchCfg->tpc_PUSCH = NULLP;
3894 pdcchCfg->tpc_PUCCH = NULLP;
3895 pdcchCfg->tpc_SRS = NULLP;
3900 /*******************************************************************
3902 * @brief Builds DMRS DL PDSCH Mapping type A
3906 * Function : BuildDMRSDLPdschMapTypeA
3908 * Functionality: Builds DMRS DL PDSCH Mapping type A
3911 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3912 * @return ROK - success
3915 * ****************************************************************/
3916 uint8_t BuildDMRSDLPdschMapTypeA
3918 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3921 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3922 dmrsDlCfg->choice.setup = NULLP;
3923 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3924 if(!dmrsDlCfg->choice.setup)
3926 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3930 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3931 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3932 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3933 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3935 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3938 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3940 dmrsDlCfg->choice.setup->maxLength = NULLP;
3941 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3942 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3943 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3948 /*******************************************************************
3950 * @brief Builds TCI states to add/modify list
3954 * Function : BuildTCIStatesToAddModList
3956 * Functionality:Builds TCI states to add/modify list
3959 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3961 * @return ROK - success
3964 * ****************************************************************/
3965 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3970 /*******************************************************************
3972 * @brief Builds PDSCH time domain allocation list
3976 * Function : BuildPdschTimeDomAllocList
3978 * Functionality: Builds PDSCH time domain allocation list
3981 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3983 * @return ROK - success
3986 * ****************************************************************/
3987 uint8_t BuildPdschTimeDomAllocList
3989 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3994 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3996 timeDomAllocList->present = \
3997 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3999 timeDomAllocList->choice.setup = NULLP;
4000 CU_ALLOC(timeDomAllocList->choice.setup, \
4001 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4002 if(!timeDomAllocList->choice.setup)
4004 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4009 timeDomAllocList->choice.setup->list.count = elementCnt;
4010 timeDomAllocList->choice.setup->list.size = \
4011 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
4013 timeDomAllocList->choice.setup->list.array = NULLP;
4014 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4015 timeDomAllocList->choice.setup->list.size);
4016 if(!timeDomAllocList->choice.setup->list.array)
4018 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4022 for(idx = 0; idx < elementCnt; idx++)
4024 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4025 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
4026 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4027 if(!timeDomAllocList->choice.setup->list.array[idx])
4029 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4035 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4036 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4037 if(!timeDomAlloc->k0)
4039 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4042 *(timeDomAlloc->k0) = 0;
4043 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4044 timeDomAlloc->startSymbolAndLength = 66;
4047 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4048 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4049 if(!timeDomAlloc->k0)
4051 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4054 *(timeDomAlloc->k0) = 1;
4055 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4056 timeDomAlloc->startSymbolAndLength = 66;
4061 /*******************************************************************
4063 * @brief Builds PDSCH PRB Bundling type
4067 * Function : BuildPdschPrbBundlingType
4069 * Functionality: Builds PDSCH PRB Bundling type
4072 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4074 * @return ROK - success
4077 * ****************************************************************/
4078 uint8_t BuildPdschPrbBundlingType
4080 struct PDSCH_Config__prb_BundlingType *prbBndlType
4083 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4085 prbBndlType->choice.staticBundling = NULLP;
4086 CU_ALLOC(prbBndlType->choice.staticBundling, \
4087 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4088 if(!prbBndlType->choice.staticBundling)
4090 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4093 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4098 /*******************************************************************
4100 * @brief Builds BWP DL dedicated PDSCH config
4104 * Function : BuildBWPDlDedPdschCfg
4106 * Functionality: Builds BWP DL dedicated PDSCH config
4108 * @params[in] struct PDSCH_Config *pdschCfg
4110 * @return ROK - success
4113 * ****************************************************************/
4114 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4116 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4118 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4119 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4120 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4121 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4123 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4127 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4132 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4133 pdschCfg->tci_StatesToAddModList = NULLP;
4134 pdschCfg->tci_StatesToReleaseList = NULLP;
4135 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4137 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4138 if(!pdschCfg->tci_StatesToAddModList)
4140 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4143 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4149 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4151 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4152 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4153 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4154 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4156 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4159 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4163 pdschCfg->pdsch_AggregationFactor = NULLP;
4164 pdschCfg->rateMatchPatternToAddModList = NULLP;
4165 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4166 pdschCfg->rateMatchPatternGroup1 = NULLP;
4167 pdschCfg->rateMatchPatternGroup2 = NULLP;
4168 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4169 pdschCfg->mcs_Table = NULLP;
4171 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4172 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4173 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4175 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4178 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4180 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4185 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4186 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4187 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4188 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4189 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4190 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4191 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4196 /*******************************************************************
4198 * @brief Builds intitial DL BWP
4201 * Function : BuildInitialDlBWP
4203 * Functionality: Builds intitial DL BWP in spCellCfgDed
4205 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4207 * @return ROK - success
4210 * ****************************************************************/
4211 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4213 dlBwp->pdcch_Config = NULLP;
4214 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4215 if(!dlBwp->pdcch_Config)
4217 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4220 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4222 dlBwp->pdcch_Config->choice.setup = NULLP;
4223 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4224 if(!dlBwp->pdcch_Config->choice.setup)
4226 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4229 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4234 dlBwp->pdsch_Config = NULLP;
4235 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4236 if(!dlBwp->pdsch_Config)
4238 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4241 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4243 dlBwp->pdsch_Config->choice.setup = NULLP;
4244 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4245 if(!dlBwp->pdsch_Config->choice.setup)
4247 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4251 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4256 dlBwp->sps_Config = NULLP;
4257 dlBwp->radioLinkMonitoringConfig = NULLP;
4261 /*******************************************************************
4263 * @brief Builds DMRS UL Pusch Mapping type A
4267 * Function : BuildDMRSULPuschMapTypeA
4269 * Functionality: Builds DMRS UL Pusch Mapping type A
4272 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4273 * @return ROK - success
4276 * ****************************************************************/
4277 uint8_t BuildDMRSULPuschMapTypeA
4279 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4282 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4283 dmrsUlCfg->choice.setup= NULLP;
4284 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4285 if(!dmrsUlCfg->choice.setup)
4287 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4291 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4292 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4293 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4294 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4296 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4299 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4301 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4302 dmrsUlCfg->choice.setup->maxLength = NULLP;
4303 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4304 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4305 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4306 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4308 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4312 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4313 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4315 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4317 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4320 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4322 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4323 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4327 /*******************************************************************
4329 * @brief Build PUSCH time domain allocation list
4333 * Function : BuildPuschTimeDomAllocList
4335 * Functionality: Build PUSCH time domain allocation list
4338 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4340 * @return ROK - success
4343 * ****************************************************************/
4344 uint8_t BuildPuschTimeDomAllocList
4346 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4351 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4353 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4354 timeDomAllocList->choice.setup = NULLP;
4355 CU_ALLOC(timeDomAllocList->choice.setup, \
4356 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4357 if(!timeDomAllocList->choice.setup)
4359 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4364 timeDomAllocList->choice.setup->list.count = elementCnt;
4365 timeDomAllocList->choice.setup->list.size = \
4366 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4367 timeDomAllocList->choice.setup->list.array = NULLP;
4368 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4369 timeDomAllocList->choice.setup->list.size);
4370 if(!timeDomAllocList->choice.setup->list.array)
4372 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4376 for(idx = 0; idx < elementCnt; idx++)
4378 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4379 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4380 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4381 if(!timeDomAllocList->choice.setup->list.array[idx])
4383 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4389 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4390 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4391 if(!timeDomAlloc->k2)
4393 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4396 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4397 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4398 timeDomAlloc->startSymbolAndLength = 66;
4401 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4402 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4403 if(!timeDomAlloc->k2)
4405 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4408 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4409 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4410 timeDomAlloc->startSymbolAndLength = 66;
4415 /*******************************************************************
4417 * @brief Builds BWP UL dedicated PUSCH Config
4421 * Function : BuildBWPUlDedPuschCfg
4424 * Builds BWP UL dedicated PUSCH Config
4426 * @params[in] : PUSCH_Config_t *puschCfg
4428 * @return ROK - success
4431 * ****************************************************************/
4432 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4434 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4435 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4436 if(!puschCfg->dataScramblingIdentityPUSCH)
4438 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4441 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4443 puschCfg->txConfig = NULLP;
4444 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4445 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4446 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4447 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4449 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4453 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4458 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4459 puschCfg->pusch_PowerControl = NULLP;
4460 puschCfg->frequencyHopping = NULLP;
4461 puschCfg->frequencyHoppingOffsetLists = NULLP;
4462 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4464 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4465 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4466 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4467 if(!puschCfg->pusch_TimeDomainAllocationList)
4469 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4473 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4478 puschCfg->pusch_AggregationFactor = NULLP;
4479 puschCfg->mcs_Table = NULLP;
4480 puschCfg->mcs_TableTransformPrecoder = NULLP;
4481 puschCfg->transformPrecoder = NULLP;
4482 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4483 if(!puschCfg->transformPrecoder)
4485 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4488 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4490 puschCfg->codebookSubset = NULLP;
4491 puschCfg->maxRank = NULLP;
4492 puschCfg->rbg_Size = NULLP;
4493 puschCfg->uci_OnPUSCH = NULLP;
4494 puschCfg->tp_pi2BPSK = NULLP;
4499 /*******************************************************************
4501 * @brief Builds BWP UL dedicated PUCCH Config
4505 * Function : BuildBWPUlDedPucchCfg
4508 * Builds BWP UL dedicated PUCCH Config
4510 * @params[in] : PUCCH_Config_t *pucchCfg
4512 * @return ROK - success
4515 * ****************************************************************/
4516 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4518 uint8_t arrIdx, elementCnt;
4519 uint8_t rsrcIdx, rsrcSetIdx;
4520 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4521 PUCCH_Resource_t *rsrc = NULLP;
4525 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4526 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4527 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4528 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4529 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4531 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4534 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4535 rsrcSet->pucch_ResourceSetId = 1;
4537 rsrcSet->resourceList.list.count = elementCnt;
4538 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4539 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4540 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4542 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4545 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4549 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4550 pucchCfg->resourceToAddModList->list.count = elementCnt;
4551 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4552 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4553 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4555 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4558 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4559 rsrc->pucch_ResourceId = 1;
4560 rsrc->startingPRB = 0;
4561 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4562 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4563 rsrc->format.choice.format1->initialCyclicShift = 0;
4564 rsrc->format.choice.format1->nrofSymbols = 4;
4565 rsrc->format.choice.format1->startingSymbolIndex = 0;
4566 rsrc->format.choice.format1->timeDomainOCC = 0;
4569 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4570 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4571 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4572 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4573 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4576 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4577 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4579 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4584 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4585 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4586 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4587 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4589 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4593 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4595 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4596 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4598 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4604 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4605 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4610 /*******************************************************************
4612 * @brief Fills SRS resource to add/modify list
4616 * Function : BuildSrsRsrcAddModList
4618 * Functionality: Fills SRS resource to add/modify list
4621 * @return ROK - success
4624 * ****************************************************************/
4625 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4631 resourceList->list.count = elementCnt;
4632 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4633 resourceList->list.array = NULLP;
4634 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4635 if(!resourceList->list.array)
4637 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4641 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4643 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4644 if(!resourceList->list.array[rsrcIdx])
4646 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4652 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4653 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4654 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4656 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4657 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4658 sizeof(struct SRS_Resource__transmissionComb__n2));
4659 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4661 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4664 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4665 = SRS_COMB_OFFSET_N2;
4666 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4667 = SRS_CYCLIC_SHIFT_N2;
4669 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4670 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4671 SRS_Resource__resourceMapping__nrofSymbols_n1;
4672 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4673 SRS_Resource__resourceMapping__repetitionFactor_n1;
4675 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4676 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4677 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4678 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4679 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4680 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4681 SRS_Resource__groupOrSequenceHopping_neither;
4683 /* Setting resource type to aperiodic for intergration purposes */
4684 resourceList->list.array[rsrcIdx]->resourceType.present = \
4685 SRS_Resource__resourceType_PR_aperiodic;
4686 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4687 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4688 sizeof(struct SRS_Resource__resourceType__aperiodic));
4689 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4691 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4694 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4699 /*******************************************************************
4701 * @brief Build SRS resource set Add/mod list
4705 * Function : BuildSrsRsrcSetAddModList
4707 * Functionality: Build SRS resource set Add/mod list
4710 * @return ROK - success
4713 * ****************************************************************/
4714 uint8_t BuildSrsRsrcSetAddModList
4716 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4722 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4725 rsrcSetList->list.count = elementCnt;
4726 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4727 rsrcSetList->list.array = NULLP;
4728 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4729 if(!rsrcSetList->list.array)
4731 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4735 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4737 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4738 if(!rsrcSetList->list.array[rSetIdx])
4740 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4746 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4748 /* Fill Resource Id list in resource set */
4749 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4750 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4751 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4752 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4754 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4759 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4760 rsrcIdList->list.count = elementCnt;
4761 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4762 rsrcIdList->list.array = NULLP;
4763 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4764 if(!rsrcIdList->list.array)
4766 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4770 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4772 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4773 if(!rsrcIdList->list.array[rsrcIdx])
4775 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4781 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4783 /* Fill resource type */
4784 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4785 SRS_ResourceSet__resourceType_PR_aperiodic;
4787 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4788 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4789 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4790 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4792 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4795 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4796 = APERIODIC_SRS_RESRC_TRIGGER;
4798 /* TODO : Fill values for below IEs as expected by Viavi */
4799 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4800 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4803 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4804 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4805 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4806 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4807 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4812 /*******************************************************************
4814 * @brief Builds BWP UL dedicated SRS Config
4818 * Function : BuildBWPUlDedSrsCfg
4820 * Functionality: Builds BWP UL dedicated SRS Config
4822 * @params[in] SRS Config
4823 * @return ROK - success
4826 * ****************************************************************/
4827 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4829 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4830 srsCfg->srs_ResourceSetToAddModList = NULLP;
4831 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4832 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4833 if(!srsCfg->srs_ResourceSetToAddModList)
4835 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4838 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4843 srsCfg->srs_ResourceToReleaseList = NULLP;
4845 /* Resource to Add/Modify list */
4846 srsCfg->srs_ResourceToAddModList = NULLP;
4847 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4848 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4849 if(!srsCfg->srs_ResourceToAddModList)
4851 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4855 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4860 srsCfg->tpc_Accumulation = NULLP;
4865 /*******************************************************************
4867 * @brief Builds inital UL BWP
4871 * Function : BuildInitialUlBWP
4873 * Functionality: Builds initial UL BWP
4875 * @params[in] BWP_UplinkDedicated_t *ulBwp
4876 * @return ROK - success
4879 * ****************************************************************/
4880 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4882 ulBwp->pucch_Config = NULLP;
4883 ulBwp->pucch_Config = NULLP;
4884 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4885 if(!ulBwp->pucch_Config)
4887 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4891 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4892 ulBwp->pucch_Config->choice.setup = NULLP;
4893 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4894 if(!ulBwp->pucch_Config->choice.setup)
4896 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4900 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4905 /* Fill BWP UL dedicated PUSCH config */
4906 ulBwp->pusch_Config = NULLP;
4907 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4908 if(!ulBwp->pusch_Config)
4910 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4914 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4915 ulBwp->pusch_Config->choice.setup = NULLP;
4916 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4917 if(!ulBwp->pusch_Config->choice.setup)
4919 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4923 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4928 ulBwp->configuredGrantConfig = NULLP;
4930 /* Fill BPW UL dedicated SRS config */
4931 ulBwp->srs_Config = NULLP;
4932 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4933 if(!ulBwp->srs_Config)
4935 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4939 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4940 ulBwp->srs_Config->choice.setup = NULLP;
4941 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4942 if(!ulBwp->srs_Config->choice.setup)
4944 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4948 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4953 ulBwp->beamFailureRecoveryConfig = NULLP;
4958 /*******************************************************************
4960 * @brief Builds Pusch Serving cell Config
4964 * Function : BuildPuschSrvCellCfg
4966 * Functionality: Builds Pusch Serving cell Config
4968 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4970 * @return ROK - success
4973 * ****************************************************************/
4974 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4976 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4977 puschCfg->choice.setup = NULLP;
4978 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4979 if(!puschCfg->choice.setup)
4981 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4985 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4986 puschCfg->choice.setup->rateMatching = NULLP;
4987 puschCfg->choice.setup->xOverhead = NULLP;
4988 puschCfg->choice.setup->ext1 = NULLP;
4989 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4990 if(!puschCfg->choice.setup->ext1)
4992 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4996 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4997 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4998 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
5000 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5003 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
5005 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
5006 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
5007 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
5009 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5012 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
5016 /*******************************************************************
5018 * @brief Builds UL config
5021 * Function : BuildUlCfg
5023 * Functionality: Builds UL config in spCellCfgDed
5025 * @params[in] UplinkConfig_t *ulCfg
5027 * @return ROK - success
5030 * ****************************************************************/
5031 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
5033 ulCfg->initialUplinkBWP = NULLP;
5034 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5035 if(!ulCfg->initialUplinkBWP)
5037 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5041 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
5046 ulCfg->uplinkBWP_ToReleaseList = NULLP;
5047 ulCfg->uplinkBWP_ToAddModList = NULLP;
5048 ulCfg->firstActiveUplinkBWP_Id = NULLP;
5049 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5050 if(!ulCfg->firstActiveUplinkBWP_Id)
5052 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5055 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5057 ulCfg->pusch_ServingCellConfig = NULLP;
5058 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
5059 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5060 if(!ulCfg->pusch_ServingCellConfig)
5062 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5066 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5071 ulCfg->carrierSwitching = NULLP;
5072 ulCfg->ext1 = NULLP;
5076 /*******************************************************************
5078 * @brief Builds PDSCH serving cell config
5081 * Function : BuildPdschSrvCellCfg
5083 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5085 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5087 * @return ROK - success
5090 * ****************************************************************/
5091 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5093 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5094 pdschCfg->choice.setup = NULLP;
5095 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5096 if(!pdschCfg->choice.setup)
5098 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5102 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5103 pdschCfg->choice.setup->xOverhead = NULLP;
5104 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5105 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5106 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5108 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5111 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5112 pdschCfg->choice.setup->pucch_Cell = NULLP;
5113 pdschCfg->choice.setup->ext1 = NULLP;
5118 /*******************************************************************
5120 * @brief Builds CSI Meas config
5123 * Function : BuildCsiMeasCfg
5125 * Functionality: Builds CSI Meas config in spCellCfgDed
5127 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5129 * @return ROK - success
5132 * ****************************************************************/
5133 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5139 /*******************************************************************
5141 * @brief Builds Spcell config dedicated
5144 * Function : BuildSpCellCfgDed
5146 * Functionality: Builds sp cell config dedicated in spCellCfg
5148 * @params[in] ServingCellConfig_t srvCellCfg
5150 * @return ROK - success
5153 * ****************************************************************/
5154 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5156 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5158 srvCellCfg->initialDownlinkBWP = NULLP;
5159 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5160 if(!srvCellCfg->initialDownlinkBWP)
5162 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5166 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5168 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5171 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5172 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5174 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5175 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5176 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5178 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5181 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5183 srvCellCfg->bwp_InactivityTimer = NULLP;
5185 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5186 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5187 if(!srvCellCfg->defaultDownlinkBWP_Id)
5189 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5192 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5194 srvCellCfg->uplinkConfig = NULLP;
5195 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5196 if(!srvCellCfg->uplinkConfig)
5198 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5202 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5204 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5207 srvCellCfg->supplementaryUplink = NULLP;
5208 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5210 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5211 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5212 if(!srvCellCfg->pdsch_ServingCellConfig)
5214 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5218 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5220 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5224 srvCellCfg->csi_MeasConfig = NULLP;
5226 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5227 if(!srvCellCfg->csi_MeasConfig)
5229 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5233 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5235 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5239 srvCellCfg->sCellDeactivationTimer = NULLP;
5240 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5241 srvCellCfg->tag_Id = TAG_ID;
5242 srvCellCfg->dummy = NULLP;
5243 srvCellCfg->pathlossReferenceLinking = NULLP;
5244 srvCellCfg->servingCellMO = NULLP;
5245 srvCellCfg->ext1 = NULLP;
5249 /*******************************************************************
5251 * @brief Builds Spcell config
5255 * Function : BuildSpCellCfg
5257 * Functionality: Builds sp cell config in DuToCuRrcContainer
5259 * @params[in] SpCellConfig_t spCellCfg
5261 * @return ROK - success
5264 * ****************************************************************/
5265 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5268 spCellCfg->servCellIndex = NULLP;
5269 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5270 if(!spCellCfg->servCellIndex)
5272 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5275 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5277 spCellCfg->reconfigurationWithSync = NULLP;
5278 spCellCfg->rlf_TimersAndConstants = NULLP;
5279 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5280 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5281 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5283 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5286 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5288 spCellCfg->spCellConfigDedicated = NULLP;
5289 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5290 if(!spCellCfg->spCellConfigDedicated)
5292 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5295 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5297 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5302 /*******************************************************************
5304 * @brief Builds Phy cell group config
5308 * Function : BuildPhyCellGrpCfg
5310 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5312 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5314 * @return ROK - success
5317 * ****************************************************************/
5318 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5320 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5321 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5323 phyCellGrpCfg->p_NR_FR1 = NULLP;
5324 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5325 if(!phyCellGrpCfg->p_NR_FR1)
5327 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5330 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5331 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5332 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5333 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5334 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5335 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5336 phyCellGrpCfg->cs_RNTI = NULLP;
5337 phyCellGrpCfg->ext1 = NULLP;
5338 phyCellGrpCfg->ext2 = NULLP;
5343 /*******************************************************************
5345 * @brief Builds tag config
5349 * Function : BuildTagConfig
5351 * Functionality: Builds tag config in MacCellGroupConfig
5353 * @params[in] TAG_Config *tag_Config
5355 * @return ROK - success
5358 * ****************************************************************/
5359 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5361 struct TAG_Config__tag_ToAddModList *tagList;
5362 uint8_t idx, elementCnt;
5364 tagConfig->tag_ToReleaseList = NULLP;
5365 tagConfig->tag_ToAddModList = NULLP;
5366 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5367 if(!tagConfig->tag_ToAddModList)
5369 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5373 elementCnt = 1; //ODU_VALUE_ONE;
5374 tagList = tagConfig->tag_ToAddModList;
5375 tagList->list.count = elementCnt;
5376 tagList->list.size = elementCnt * sizeof(struct TAG *);
5378 tagList->list.array = NULLP;
5379 CU_ALLOC(tagList->list.array, tagList->list.size);
5380 if(!tagList->list.array)
5382 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5386 for(idx=0; idx<tagList->list.count; idx++)
5388 tagList->list.array[idx] = NULLP;
5389 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5390 if(!tagList->list.array[idx])
5392 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5398 tagList->list.array[idx]->tag_Id = TAG_ID;
5399 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5404 /*******************************************************************
5406 * @brief Builds PHR Config
5410 * Function : BuildPhrConfig
5412 * Functionality: Builds phrConfig in MacCellGroupConfig
5414 * @params[in] PHR Config *
5416 * @return ROK - success
5419 * ****************************************************************/
5420 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5423 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5424 phrConfig->choice.setup = NULLP;
5425 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5426 if(!phrConfig->choice.setup)
5428 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5432 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5433 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5434 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5435 phrConfig->choice.setup->multiplePHR = false;
5436 phrConfig->choice.setup->dummy = false;
5437 phrConfig->choice.setup->phr_Type2OtherCell = false;
5438 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5443 /*******************************************************************
5445 * @brief Builds BSR Config
5449 * Function : BuildBsrConfig
5451 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5453 * @params[in] BSR_Config *bsrConfig
5455 * @return ROK - success
5458 * ****************************************************************/
5459 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5461 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5462 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5463 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5468 /*******************************************************************
5470 * @brief Builds scheduling request config
5474 * Function : BuildSchedulingReqConfig
5476 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5478 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5480 * @return ROK - success
5483 * ****************************************************************/
5484 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5486 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5487 uint8_t idx, elementCnt;
5489 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5490 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5491 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5492 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5494 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5498 elementCnt = 1; //ODU_VALUE_ONE;
5499 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5500 schReqList->list.count = elementCnt;
5501 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5503 schReqList->list.array = NULLP;
5504 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5505 if(!schReqList->list.array)
5507 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5511 for(idx=0;idx<schReqList->list.count; idx++)
5513 schReqList->list.array[idx] = NULLP;
5514 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5515 if(!schReqList->list.array[idx])
5517 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5523 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5525 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5526 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5527 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5529 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5532 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5533 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5534 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5538 /*******************************************************************
5540 * @brief Builds Mac cell group config
5544 * Function : BuildMacCellGrpCfg
5546 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5548 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5550 * @return ROK - success
5553 * ****************************************************************/
5554 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5556 macCellGrpCfg->drx_ConfigRrc = NULLP;
5557 macCellGrpCfg->schedulingRequestConfig = NULLP;
5558 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5559 if(!macCellGrpCfg->schedulingRequestConfig)
5561 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5565 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5567 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5571 macCellGrpCfg->bsr_Config = NULLP;
5572 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5573 if(!macCellGrpCfg->bsr_Config)
5575 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5579 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5581 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5585 macCellGrpCfg->tag_Config = NULLP;
5586 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5587 if(!macCellGrpCfg->tag_Config)
5589 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5593 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5595 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5599 macCellGrpCfg->phr_Config = NULLP;
5600 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5601 if(!macCellGrpCfg->phr_Config)
5603 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5607 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5609 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5613 macCellGrpCfg->skipUplinkTxDynamic = false;
5614 macCellGrpCfg->ext1 = NULLP;
5618 /*******************************************************************
5620 * @brief Frees memeory allocated for SearchSpcToAddModList
5624 * Function : FreeSearchSpcToAddModList
5626 * Functionality: Deallocating memory of SearchSpcToAddModList
5628 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5632 4221 * ****************************************************************/
5633 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5637 struct SearchSpace *searchSpc=NULLP;
5639 if(searchSpcList->list.array)
5641 if(searchSpcList->list.array[idx2])
5643 searchSpc = searchSpcList->list.array[idx2];
5644 if(searchSpc->controlResourceSetId)
5646 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5648 if(searchSpc->monitoringSymbolsWithinSlot)
5650 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5652 if(searchSpc->nrofCandidates)
5654 if(searchSpc->searchSpaceType)
5656 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5657 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5658 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5659 SearchSpace__searchSpaceType));
5661 CU_FREE(searchSpc->nrofCandidates,
5662 sizeof(struct SearchSpace__nrofCandidates));
5664 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5665 searchSpc->monitoringSymbolsWithinSlot->size);
5667 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5668 sizeof(BIT_STRING_t));
5670 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5671 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5673 CU_FREE(searchSpc->controlResourceSetId,
5674 sizeof(ControlResourceSetId_t));
5677 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5679 CU_FREE(searchSpcList->list.array[idx1],
5680 sizeof(struct SearchSpace));
5682 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5685 /*******************************************************************
5687 * @brief Frees memory allocated for PdschTimeDomAllocList
5691 * Function : FreePdschTimeDomAllocList
5693 * Functionality: Deallocating memory of PdschTimeDomAllocList
5695 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5699 4221 * ****************************************************************/
5700 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5704 if(timeDomAllocList->choice.setup)
5706 if(timeDomAllocList->choice.setup->list.array)
5708 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5710 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5711 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5713 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5714 timeDomAllocList->choice.setup->list.size);
5716 CU_FREE(timeDomAllocList->choice.setup,\
5717 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5720 /*******************************************************************
5722 * @brief Frees memory allocated for PuschTimeDomAllocList
5726 * Function : FreePuschTimeDomAllocList
5728 * Functionality: Deallocating memory of PuschTimeDomAllocList
5730 * @params[in] PUSCH_Config_t *puschCfg
5734 ***********************************************************************/
5735 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5739 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5741 if(puschCfg->pusch_TimeDomainAllocationList)
5743 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5744 if(timeDomAllocList_t->choice.setup)
5746 if(timeDomAllocList_t->choice.setup->list.array)
5748 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5749 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5751 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5752 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5754 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5755 timeDomAllocList_t->choice.setup->list.size);
5757 CU_FREE(timeDomAllocList_t->choice.setup, \
5758 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5760 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5761 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5762 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5767 /*******************************************************************
5769 * @brief Frees memory allocated for Dedicated PUCCH config
5773 * Function : FreeBWPUlDedPucchCfg
5775 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5777 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5781 * ****************************************************************/
5782 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5784 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5785 PUCCH_Config_t *pucchCfg = NULLP;
5786 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5787 PUCCH_Resource_t *rsrc = NULLP;
5791 if(ulBwpPucchCfg->choice.setup)
5793 pucchCfg = ulBwpPucchCfg->choice.setup;
5795 //Free resource set list
5796 if(pucchCfg->resourceSetToAddModList)
5798 if(pucchCfg->resourceSetToAddModList->list.array)
5800 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5802 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5803 if(rsrcSet->resourceList.list.array)
5805 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5807 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5809 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5811 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5813 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5815 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5818 //Free resource list
5819 if(pucchCfg->resourceToAddModList)
5821 if(pucchCfg->resourceToAddModList->list.array)
5823 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5825 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5826 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5827 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5829 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5831 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5835 if(pucchCfg->format1)
5837 if(pucchCfg->format1->choice.setup)
5839 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5840 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5842 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5846 if(pucchCfg->dl_DataToUL_ACK)
5848 if(pucchCfg->dl_DataToUL_ACK->list.array)
5850 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5852 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5854 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5856 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5859 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5861 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5865 /*******************************************************************
5867 * @brief Frees memory allocated for InitialUlBWP
5871 * Function : FreeInitialUlBWP
5873 * Functionality: Deallocating memory of InitialUlBWP
5875 * @params[in] BWP_UplinkDedicated_t *ulBwp
5879 * ****************************************************************/
5880 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5882 uint8_t rSetIdx, rsrcIdx;
5883 SRS_Config_t *srsCfg = NULLP;
5884 PUSCH_Config_t *puschCfg = NULLP;
5885 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5886 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5887 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5888 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5890 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5892 if(ulBwp->pusch_Config)
5894 if(ulBwp->pusch_Config->choice.setup)
5896 puschCfg=ulBwp->pusch_Config->choice.setup;
5897 if(puschCfg->dataScramblingIdentityPUSCH)
5899 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5901 FreePuschTimeDomAllocList(puschCfg);
5902 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5903 if(dmrsUlCfg->choice.setup)
5905 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5907 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5909 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5911 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5912 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5914 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5917 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5919 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5920 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5922 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5924 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5926 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5928 /* Free SRS-Config */
5929 if(ulBwp->srs_Config)
5931 if(ulBwp->srs_Config->choice.setup)
5933 srsCfg = ulBwp->srs_Config->choice.setup;
5935 /* Free Resource Set to add/mod list */
5936 if(srsCfg->srs_ResourceSetToAddModList)
5938 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5939 if(rsrcSetList->list.array)
5943 /* Free SRS resource Id list in this SRS resource set */
5944 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5946 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5948 if(rsrcIdList->list.array)
5950 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5952 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5954 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5956 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5957 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5960 /* Free resource type info for this SRS resource set */
5961 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5962 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5964 /* Free memory for each resource set */
5965 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5967 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5969 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5971 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5972 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5975 /* Free resource to add/modd list */
5976 if(srsCfg->srs_ResourceToAddModList)
5978 resourceList = srsCfg->srs_ResourceToAddModList;
5979 if(resourceList->list.array)
5982 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5983 sizeof(struct SRS_Resource__transmissionComb__n2));
5984 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5985 sizeof(struct SRS_Resource__resourceType__aperiodic));
5987 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5989 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5991 CU_FREE(resourceList->list.array, resourceList->list.size);
5993 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5994 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5997 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5999 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
6003 /*******************************************************************
6005 * @brief Frees memory allocated for initialUplinkBWP
6009 * Function : FreeinitialUplinkBWP
6011 * Functionality: Deallocating memory of initialUplinkBWP
6013 * @params[in] UplinkConfig_t *ulCfg
6018 * ****************************************************************/
6019 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
6021 BWP_UplinkDedicated_t *ulBwp=NULLP;
6022 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6024 if(ulCfg->initialUplinkBWP)
6026 ulBwp=ulCfg->initialUplinkBWP;
6027 if(ulCfg->firstActiveUplinkBWP_Id)
6029 if(ulCfg->pusch_ServingCellConfig)
6031 puschCfg=ulCfg->pusch_ServingCellConfig;
6032 if(puschCfg->choice.setup)
6034 if(puschCfg->choice.setup->ext1)
6036 CU_FREE(puschCfg->choice.setup->ext1->\
6037 processingType2Enabled,sizeof(BOOLEAN_t));
6038 CU_FREE(puschCfg->choice.setup->ext1->\
6039 maxMIMO_Layers,sizeof(long));
6040 CU_FREE(puschCfg->choice.setup->ext1, \
6041 sizeof(struct PUSCH_ServingCellConfig__ext1));
6043 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
6045 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
6047 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
6049 FreeInitialUlBWP(ulBwp);
6050 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6053 /*******************************************************************
6055 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6059 * Function : FreeBWPDlDedPdschCfg
6061 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6063 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6068 * ****************************************************************/
6069 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6071 struct PDSCH_Config *pdschCfg=NULLP;
6072 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6073 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6074 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6076 if(dlBwp->pdsch_Config->choice.setup)
6078 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6079 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6081 if(pdschCfg->pdsch_TimeDomainAllocationList)
6083 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6084 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6086 prbBndlType=&pdschCfg->prb_BundlingType;
6087 CU_FREE(prbBndlType->choice.staticBundling,\
6088 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6089 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6091 FreePdschTimeDomAllocList(timeDomAllocList);
6092 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6093 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6095 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6096 if(dmrsDlCfg->choice.setup)
6098 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6100 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6102 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6103 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6105 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6108 /*******************************************************************
6110 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6114 * Function : FreeBWPDlDedPdcchCfg
6116 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6118 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6123 * ****************************************************************/
6124 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6128 struct PDCCH_Config *pdcchCfg=NULLP;
6129 struct ControlResourceSet *controlRSet=NULLP;
6130 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6132 if(dlBwp->pdcch_Config->choice.setup)
6134 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6135 if(pdcchCfg->controlResourceSetToAddModList)
6137 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6138 if(controlRSetList->list.array)
6140 controlRSet = controlRSetList->list.array[idx2];
6143 if(controlRSet->frequencyDomainResources.buf)
6145 if(controlRSet->pdcch_DMRS_ScramblingID)
6147 if(pdcchCfg->searchSpacesToAddModList)
6149 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6150 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6151 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6153 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6155 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6156 controlRSet->frequencyDomainResources.size);
6159 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6161 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6163 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6165 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6166 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6168 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6171 /*******************************************************************
6173 * @brief Builds RLC Config
6177 * Function : BuildRlcConfig
6179 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6181 * @params[in] RLC_Config *rlcConfig
6183 * @return ROK - success
6186 * ****************************************************************/
6187 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6189 rlcConfig->present = rlcLcCfgDb.rlcMode;
6191 switch(rlcConfig->present)
6193 case RLC_Config_PR_am:
6195 rlcConfig->choice.am = NULLP;
6196 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6197 if(!rlcConfig->choice.am)
6199 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6204 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6205 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6206 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6208 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6211 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6212 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6213 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6214 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6215 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6218 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6219 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6220 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6222 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6225 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6226 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6227 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6232 case RLC_Config_PR_um_Bi_Directional:
6234 rlcConfig->choice.um_Bi_Directional = NULLP;
6235 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6236 if(!rlcConfig->choice.um_Bi_Directional)
6238 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6243 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6244 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6245 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6247 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6250 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6253 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6254 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6255 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6257 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6260 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6261 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6268 /*******************************************************************
6270 * @brief Builds MAC LC Config
6274 * Function : BuildMacLCConfig
6276 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6278 * @params[in] struct LogicalChannelConfig macLcConfig
6280 * @return ROK - success
6283 * ****************************************************************/
6284 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6287 macLcConfig->ul_SpecificParameters = NULLP;
6288 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6289 if(!macLcConfig->ul_SpecificParameters)
6291 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6295 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6296 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6297 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6298 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6299 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6300 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6301 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6303 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6304 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6305 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6307 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6310 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6312 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6313 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6314 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6316 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6319 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6321 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6322 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6323 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6327 /*******************************************************************
6329 * @brief Builds RLC Bearer to Add/Mod list
6333 * Function :BuildRlcBearerToAddModList
6335 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6337 * @params[in] rlc_BearerToAddModList
6339 * @return ROK - success
6342 * ****************************************************************/
6343 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6345 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6348 elementCnt = ueCb->numSrb + ueCb->numDrb;
6351 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6353 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6357 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6359 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6366 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6369 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6372 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6375 rlcBearerList->list.count = elementCnt;
6376 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6378 rlcBearerList->list.array = NULLP;
6379 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6380 if(!rlcBearerList->list.array)
6382 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6386 for(idx=0; idx<rlcBearerList->list.count; idx++)
6388 rlcBearerList->list.array[idx] = NULLP;
6389 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6390 if(!rlcBearerList->list.array[idx])
6392 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6399 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6401 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6404 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6406 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6407 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6409 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6413 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6414 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6416 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6417 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6418 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6419 if(!rlcBearerList->list.array[idx]->rlc_Config)
6421 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6425 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6427 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6431 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6432 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6433 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6435 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6439 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6441 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6447 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6449 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6452 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6454 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6455 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6457 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6461 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6462 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6464 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6465 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6466 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6467 if(!rlcBearerList->list.array[idx]->rlc_Config)
6469 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6473 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6475 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6479 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6480 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6481 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6483 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6487 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6489 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6497 /*******************************************************************
6499 * @brief Free memory allocated for CellGroupConfig
6503 * Function : FreeMemCellGrpCfg
6505 * Functionality: Deallocating memory of CellGroupConfig
6507 * @params[in] pointer to CellGroupConfigRrc_t
6509 * @return ROK - success
6512 ******************************************************************/
6513 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6516 SpCellConfig_t *spCellCfg=NULLP;
6517 ServingCellConfig_t *srvCellCfg=NULLP;
6518 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6519 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6520 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6521 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6522 struct RLC_Config *rlcConfig=NULLP;
6523 struct LogicalChannelConfig *macLcConfig=NULLP;
6524 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6525 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6526 struct TAG_Config *tagConfig=NULLP;
6527 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6528 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6529 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6531 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6534 if(rlcBearerList->list.array)
6536 for(idx=0; idx<rlcBearerList->list.count; idx++)
6538 if(rlcBearerList->list.array[idx])
6540 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6541 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6544 if(rlcConfig->choice.am)
6546 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6547 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6548 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6550 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6552 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6555 if(macLcConfig->ul_SpecificParameters)
6557 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6558 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6559 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6561 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6563 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6566 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6568 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6571 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6574 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6575 if(schedulingRequestConfig)
6577 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6580 if(schReqList->list.array)
6582 for(idx=0;idx<schReqList->list.count; idx++)
6584 if(schReqList->list.array[idx])
6586 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6587 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6590 CU_FREE(schReqList->list.array, schReqList->list.size);
6592 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6593 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6594 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6596 if(macCellGrpCfg->bsr_Config)
6598 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6600 tagConfig = macCellGrpCfg->tag_Config;
6603 tagList = tagConfig->tag_ToAddModList;
6606 if(tagList->list.array)
6608 for(idx=0; idx<tagList->list.count; idx++)
6610 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6612 CU_FREE(tagList->list.array, tagList->list.size);
6614 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6616 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6619 phrConfig = macCellGrpCfg->phr_Config;
6622 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6623 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6626 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6629 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6632 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6633 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6636 spCellCfg = cellGrpCfg->spCellConfig;
6639 if(spCellCfg->servCellIndex)
6641 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6643 if(spCellCfg->spCellConfigDedicated)
6645 srvCellCfg = spCellCfg->spCellConfigDedicated;
6646 if(srvCellCfg->initialDownlinkBWP)
6648 dlBwp = srvCellCfg->initialDownlinkBWP;
6649 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6651 if(srvCellCfg->defaultDownlinkBWP_Id)
6653 if(srvCellCfg->uplinkConfig)
6655 if(srvCellCfg->pdsch_ServingCellConfig)
6657 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6658 if(pdschCfg->choice.setup)
6660 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6661 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6663 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6664 ServingCellConfig__pdsch_ServingCellConfig));
6666 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6667 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6669 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6671 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6673 if(dlBwp->pdcch_Config)
6675 if(dlBwp->pdsch_Config)
6677 FreeBWPDlDedPdschCfg(dlBwp);
6678 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6680 FreeBWPDlDedPdcchCfg(dlBwp);
6681 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6683 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6685 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6687 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6689 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6691 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6696 /*******************************************************************
6698 * @brief Fills CellGroupConfig
6702 * Function : fillCellGrpCfg
6704 * Functionality: Fills CellGroupConfig
6706 * @params[in] pointer to CellGroupConfigRrc_t
6708 * @return ROK - success
6711 ******************************************************************/
6713 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6715 uint8_t ret = RFAILED;
6716 CellGroupConfigRrc_t cellGrpCfg;
6717 asn_enc_rval_t encRetVal;
6721 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6723 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6725 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6727 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6731 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6732 cellGrpCfg.mac_CellGroupConfig = NULLP;
6733 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6734 if(!cellGrpCfg.mac_CellGroupConfig)
6736 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6739 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6741 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6745 cellGrpCfg.physicalCellGroupConfig = NULLP;
6746 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6747 if(!cellGrpCfg.physicalCellGroupConfig)
6749 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6752 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6754 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6758 cellGrpCfg.spCellConfig = NULLP;
6759 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6760 if(!cellGrpCfg.spCellConfig)
6762 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6765 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6767 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6771 cellGrpCfg.sCellToAddModList = NULLP;
6772 cellGrpCfg.sCellToReleaseList = NULLP;
6773 cellGrpCfg.ext1 = NULLP;
6775 /* encode cellGrpCfg into duToCuRrcContainer */
6776 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6777 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6779 encRetVal = uper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6780 /* Encode results */
6781 if(encRetVal.encoded == ENCODE_FAIL)
6783 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6784 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6789 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6790 for(int i=0; i< encBufSize; i++)
6792 DU_LOG("%x",encBuf[i]);
6796 cellGrp->size = encBufSize;
6797 CU_ALLOC(cellGrp->buf, cellGrp->size);
6800 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6803 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6807 FreeMemCellGrpCfg(&cellGrpCfg);
6811 /*******************************************************************
6813 * @brief Free UE Capability RAT container
6817 * Function : freeUeCapRatCont
6820 * Free UE Capability RAT conatiner
6823 * @return ROK - success
6826 * ****************************************************************/
6827 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6830 FeatureSets_t *featureSets;
6832 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6834 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6836 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6837 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6839 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6842 if(ueNrCap->featureSets)
6844 featureSets = ueNrCap->featureSets;
6845 if(featureSets->featureSetsDownlinkPerCC)
6847 if(featureSets->featureSetsDownlinkPerCC->list.array)
6849 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6851 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6852 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6853 sizeof(ModulationOrder_t));
6854 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6856 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6858 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6861 if(featureSets->featureSetsUplinkPerCC)
6863 if(featureSets->featureSetsUplinkPerCC->list.array)
6865 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6867 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6869 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6870 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6871 sizeof(ModulationOrder_t));
6872 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6875 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6877 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6879 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6883 /*******************************************************************
6885 * @brief Free UE capability RAT container list
6889 * Function : freeUeCapRatContList
6891 * Functionality: Free UE capability RAT container list
6894 * @return ROK - success
6897 * ****************************************************************/
6898 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6901 if(ueCapablityList->list.array)
6903 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6905 if(ueCapablityList->list.array[idx])
6906 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6908 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6912 /*******************************************************************
6914 * @brief Free Handover preparation information
6918 * Function : freeHOPreparationInfo
6920 * Functionality: Free Handover preparation information
6923 * @return ROK - success
6926 * ****************************************************************/
6927 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6929 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6931 if(hoPrep->criticalExtensions.choice.c1)
6933 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6935 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6936 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6937 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6938 sizeof(HandoverPreparationInformationRrc_IEs_t));
6940 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6944 /*******************************************************************
6946 * @brief Fill feature sets
6950 * Function : fillFeatureSets
6952 * Functionality: Fill feature sets
6955 * @return ROK - success
6958 * ****************************************************************/
6959 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6961 uint8_t idx, elementCnt;
6963 featureSets->featureSetsDownlink = NULLP;
6964 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6965 if(!featureSets->featureSetsDownlinkPerCC)
6967 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6972 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6973 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6974 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6975 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6977 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6981 for(idx = 0; idx < elementCnt; idx++)
6983 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6984 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6986 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6992 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6993 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6994 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6995 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6996 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6998 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6999 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
7001 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7004 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
7006 featureSets->featureSetsUplink = NULLP;
7007 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
7008 if(!featureSets->featureSetsUplinkPerCC)
7010 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7015 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
7016 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
7017 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
7018 if(!featureSets->featureSetsUplinkPerCC->list.array)
7020 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7024 for(idx = 0; idx < elementCnt; idx++)
7026 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
7027 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
7029 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7035 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
7036 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
7037 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
7038 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
7039 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
7040 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
7042 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
7043 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
7045 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7048 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
7053 /*******************************************************************
7055 * @brief Fill UE capability RAT container
7059 * Function : fillUeCapRatCont
7061 * Functionality: Fill UE capability RAT container
7063 * @params[in] UE Capability RAT container buffer
7064 * @return ROK - success
7067 * ****************************************************************/
7068 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
7071 uint8_t idx, elementCnt;
7072 asn_enc_rval_t encRetVal;
7073 UE_NR_Capability_t ueNrCap;
7077 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7079 /* Filling PDCP parameters */
7080 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7081 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7082 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7083 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7084 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7085 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7086 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7087 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7088 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7089 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7090 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7091 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7092 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7093 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7094 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7095 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7096 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7098 ueNrCap.rlc_Parameters = NULLP;
7099 ueNrCap.mac_Parameters = NULLP;
7101 /* Filling PHY parameters */
7102 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7103 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7104 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7105 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7106 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7108 /* Filling RF parameters */
7110 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7111 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7112 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7113 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7115 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7120 for(idx = 0; idx < elementCnt; idx++)
7122 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7123 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7133 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7134 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7135 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7137 ueNrCap.measAndMobParameters = NULLP;
7138 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7139 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7140 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7141 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7142 ueNrCap.featureSets = NULLP;
7144 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7145 if(!ueNrCap.featureSets)
7147 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7152 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7154 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7159 ueNrCap.featureSetCombinations = NULLP;
7160 ueNrCap.lateNonCriticalExtension = NULLP;
7161 ueNrCap.nonCriticalExtension = NULLP;
7163 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7164 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7165 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7167 encRetVal = uper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7169 /* Encode results */
7170 if(encRetVal.encoded == ENCODE_FAIL)
7172 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7173 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7178 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7179 for(int i=0; i< encBufSize; i++)
7181 DU_LOG("%x",encBuf[i]);
7185 ueCapRatContBuf->size = encBufSize;
7186 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7187 if(!ueCapRatContBuf->buf)
7189 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7192 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7196 freeUeCapRatCont(&ueNrCap);
7200 /*******************************************************************
7202 * @brief Fill UE Capability RAT container list
7206 * Function : fillUeCapRatContList
7208 * Functionality: Fill UE Capability RAT container list
7211 * @params[in] UE capability RAT container list
7212 * @return ROK - success
7215 * ****************************************************************/
7216 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7218 uint8_t ret = RFAILED;
7219 uint8_t idx, elementCnt;
7224 ueCapablityList->list.count = elementCnt;
7225 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7227 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7228 if(!ueCapablityList->list.array)
7230 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7235 for(idx=0; idx<elementCnt; idx++)
7237 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7238 if(ueCapablityList->list.array[idx] == NULLP)
7240 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7246 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7247 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7249 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7260 /*******************************************************************
7262 * @brief Fill UE Capability RAT container list octet string
7266 * Function : fillUeCapRatContListBuf
7268 * Functionality: Fill UE Capability RAT container list octet string
7271 * @params[in] UE capability RAT container list buffer
7272 * @return ROK - success
7275 * ****************************************************************/
7276 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7278 uint8_t ret = RFAILED;
7279 asn_enc_rval_t encRetVal;
7280 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7284 ret = fillUeCapRatContList(&ueCapablityList);
7287 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7291 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7292 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7293 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7295 encRetVal = uper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7296 &ueCapablityList, PrepFinalEncBuf, encBuf);
7298 /* Encode results */
7299 if(encRetVal.encoded == ENCODE_FAIL)
7301 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7302 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7307 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7308 for(int i=0; i< encBufSize; i++)
7310 DU_LOG("%x",encBuf[i]);
7314 ueCapablityListBuf->size = encBufSize;
7315 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7316 if(!ueCapablityListBuf->buf)
7318 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7321 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7325 freeUeCapRatContList(&ueCapablityList);
7329 /*******************************************************************
7331 * @brief Free Measurement Timing Configuration
7335 * Function : freeMeasuementTimingConfig
7337 * Functionality: Free Measurement Timing Configuration
7339 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7342 * ****************************************************************/
7343 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7346 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7347 MeasTiming_t *measTiming = NULLP;
7349 if(measTimingConfig.criticalExtensions.choice.c1)
7351 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7353 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7354 if(measTimingCfg->measTiming)
7356 if(measTimingCfg->measTiming->list.array)
7358 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7360 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7361 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7362 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7364 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7366 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7368 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7370 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7374 /*******************************************************************
7376 * @brief Fill Measurement Timing Configuration
7380 * Function : fillMeasTimingCfg
7382 * Functionality: Fill Measurement Timing Configuration
7384 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7385 * @return ROK - success
7388 * ****************************************************************/
7389 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7391 uint8_t elementCnt = 0;
7392 uint8_t measCfgIdx = 0;
7393 MeasTiming_t *measTiming;
7396 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7397 if(!measTimingCfg->measTiming)
7399 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7404 measTimingCfg->measTiming->list.count = elementCnt;
7405 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7406 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7407 if(!measTimingCfg->measTiming->list.array)
7409 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7413 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7415 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7416 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7418 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7424 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7425 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7426 if(!measTiming->frequencyAndTiming)
7428 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7432 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7433 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7435 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7436 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7437 smtc->periodicityAndOffset.choice.sf20 = 0;
7438 smtc->duration = SSB_MTC__duration_sf1;
7442 /*******************************************************************
7444 * @brief Fill Measurement Timing Configuration Octet string
7448 * Function : fillMeasConfigBuf
7450 * Functionality: Fill Measurement Timing Configuration Octet string
7453 * @params[in] MeasConfig_t *measConfgBuf
7454 * @return ROK - success
7457 * ****************************************************************/
7458 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7460 uint8_t ret = RFAILED;
7461 asn_enc_rval_t encRetVal;
7462 MeasurementTimingConfigurationRrc_t measTimingConfig;
7466 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7467 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7468 if(!measTimingConfig.criticalExtensions.choice.c1)
7470 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7473 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7475 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7476 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7478 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7482 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7485 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7489 /* Encode measurement timing configuration into octet string */
7490 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7491 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7493 encRetVal = uper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7495 /* Encode results */
7496 if(encRetVal.encoded == ENCODE_FAIL)
7498 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7499 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7504 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7505 for(int i=0; i< encBufSize; i++)
7507 DU_LOG("%x",encBuf[i]);
7511 measTimingConfigBuf->size = encBufSize;
7512 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7513 if(!measTimingConfigBuf->buf)
7515 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7518 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7522 freeMeasuementTimingConfig(measTimingConfig);
7526 /******************************************************************
7528 * @brief Free RRC reconfiguration non-critical extension
7532 * Function : freeRrcReconfigNonCriticalExt
7534 * Functionality: Free RRC reconfiguration non-critical extension
7536 * @params[in] RRC reconfiguration IE
7539 * ****************************************************************/
7540 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7542 if(rrcRecfg->masterCellGroup)
7544 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7548 /******************************************************************
7550 * @brief Free measurement object addmod list
7554 * Function : freeMeasObjToAddModList
7556 * Functionality: Free measurement object add mod list
7558 * @params[in] Measurement object add/mod list
7561 * ****************************************************************/
7562 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7565 MeasObjectNR_t *measObject;
7567 if(measObjList->list.array)
7569 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7571 if(measObjList->list.array[objIdx])
7573 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7575 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7576 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7577 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7578 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7579 if(measObject->absThreshSS_BlocksConsolidation)
7581 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7582 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7583 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7584 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7586 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7587 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7588 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7589 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7590 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7592 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7595 CU_FREE(measObjList->list.array, measObjList->list.size);
7599 /******************************************************************
7601 * @brief Free report config add mod list
7605 * Function : freeReportCfgToAddModList
7607 * Functionality: Free report config add mod list
7609 * @params[in] Report config list
7612 * ****************************************************************/
7613 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7615 uint8_t reportCfgIdx;
7616 ReportConfigToAddMod_t *reportCfg;
7617 ReportConfigNR_t *reportCfgNr;
7618 EventTriggerConfig_t *eventTriggCfg;
7620 if(reportCfgList->list.array)
7622 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7624 if(reportCfgList->list.array[reportCfgIdx])
7626 reportCfg = reportCfgList->list.array[reportCfgIdx];
7627 if(reportCfg->reportConfig.choice.reportConfigNR)
7629 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7630 if(reportCfgNr->reportType.choice.eventTriggered)
7632 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7633 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7634 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7635 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7636 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7640 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7642 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7646 /******************************************************************
7648 * @brief Free measurement id to add mod list
7652 * Function : freeMeasIdToAddModList
7654 * Functionality: Free measurement id to add mod list
7656 * @params[in] Measurement id to add mod list
7659 * ****************************************************************/
7660 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7663 if(measIdList->list.array)
7665 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7667 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7669 CU_FREE(measIdList->list.array, measIdList->list.size);
7673 /*******************************************************************
7675 * @brief Free quantity config
7679 * Function : freeQunatityConfig
7681 * Functionality: Free quantity config
7683 * @params[in] Quantity Config
7686 * ****************************************************************/
7687 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7690 QuantityConfigNR_t *quantityCfgNr;
7692 if(quantityCfg->quantityConfigNR_List)
7694 if(quantityCfg->quantityConfigNR_List->list.array)
7696 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7698 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7700 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7701 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7702 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7703 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7704 if(quantityCfgNr->quantityConfigRS_Index)
7706 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7707 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7708 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7709 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7711 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7714 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7716 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7720 /******************************************************************
7722 * @brief Free measurement Config
7726 * Function : freeMeasConfig
7728 * Functionality: Free measurement config
7730 * @params[in] Measurement config
7733 * ****************************************************************/
7734 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7736 if(measConfig->measObjectToAddModList)
7738 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7739 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7741 if(measConfig->reportConfigToAddModList)
7743 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7744 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7746 if(measConfig->measIdToAddModList)
7748 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7749 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7751 if(measConfig->s_MeasureConfig)
7753 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7755 if(measConfig->quantityConfig)
7757 freeQuantityConfig(measConfig->quantityConfig);
7758 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7761 /******************************************************************
7763 * @brief Free DRB to AddMod List
7767 * Function : freeDrbToAddModList
7769 * Functionality: Free SRB to AddMod List
7771 * @params[in] SBR to add/mod list
7774 * ****************************************************************/
7775 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7778 if(drbToAddList->list.array)
7780 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7782 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7784 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7786 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7787 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7788 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7789 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7791 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7792 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7794 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7796 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7800 /******************************************************************
7802 * @brief Free SRB to AddMod List
7806 * Function : freeSrbToAddModList
7808 * Functionality: Free SRB to AddMod List
7810 * @params[in] SBR to add/mod list
7813 * ****************************************************************/
7814 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7817 if(srbToAddList->list.array)
7819 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7821 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7822 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7824 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7825 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7828 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7830 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7834 /******************************************************************
7836 * @brief Free Radio Bearer Config
7840 * Function : freeRadioBearerConfig
7842 * Functionality: Free Radio Bearer config
7844 * @params[in] Radio bearer config
7847 * ****************************************************************/
7848 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7850 if(radioBearerConfig->srb_ToAddModList)
7852 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7853 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7855 if(radioBearerConfig->drb_ToAddModList)
7857 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7858 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7862 /******************************************************************
7864 * @brief Free reconfiguration message
7868 * Function : freeRrcReconfig
7870 * Functionality: Free reconfiguration message
7872 * @params[in] RRC Reconfiguration message
7875 * ****************************************************************/
7876 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7878 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7880 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7882 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7883 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7885 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7887 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7888 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7890 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7892 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7893 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7895 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7899 /******************************************************************
7901 * @brief Fill SRB To Add Mod list
7905 * Function : fillSrbToAddModList
7907 * Functionality: fill SRB to Add Mod list
7909 * @params[in] UE control block
7910 * SRB to Add/Mod list
7911 * @return ROK - success
7914 * ****************************************************************/
7915 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7917 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7920 elementCnt = ueCb->numSrb;
7923 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7925 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7932 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7936 srbToAddList->list.count = elementCnt;
7937 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7939 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7940 if(!srbToAddList->list.array)
7942 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7947 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7949 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7952 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7953 if(!srbToAddList->list.array[srbIdx])
7955 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7959 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7961 /* Reestablish PDCP */
7962 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7963 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7965 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7968 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7970 /* PDCP configuration */
7971 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7972 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7974 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7978 /* Reordering timer */
7979 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7980 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7982 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7985 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7992 /******************************************************************
7994 * @biief Fill DRBeTo Add Mod list
7998 * Function : fillDrbToAddModList
8000 * Functionality: fill DRB to Add Mod list
8002 * @params[in] UE control block
8003 * DRB to Add/Mod list
8004 * @return ROK - success
8007 * ****************************************************************/
8008 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
8010 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
8013 elementCnt = ueCb->numDrb;
8016 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8018 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
8025 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
8030 drbToAddList->list.count = elementCnt;
8031 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
8033 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
8034 if(!drbToAddList->list.array)
8036 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
8041 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8043 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
8046 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
8047 if(!drbToAddList->list.array[drbIdx])
8049 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
8054 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
8057 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
8058 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
8060 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
8064 /* PDCP Config -> DRB */
8065 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
8066 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
8068 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8072 /* DRB -> Discard Timer */
8073 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8074 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8076 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8079 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8081 /* UL PDCP SN length */
8082 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8083 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8085 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8088 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8090 /* DL PDCP SN length */
8091 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8092 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8094 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8097 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8099 /* Header Compression */
8100 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8101 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8103 /* Reordering timer */
8104 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8105 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8107 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8110 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8118 /******************************************************************
8120 * @brief Fill Radio bearer configuration
8124 * Function : fillRadioBearerConfig
8126 * Functionality: Fill Radio bearer configuration
8128 * @params[in] UE control block
8129 * Radio bearer config pointer
8130 * @return ROK - success
8133 * ****************************************************************/
8134 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8136 /* SRB To Add/Mod List */
8137 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8138 if(!radioBearerConfig->srb_ToAddModList)
8140 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8143 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8145 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8149 /* DRB To Add/Mod List */
8150 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8151 if(!radioBearerConfig->drb_ToAddModList)
8153 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8156 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8158 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8165 /*******************************************************************
8167 * @brief Fill measurement object to add/mod list
8171 * Function : fillMeasObjToAddModList
8173 * Functionality: Fill measurement object to add/mod list
8175 * @params[in] Measurement object to add/mod list
8176 * @return ROK - success
8179 * ****************************************************************/
8180 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8182 uint8_t elementCnt, objIdx;
8183 MeasObjectNR_t *measObject;
8186 measObjList->list.count = elementCnt;
8187 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8189 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8190 if(!measObjList->list.array)
8192 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8196 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8198 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8199 if(!measObjList->list.array[objIdx])
8201 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8207 measObjList->list.array[objIdx]->measObjectId = 1;
8208 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8209 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8210 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8212 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8216 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8219 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8220 if(!measObject->ssbFrequency)
8222 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8225 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8227 /* Subcarrier spacing */
8228 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8229 if(!measObject->ssbSubcarrierSpacing)
8231 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8234 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8237 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8238 if(!measObject->smtc1)
8240 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8243 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8244 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8245 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8247 /* Absoulute threshold SSB consolidation */
8248 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8249 if(!measObject->absThreshSS_BlocksConsolidation)
8251 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8255 /* RSRP threshold */
8256 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8257 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8259 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8262 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8264 /* RSRQ threshold */
8265 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8266 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8268 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8271 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8273 /* SINR threshold */
8274 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8275 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8277 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8280 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8282 /* Number of SSBs to average */
8283 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8284 if(!measObject->nrofSS_BlocksToAverage)
8286 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8289 *(measObject->nrofSS_BlocksToAverage) = 2;
8291 /* Quantity Config index */
8292 measObject->quantityConfigIndex = 1;
8295 /* RSRP offset for SSB */
8296 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8297 if(!measObject->offsetMO.rsrpOffsetSSB)
8299 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8302 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8304 /* RSRQ offset for SSB */
8305 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8306 if(!measObject->offsetMO.rsrqOffsetSSB)
8308 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8311 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8313 /* SINR offset for SSB */
8314 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8315 if(!measObject->offsetMO.sinrOffsetSSB)
8317 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8320 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8325 /*******************************************************************
8327 * @brief Fill Report configuration to Add/mod list
8331 * Function : fillReportCfgToAddModList
8333 * Functionality: Fill Report configuration to Add/mod list
8335 * @params[in] Report Config To Add/Mod List
8336 * @return ROK - success
8339 * ****************************************************************/
8340 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8343 uint8_t reportCfgIdx;
8344 ReportConfigToAddMod_t *reportCfg;
8345 ReportConfigNR_t *reportCfgNr;
8346 EventTriggerConfig_t *eventTriggCfg;
8349 reportCfgList->list.count = elementCnt;
8350 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8352 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8353 if(!reportCfgList->list.array)
8355 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8359 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8361 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8362 if(!reportCfgList->list.array[reportCfgIdx])
8364 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8370 reportCfg = reportCfgList->list.array[reportCfgIdx];
8371 reportCfg->reportConfigId = 1;
8372 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8374 /* Report Configuration for NR */
8375 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8376 if(!reportCfg->reportConfig.choice.reportConfigNR)
8378 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8381 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8384 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8385 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8386 if(!reportCfgNr->reportType.choice.eventTriggered)
8388 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8391 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8394 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8395 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8396 if(!eventTriggCfg->eventId.choice.eventA3)
8398 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8402 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8403 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8404 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8405 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8406 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8407 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8409 /* Reference Signal Type */
8410 eventTriggCfg->rsType = NR_RS_Type_ssb;
8412 /* Report Interval */
8413 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8416 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8418 /* Report Quantity cell */
8419 eventTriggCfg->reportQuantityCell.rsrp = true;
8420 eventTriggCfg->reportQuantityCell.rsrq = false;
8421 eventTriggCfg->reportQuantityCell.sinr = false;
8423 /* Maximum reported cells */
8424 eventTriggCfg->maxReportCells = 3;
8426 /* Report qunatity RS Indexes */
8427 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8428 if(!eventTriggCfg->reportQuantityRS_Indexes)
8430 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8433 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8434 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8435 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8437 /* Maximum number of RS indexes to report */
8438 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8439 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8441 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8444 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8446 /* Include Beam measurement */
8447 eventTriggCfg->includeBeamMeasurements = false;
8452 /*******************************************************************
8454 * @brief Fill measurement Id to add/mod list
8458 * Function : fillMeasIdToAddModList
8460 * Functionality: Fill measurement Id to add/mod list
8462 * @params[in] Measurement Id to add/mod list
8463 * @return ROK - success
8466 * ****************************************************************/
8467 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8473 measIdList->list.count = elementCnt;
8474 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8476 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8477 if(!measIdList->list.array)
8482 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8484 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8485 if(!measIdList->list.array[measIdIdx])
8491 measIdList->list.array[measIdIdx]->measId = 1;
8492 measIdList->list.array[measIdIdx]->measObjectId = 1;
8493 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8498 /*******************************************************************
8500 * @brief Fill s-measurement configuration
8504 * Function : fillSMeasConfig
8506 * Functionality: Fill s-measurement configuration
8508 * @params[in] s-Measurement config
8509 * @return ROK - success
8512 * ****************************************************************/
8513 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8515 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8516 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8521 /*******************************************************************
8523 * @brief Fill quantity config
8527 * Function : fillQunatityConfig
8529 * Functionality: Fill quantity config
8531 * @params[in] Quantity Config
8532 * @return ROK - success
8535 * ****************************************************************/
8536 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8538 uint8_t elementCnt = 0;
8539 uint8_t quanCfgIdx = 0;
8540 QuantityConfigNR_t *quantityCfgNr;
8542 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8543 if(!quantityCfg->quantityConfigNR_List)
8549 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8550 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8552 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8553 if(!quantityCfg->quantityConfigNR_List->list.array)
8558 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8560 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8561 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8568 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8570 /* Quantity Config of Reference signal */
8571 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8572 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8576 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8578 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8579 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8583 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8585 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8586 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8590 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8592 /* Quantity Config RS index */
8593 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8594 if(!quantityCfgNr->quantityConfigRS_Index)
8599 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8600 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8604 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8606 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8607 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8611 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8613 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8614 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8618 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8623 /*******************************************************************
8625 * @brief Fill measurement configuration
8629 * Function : fillMeasConfig
8631 * Functionality: Fill measurement configuration
8633 * @params[in] Measurement config
8634 * @return ROK - success
8637 * ****************************************************************/
8638 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8640 /* Measurement object to add/mod list */
8641 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8642 if(!measConfig->measObjectToAddModList)
8644 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8647 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8649 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8653 /* Report Config To add/mod list */
8654 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8655 if(!measConfig->reportConfigToAddModList)
8657 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8660 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8662 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8666 /* Measurement Id to add/mod list */
8667 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8668 if(!measConfig->measIdToAddModList)
8670 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8673 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8675 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8679 /* S-Measurement config */
8680 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8681 if(!measConfig->s_MeasureConfig)
8683 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8686 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8688 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8692 /* Qunatity Config */
8693 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8694 if(!measConfig->quantityConfig)
8696 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8699 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8701 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8708 /*******************************************************************
8710 * @brief Fill RRC reconfiguration non-critical extension IE
8714 * Function : fillRrcReconfigNonCriticalExt
8716 * Functionality: Fill RRC reconfiguration non-critical extension
8718 * @params[in] RRC Reconfig Non-critical extension
8719 * @return ROK - success
8722 * ****************************************************************/
8723 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8725 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8726 if(!rrcRecfg->masterCellGroup)
8728 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8732 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8733 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8734 if(!rrcRecfg->masterCellGroup->buf)
8736 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8739 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8742 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8743 * received from DU */
8744 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8746 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8754 /*******************************************************************
8756 * @brief Fill RRC reconfiguration structure
8760 * Function : fillRrcReconfig
8762 * Functionality: Fill RRC reconfiguration
8766 * RRC reconfiguration structure
8767 * @return ROK - success
8770 * ****************************************************************/
8771 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8773 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8775 rrcReconfig->rrc_TransactionIdentifier = 1;
8776 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8778 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8779 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8781 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8785 /* Radio Bearer Configuration */
8786 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8787 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8789 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8792 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8794 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8798 /* Measurement Configuration */
8799 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8800 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8802 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8805 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8807 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8811 /* Non Critical extension */
8812 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8813 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8815 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8818 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8820 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8826 /*******************************************************************
8828 * @brief Fill RRC reconfiguration Octet string
8832 * Function : fillRrcReconfigBuf
8834 * Functionality: Fill RRC reconfiguration octet string
8837 * @params[in] OCTET_STRING_t buffer
8838 * @return ROK - success
8841 * ****************************************************************/
8842 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8844 uint8_t ret = RFAILED;
8845 asn_enc_rval_t encRetVal;
8846 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8847 rrcReconfig = &rrcRecfg;
8851 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8853 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8857 /* Encode RRC Reconfiguration */
8858 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8859 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8861 encRetVal = uper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8863 /* Encode results */
8864 if(encRetVal.encoded == ENCODE_FAIL)
8866 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8867 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8872 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8873 for(int i=0; i< encBufSize; i++)
8875 DU_LOG("%x",encBuf[i]);
8879 rrcReconfigBuf->size = encBufSize;
8880 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8881 if(!rrcReconfigBuf->buf)
8883 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8886 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8891 freeRrcReconfig(rrcReconfig);
8895 /*******************************************************************
8897 * @brief Fill HO preparation information Octet string
8901 * Function : fillHOPreparationInfoBuf
8903 * Functionality: Fill HO preparation information Octet string
8906 * @params[in] HandoverPreparationInformation_t buffer
8907 * @return ROK - success
8910 * ****************************************************************/
8911 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8913 uint8_t ret = RFAILED;
8914 asn_enc_rval_t encRetVal;
8915 HandoverPreparationInformationRrc_t hoPrepInfo;
8916 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8921 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8922 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8923 if(!hoPrepInfo.criticalExtensions.choice.c1)
8925 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8928 hoPrepInfo.criticalExtensions.choice.c1->present = \
8929 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8931 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8932 sizeof(HandoverPreparationInformationRrc_IEs_t));
8933 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8935 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8938 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8940 /* Fill UE Capability RAT container list */
8941 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8944 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8948 /* Fill Source config */
8949 hoPrepInfoIe->sourceConfig = NULLP;
8950 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8951 if(!hoPrepInfoIe->sourceConfig)
8953 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8956 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8960 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8964 hoPrepInfoIe->rrm_Config = NULLP;
8965 hoPrepInfoIe->as_Context = NULLP;
8966 hoPrepInfoIe->nonCriticalExtension = NULLP;
8968 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8969 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8970 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8972 encRetVal = uper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8973 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8975 /* Encode results */
8976 if(encRetVal.encoded == ENCODE_FAIL)
8978 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8979 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8984 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8985 for(int i=0; i< encBufSize; i++)
8987 DU_LOG("%x",encBuf[i]);
8991 hoPrepInfoBuf->size = encBufSize;
8992 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8993 if(!hoPrepInfoBuf->buf)
8995 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8998 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
9002 freeHOPreparationInfo(&hoPrepInfo);
9006 /*******************************************************************
9008 * @brief Fills CuToDuContainer
9012 * Function : fillCuToDuContainer
9014 * Functionality: Fills CuToDuContainer
9016 * @params[in] pointer to CUtoDURRCInformation_t
9018 * @return ROK - success
9021 ******************************************************************/
9023 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
9025 uint8_t elementCnt = 0;
9029 if((ueCb->state != UE_HANDOVER_IN_PROGRESS) || ((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Inter_DU_HO)))
9031 /* UE Capabulity RAT Container List */
9032 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9033 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
9035 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
9038 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
9043 /* Commenting this because:
9044 * CUToDURRCInformation->MeasConfig contains measurement gap configurations.
9045 * Howeever measurement gap is not supported in our code. Measurement Gap will
9046 * be required if we want to support inter-RAT handover or handover to
9047 * neighbouring cells operating on a different frequency than serving cell.
9049 * In case we plan to use this IE in future, following fixes are required:
9050 * As of now, we are filling MeasurementTimingConfigurationRrc_t into rrcMsg->measConfig.
9051 * This is incorrect. We must fill MeasConfigRrc_t in rrcMsg->measConfig.
9052 * MeasurementTimingConfigurationRrc_t should be filled in
9053 * rrcMsg->iE_Extensions->MeasurementTimingConfiguration, if required.
9056 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
9057 if(!rrcMsg->measConfig)
9059 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
9062 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
9065 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9068 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9069 if(rrcMsg->iE_Extensions)
9072 rrcMsg->iE_Extensions->list.count = elementCnt;
9073 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9075 /* Initialize the CUtoDURRCInformation_ExtIEs */
9076 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9078 if(rrcMsg->iE_Extensions->list.array == NULLP)
9080 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9084 for(idx=0; idx<elementCnt; idx++)
9086 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9087 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9089 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9096 /* Cell Group Configuration */
9097 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9098 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9099 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9100 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9101 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9104 /* Handover Preparation Information */
9105 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9106 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9107 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9108 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9109 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9114 /*******************************************************************
9116 * @brief Build the drx cycle
9120 * Function : BuildDrxCycle
9122 * Functionality: Build drx cycle IE
9124 * @params[in] pointer to DRXCycle_t
9126 * @return ROK - success
9129 ******************************************************************/
9130 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9132 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms80;
9133 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9134 if(!drxCycle->shortDRXCycleLength)
9136 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9139 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9141 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9142 if(!drxCycle->shortDRXCycleTimer)
9144 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9147 *(drxCycle->shortDRXCycleTimer) = 4;
9150 /*******************************************************************
9152 * @brief Free CuToDuContainer
9156 * Function : FreeCuToDuInfo
9158 * Functionality: Free CuToDuContainer
9160 * @params[in] pointer to CUtoDURRCInformation_t
9162 * @return ROK - success
9165 ******************************************************************/
9167 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9171 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9173 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9174 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9175 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9177 if(rrcMsg->iE_Extensions)
9179 if(rrcMsg->iE_Extensions->list.array)
9181 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9183 if(rrcMsg->iE_Extensions->list.array[idx])
9185 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9187 case ProtocolIE_ID_id_CellGroupConfig:
9188 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9190 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9191 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9196 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9197 rrcMsg->iE_Extensions->list.array[idx]->id);
9203 for(idx2 = 0; idx2 < idx; idx2++)
9205 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9207 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9211 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9214 /*******************************************************************
9216 * @brief Builds and sends the UE Setup Request
9220 * Function : BuildAndSendUeContextSetupReq
9222 * Functionality: Constructs the UE Setup Request and sends
9223 * it to the CU through SCTP.
9227 * @return ROK - success
9230 * ****************************************************************/
9231 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9233 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9234 uint8_t ret= RFAILED, ret1;
9236 uint8_t idx, idx1, bufLen, duIdx;
9238 uint32_t targetDuId;
9239 DuDb *targetDuDb = NULLP;
9240 F1AP_PDU_t *f1apMsg = NULLP;
9241 UEContextSetupRequest_t *ueSetReq = NULLP;
9242 asn_enc_rval_t encRetVal; /* Encoder return value */
9243 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9247 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9249 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9250 if(f1apMsg == NULLP)
9252 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9256 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9257 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9258 if(f1apMsg->choice.initiatingMessage == NULLP)
9260 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9264 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9265 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9266 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9268 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9270 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9280 ueSetReq->protocolIEs.list.count = elementCnt;
9281 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9283 /* Initialize the UESetup members */
9284 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9286 if(ueSetReq->protocolIEs.list.array == NULLP)
9288 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9292 for(idx1=0; idx1<elementCnt; idx1++)
9294 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9295 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9303 /*GNB CU UE F1AP ID*/
9304 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9305 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9306 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9307 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9309 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9311 /*GNB DU UE F1AP ID*/
9313 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9314 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9315 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9316 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9321 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9322 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9323 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9325 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9326 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9328 if(ueCb->hoInfo.HOType == Inter_DU_HO)
9329 targetDuId = ueCb->hoInfo.tgtNodeId;
9333 SEARCH_DU_DB(duIdx, targetDuId, targetDuDb);
9334 /* Since we are supporting only one cell per DU, accessing 0th index to
9335 * get target cell info */
9336 spCellId = targetDuDb->cellCb[0].nrCellId;
9339 spCellId = ueCb->cellCb->nrCellId;
9341 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9347 /*Served Cell Index*/
9349 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9350 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9351 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9352 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9354 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9356 /*CellULConfigured*/
9358 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9359 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9360 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9361 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9364 /*CUtoDURRCContainer*/
9366 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9367 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9368 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9369 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9374 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9379 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9380 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9381 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9382 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9384 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9388 /*Special Cells to be SetupList*/
9390 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9391 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9392 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9393 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9394 if(SplCellListret != ROK)
9400 /*SRBs To Be Setup List*/
9402 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9403 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9404 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9405 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9406 if(SrbSetupret != ROK)
9411 /*DRBs to Be Setup List*/
9413 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9414 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9415 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9416 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9422 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9424 /* RRC delivery status request */
9426 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9427 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9428 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9429 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9432 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9434 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9435 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9436 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9438 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9440 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9441 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9442 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9443 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9445 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9448 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9449 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9451 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9453 /* Encode the F1SetupRequest type as APER */
9454 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9456 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9458 /* Encode results */
9459 if(encRetVal.encoded == ENCODE_FAIL)
9461 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9462 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9467 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9468 for(int i=0; i< encBufSize; i++)
9470 DU_LOG("%x",encBuf[i]);
9475 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9477 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9483 FreeUeContextSetupReq(f1apMsg);
9486 }/* End of BuildAndSendUeContextSetupReq*/
9488 /**********************************************************************
9489 * @brief Function to extractTeId received in UE context setup Response
9493 * Function : extractTeId
9496 * - Function to extract TeId
9499 * @return ROK - success
9502 **********************************************************************/
9503 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9507 GTPTunnel_t *gtpDl = NULLP;
9509 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9511 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9513 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9515 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9516 if(gtpDl->gTP_TEID.size > 0)
9518 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9521 DU_LOG("\nERROR --> EGTP: No TeId received");
9529 /****************************************************************
9530 * @brief Function to add Drb tunnels
9534 * Function : addDrbTunnels
9537 * - Function to add Drb tunnels
9540 * @return ROK - success
9543 * ****************************************************************/
9544 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9549 if(teId > MAX_TEID || teId < MIN_TEID)
9551 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9553 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9554 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9555 tnlEvt.lclTeid = teId;
9556 tnlEvt.remTeid = teId;
9557 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9560 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9565 /****************************************************************
9566 * @brief Function to process Drb Setup List
9570 * Function : procDrbSetupList
9573 * - Function to process DRB Setup List
9576 * @return ROK - success
9579 * ****************************************************************/
9580 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9582 uint8_t arrIdx = 0, drbIdx = 0;
9584 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9586 if(drbSetupList != NULLP)
9588 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9590 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9591 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9593 /* extracting teId */
9594 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9597 if(addDrbTunnels(duId, teId)== ROK)
9599 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9601 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9602 * are sent to CU for setting up of Tunnels in DL direction.
9603 * Search for DRB ID in CU databse */
9604 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9606 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9608 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9621 /****************************************************************
9622 * @brief Function to process Ue Context Setup Response
9626 * Function : procUeContextSetupResponse
9629 * - Function to process Ue Context Setup Response
9632 * @return ROK - success
9635 * ****************************************************************/
9636 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *recvBuf, MsgLen recvBufLen)
9638 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9639 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9641 CuUeCb *ueCb = NULLP;
9642 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9643 OCTET_STRING_t *duToCuRrcContainer;
9645 SEARCH_DU_DB(duIdx, duId, duDb);
9646 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9648 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9650 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9652 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9654 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9657 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9659 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9660 ueCb = &duDb->ueCb[duUeF1apId-1];
9661 /* If ue context is not present in du db, then create UE context
9662 * here. This flow is hit in case of UE handover where UE
9663 * context is created before UE performs RACH on target DU */
9664 if(ueCb->gnbDuUeF1apId == 0)
9666 /* Creating UE context in target DU */
9667 memset(ueCb, 0, sizeof(CuUeCb));
9669 /* Check if UE is under Inter-CU handover */
9670 if(duDb->tempUeCtxtInHo && (duDb->tempUeCtxtInHo->gnbCuUeF1apId == cuUeF1apId))
9672 memcpy(ueCb, duDb->tempUeCtxtInHo, sizeof(CuUeCb));
9673 ueCb->gnbDuUeF1apId = duUeF1apId;
9674 CU_FREE(duDb->tempUeCtxtInHo, sizeof(CuUeCb));
9678 /* In case of Inter DU Handover */
9679 ueCb->cellCb = &duDb->cellCb[0];
9680 ueCb->gnbDuUeF1apId = duUeF1apId;
9681 ueCb->gnbCuUeF1apId = cuUeF1apId;
9682 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9683 ueCb->hoInfo.HOType = Inter_DU_HO;
9684 ueCb->hoInfo.tgtNodeId = duId;
9688 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9689 ueCb->cellCb->numUe++;
9693 case ProtocolIE_ID_id_C_RNTI:
9695 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9698 case ProtocolIE_ID_id_DRBs_Setup_List:
9700 /* Adding Tunnels for successful DRB */
9701 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9704 case ProtocolIE_ID_id_DUtoCURRCInformation:
9706 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9707 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9708 DUtoCURRCInformation.cellGroupConfig;
9709 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9710 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9712 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9720 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9722 ueCb->f1apMsgDb.dlRrcMsgCount++;
9723 rrcMsgType = setDlRRCMsgType(ueCb);
9725 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9726 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9728 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9734 if(ueCb->hoInfo.HOType == Inter_DU_HO)
9736 /* If the UE is in Inter-DU handover, UE context modification request is to be sent to
9737 * source DU once UE context setup response is received from target DU */
9739 DuDb *srcDuDb = NULLP;
9740 CuUeCb *ueCbInSrcDu = NULLP;
9742 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9743 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9744 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9746 /* UE context setup response is received from target DU. Search all
9747 * DUs to find source DU except this target DU Id.*/
9748 if(cuCb.duInfo[duIdx].duId != duId)
9750 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9753 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9754 * received in UE context setup response since CU UE F1AP ID does not
9755 * change for UE in handover.
9756 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9758 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9759 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9761 srcDuDb = &cuCb.duInfo[duIdx];
9762 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9764 /* Store source DU info in the new UE context created in
9766 ueCb->hoInfo.srcNodeId = srcDuDb->duId;
9768 /* Copy the received container to UeCb */
9769 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9771 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9773 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9780 if(srcDuDb && ueCbInSrcDu)
9784 else if(ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO)
9786 BuildAndSendHOReqAck(ueCb, duToCuRrcContainer->buf, duToCuRrcContainer->size);
9793 /****************************************************************
9794 * @brief Function to process Ul Rrc Msg received from DU
9798 * Function : procUlRrcMsg
9801 * - Function to process Ul Rrc Msg received from DU
9804 * @return ROK - success
9807 * ****************************************************************/
9809 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9811 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9812 uint8_t *rrcContainer = NULLP;
9813 uint16_t rrcContLen = 0;
9814 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9816 CuUeCb *ueCb = NULLP;
9817 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9820 SEARCH_DU_DB(duIdx, duId, duDb);
9821 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9823 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9825 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9827 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9829 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9832 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9834 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9837 case ProtocolIE_ID_id_SRBID:
9838 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9841 case ProtocolIE_ID_id_RRCContainer:
9843 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9844 CU_ALLOC(rrcContainer, rrcContLen);
9847 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9850 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9852 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9854 if(duDb->ueCb[duUeF1apId-1].hoInfo.HOType == Inter_DU_HO)
9857 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.srcNodeId;
9858 DuDb *srcDuDb = NULLP;
9860 /* Release UE context in source DU because the UE is now
9861 * attached to target DU */
9862 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9863 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9865 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9867 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9870 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9878 BuildAndSendUeContextRelease(&duDb->ueCb[duUeF1apId-1]);
9881 /* In target DU DB, mark UE as active and delete HO info */
9882 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9883 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9890 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9897 ueCb = &duDb->ueCb[duUeF1apId-1];
9898 ueCb->f1apMsgDb.dlRrcMsgCount++;
9899 rrcMsgType = setDlRRCMsgType(ueCb);
9900 if(rrcMsgType == REGISTRATION_COMPLETE)
9902 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9903 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9905 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9907 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9908 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9912 /* In case rrcMsgType is RRC_SETUP_COMPLETE / NAS_AUTHENTICATION_RSP / NAS_SECURITY_MODE_COMPLETE / RRC_SECURITY_MODE_COMPLETE */
9913 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9919 /****************************************************************
9920 * @brief Build And Send F1ResetAck
9924 * Function : FreeF1ResetAck
9927 * - Build And Send F1ResetRSP
9930 * @return ROK - success
9933 * ****************************************************************/
9934 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9937 ResetAcknowledge_t *f1ResetAck;
9941 if(f1apMsg->choice.successfulOutcome)
9943 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9945 if(f1ResetAck->protocolIEs.list.array)
9947 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9949 if(f1ResetAck->protocolIEs.list.array[idx])
9951 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9954 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9956 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9958 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9962 /****************************************************************
9963 * @brief Build And Send F1ResetAck
9967 * Function : BuildAndSendF1ResetAck
9970 * - Build And Send F1ResetRSP
9973 * @return ROK - success
9976 * ****************************************************************/
9978 uint8_t BuildAndSendF1ResetAck()
9981 uint8_t elementCnt = 0;
9982 uint8_t ret = RFAILED;
9983 F1AP_PDU_t *f1apMsg = NULL;
9984 ResetAcknowledge_t *f1ResetAck = NULLP;
9985 asn_enc_rval_t encRetVal;
9986 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9989 /* Allocate the memory for F1ResetRequest_t */
9990 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9991 if(f1apMsg == NULLP)
9993 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9997 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9999 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10000 if(f1apMsg->choice.successfulOutcome == NULLP)
10002 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
10006 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
10007 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
10008 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
10009 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10013 f1ResetAck->protocolIEs.list.count = elementCnt;
10014 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
10016 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10017 if(f1ResetAck->protocolIEs.list.array == NULLP)
10019 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
10023 for(idx=0; idx<elementCnt; idx++)
10025 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10026 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
10033 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10034 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10035 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
10036 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
10038 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10040 /* Encode the F1SetupRequest type as UPER */
10041 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10043 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10045 /* Check encode results */
10046 if(encRetVal.encoded == ENCODE_FAIL)
10048 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
10049 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10054 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
10055 for(int i=0; i< encBufSize; i++)
10057 DU_LOG("%x",encBuf[i]);
10062 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10063 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
10065 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
10073 FreeF1ResetAck(f1apMsg);
10077 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
10081 if(ulInfo->list.array)
10083 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
10085 if(ulInfo->list.array[arrIdx])
10087 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
10089 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
10091 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
10093 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10094 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10095 gTPTunnel->gTP_TEID.size);
10097 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10098 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10099 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10101 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10102 sizeof(GTPTunnel_t));
10104 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10107 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10111 /*******************************************************************
10113 * @brief Deletes the EGTP tunnel
10117 * Function : deleteEgtpTunnel
10119 * Functionality: Deletes the EGTP tunnel
10121 * @params[in] uint8_t *buf
10123 * @return ROK - success
10124 * RFAILED - failure
10126 * ****************************************************************/
10127 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10132 teIdStringToInt(buf, &teId);
10133 if(teId > MAX_TEID || teId < MIN_TEID)
10135 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10138 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10139 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10140 tnlEvt.lclTeid = teId;
10141 tnlEvt.remTeid = teId;
10142 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10144 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10149 /*******************************************************************
10151 * @brief Builds the Uplink Tunnel Info
10155 * Function : BuildUlTnlInfoforSetupMod
10157 * Functionality: Constructs the UL TnlInfo For DRB list
10159 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10161 * @return ROK - success
10162 * RFAILED - failure
10164 * ****************************************************************/
10165 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10171 ulInfo->list.count = ulCnt;
10172 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10173 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10174 if(ulInfo->list.array == NULLP)
10176 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10179 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10181 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10182 if(ulInfo->list.array[arrIdx] == NULLP)
10184 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10190 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10191 UPTransportLayerInformation_PR_gTPTunnel;
10194 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10195 sizeof(GTPTunnel_t));
10196 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10198 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10201 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10202 transportLayerAddress.size = 4*sizeof(uint8_t);
10203 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10204 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10205 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10206 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10207 transportLayerAddress.buf == NULLP)
10209 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10213 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10214 transportLayerAddress.buf[0] = 192;
10215 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10216 transportLayerAddress.buf[1] = 168;
10217 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10218 transportLayerAddress.buf[2] = 130;
10219 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10220 transportLayerAddress.buf[3] = 82;
10221 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10222 transportLayerAddress.bits_unused = 0;
10224 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10225 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10226 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10227 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10230 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10231 = 4 * sizeof(uint8_t);
10232 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10233 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10234 gTPTunnel->gTP_TEID.size);
10235 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10238 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10241 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10242 gTP_TEID.buf[0] = 0;
10243 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10244 gTP_TEID.buf[1] = 0;
10245 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10246 gTP_TEID.buf[2] = 0;
10247 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10249 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10250 * fetched based on the Drb Id */
10252 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10253 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10254 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10258 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10259 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10262 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10263 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10264 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10265 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10267 }/*End of BuildULTnlInfo*/
10269 /*******************************************************************
10271 * @brief freeing the DRB item
10275 * Function : FreeDrbItem
10277 * Functionality: freeing the DRB item
10279 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10281 * @return ROK - success
10282 * RFAILED - failure
10284 * ****************************************************************/
10286 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10289 SNSSAI_t *snssai =NULLP;
10290 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10292 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10293 switch(drbItem->qoSInformation.present)
10295 case QoSInformation_PR_NOTHING:
10297 case QoSInformation_PR_eUTRANQoS:
10299 if(drbItem->qoSInformation.choice.eUTRANQoS)
10301 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10305 case QoSInformation_PR_choice_extension:
10307 if(drbItem->qoSInformation.choice.choice_extension)
10309 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10311 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10312 if(snssai->sST.buf)
10314 CU_FREE(snssai->sST.buf,snssai->sST.size);
10318 if(snssai->sD->buf)
10320 CU_FREE(snssai->sD->buf,snssai->sD->size);
10322 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10325 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10326 if(flowMap->list.array)
10328 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10330 if(flowMap->list.array[arrIdx] )
10332 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10333 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10336 CU_FREE(flowMap->list.array,flowMap->list.size);
10339 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10345 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10346 if(drbItem->uLConfiguration)
10348 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10352 /*******************************************************************
10354 * @brief filling the DRB setup Mod item
10358 * Function : FillDrbItemToSetupMod
10360 * Functionality: filling the DRB setup Mod item
10363 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10365 * @return ROK - success
10366 * RFAILED - failure
10368 * ****************************************************************/
10370 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10375 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10376 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10379 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10381 switch(drbItem->qoSInformation.present)
10383 case QoSInformation_PR_NOTHING:
10387 case QoSInformation_PR_eUTRANQoS:
10390 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10391 if(drbItem->qoSInformation.choice.eUTRANQoS)
10393 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10396 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10397 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10398 PriorityLevel_no_priority;
10400 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10401 Pre_emptionCapability_may_trigger_pre_emption;
10403 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10404 Pre_emptionVulnerability_pre_emptable;
10408 case QoSInformation_PR_choice_extension:
10410 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10411 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10413 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10417 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10418 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10419 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10420 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10421 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10424 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10429 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10430 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10433 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10437 /*Flows mapped to DRB List*/
10438 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10439 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10440 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10443 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10449 /*ULUPTNLInformation To Be Setup List*/
10450 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10451 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10454 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10459 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10460 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10466 /*******************************************************************
10468 * @brief Builds the DRB to be Setup Mod ItemIes
10472 * Function : FillDrbItemList
10474 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10476 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10478 * @return ROK - success
10479 * RFAILED - failure
10481 * ****************************************************************/
10483 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10485 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10486 drbItemIe->criticality = Criticality_reject;
10487 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10489 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10491 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10496 /*******************************************************************
10498 * @brief free the DRB to be Setup Mod list
10502 * Function : FreeDrbToBeSetupModList
10504 * Functionality: free the DRB to be Setup Mod list
10506 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10508 * @return ROK - success
10509 * RFAILED - failure
10511 * ****************************************************************/
10512 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10515 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10517 if(drbSet->list.array)
10519 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10521 if(drbSet->list.array[arrIdx] != NULLP)
10525 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10526 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10528 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10531 CU_FREE(drbSet->list.array, drbSet->list.size);
10536 /*******************************************************************
10538 * @brief Builds the DRB to be Setup Mod list
10542 * Function : BuildDrbToBeSetupList
10544 * Functionality: Constructs the DRB to be Setup Mod list
10546 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10548 * @return ROK - success
10549 * RFAILED - failure
10551 * ****************************************************************/
10553 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10559 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10560 drbSet->list.count = drbCnt;
10561 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10562 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10563 if(drbSet->list.array == NULLP)
10565 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10569 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10571 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10572 if(drbSet->list.array[arrIdx] == NULLP)
10574 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10578 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10581 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10588 /*******************************************************************
10590 * @brief Filling the DRB to be modified item
10594 * Function : FillDrbToBeModItem
10596 * Functionality: filling the DRB to be modified item
10598 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10600 * @return ROK - success
10601 * RFAILED - failure
10603 * ****************************************************************/
10605 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10609 DrbInfo *drbToBeMod;
10612 drbItem->dRBID = DRB2 + arrIdx;
10614 /* Search for DRB ID in CU databse */
10615 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10617 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10619 drbToBeMod = &ueCb->drbList[drbIdx];
10625 drbItem->qoSInformation = NULLP;
10626 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10627 if(drbItem->qoSInformation != NULLP)
10629 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10631 switch(drbItem->qoSInformation->present)
10633 case QoSInformation_PR_NOTHING:
10637 case QoSInformation_PR_eUTRANQoS:
10640 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10641 if(drbItem->qoSInformation->choice.eUTRANQoS)
10643 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10646 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10647 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10648 PriorityLevel_no_priority;
10650 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10651 Pre_emptionCapability_may_trigger_pre_emption;
10653 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10654 Pre_emptionVulnerability_pre_emptable;
10658 case QoSInformation_PR_choice_extension:
10660 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10661 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10663 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10667 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10668 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10669 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10670 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10671 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10674 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10679 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10680 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10683 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10687 /*Flows mapped to DRB List*/
10688 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10689 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10690 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10693 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10700 /*ULUPTNLInformation To Be Setup List*/
10701 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10702 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10705 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10711 /*******************************************************************
10713 * @brief Builds the DRB to be modified Item IE
10717 * Function : FillDrbToBeModItemList
10719 * Functionality: Constructs the DRB to be modified Mod Item Ies
10721 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10723 * @return ROK - success
10724 * RFAILED - failure
10726 * ****************************************************************/
10728 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10730 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10731 drbItemIe->criticality = Criticality_reject;
10732 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10733 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10735 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10742 /*******************************************************************
10744 * @brief Builds the DRB to be modified list
10748 * Function : BuildDrbToBeModList
10750 * Functionality: Constructs the DRB to be modified list
10752 * @params[in] DRBs_ToBeModified_List_t *drbSet
10754 * @return ROK - success
10755 * RFAILED - failure
10757 * ****************************************************************/
10759 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10765 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10766 drbSet->list.count = drbCnt;
10767 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10768 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10769 if(drbSet->list.array == NULLP)
10771 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10774 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10776 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10777 if(drbSet->list.array[arrIdx] == NULLP)
10779 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10783 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10786 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10793 /*******************************************************************
10795 * @brief Builds the DRB to be released Item IE
10799 * Function : FillDrbToBeRelItemList
10801 * Functionality: Constructs the DRB to be modified Mod Item Ies
10803 * @params[in] struct DRBs_ToBeReleased_ItemIEs *drbItemIe
10805 * @return ROK - success
10806 * RFAILED - failure
10808 * ****************************************************************/
10810 uint8_t FillDrbToBeRelItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeReleased_ItemIEs *drbItemIe)
10814 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
10815 drbItemIe->criticality = Criticality_reject;
10816 drbItemIe->value.present = DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
10817 drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID = DRB1 + arrIdx;
10819 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10821 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID)
10823 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
10824 CU_FREE(ueCb->drbList[drbIdx].snssai, sizeof(Snssai));
10831 /*******************************************************************
10833 * @brief Builds the DRB to be released list
10837 * Function : BuildDrbToBeReleasedList
10839 * Functionality: Constructs the DRB to be released list
10841 * @params[in] DRBs_ToBeReleased_List_t *drbSet
10843 * @return ROK - success
10844 * RFAILED - failure
10846 * ****************************************************************/
10848 uint8_t BuildDrbToBeReleasedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeReleased_List_t *drbSet)
10854 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10855 drbSet->list.count = drbCnt;
10856 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeReleased_ItemIEs_t *);
10857 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10858 if(drbSet->list.array == NULLP)
10860 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10863 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10865 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
10866 if(drbSet->list.array[arrIdx] == NULLP)
10868 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
10872 ret = FillDrbToBeRelItemList(duId, ueCb, arrIdx, (DRBs_ToBeReleased_ItemIEs_t *)drbSet->list.array[arrIdx]);
10875 DU_LOG("\nERROR --> F1AP : FillDrbToBeRelItemList failed");
10882 /*******************************************************************
10884 * @brief freeing the DRB item
10888 * Function : FreeModifiedDrbItem
10890 * Functionality: freeing the DRB 2 item
10892 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10894 * @return ROK - success
10895 * RFAILED - failure
10897 * ****************************************************************/
10899 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10902 SNSSAI_t *snssai =NULLP;
10903 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10905 if(drbItem->qoSInformation != NULLP)
10907 switch(drbItem->qoSInformation->present)
10909 case QoSInformation_PR_NOTHING:
10911 case QoSInformation_PR_eUTRANQoS:
10913 if(drbItem->qoSInformation->choice.eUTRANQoS)
10915 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10919 case QoSInformation_PR_choice_extension:
10921 if(drbItem->qoSInformation->choice.choice_extension)
10923 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10925 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10926 if(snssai->sST.buf)
10928 CU_FREE(snssai->sST.buf,snssai->sST.size);
10932 if(snssai->sD->buf)
10934 CU_FREE(snssai->sD->buf,snssai->sD->size);
10936 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10939 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10940 if(flowMap->list.array)
10942 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10944 if(flowMap->list.array[arrIdx] )
10946 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10947 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10950 CU_FREE(flowMap->list.array,flowMap->list.size);
10953 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10959 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10960 if(drbItem->uLConfiguration)
10962 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10966 /*******************************************************************
10968 * @brief free the DRB to be modfified list
10972 * Function : FreeDrbToBeModifiedList
10974 * Functionality: free the DRB to be Setup Mod list
10976 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10978 * @return ROK - success
10979 * RFAILED - failure
10981 * ****************************************************************/
10982 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10985 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10987 if(drbSet->list.array)
10989 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10991 if(drbSet->list.array[arrIdx] != NULLP)
10993 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10994 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10995 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10998 CU_FREE(drbSet->list.array, drbSet->list.size);
11003 /*******************************************************************
11005 * @brief free the DRB to be modfified list
11009 * Function : FreeDrbToBeReleasedList
11011 * Functionality: free the DRB to be Release list
11013 * @params[in] FreeDrbToBeReleasedList_t *drbSet
11015 * @return ROK - success
11016 * RFAILED - failure
11018 * ****************************************************************/
11019 void FreeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet)
11022 struct DRBs_ToBeReleased_ItemIEs *drbItemIe;
11024 if(drbSet->list.array)
11026 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
11028 if(drbSet->list.array[arrIdx] != NULLP)
11030 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
11033 CU_FREE(drbSet->list.array, drbSet->list.size);
11037 /*******************************************************************
11039 * @brief free the UeContextModification Request
11043 * Function : FreeUeContextModicationRequest
11045 * Functionality : deallocation of memory allocated in UeContextModiification
11048 * @params[in] F1AP_PDU_t *f1apMsg
11052 * ****************************************************************/
11053 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
11055 uint8_t arrIdx =0 , ieId=0;
11056 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11060 if(f1apMsg->choice.initiatingMessage)
11062 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11063 if(ueContextModifyReq->protocolIEs.list.array)
11065 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
11067 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
11069 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
11072 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11074 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11076 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
11078 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11079 choice.DRBs_ToBeSetupMod_List);
11082 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
11084 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11085 choice.DRBs_ToBeModified_List);
11088 case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
11090 FreeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
11091 choice.DRBs_ToBeReleased_List);
11094 case ProtocolIE_ID_id_TransmissionActionIndicator:
11096 case ProtocolIE_ID_id_RRCContainer:
11098 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
11099 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
11103 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
11106 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11108 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11110 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11114 /*******************************************************************
11116 * @brief Builds the Ue Context Modification Req
11120 * Function : BuildAndSendUeContextModificationReq
11122 * Functionality: Constructs the Ue Context Modification Req
11126 * @return ROK - success
11127 * RFAILED - failure
11129 * ****************************************************************/
11130 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
11133 uint8_t elementCnt = 0;
11134 uint8_t ret = RFAILED;
11135 uint16_t tmpBufIdx = 0, bufIdx = 0;
11136 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
11137 F1AP_PDU_t *f1apMsg = NULLP;
11138 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
11139 RRCContainer_t rrcContainerTmp, *rrcContainer = NULLP;
11140 asn_enc_rval_t encRetVal;
11141 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
11144 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11145 if(f1apMsg == NULLP)
11147 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11151 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11153 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11154 if(f1apMsg->choice.initiatingMessage == NULLP)
11156 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
11159 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
11160 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11161 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
11163 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
11165 if(action == MODIFY_UE)
11167 else if(action == QUERY_CONFIG)
11169 else if(action == RRC_RECONFIG_COMPLETE_IND)
11171 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11173 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11180 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11183 ueContextModifyReq->protocolIEs.list.count = elementCnt;
11184 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
11186 /* Initialize the UE context modification members */
11187 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
11188 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
11190 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11194 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11196 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
11197 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
11199 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
11205 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11206 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11207 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11208 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
11209 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
11212 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11213 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11214 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
11215 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
11216 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
11218 if(action == MODIFY_UE)
11220 /* DRB to be setup list */
11222 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
11223 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11224 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11225 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
11226 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11227 value.choice.DRBs_ToBeSetupMod_List));
11229 /* DRB to be modified list */
11231 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
11232 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11233 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11234 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11235 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11236 value.choice.DRBs_ToBeModified_List));
11240 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11244 /* DRB to be released list */
11246 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeReleased_List;
11247 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11248 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11249 UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
11250 ret = BuildDrbToBeReleasedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11251 value.choice.DRBs_ToBeReleased_List));
11255 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be deleted list");
11259 else if(action == QUERY_CONFIG)
11262 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11263 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11264 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11265 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11266 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11268 else if(action == RRC_RECONFIG_COMPLETE_IND)
11271 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11272 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11273 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11274 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11275 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11276 RRCReconfigurationCompleteIndicator_true;
11278 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11281 if(action == STOP_DATA_TX)
11283 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11284 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11285 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11286 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11287 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11288 TransmissionActionIndicator_stop;
11290 else if (action == RESTART_DATA_TX)
11292 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11293 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11294 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11295 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11296 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11297 TransmissionActionIndicator_restart;
11301 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11302 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11303 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCContainer;
11304 if(fillDlDcchRrcMsg(ueCb, &rrcContainerTmp, true) != ROK)
11306 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11310 rrcContainer = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
11311 rrcContainer->size = rrcContainerTmp.size + 2; /* 2 bytes of PDCP SN */
11312 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
11313 memset(rrcContainer->buf, 0, rrcContainer->size);
11314 rrcContainer->buf[0] = 0x00;
11315 rrcContainer->buf[1] = ueCb->pdcpSn; //PDCP SN
11316 for(bufIdx = 2, tmpBufIdx = 0; bufIdx < rrcContainer->size; bufIdx++, tmpBufIdx++)
11318 rrcContainer->buf[bufIdx] = rrcContainerTmp.buf[tmpBufIdx];
11321 /* RRC delivery status request */
11322 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11325 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11326 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11327 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11328 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11333 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11335 /* DRX Configuration Indicator */
11337 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator;
11338 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11339 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator;
11340 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release;
11341 ueCb->drxCfgPresent = false;
11342 memset(&ueCb->drxCfg, 0, sizeof(DrxCfg));
11346 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11348 /* Encode the F1SetupRequest type as APER */
11349 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11351 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11353 /* Encode results */
11354 if(encRetVal.encoded == ENCODE_FAIL)
11356 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11357 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11362 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11364 /* This for loop was going into an infinite loop even though encBufSize
11365 * has a small value. Hence commented this
11367 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11369 DU_LOG("%x",encBuf[ieIdx]);
11374 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11375 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11377 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11385 FreeUeContextModicationRequest(f1apMsg);
11389 /*****************************************************************i
11391 * @brief Free memory allocated for UE Context Release Command
11395 * Function : FreeUeContextReleaseCommand
11398 * - Free memory allocated for UE Context Release Command
11400 * @params[in] F1AP_PDU_t *f1apMsg
11403 * *************************************************************/
11404 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11407 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11411 if(f1apMsg->choice.initiatingMessage)
11413 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11414 if(ueReleaseCommand->protocolIEs.list.array)
11416 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11418 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11420 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11422 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11424 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11427 /*******************************************************************
11429 * @brief Builds the Ue Context Release Command
11433 * Function : BuildAndSendUeContextReleaseCommand
11435 * Functionality: Constructs the Ue Context Release Command
11439 * @return ROK - success
11440 * RFAILED - failure
11442 * ****************************************************************/
11443 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11445 bool memAllocFailed = false;
11446 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11449 F1AP_PDU_t *f1apMsg = NULLP;
11450 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11452 asn_enc_rval_t encRetVal;
11453 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11457 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11458 if(f1apMsg == NULLP)
11460 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11464 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11466 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11467 if(f1apMsg->choice.initiatingMessage == NULLP)
11469 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11472 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11473 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11474 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11476 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11478 SEARCH_DU_DB(duIdx, duId, duDb);
11479 ueCb = &duDb->ueCb[duUeF1apId-1];
11480 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11485 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11486 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11488 /* Initialize the UE context modification members */
11489 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11490 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11492 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11496 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11498 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11499 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11501 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11502 memAllocFailed = true;
11507 if(memAllocFailed == true)
11513 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11514 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11515 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11516 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11517 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11520 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11521 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11522 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11523 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11524 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11526 /* Cause of UE context release */
11528 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11529 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11530 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11531 UEContextReleaseCommandIEs__value_PR_Cause;
11532 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11533 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11534 CauseRadioNetwork_normal_release;
11535 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11537 /* RRC Container for RRC release */
11539 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11540 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11541 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11542 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11543 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11545 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11546 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11547 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11548 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11550 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11553 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11554 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11556 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11558 /* Encode the UE Context Release Command type as APER */
11559 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11561 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11564 /* Encode results */
11565 if(encRetVal.encoded == ENCODE_FAIL)
11567 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11568 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11573 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11574 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11576 DU_LOG("%x",encBuf[ieIdx]);
11580 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11581 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11583 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11591 FreeUeContextReleaseCommand(f1apMsg);
11594 /*******************************************************************
11596 * @brief process Ue context release request
11600 * Function : procUeContextReleaseReq
11603 * - process Ue context release request
11605 * @params[in] F1AP_PDU_t *f1apMsg
11606 * @return ROK - success
11607 * RFAILED - failure
11609 * ****************************************************************/
11610 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11612 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11614 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11615 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11617 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11619 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11621 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11623 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11626 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11628 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11636 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11638 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11643 /*******************************************************************
11645 * @brief processing of Gnb-DU config update
11649 * Function : procGnbDuUpdate
11652 * - processing of Gnb-DU config update
11654 * @params[in] F1AP_PDU_t *f1apMsg
11655 * @return ROK - success
11656 * RFAILED - failure
11658 * ****************************************************************/
11659 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11661 bool cellToBeDelete = false;
11662 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11666 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11668 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11669 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11671 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11673 case ProtocolIE_ID_id_TransactionID:
11675 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11677 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11679 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11680 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11681 Served_Cells_To_Delete_List.list.array[0];
11682 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11683 cellToBeDelete = true;
11686 case ProtocolIE_ID_id_gNB_DU_ID:
11690 if(BuildAndSendDUUpdateAck(duId) != ROK)
11692 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11696 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11697 * commented this trigger for now */
11699 if(cellToBeDelete == false)
11701 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11702 if(BuildAndSendF1ResetReq() != ROK)
11704 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11709 if(cellToBeDelete == true)
11711 SEARCH_DU_DB(duIdx, duId, duDb);
11712 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11713 if(cellCb->numUe == 0)
11715 memset(cellCb, 0, sizeof(CuCellCb));
11719 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11724 /*******************************************************************
11726 * @brief storing slice list in CU database
11730 * Function : buildSliceList
11733 * - storing slice list in CU database
11735 * @params[in] SliceSupportList_t *sliceSupportList
11736 * @return ROK - success
11737 * RFAILED - failure
11739 * ****************************************************************/
11740 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11742 uint8_t sliceListIdx = 0;
11744 if(sliceSupportList)
11746 if(sliceSupportList->list.array)
11748 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11749 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11751 if(sliceSupportList->list.array[sliceListIdx])
11753 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11754 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11756 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11759 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11761 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11762 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11764 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11766 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11767 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11768 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11777 /****************************************************************
11778 * @brief Function to process Srb Setup Mod List
11782 * Function : procSrbSetupModList
11785 * - Function to process SRB Setup Mod List
11788 * @return ROK - success
11789 * RFAILED - failure
11791 * ****************************************************************/
11792 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11794 uint8_t arrIdx = 0, srbIdx;
11795 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11797 if(srbSetupList != NULLP)
11799 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11801 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11802 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11804 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11806 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11808 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11820 /****************************************************************
11821 * @brief Function to process Drb Setup Mod List
11825 * Function : procDrbSetupModList
11828 * - Function to process DRB Setup Mod List
11831 * @return ROK - success
11832 * RFAILED - failure
11834 * ****************************************************************/
11835 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11837 uint8_t arrIdx = 0, drbIdx;
11839 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11841 if(drbSetupList != NULLP)
11843 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11845 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11846 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11848 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11850 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11852 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11853 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11858 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11860 /* extracting teId */
11861 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11864 if(addDrbTunnels(duId, teId)== ROK)
11866 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11878 /*******************************************************************
11880 * @brief processing of GNB_DU_Served_Cells Plmn list information
11884 * Function : procServedCellPlmnList
11887 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11890 * @params[in] F1AP_PDU_t *f1apMsg
11891 * @return ROK - success
11892 * RFAILED - failure
11894 * ****************************************************************/
11895 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11897 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11898 ProtocolExtensionContainer_4624P3_t **ieExtend;
11900 if(srvPlmn->list.array)
11902 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11904 if(srvPlmn->list.array[srvPlmnIdx])
11906 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11909 if((*ieExtend)->list.array)
11911 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11913 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11915 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11917 case ProtocolIE_ID_id_TAISliceSupportList:
11919 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11920 extensionValue.choice.SliceSupportList) != ROK)
11922 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11937 /****************************************************************
11938 * @brief Function to process Ue Context Modification Response
11942 * Function : procUeContextModificationResponse
11945 * - Function to process Ue Context Modification Response
11948 * @return ROK - success
11949 * RFAILED - failure
11951 * ****************************************************************/
11952 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *recvBuf, MsgLen recvBufLen)
11954 uint8_t idx=0, duIdx=0;
11955 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11956 DuDb *duDb = NULLP;
11957 CuUeCb *ueCb = NULLP;
11958 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11960 SEARCH_DU_DB(duIdx, duId, duDb);
11961 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11963 /* In case of Inter-CU Handover request received from peer CU */
11964 if(duDb->tempUeCtxtInHo)
11965 ueCb = duDb->tempUeCtxtInHo;
11967 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11969 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11971 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11975 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11979 /* In case of Inter-CU Handover request received from peer CU */
11980 cuUeF1apId = ueCb->gnbCuUeF1apId;
11984 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11988 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11989 ueCb = &duDb->ueCb[duUeF1apId-1];
11991 /* In case UE context modification response is received at source GNB CU from source GNB DU
11992 * for a UE in handover, send HO request to target GNB only if not sent already.
11993 * If HO Req is already sent to target GNB, and an HO Req Ack is received, then
11994 * ueCb->hoInfo.cuUeF1apIdTgt will be non-zero
11996 if((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO) && \
11997 (ueCb->hoInfo.cuUeF1apIdTgt == 0))
11999 BuildAndSendHOReq(ueCb, recvBuf, recvBufLen);
12004 case ProtocolIE_ID_id_DRBs_SetupMod_List:
12006 /* Adding Tunnels for successful DRB */
12007 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
12011 case ProtocolIE_ID_id_DRBs_Modified_List:
12013 DU_LOG("\nINFO --> Received DRBs Modified List");
12016 case ProtocolIE_ID_id_SRBs_SetupMod_List:
12018 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
12021 case ProtocolIE_ID_id_DUtoCURRCInformation:
12023 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
12024 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
12025 DUtoCURRCInformation.cellGroupConfig)) != ROK)
12027 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
12036 /* If UE is in handover and UE context is not yet created at target DU, then send
12037 * UE context setup request to target DU */
12038 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
12041 uint8_t tgtDuId = 0;
12042 DuDb *tgtDuDb = NULLP;
12043 CuUeCb *ueCbInTgtDu = NULLP;
12045 if(ueCb->hoInfo.HOType == Inter_DU_HO)
12047 tgtDuId = ueCb->hoInfo.tgtNodeId;
12049 else if (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO)
12054 SEARCH_DU_DB(duIdx, tgtDuId, tgtDuDb);
12057 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
12058 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
12060 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
12062 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
12064 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
12069 /* If UE context is not found in Target DU, send UE context setup
12071 if(ueCbInTgtDu == NULLP)
12073 if((BuildAndSendUeContextSetupReq(tgtDuId, ueCb)) != ROK)
12075 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
12082 #ifdef START_DL_UL_DATA
12089 /*******************************************************************
12091 * @brief processing of F1 setup request
12095 * Function : procF1SetupReq
12098 * - processing of F1 setup request
12100 * @params[in] F1AP_PDU_t *f1apMsg
12101 * @return ROK - success
12102 * RFAILED - failure
12104 * ****************************************************************/
12105 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
12107 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
12109 uint64_t nrCellId = 0;
12110 DuDb *duDb = NULLP;
12111 CuCellCb *cellCb = NULLP;
12112 BIT_STRING_t nrcellIdentity;
12113 F1SetupRequest_t *f1SetupReq = NULLP;
12114 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
12115 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
12117 /* Triggering XN setup request before F1 setup establishment */
12118 if(LOCAL_NODE_TYPE == CLIENT)
12119 BuildAndSendXnSetupReq();
12121 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
12122 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
12124 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
12126 case ProtocolIE_ID_id_gNB_DU_ID:
12128 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
12129 SEARCH_DU_DB(duIdx, duId, duDb);
12132 duDb = &cuCb.duInfo[cuCb.numDu];
12135 memset(duDb, 0, sizeof(DuDb));
12140 case ProtocolIE_ID_id_gNB_DU_Name:
12142 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
12145 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
12147 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
12148 if(duServedCell->list.array)
12150 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
12152 if(duServedCell->list.array[plmnidx])
12154 switch(duServedCell->list.array[plmnidx]->id)
12156 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
12158 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
12159 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
12160 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
12162 bitStringToInt(&nrcellIdentity, &nrCellId);
12163 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
12164 if(cellCb == NULLP)
12166 cellCb = &duDb->cellCb[duDb->numCells];
12167 memset(cellCb, 0, sizeof(CuCellCb));
12168 cellCb->nrCellId = nrCellId;
12169 cellCb->cellStatus = CELL_ACTIVE;
12182 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
12186 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
12190 /****************************************************************
12192 * @brief processing of UE Context Release Complete
12196 * Function : procUeContextReleaseComplete
12199 * - processing of UE Context Release Complete
12201 * @params[in] F1AP_PDU_t *f1apMsg
12202 * @return ROK - success
12203 * RFAILED - failure
12205 * ****************************************************************/
12206 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
12208 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
12209 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
12210 DuDb *duDb = NULLP;
12211 CuUeCb *ueCb = NULLP;
12212 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
12214 SEARCH_DU_DB(duIdx, duId, duDb);
12217 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
12221 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
12222 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
12224 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
12226 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12228 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
12231 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12233 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
12234 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
12235 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
12237 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
12239 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
12240 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
12242 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
12244 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
12246 ueCb->cellCb->ueCb[ueIdx] = NULLP;
12247 ueCb->cellCb->numUe--;
12248 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
12250 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
12257 memset(ueCb, 0, sizeof(CuUeCb));
12265 /*******************************************************************
12267 * @brief Builds the Paging cell list
12271 * Function : BuildPagingCellList
12273 * Functionality: Build the paging cell list
12275 * @params[in] PagingCell_list_t *pagingCelllist,
12277 * @return ROK - success
12278 * RFAILED - failure
12280 * ****************************************************************/
12281 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
12283 uint8_t cellIdx =0;
12284 PagingCell_ItemIEs_t *pagingCellItemIes;
12285 PagingCell_Item_t *pagingCellItem;
12287 pagingCelllist->list.count = numCells;
12288 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
12289 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
12290 if(pagingCelllist->list.array == NULLP)
12292 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12296 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12298 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12299 if(pagingCelllist->list.array[cellIdx] == NULLP)
12301 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12306 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12308 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12309 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
12310 pagingCellItemIes->criticality = Criticality_ignore;
12311 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
12312 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12314 /* Fill NrCgi Information */
12315 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
12321 /*******************************************************************
12323 * @brief Deallocation of memory allocated in paging msg
12327 * Function :FreePagingMsg
12329 * Functionality: Deallocation of memory allocated in paging msg
12331 * @params[in] F1AP_PDU_t *f1apMsg
12335 * ****************************************************************/
12336 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12338 uint8_t ieIdx, cellIdx;
12340 PagingCell_ItemIEs_t *pagingCellItemIes;
12341 PagingCell_Item_t *pagingCellItem;
12342 PagingCell_list_t *pagingCelllist;
12346 if(f1apMsg->choice.initiatingMessage)
12348 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12349 if(paging->protocolIEs.list.array)
12351 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12353 if(paging->protocolIEs.list.array[ieIdx])
12355 switch(paging->protocolIEs.list.array[ieIdx]->id)
12357 case ProtocolIE_ID_id_UEIdentityIndexValue:
12359 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12360 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12364 case ProtocolIE_ID_id_PagingIdentity:
12366 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12368 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12370 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12372 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12373 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12375 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12376 sizeof(struct CNUEPagingIdentity));
12382 case ProtocolIE_ID_id_PagingCell_List:
12384 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12385 if(pagingCelllist->list.array)
12387 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12389 if(pagingCelllist->list.array[cellIdx])
12391 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12392 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12394 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12395 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12396 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12398 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12401 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12406 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12409 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12411 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12413 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12416 /*******************************************************************
12418 * @brief Builds and sends the paging message if UE is in idle mode
12422 * Function : BuildAndSendPagingMsg
12424 * Functionality: Builds and sends the paging message
12426 * @params[in] uint32_t duId, uint8_t gsTmsi
12428 * @return ROK - success
12429 * RFAILED - failure
12431 * ****************************************************************/
12432 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12434 bool memAllocFailed = false;
12435 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12436 uint16_t ueId = 0, duIdx = 0;
12438 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12439 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12440 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12441 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12443 F1AP_PDU_t *f1apMsg = NULLP;
12444 Paging_t *paging = NULLP;
12446 asn_enc_rval_t encRetVal;
12448 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12450 SEARCH_DU_DB(duIdx, duId, duDb);
12453 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12456 if(duDb->numCells == 0)
12458 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): No CELL is UP!");
12464 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12465 if(f1apMsg == NULLP)
12467 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12471 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12473 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12474 if(f1apMsg->choice.initiatingMessage == NULLP)
12476 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12479 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12480 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12481 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12483 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12486 paging->protocolIEs.list.count = elementCnt;
12487 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12489 /* Initialize the Paging Message members */
12490 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12491 if(paging->protocolIEs.list.array == NULLP)
12493 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12497 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12499 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12500 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12502 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12503 memAllocFailed = true;
12508 if(memAllocFailed == true)
12513 /* UE Identity Index Value */
12515 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12516 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12517 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12518 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12519 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12520 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12521 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12522 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12524 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12528 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12529 ueId = gsTmsi % 1024;
12530 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12532 /* Paging Identity */
12534 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12535 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12536 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12537 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12538 PagingIdentity_PR_cNUEPagingIdentity;
12539 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12540 sizeof(struct CNUEPagingIdentity));
12541 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12543 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12547 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12548 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12550 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12551 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12552 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12553 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12555 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12559 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12560 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12564 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12565 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12566 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12567 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12569 /* Paging Priority */
12571 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12572 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12573 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12574 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12576 /* Paging Cell List */
12578 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12579 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12580 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12581 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12583 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12587 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12589 /* Encode the UE Context Release Command type as APER */
12590 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12592 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12595 /* Encode results */
12596 if(encRetVal.encoded == ENCODE_FAIL)
12598 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12599 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12604 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12605 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12607 DU_LOG("%x",encBuf[ieIdx]);
12611 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12613 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12622 FreePagingMsg(f1apMsg);
12626 /*******************************************************************
12628 * @brief Decode received character string into F1AP message
12632 * Function : F1APMsgHdlr
12635 * - Decodes received F1AP control message
12638 * @return ROK - success
12639 * RFAILED - failure
12641 * ****************************************************************/
12642 uint8_t F1APDecodeMsg(F1AP_PDU_t *f1apMsg, Buffer *mBuf, char **recvBuf, MsgLen *recvBufLen)
12646 asn_dec_rval_t rval; /* Decoder return value */
12648 /* Copy mBuf into char array to decode it */
12649 ODU_GET_MSG_LEN(mBuf, recvBufLen);
12650 CU_ALLOC(*recvBuf, (Size)(*recvBufLen));
12651 if(*recvBuf == NULLP)
12653 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12656 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, *recvBufLen, (Data *)*recvBuf, ©Cnt) != ROK)
12658 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12662 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : \n");
12663 for(i=0; i< *recvBufLen; i++)
12665 DU_LOG("%x ",(*recvBuf)[i]);
12668 /* Decoding flat buffer into F1AP messsage */
12669 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, *recvBuf, *recvBufLen, 0, 0);
12670 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12672 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12676 /* Printing the decoded F1AP PDU */
12678 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12682 /*******************************************************************
12684 * @brief Handles received F1AP message and sends back response
12688 * Function : F1APMsgHdlr
12691 * - Decodes received F1AP control message
12692 * - Prepares response message, encodes and sends to SCTP
12695 * @return ROK - success
12696 * RFAILED - failure
12698 * ****************************************************************/
12699 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12703 F1AP_PDU_t *f1apMsg = NULLP;
12704 F1AP_PDU_t f1apasnmsg ;
12706 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12707 ODU_PRINT_MSG(mBuf, 0,0);
12709 f1apMsg = &f1apasnmsg;
12710 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12711 if(F1APDecodeMsg(f1apMsg, mBuf, &recvBuf, &recvBufLen) != ROK)
12713 DU_LOG("\nERROR --> F1AP : F1AP PDU decode failed");
12717 switch(f1apMsg->present)
12719 case F1AP_PDU_PR_initiatingMessage:
12721 switch(f1apMsg->choice.initiatingMessage->value.present)
12723 case InitiatingMessage__value_PR_Reset:
12725 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12726 BuildAndSendF1ResetAck();
12730 case InitiatingMessage__value_PR_F1SetupRequest:
12732 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12733 procF1SetupReq(duId, f1apMsg);
12737 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12739 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12740 procGnbDuUpdate(*duId, f1apMsg);
12743 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12745 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12746 procInitULRRCMsg(*duId, f1apMsg);
12749 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12751 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12752 procUlRrcMsg(*duId, f1apMsg);
12756 case InitiatingMessage__value_PR_RRCDeliveryReport:
12758 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12761 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12763 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12764 procUeContextReleaseReq(*duId, f1apMsg);
12769 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12770 f1apMsg->choice.initiatingMessage->value.present);
12773 }/* End of switch(initiatingMessage) */
12777 case F1AP_PDU_PR_successfulOutcome:
12779 switch(f1apMsg->choice.successfulOutcome->value.present)
12781 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12783 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12786 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12788 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12789 procUeContextSetupResponse(*duId, f1apMsg, recvBuf, recvBufLen);
12792 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12794 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12795 procUeContextModificationResponse(*duId, f1apMsg, recvBuf, recvBufLen);
12798 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12800 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12801 procUeContextReleaseComplete(*duId, f1apMsg);
12806 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12807 f1apMsg->choice.successfulOutcome->value.present);
12810 }/* End of switch(successfulOutcome) */
12815 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12818 }/* End of switch(f1apMsg->present) */
12820 CU_FREE(recvBuf, (Size)(recvBufLen));
12821 } /* End of F1APMsgHdlr */
12823 /**********************************************************************
12825 **********************************************************************/