1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ProtocolIE-Field.h"
25 #include "ProtocolExtensionField.h"
26 #include "ProtocolIE-SingleContainer.h"
27 #include "F1SetupResponse.h"
28 #include "SuccessfulOutcome.h"
29 #include "InitiatingMessage.h"
30 #include "NonDynamic5QIDescriptor.h"
31 #include "AveragingWindow.h"
32 #include "MaxDataBurstVolume.h"
33 #include "Flows-Mapped-To-DRB-Item.h"
34 #include "SliceSupportItem.h"
35 #include "ServedPLMNs-Item.h"
37 #include "ULUPTNLInformation-ToBeSetup-Item.h"
38 #include "ULConfiguration.h"
39 #include "ModulationOrder.h"
41 #include "UE-CapabilityRAT-Container.h"
42 #include "UE-CapabilityRAT-ContainerList.h"
43 #include "UE-CapabilityRAT-ContainerListRRC.h"
44 #include "HandoverPreparationInformationRrc-IEs.h"
45 #include "HandoverPreparationInformationRrc.h"
46 #include "SupportedBandwidth.h"
47 #include "FeatureSetUplinkPerCC.h"
48 #include "FeatureSetDownlinkPerCC.h"
49 #include "FeatureSets.h"
50 #include "RF-Parameters.h"
51 #include "UE-NR-Capability.h"
52 #include "ProtocolExtensionContainer.h"
53 #include "CellGroupConfigRrc.h"
54 #include "MAC-CellGroupConfig.h"
55 #include "SchedulingRequestConfig.h"
56 #include "SchedulingRequestToAddMod.h"
57 #include "BSR-Config.h"
58 #include "TAG-Config.h"
60 #include "PHR-Config.h"
61 #include "RLC-Config.h"
62 #include "UL-AM-RLC.h"
63 #include "DL-AM-RLC.h"
64 #include "LogicalChannelConfig.h"
65 #include "RLC-BearerConfig.h"
66 #include "PhysicalCellGroupConfig.h"
67 #include "SpCellConfig.h"
68 #include "ServingCellConfig.h"
69 #include "ControlResourceSet.h"
70 #include "SearchSpace.h"
71 #include "PDCCH-Config.h"
72 #include "PDSCH-TimeDomainResourceAllocation.h"
73 #include "PDSCH-TimeDomainResourceAllocationList.h"
74 #include "DMRS-DownlinkConfig.h"
75 #include "PDSCH-Config.h"
76 #include "BWP-DownlinkDedicated.h"
77 #include "PUSCH-TimeDomainResourceAllocation.h"
78 #include "PUSCH-TimeDomainResourceAllocationList.h"
79 #include "DMRS-UplinkConfig.h"
80 #include "PUSCH-Config.h"
81 #include "SRS-ResourceId.h"
82 #include "SRS-Resource.h"
83 #include "SRS-ResourceSet.h"
84 #include "SRS-Config.h"
85 #include "PUCCH-Config.h"
86 #include "PUCCH-ResourceSet.h"
87 #include "PUCCH-Resource.h"
88 #include "PUCCH-format1.h"
89 #include "PUCCH-FormatConfig.h"
90 #include "BWP-UplinkDedicated.h"
91 #include "PUSCH-ServingCellConfig.h"
92 #include "UplinkConfig.h"
93 #include "PDSCH-ServingCellConfig.h"
94 #include "EUTRANQoS.h"
95 #include "GBR-QosInformation.h"
96 #include "DRBs-ToBeSetupMod-List.h"
97 #include "DRBs-ToBeSetupMod-Item.h"
98 #include "DRBs-Setup-Item.h"
99 #include "DLUPTNLInformation-ToBeSetup-List.h"
100 #include "DLUPTNLInformation-ToBeSetup-Item.h"
101 #include "UPTransportLayerInformation.h"
102 #include "GTPTunnel.h"
103 #include "QoSInformation.h"
104 #include "Cells-to-be-Activated-List.h"
105 #include "DL-CCCH-Message.h"
106 #include "SRB-ToAddModList.h"
107 #include "SRB-ToAddMod.h"
108 #include "RRCSetup-IEs.h"
109 #include "RRCSetup.h"
110 #include "DL-DCCH-Message.h"
111 #include "RRCReconfiguration-IEs.h"
112 #include "RRCReconfiguration.h"
113 #include "DRB-ToAddModList.h"
114 #include "DRB-ToAddMod.h"
115 #include "SDAP-Config.h"
117 #include "MeasTiming.h"
118 #include "MeasTimingList.h"
119 #include "MeasurementTimingConfigurationRrc-IEs.h"
120 #include "MeasurementTimingConfigurationRrc.h"
121 #include "PDCP-Config.h"
122 #include "RSRP-Range.h"
123 #include "RSRQ-Range.h"
124 #include "SINR-Range.h"
125 #include "ThresholdNR.h"
126 #include "MeasObjectToAddMod.h"
127 #include "MeasObjectNR.h"
128 #include "MeasObjectToAddModList.h"
129 #include "EventTriggerConfig.h"
130 #include "ReportConfigNR.h"
131 #include "ReportConfigToAddMod.h"
132 #include "ReportConfigToAddModList.h"
133 #include "MeasIdToAddMod.h"
134 #include "MeasIdToAddModList.h"
135 #include "FilterCoefficient.h"
136 #include "QuantityConfigNR.h"
137 #include "QuantityConfig.h"
138 #include "MeasConfigRrc.h"
139 #include "AS-Config.h"
140 #include "RRCReconfiguration-v1530-IEs.h"
141 #include "CNUEPagingIdentity.h"
142 #include "PagingCell-Item.h"
143 #include "UL-DCCH-Message.h"
144 #include "DRX-ConfigRrc.h"
146 #include "cu_stub_sctp.h"
147 #include "cu_stub_egtp.h"
148 #include "cu_f1ap_msg_hdl.h"
151 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
152 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
154 /*******************************************************************
156 * @brief Sends F1 msg over SCTP
160 * Function : SendF1APMsg
162 * Functionality: Sends F1 msg over SCTP
164 * @params[in] Region region
166 * @return ROK - success
169 * ****************************************************************/
170 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
172 Buffer *mBuf = NULLP;
174 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
176 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
178 ODU_PRINT_MSG(mBuf, 0,0);
180 if(sctpSend(duId, mBuf) != ROK)
182 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
183 ODU_PUT_MSG_BUF(mBuf);
189 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
190 ODU_PUT_MSG_BUF(mBuf);
193 ODU_PUT_MSG_BUF(mBuf);
197 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
204 /********************************************************************
206 * @brief Builds and sends the F1SetupResponse
210 * Function : BuildAndSendF1SetupRsp
212 * Functionality: Constructs the F1SetupResponse message and sends
213 * it back to the DU through SCTP.
215 * @params[in] void **buf,Buffer to which encoded pattern is written into
216 * @params[in] int *size,size of buffer
218 * @return ROK - success
221 * ****************************************************************/
222 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
225 uint8_t elementCnt,cellCnt;
226 F1AP_PDU_t *f1apMsg = NULL;
227 F1SetupResponse_t *f1SetupRsp;
228 GNB_CU_Name_t *cuName;
229 Cells_to_be_Activated_List_t *cellToActivate;
230 RRC_Version_t *rrcVer;
231 asn_enc_rval_t encRetVal;
232 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
234 /* Allocate the memory for F1SetupRequest_t */
235 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
238 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
241 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
243 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
244 if(f1apMsg->choice.successfulOutcome == NULLP)
246 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
247 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
251 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
252 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
253 f1apMsg->choice.successfulOutcome->value.present = \
254 SuccessfulOutcome__value_PR_F1SetupResponse;
255 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
258 f1SetupRsp->protocolIEs.list.count = elementCnt;
259 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
261 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
262 elementCnt * sizeof(F1SetupResponseIEs_t *));
263 if(f1SetupRsp->protocolIEs.list.array == NULLP)
265 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
266 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
267 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
271 for(idx=0; idx<elementCnt; idx++)
273 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
274 sizeof(F1SetupResponseIEs_t));
275 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
277 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
278 elementCnt * sizeof(F1SetupResponseIEs_t *));
279 CU_FREE(f1apMsg->choice.successfulOutcome, \
280 sizeof(SuccessfulOutcome_t));
281 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
288 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
289 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
290 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
291 F1SetupResponseIEs__value_PR_TransactionID;
292 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
297 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
298 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
299 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
300 F1SetupResponseIEs__value_PR_GNB_CU_Name;
301 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
302 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
304 CU_ALLOC(cuName->buf, sizeof(cuName->size));
305 if(cuName->buf == NULLP)
307 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
309 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
310 sizeof(F1SetupResponseIEs_t));
312 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
313 elementCnt * sizeof(F1SetupResponseIEs_t *));
314 CU_FREE(f1apMsg->choice.successfulOutcome,\
315 sizeof(SuccessfulOutcome_t));
316 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
319 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
321 /*Cells to be activated list*/
323 f1SetupRsp->protocolIEs.list.array[idx]->id = \
324 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
325 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
326 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
327 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
328 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
329 Cells_to_be_Activated_List;
331 cellToActivate->list.count = cellCnt;
332 cellToActivate->list.size = \
333 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
334 CU_ALLOC(cellToActivate->list.array,\
335 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],\
342 sizeof(F1SetupResponseIEs_t));
344 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
345 elementCnt * sizeof(F1SetupResponseIEs_t *));
346 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
347 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
350 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
352 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
353 if(cellToActivate->list.array[ieIdx] == NULLP)
355 CU_FREE(cellToActivate->list.array,\
356 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
357 CU_FREE(cuName->buf, sizeof(cuName->size));
358 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
360 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
361 sizeof(F1SetupResponseIEs_t));
363 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
364 elementCnt * sizeof(F1SetupResponseIEs_t *));
365 CU_FREE(f1apMsg->choice.successfulOutcome, \
366 sizeof(SuccessfulOutcome_t));
367 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
371 cellToActivate->list.array[0]->id = \
372 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
373 cellToActivate->list.array[0]->criticality = Criticality_ignore;
374 cellToActivate->list.array[0]->value.present = \
375 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
376 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
377 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
378 CU_ALLOC(cellToActivate->list.array[0]->\
379 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
381 if(cellToActivate->list.array[0]->value.choice.\
382 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
385 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
387 CU_FREE(cellToActivate->list.array[ieIdx],\
388 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
391 CU_FREE(cellToActivate->list.array,\
392 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
393 CU_FREE(cuName->buf, sizeof(cuName->size));
394 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
396 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
397 sizeof(F1SetupResponseIEs_t));
399 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
400 elementCnt * sizeof(F1SetupResponseIEs_t *));
401 CU_FREE(f1apMsg->choice.successfulOutcome, \
402 sizeof(SuccessfulOutcome_t));
403 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
406 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
407 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
408 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
409 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
410 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
411 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
412 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
413 nRCGI.nRCellIdentity.size);
414 if(cellToActivate->list.array[0]->value.choice.\
415 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
417 CU_FREE(cellToActivate->list.array[0]->\
418 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
420 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
422 CU_FREE(cellToActivate->list.array[ieIdx],\
423 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
426 CU_FREE(cellToActivate->list.array,\
427 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
428 CU_FREE(cuName->buf, sizeof(cuName->size));
429 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
431 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
432 sizeof(F1SetupResponseIEs_t));
434 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
435 elementCnt * sizeof(F1SetupResponseIEs_t *));
436 CU_FREE(f1apMsg->choice.successfulOutcome, \
437 sizeof(SuccessfulOutcome_t));
438 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
441 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
444 f1SetupRsp->protocolIEs.list.array[idx]->id = \
445 ProtocolIE_ID_id_GNB_CU_RRC_Version;
446 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
447 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
448 F1SetupResponseIEs__value_PR_RRC_Version;
449 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
450 rrcVer->latest_RRC_Version.size = RRC_SIZE;
452 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
453 if(rrcVer->latest_RRC_Version.buf == NULLP)
455 CU_FREE(cuName->buf, sizeof(cuName->size));
456 for(ieIdx=0; ieIdx<elementCnt; idx++)
458 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
459 sizeof(F1SetupResponseIEs_t));
461 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
462 elementCnt * sizeof(F1SetupResponseIEs_t *));
463 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
464 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
468 /* Need to check RRC Version */
469 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
470 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
471 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
472 if(rrcVer->iE_Extensions == NULLP)
474 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
475 CU_FREE(cuName->buf, sizeof(cuName->size));
476 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
478 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
479 sizeof(F1SetupResponseIEs_t));
481 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
482 elementCnt * sizeof(F1SetupResponseIEs_t *));
483 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
484 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
487 rrcVer->iE_Extensions->list.count = 1;
488 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
489 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
490 sizeof(struct RRC_Version_ExtIEs *));
491 if(rrcVer->iE_Extensions->list.array == NULLP)
493 CU_FREE(rrcVer->iE_Extensions,\
494 sizeof(ProtocolExtensionContainer_4624P81_t));
495 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
496 CU_FREE(cuName->buf, sizeof(cuName->size));
497 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
499 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
500 sizeof(F1SetupResponseIEs_t));
502 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
503 elementCnt * sizeof(F1SetupResponseIEs_t *));
504 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
505 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
508 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
509 sizeof(struct RRC_Version_ExtIEs));
510 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
512 CU_FREE(rrcVer->iE_Extensions->list.array,\
513 sizeof(struct RRC_Version_ExtIEs *));
514 CU_FREE(rrcVer->iE_Extensions,\
515 sizeof(ProtocolExtensionContainer_4624P81_t));
516 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
517 CU_FREE(cuName->buf, sizeof(cuName->size));
518 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
520 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
521 sizeof(F1SetupResponseIEs_t));
523 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
524 elementCnt * sizeof(F1SetupResponseIEs_t *));
525 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
526 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
529 rrcVer->iE_Extensions->list.array[0]->id = \
530 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
531 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
532 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
533 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
534 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
535 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
536 CU_ALLOC(rrcVer->iE_Extensions->list.\
537 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
539 if(rrcVer->iE_Extensions->list.\
540 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
542 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
543 sizeof(struct RRC_Version_ExtIEs));
544 CU_FREE(rrcVer->iE_Extensions->list.array,\
545 sizeof(struct RRC_Version_ExtIEs *));
546 CU_FREE(rrcVer->iE_Extensions,\
547 sizeof(ProtocolExtensionContainer_4624P81_t));
548 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
549 CU_FREE(cuName->buf, sizeof(cuName->size));
550 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
552 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
553 sizeof(F1SetupResponseIEs_t));
555 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
556 elementCnt * sizeof(F1SetupResponseIEs_t *));
557 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
558 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
561 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
562 Latest_RRC_Version_Enhanced.buf[0] = 0;
563 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
564 Latest_RRC_Version_Enhanced.buf[1] = 5;
565 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
566 Latest_RRC_Version_Enhanced.buf[2] = 15;
568 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
570 /* Encode the F1SetupRequest type as UPER */
571 memset(encBuf, 0, ENC_BUF_MAX_LEN);
573 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
576 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
577 CU_FREE(cuName->buf, sizeof(cuName->size));
578 for(idx=0; idx<elementCnt; idx++)
580 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
582 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
583 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
584 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
586 /* Check encode results */
587 if(encRetVal.encoded == ENCODE_FAIL)
589 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
590 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
595 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
596 for(int i=0; i< encBufSize; i++)
598 DU_LOG("%x",encBuf[i]);
603 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
605 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
610 }/* End of BuildAndSendF1SetupRsp */
612 /*******************************************************************
614 * @brief Builds and sends the DUUpdateAcknowledge
618 * Function : BuildAndSendDUUpdateAck
620 * Functionality: Constructs the DU Update Acknowledge message and sends
621 * it to the DU through SCTP.
625 * @return ROK - success
628 * ****************************************************************/
630 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
634 F1AP_PDU_t *f1apMsg = NULL;
635 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
636 asn_enc_rval_t enRetVal; /* Encoder return value */
638 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
640 /* Allocate the memory for F1SetupRequest_t */
641 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
644 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
648 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
650 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
651 if(f1apMsg->choice.successfulOutcome == NULLP)
653 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
654 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
658 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
659 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
660 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
661 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
664 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
665 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
667 /* Initialize the F1Setup members */
668 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
669 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
671 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
672 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
673 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
677 for(idx=0; idx<elementCnt; idx++)
679 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
680 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
682 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
683 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
684 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
691 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
692 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
693 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
694 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
695 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
697 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
699 /* Encode the F1SetupRequest type as UPER */
700 memset(encBuf, 0, ENC_BUF_MAX_LEN);
702 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
705 for(idx=0; idx<elementCnt; idx++)
707 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
709 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
710 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
711 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
713 /* Checking encode results */
714 if(enRetVal.encoded == ENCODE_FAIL)
716 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
717 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
722 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
723 for(int i=0; i< encBufSize; i++)
725 DU_LOG("%x",encBuf[i]);
730 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
731 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
733 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
739 }/* End of BuildAndSendDUUpdateAck*/
741 /*******************************************************************
743 * @brief deallocating the memory of F1reset msg
747 * Function : FreeF1ResetReq
750 * - freeing memory of F1reset request msg
756 * ****************************************************************/
757 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
760 Reset_t *f1ResetMsg = NULLP;
764 if(f1apMsg->choice.initiatingMessage)
766 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
767 if(f1ResetMsg->protocolIEs.list.array)
769 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
771 if(f1ResetMsg->protocolIEs.list.array[idx])
773 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
776 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
778 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
780 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
783 /*******************************************************************
785 * @brief build ansld ans send f1reset msg
789 * Function : BuildAndSendF1ResetReq
791 * Functionality: build and send f1reset msg
793 * @return ROK - success
796 * ****************************************************************/
797 uint8_t BuildAndSendF1ResetReq()
799 uint8_t elementCnt=0;
801 uint8_t ret= RFAILED;
802 Reset_t *f1ResetMsg = NULLP;
803 F1AP_PDU_t *f1apMsg = NULLP;
804 asn_enc_rval_t encRetVal;
805 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
808 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
811 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
814 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
815 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
816 if(f1apMsg->choice.initiatingMessage == NULLP)
818 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
821 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
822 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
823 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
825 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
828 f1ResetMsg->protocolIEs.list.count = elementCnt;
829 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
831 /* Initialize the F1Reset members */
832 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
833 if(f1ResetMsg->protocolIEs.list.array == NULLP)
835 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
838 for(idx=0; idx<elementCnt; idx++)
840 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
841 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
843 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
850 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
851 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
852 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
853 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
857 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
858 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
859 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
860 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
861 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
865 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
866 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
867 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
868 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
869 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
871 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
873 /* Encode the F1SetupRequest type as APER */
874 memset(encBuf, 0, ENC_BUF_MAX_LEN);
876 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
880 if(encRetVal.encoded == ENCODE_FAIL)
882 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
883 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
888 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
889 for(idx=0; idx< encBufSize; idx++)
891 DU_LOG("%x",encBuf[idx]);
895 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
896 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
898 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
906 FreeF1ResetReq(f1apMsg);
910 /*******************************************************************
912 * @brief Fills Radio Bearer Config
916 * Function : fillSrbCfg
918 * Functionality: Fills Radio Bearer Config
920 * @params[in] SRB_ToAddModList *
922 * @return ROK - success
925 * ****************************************************************/
926 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
928 uint8_t elementCnt = 0;
929 uint8_t idx, ieId, srbIdx = 0;
931 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
933 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
937 if(bearerCfg != NULLP)
939 bearerCfg->list.count = elementCnt;
940 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
941 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
942 if(bearerCfg->list.array != NULLP)
944 for(idx = 0; idx < elementCnt; idx++)
946 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
947 if(bearerCfg->list.array[idx] == NULLP)
949 for(ieId = 0; ieId < idx; ieId++)
951 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
953 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
960 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
965 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
967 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
968 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
974 /*******************************************************************
976 * @brief Fills Master CellGroup Info
980 * Function : fillMasterCellGroup
982 * Functionality: Fills Master Cell Group IE
984 * @params[in] RRCSetup_IEs_t *
986 * @return ROK - success
989 * ****************************************************************/
991 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
994 masterCellGroup->buf = NULLP;
995 if(ueCb->f1apMsgDb.duToCuContainer.buf)
997 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
998 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
999 if(masterCellGroup->buf != NULLP)
1001 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1005 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1016 /*******************************************************************
1018 * @brief Fills RRC setup IE
1022 * Function : fillRRCSetupIE
1024 * Functionality: Fills RRC Setup IE
1026 * @params[in] RRCSetup_IEs_t *
1028 * @return ROK - success
1031 * ****************************************************************/
1033 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1035 uint8_t ret = ROK, srbIdx = 0;
1038 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1039 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1041 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1045 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1049 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1053 /* If SRB configuration are filled successfully in RRC Setup, mark these
1054 * configurartion as sent to UE */
1055 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1057 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1058 ueCb->srbList[srbIdx].cfgSentToUe = true;
1063 /*******************************************************************
1065 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1069 * Function : fillDlCcchRrcMsg
1071 * Functionality: Fills DL DCCCH Message required for
1072 * DLRRCMessageTransfer
1074 * @params[in] RRCContainer_t *rrcContainer
1076 * @return ROK - success
1079 * ****************************************************************/
1081 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1085 DL_CCCH_Message_t dl_CCCH_Msg;
1086 asn_enc_rval_t encRetVal;
1088 if(rrcContainer != NULLP)
1090 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1092 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1093 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1095 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1096 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1097 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1099 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1100 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1101 RRCSetup__criticalExtensions_PR_rrcSetup;
1103 /* Fill RRC Setup IE */
1104 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1105 sizeof(RRCSetup_IEs_t));
1106 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1108 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1112 /* encode DL-CCCH message into RRC Container */
1113 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1114 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1116 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1117 /* Encode results */
1118 if(encRetVal.encoded == ENCODE_FAIL)
1120 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1121 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1126 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1127 for(int i = 0; i< encBufSize; i++)
1129 DU_LOG("%x",encBuf[i]);
1131 rrcContainer->size = encBufSize;
1132 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1133 if(rrcContainer->buf != NULLP)
1135 memset(rrcContainer->buf, 0, encBufSize);
1136 for(idx2 = 0; idx2 < encBufSize; idx2++)
1138 rrcContainer->buf[idx2] = encBuf[idx2];
1150 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1156 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1162 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1168 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1173 /*******************************************************************
1175 * @brief Fills QOS flow configuration
1179 * Function : fillQosFlowsToAdd
1181 * Functionality: Fills QOS flow configuration
1183 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1185 * @return ROK - success
1188 * ****************************************************************/
1189 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1191 uint8_t idx, ied, elementCnt;
1194 qosFlow->list.count = elementCnt;
1195 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1196 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1197 if(qosFlow->list.array != NULLP)
1199 for(idx = 0; idx < elementCnt; idx++)
1201 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1202 if(qosFlow->list.array[idx] == NULLP)
1204 for(ied = 0; ied < idx; ied++)
1206 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1208 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1214 *qosFlow->list.array[idx] = 9;
1218 /*******************************************************************
1220 * @brief Fills CN Assoc for Drb to Add/Mod List
1224 * Function : fillCnAssoc
1226 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1228 * @params[in] struct DRB_ToAddMod__cnAssociation *
1230 * @return ROK - success
1233 * ****************************************************************/
1235 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1239 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1240 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1242 cnAssoc->choice.eps_BearerIdentity = 5;
1244 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1246 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1247 if(cnAssoc->choice.sdap_Config)
1249 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1250 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1251 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1252 cnAssoc->choice.sdap_Config->defaultDRB = true;
1253 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1254 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1255 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1256 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1257 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1259 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1263 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1264 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1270 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1277 /*******************************************************************
1279 * @brief Fills Radio Bearer Config for Drb
1283 * Function : fillDrbCfg
1285 * Functionality: Fills Radio Bearer Config for Drb
1287 * @params[in] drbId, DRB_ToAddModList *
1289 * @return ROK - success
1292 * ****************************************************************/
1293 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1295 uint8_t idx, ied, ret, elementCnt;
1301 drbCfg->list.count = elementCnt;
1302 drbCfg->list.size =\
1303 elementCnt * sizeof(DRB_ToAddMod_t *);
1304 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1305 if(drbCfg->list.array != NULLP)
1307 for(idx = 0; idx < elementCnt; idx++)
1309 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1310 if(drbCfg->list.array[idx] == NULLP)
1312 for(ied = 0; ied < idx; ied++)
1314 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1316 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1326 /* CN ASSOCIATION */
1327 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1328 if(drbCfg->list.array[idx]->cnAssociation)
1330 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1333 drbCfg->list.array[idx]->drb_Identity = drbId;
1338 /*******************************************************************
1340 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1344 * Function : fillRrcReconfigIE
1346 * Functionality: Fills RRC Reconfig Message required for
1347 * DLRRCMessageTransfer
1349 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1351 * @return ROK - success
1354 * ****************************************************************/
1356 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1359 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1360 if(rrcReconfigMsg->radioBearerConfig)
1362 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1363 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1365 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1370 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1371 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1373 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1376 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1377 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1378 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1384 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1385 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1391 /*******************************************************************
1393 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1397 * Function : fillDlDcchRrcMsg
1399 * Functionality: Fills DL DCCH Message required for
1400 * DLRRCMessageTransfer
1402 * @params[in] RRCContainer_t *rrcContainer
1404 * @return ROK - success
1407 * ****************************************************************/
1409 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1412 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1413 DL_DCCH_Message_t dl_DCCH_Msg;
1414 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1415 asn_enc_rval_t encRetVal;
1417 if(rrcContainer != NULLP)
1419 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1421 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1422 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1424 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1425 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1426 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1428 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1429 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1432 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1433 * configurartion as sent to UE */
1434 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1436 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1437 ueCb->srbList[srbIdx].cfgSentToUe = true;
1439 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1441 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1442 ueCb->drbList[drbIdx].cfgSentToUe = true;
1445 /* encode DL-DCCH message into RRC Container */
1446 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1447 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1449 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1450 /* Encode results */
1451 if(encRetVal.encoded == ENCODE_FAIL)
1453 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1454 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1459 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1460 for(int i = 0; i< encBufSize; i++)
1462 DU_LOG("%x",encBuf[i]);
1464 rrcContainer->size = encBufSize;
1465 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1466 if(rrcContainer->buf != NULLP)
1468 memset(rrcContainer->buf, 0, encBufSize);
1469 for(idx2 = 0; idx2 < encBufSize; idx2++)
1471 rrcContainer->buf[idx2] = encBuf[idx2];
1479 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1485 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1491 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1497 /*******************************************************************
1499 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1503 * Function : BuildDLRRCContainer
1505 * Functionality: Builds RRC Container IE required for
1506 * DLRRCMessageTransfer
1510 * @return ROK - success
1513 * ****************************************************************/
1515 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1517 uint8_t ret, bufLen;
1520 if(rrcMsgType == RRC_SETUP)
1522 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1524 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1526 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1528 DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
1529 char secModeBuf[30]={0x00, 0x02, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1530 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1532 rrcContainer->size = bufLen;
1533 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1534 if(rrcContainer->buf != NULLP)
1536 memset(rrcContainer->buf, 0, bufLen);
1537 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1541 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1545 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1547 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1548 char secModeBuf[9]={0x00, 0x03, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1550 rrcContainer->size = bufLen;
1551 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1552 if(rrcContainer->buf != NULLP)
1554 memset(rrcContainer->buf, 0, bufLen);
1555 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1559 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1563 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1565 /*Hardcoded RRC Container from reference logs*/
1566 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1567 char buf[14] ={0x00, 0x04, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 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, buf, bufLen);
1578 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1582 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1584 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1585 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1587 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1593 /*******************************************************************
1595 * @brief Frees the DLRRCMessageTransfer
1599 * Function : freeDlRrcMessageTransfer
1601 * Functionality: Frees the DLRRCMessageTransfer
1605 * @return ROK - success
1608 * ****************************************************************/
1609 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1612 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1616 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1617 if(dlRRCMsg->protocolIEs.list.array)
1620 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1621 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1622 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1624 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1626 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1628 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1632 /*******************************************************************
1634 * @brief Builds and sends the DLRRCMessageTransfer
1638 * Function : BuildAndSendDLRRCMessageTransfer
1640 * Functionality: Constructs the DL RRC Message Transfer and sends
1641 * it to the CU through SCTP.
1645 * @return ROK - success
1648 * ****************************************************************/
1649 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1651 uint8_t elementCnt = 0;
1654 F1AP_PDU_t *f1apMsg = NULLP;
1655 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1656 asn_enc_rval_t encRetVal; /* Encoder return value */
1658 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1660 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1661 if(f1apMsg == NULLP)
1663 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1667 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1668 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1669 if(f1apMsg->choice.initiatingMessage == NULLP)
1671 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1672 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1676 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1677 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1678 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1679 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1682 dlRRCMsg->protocolIEs.list.count = elementCnt;
1683 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1685 /* Initialize the F1Setup members */
1686 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1687 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1689 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1690 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1691 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1695 for(idx=0; idx<elementCnt; idx++)
1697 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1698 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1700 for(ieId=0; ieId<idx; ieId++)
1702 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1704 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1705 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1706 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1711 /* GNB CU UE F1AP ID */
1713 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1714 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1715 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1716 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1718 /* GNB DU UE F1AP ID */
1720 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1721 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1722 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1723 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1727 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1728 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1729 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1730 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1734 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1735 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1736 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1737 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1739 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1741 /* Encode the F1SetupRequest type as APER */
1742 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1744 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1746 /* Encode results */
1747 if(encRetVal.encoded == ENCODE_FAIL)
1749 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1750 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1755 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1756 for(int i=0; i< encBufSize; i++)
1758 DU_LOG("%x",encBuf[i]);
1763 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1765 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1768 freeDlRrcMessageTransfer(f1apMsg);
1770 }/* End of BuildAndSendDLRRCMessageTransfer */
1772 /*******************************************************************
1774 * @brief Function to set the Dl RRC Msg Type
1778 * Function : setDlRRCMsgType
1780 * Functionality: Constructs the UE Setup Response and sends
1781 * it to the DU through SCTP.
1785 * @return ROK - success
1788 * ****************************************************************/
1790 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1792 uint8_t rrcMsgType = 0;
1793 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1796 rrcMsgType = RRC_SETUP;
1798 case RRC_SETUP_COMPLETE:
1799 rrcMsgType = RRC_SETUP_COMPLETE;
1801 case NAS_SECURITY_MODE_COMPLETE:
1802 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1804 case RRC_SECURITY_MODE_COMPLETE:
1805 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1807 case REGISTRATION_COMPLETE:
1808 rrcMsgType = REGISTRATION_COMPLETE;
1810 case UE_CONTEXT_SETUP_RSP:
1811 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1813 case RRC_RECONFIG_COMPLETE:
1814 rrcMsgType = RRC_RECONFIG_COMPLETE;
1823 /*******************************************************************
1825 * @brief fill long cycle offset value of drx
1829 * Function : fillLongCycleOffsetValue
1831 * Functionality: fill long cycle offset value of drx
1833 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1834 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1836 * @return ROK - success
1839 * ****************************************************************/
1840 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *recvedLongCycleOffsetVal)
1843 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1844 switch(recvedLongCycleOffsetVal->present)
1846 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10:
1848 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1851 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20:
1853 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1856 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32:
1858 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1861 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40:
1863 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1866 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60:
1868 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1871 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64:
1873 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1876 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70:
1878 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1881 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80:
1883 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1886 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128:
1888 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1891 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160:
1893 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1896 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256:
1898 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1901 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320:
1903 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1906 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512:
1908 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1911 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640:
1913 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1916 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024:
1918 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1921 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280:
1923 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1926 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048:
1928 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1931 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560:
1933 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1936 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120:
1938 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1941 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240:
1943 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1951 /*******************************************************************
1953 * @brief Extract configuration from DRX_ConfigRrc
1954 * and store the drx configuration in UeCb
1958 * Function : storeDrxCfgInUeCb
1960 * Functionality: Store drx configuration in UeCb
1962 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
1965 * ****************************************************************/
1966 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
1968 switch(drxSetup->drx_onDurationTimer.present)
1970 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
1972 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
1974 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
1975 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
1978 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
1980 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
1981 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
1985 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
1986 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
1987 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
1988 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
1989 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
1990 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
1991 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
1992 if(drxSetup->shortDRX)
1994 drxCfg->shortDrxPres=true;
1995 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
1996 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
1999 drxCfg->shortDrxPres=false;
2003 /*******************************************************************
2005 * @brief Extract configuration from CellGroupConfig
2009 * Function : extractCellGroupConfig
2011 * Functionality: Extract configuration from CellGroupConfig
2012 * and store in local database
2014 * @params[in] UE control block
2017 * @return ROK - success
2020 * ****************************************************************/
2021 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
2023 uint8_t rbIdx, srbIdx, drbIdx;
2024 bool srbFound, drbFound;
2025 SrbInfo *srbCfgDb = NULLP;
2026 DrbInfo *drbCfgDb = NULLP;
2027 RlcLcCfg *rlcLcCfgDb = NULLP;
2028 MacLcCfg *macLcCfgDb = NULLP;
2029 RLC_BearerConfig_t *rlcCfg = NULLP;
2030 RLC_Config_t *rlcLcCfg = NULLP;
2031 LogicalChannelConfig_t *macLcCfg = NULLP;
2038 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2042 if(cellGrpCfg == NULLP)
2044 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2049 if(cellGrpCfg->mac_CellGroupConfig)
2051 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2053 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2055 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2058 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2060 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup)
2062 ueCb->drxCfgPresent = true;
2063 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2068 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2075 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2080 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2082 /* Update SRB configuration in local DB */
2083 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2085 /* Search if SRB entry is already present in DB */
2086 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2088 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2090 srbCfgDb = &ueCb->srbList[srbIdx];
2096 /* If not, add SRB to UE CB's SRB list */
2099 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2100 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2104 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2105 srbCfgDb->cfgSentToUe = false;
2106 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2107 macLcCfgDb = &srbCfgDb->macLcCfg;
2110 /* Update DRB configuration in local DB */
2111 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2113 /* Search if DRB entry is already present in DB */
2114 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2116 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2118 drbCfgDb = &ueCb->drbList[drbIdx];
2124 /* If not, add DRB to UE CB's SRB list */
2127 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2128 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2132 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2133 drbCfgDb->cfgSentToUe = false;
2134 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2135 macLcCfgDb = &drbCfgDb->macLcCfg;
2139 /* Update RLC configuration for this RB */
2140 rlcLcCfg = rlcCfg->rlc_Config;
2141 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2142 switch(rlcLcCfgDb->rlcMode)
2144 case RLC_Config_PR_am:
2146 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2147 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2148 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2149 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2150 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2152 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2153 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2154 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2158 case RLC_Config_PR_um_Bi_Directional:
2160 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2162 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2163 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2168 /* Update MAC configuration for this LC */
2169 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2170 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2171 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2172 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2173 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2174 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2179 /*******************************************************************
2181 * @brief Function to decode DU to CU RRC container
2185 * Function : extractDuToCuRrcCont
2187 * Functionality: Function to decode DU to CU RRC container
2190 * RRC conatiner octect string to be decoded
2192 * @return ROK - success
2195 * ****************************************************************/
2196 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2198 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2199 asn_dec_rval_t rval; /* Decoder return value */
2201 /* Copy the received container to UeCb */
2202 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2204 /* Decoding DU to CU RRC container octet string to cell group config */
2205 cellGrpCfgMsg = &cellGrpCfg;
2206 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2208 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2210 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2212 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2216 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2218 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2220 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2227 /*******************************************************************
2229 * @brief Function to build Initial UL RRC Message
2233 * Function : procInitULRRCMsg
2235 * Functionality: Function to build Initial UL RRC Message
2239 * @return ROK - success
2242 * ****************************************************************/
2244 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2246 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2248 uint16_t cellIdx=0, nrCellId = 0;
2253 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2255 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2257 SEARCH_DU_DB(duIdx, duId, duDb);
2258 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2260 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2262 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2264 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2265 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2268 case ProtocolIE_ID_id_NRCGI:
2269 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2270 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2275 case ProtocolIE_ID_id_C_RNTI:
2276 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2277 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2279 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2280 memset(ueCb, 0, sizeof(CuUeCb));
2281 ueCb->cellCb = cellCb;
2282 ueCb->crnti = crnti;
2283 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2284 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2285 ueCb->state = UE_ATTACH_IN_PROGRESS;
2288 cellCb->ueCb[cellCb->numUe] = ueCb;
2293 case ProtocolIE_ID_id_RRCContainer:
2296 case ProtocolIE_ID_id_DUtoCURRCContainer:
2298 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2299 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2301 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2302 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2303 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2304 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2306 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2307 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2308 ueCb->f1apMsgDb.duToCuContainer.size);
2310 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2312 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2318 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2325 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2334 ueCb->f1apMsgDb.dlRrcMsgCount++;
2335 rrcMsgType = setDlRRCMsgType(ueCb);
2336 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2341 /*******************************************************************
2343 * @brief Builds Nrcgi
2347 * Function : BuildNrcgi
2349 * Functionality: Building the PLMN ID and NR Cell id
2351 * @params[in] NRCGI_t *nrcgi
2352 * @return ROK - success
2355 * ****************************************************************/
2356 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2359 uint8_t unused_bits = 4;
2360 uint8_t byteSize = 5;
2362 /* Allocate Buffer Memory */
2363 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2364 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2365 if(nrcgi->pLMN_Identity.buf == NULLP)
2369 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2375 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2376 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2377 if(nrcgi->nRCellIdentity.buf == NULLP)
2381 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2385 /*******************************************************************
2387 * @brief Builds Special cell list for UE Setup Request
2391 * Function : BuildSplCellList
2393 * Functionality: Constructs the Special Cell list for UESetReq
2395 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2397 * @return ROK - success
2400 * ****************************************************************/
2401 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2407 spCellLst->list.count = cellCnt;
2408 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2409 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2410 if(spCellLst->list.array == NULLP)
2414 for(idx=0; idx<cellCnt; idx++)
2416 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2417 if(spCellLst->list.array[idx] == NULLP)
2423 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2424 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2425 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2427 /* Special Cell ID -NRCGI */
2428 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2433 /*Special Cell Index*/
2434 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2436 }/* End of BuildSplCellList*/
2438 /*******************************************************************
2440 * @brief Builds SRBS to be setup
2444 * Function : BuildSRBSetup
2446 * Functionality: Constructs the SRB's for UESetReq
2448 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2450 * @return ROK - success
2453 * ****************************************************************/
2454 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2459 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2460 srbCnt = ueCb->numSrb;
2463 srbSet->list.count = srbCnt;
2464 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2465 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2466 if(srbSet->list.array == NULLP)
2468 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2472 for(idx=0; idx<srbCnt; idx++)
2474 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2475 if(srbSet->list.array[idx] == NULLP)
2477 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2482 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2485 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2486 srbSet->list.array[idx]->criticality = Criticality_ignore;
2487 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2488 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2489 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2494 for(idx=0; idx<srbCnt; idx++)
2496 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2497 srbSet->list.array[idx]->criticality = Criticality_ignore;
2498 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2499 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2503 }/* End of BuildSRBSetup*/
2505 /*******************************************************************
2507 * @brief Builds QOS Info for DRB Setum Item
2511 * Function : BuildQOSInfo
2513 * Functionality: Constructs the QOS Info for DRB Setup Item
2515 * @params[in] QoSInformation_t *qosinfo
2516 * int16_t pduSessionID
2518 * @return ROK - success
2521 * ****************************************************************/
2522 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2524 uint8_t elementCnt = 0, qosCntIdx = 0;
2525 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2527 /* NonDynamic5QIDescriptor */
2528 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2529 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2530 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2536 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2540 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2541 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2543 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2545 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2551 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2552 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2556 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2557 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2559 /*MaxDataBurstVolume*/
2560 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2561 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2565 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2566 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2569 /*nRGRAN Allocation Retention Priority*/
2572 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2573 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2574 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2578 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2579 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2580 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2582 qosInfo->priorityLevel = PriorityLevel_lowest;
2583 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2584 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2587 /* PDU session ID */
2590 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2591 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2593 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2597 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2598 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2602 elementCnt = NUM_QOS_EXT;
2603 qosIeExt->list.count = elementCnt;
2604 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2606 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2607 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2609 if(qosIeExt->list.array == NULLP)
2611 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2615 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2617 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2618 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2620 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2623 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2624 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2625 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2626 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2627 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2628 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2629 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2630 qosInfo->pduSessionId = pduSessionID;
2635 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2640 }/*End of BuildQOSInfo*/
2642 /*******************************************************************
2644 * @brief Builds SNSSAI
2648 * Function : BuildSNSSAI
2650 * Functionality: Constructs the SNSSAI For DRB list
2652 * @params[in] SNSSAI_t *snssai
2653 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2655 * @return ROK - success
2658 * ****************************************************************/
2659 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2663 snssai->sST.size = sizeof(uint8_t);
2664 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2665 if(snssai->sST.buf == NULLP)
2670 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2672 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2675 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2676 if(snssai->sD == NULLP)
2680 snssai->sD->size = 3 * sizeof(uint8_t);
2681 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2682 if(snssai->sD->buf == NULLP)
2687 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2689 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2692 drbInfo->snssai = snssaiToCopy;
2694 }/*End of BuildSNSSAI*/
2696 /*******************************************************************
2698 * @brief Builds the flow map.
2702 * Function : BuildFlowsMap
2704 * Functionality: Constructs the flowmap For DRB list
2706 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2708 * @return ROK - success
2711 * ****************************************************************/
2712 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2714 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2715 FlowsMapped *qosFlow;
2720 flowCnt = drbInfo->numFlowMap;
2721 flowMap->list.count = flowCnt;
2722 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2723 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2724 if(flowMap->list.array == NULLP)
2726 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2729 for(idx=0; idx<flowCnt; idx++)
2731 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2732 if(flowMap->list.array[idx] == NULLP)
2734 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2740 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2741 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2743 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2745 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2747 qosFlow = &drbInfo->flowMapList[flowIdx];
2754 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2755 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2760 qosFlow = &drbInfo->flowMapList[idx];
2761 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2764 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2765 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2768 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2772 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2773 drbInfo->numFlowMap++;
2776 }/*End of BuildFlowsMap*/
2778 /*******************************************************************
2780 * @brief Builds the Uplink Tunnel Info
2784 * Function : BuildULTnlInfo
2786 * Functionality: Constructs the UL TnlInfo For DRB list
2788 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2790 * @return ROK - success
2793 * ****************************************************************/
2794 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2800 ulInfo->list.count = ulCnt;
2801 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2802 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2803 if(ulInfo->list.array == NULLP)
2805 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2808 for(idx=0; idx<ulCnt; idx++)
2810 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2811 if(ulInfo->list.array[idx] == NULLP)
2813 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2818 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2820 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2821 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2823 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2826 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2827 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2828 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2829 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2831 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2837 /* NOTE: Below IP address must be changed if running on different IP configuration */
2838 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2839 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2840 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2841 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2842 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2844 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2845 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2846 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2847 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2851 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2852 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2853 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2854 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2855 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2859 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2860 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2861 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2862 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2864 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2870 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2871 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2872 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2873 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2875 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2876 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2877 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2878 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2882 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2883 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2884 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2885 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2888 }/*End of BuildULTnlInfo*/
2890 /*******************************************************************
2892 * @brief Builds DRBS to be setup
2896 * Function : BuildDRBSetup
2898 * Functionality: Constructs the DRB's for UESetReq
2900 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2902 * @return ROK - success
2905 * ****************************************************************/
2906 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2908 uint16_t snssaiIdx=0;
2909 uint8_t idx = 0, extIeIdx = 0;
2910 uint8_t elementCnt = 0, drbCnt = 0;
2911 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2912 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2913 DRBs_ToBeSetup_Item_t *drbSetItem;
2914 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2915 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2917 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2918 drbCnt = ueCb->numDrb;
2920 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2921 drbSet->list.count = drbCnt;
2923 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2924 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2925 if(drbSet->list.array == NULLP)
2927 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2931 for(idx=0; idx<drbCnt; idx++)
2933 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2934 if(drbSet->list.array[idx] == NULLP)
2936 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2940 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2941 drbSet->list.array[idx]->criticality = Criticality_ignore;
2942 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2943 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2945 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2947 drbSetItem->dRBID = idx + 1;
2948 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2951 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2954 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2955 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2956 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2958 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2961 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2962 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2963 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2964 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2965 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2966 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2968 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2969 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2970 if(BuildQOSInforet != ROK)
2972 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2977 snssaiIdx = (idx% cuCb.numSnssaiSupported);
2978 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2979 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2980 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
2982 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2983 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
2984 if(BuildSNSSAIret != ROK)
2986 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2990 /*Flows mapped to DRB List*/
2991 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2992 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2993 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2995 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2996 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2997 if(BuildFlowsMapret != ROK)
2999 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
3003 /*ULUPTNLInformation To Be Setup List*/
3004 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3005 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3008 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
3010 if(BuildULTnlInforet != ROK)
3012 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
3017 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3019 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3020 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
3023 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
3025 /* DL PDCP SN Length */
3026 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
3028 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
3029 if(!drbToBeSetupExt)
3031 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3036 drbToBeSetupExt->list.count = elementCnt;
3037 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3039 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3040 if(!drbToBeSetupExt->list.array)
3042 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3046 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3048 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3049 if(!drbToBeSetupExt->list.array[extIeIdx])
3051 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3057 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3059 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3060 drbToBeSetupExtIe->criticality = Criticality_ignore;
3061 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3062 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3063 drbSetItem->iE_Extensions = drbToBeSetupExt;
3066 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3070 }/* End of BuildDRBSetup*/
3072 /*******************************************************************
3074 * @brief Deallocating memory of function BuildAndSendUESetReq
3078 * Function : FreeNrcgi
3080 * Functionality: Deallocating memory for function BuildNrcgi
3082 * @params[in] NRCGI_t *nrcgi
3086 *******************************************************************/
3087 void FreeNrcgi(NRCGI_t *nrcgi)
3089 if(nrcgi->pLMN_Identity.buf != NULLP)
3091 if(nrcgi->nRCellIdentity.buf != NULLP)
3093 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3095 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3098 /*******************************************************************
3100 * @brief Deallocating memory of function BuildAndSendUESetReq
3104 * Function : FreeSplCellList
3106 * Functionality: Deallocating memory for function BuildSplCellList
3108 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3113 * *****************************************************************/
3114 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3117 if(spCellLst->list.array != NULLP)
3119 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3121 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3123 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3125 if(spCellLst->list.array[cellidx]!=NULLP)
3127 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3130 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3133 /*******************************************************************
3135 * @brief Deallocating memory of function BuildAndSendUESetReq
3139 * Function : FreeSRBSetup
3141 * Functionality: Deallocating memory for function BuildSRBSetup
3143 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3148 * ******************************************************************/
3149 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3152 if(srbSet->list.array != NULLP)
3154 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3156 if(srbSet->list.array[srbidx]!=NULLP)
3158 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3161 CU_FREE(srbSet->list.array,srbSet->list.size);
3164 /*******************************************************************
3166 * @brief Deallocating memory of function BuildAndSendUESetReq
3170 * Function : FreeQOSInfo
3172 * Functionality: Deallocating memory for function BuildQOSInfo
3174 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3178 * ****************************************************************/
3179 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3181 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3182 uint8_t qosCntIdx = 0;
3184 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3186 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3188 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3190 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3191 sizeof(MaxDataBurstVolume_t));
3193 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3194 sizeof(AveragingWindow_t));
3196 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3197 sizeof(NonDynamic5QIDescriptor_t));
3199 if(drbQos->iE_Extensions)
3201 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3202 if(qosIeExt->list.array != NULLP)
3204 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3206 if(qosIeExt->list.array[qosCntIdx])
3208 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3211 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3214 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3217 /*******************************************************************
3219 * @brief Deallocating memory of function BuildAndSendUESetReq
3223 * Function : FreeULTnlInfo
3225 * Functionality: Deallocating memory for function BuildULTnlInfo
3227 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3232 * ****************************************************************/
3233 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3236 if(ulInfo->list.array != NULLP)
3238 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3240 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3242 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3244 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3245 transportLayerAddress.buf != NULLP)
3247 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3250 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3251 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3252 gTPTunnel->gTP_TEID.size);
3254 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3255 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3256 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3258 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3259 sizeof(GTPTunnel_t));
3262 if(ulInfo->list.array[ulidx]!=NULLP)
3264 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3267 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3270 /*******************************************************************
3272 * @brief Deallocating memory for BuildAndSendUESetReq
3276 * Function : FreeDRBSetup
3278 * Functionality: Deallocating memory for BuildDRBSetup
3280 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3284 * ****************************************************************/
3285 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3287 DRBs_ToBeSetup_Item_t *drbSetItem;
3288 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3290 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3292 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3293 if(drbSet->list.array != NULLP)
3295 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3297 if(drbSet->list.array[drbidx] != NULLP)
3299 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3300 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3302 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3303 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3305 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3306 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3308 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3309 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3311 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3313 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3315 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3317 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3318 flows_Mapped_To_DRB_List.list.array != NULLP)
3320 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3321 flows_Mapped_To_DRB_List.list.count; flowidx++)
3323 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3324 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3326 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3327 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3328 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3330 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3331 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3332 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3334 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3335 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3336 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3338 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3339 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3341 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3342 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3343 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3344 sizeof(MaxDataBurstVolume_t));
3346 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3347 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3348 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3350 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3351 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3352 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3355 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3356 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3358 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3359 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3362 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3363 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3364 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3366 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3367 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3369 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3370 sizeof(OCTET_STRING_t));
3372 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3373 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3375 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3376 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3378 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3379 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3381 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3382 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3384 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3385 iE_Extensions != NULLP)
3387 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3388 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3389 if(qosIeExt->list.array != NULLP)
3391 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3393 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3395 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3398 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3400 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3401 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3404 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3406 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3409 CU_FREE(drbSet->list.array,drbSet->list.size);
3414 /*******************************************************************
3416 * @brief Free the UE Setup Request
3420 * Function : FreeUeContextSetupReq
3422 * Functionality: Deallocate the memory of BuildUESetReq
3424 * @params[in] F1AP_PDU_t *f1apMsg
3429 * ****************************************************************/
3430 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3433 UEContextSetupRequest_t *ueSetReq = NULLP;
3435 if(f1apMsg != NULLP)
3437 if(f1apMsg->choice.initiatingMessage != NULLP)
3439 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3440 if(ueSetReq->protocolIEs.list.array != NULLP)
3442 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3444 if(ueSetReq->protocolIEs.list.array[idx])
3446 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3448 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3450 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3452 case ProtocolIE_ID_id_SpCell_ID:
3453 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3455 case ProtocolIE_ID_id_ServCellIndex:
3457 case ProtocolIE_ID_id_SpCellULConfigured:
3459 case ProtocolIE_ID_id_CUtoDURRCInformation:
3460 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3462 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3463 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3465 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3466 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3468 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3469 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3471 case ProtocolIE_ID_id_RRCContainer:
3472 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3474 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3475 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3478 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3479 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3480 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3483 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3487 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3489 for(ieId=0; ieId<idx; ieId++)
3491 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3493 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3496 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3498 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3500 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3504 /**Filling cell group info **/
3505 /*******************************************************************
3507 * @brief Build Control resource set to add/modify list
3511 * Function : BuildControlRSetToAddModList
3513 * Functionality: Build Control resource set to add/modify list
3516 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3518 * @return ROK - success
3521 * ****************************************************************/
3522 uint8_t BuildControlRSetToAddModList
3524 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3529 uint8_t numBytes, bitsUnused;
3530 struct ControlResourceSet *controlRSet;
3531 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3532 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3535 controlRSetList->list.count = elementCnt;
3536 controlRSetList->list.size = \
3537 elementCnt * sizeof(struct ControlResourceSet *);
3539 controlRSetList->list.array = NULLP;
3540 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3541 if(!controlRSetList->list.array)
3543 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3547 for(idx = 0; idx < elementCnt; idx++)
3549 controlRSetList->list.array[idx] = NULLP;
3550 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3551 if(!controlRSetList->list.array[idx])
3553 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3559 controlRSet = controlRSetList->list.array[idx];
3560 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3562 /* Values harcoded according to our design:
3565 * Bit string stored ff0000000000
3569 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3570 controlRSet->frequencyDomainResources.buf = NULLP;
3571 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3572 controlRSet->frequencyDomainResources.size);
3573 if(!controlRSet->frequencyDomainResources.buf)
3575 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3579 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3580 coreset0EndPrb = CORESET0_END_PRB;
3581 coreset1StartPrb = coreset0EndPrb + 6;
3582 coreset1NumPrb = CORESET1_NUM_PRB;
3583 /* calculate the PRBs */
3584 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3585 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3586 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3588 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3589 controlRSet->cce_REG_MappingType.present = \
3590 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3592 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3593 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3594 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3595 controlRSet->tci_PresentInDCI = NULLP;
3597 uint8_t tciStateIdx;
3599 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3600 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3601 if(!controlRset->tci_StatesPDCCH_ToAddList)
3603 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3608 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3609 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3610 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3611 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3612 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3614 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3618 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3620 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3621 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3623 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3630 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3632 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3633 if(!controlRset->tci_PresentInDCI)
3635 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3639 *(controlRset->tci_PresentInDCI);
3642 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3643 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3644 if(!controlRSet->pdcch_DMRS_ScramblingID)
3646 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3649 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3652 } /* End BuildControlRSetToAddModList */
3654 /*******************************************************************
3656 * @brief Build search space to add/modify list
3660 * Function : BuildSearchSpcToAddModList
3662 * Functionality: Build search space to add/modify list
3665 * @return ROK - success
3668 * ****************************************************************/
3669 uint8_t BuildSearchSpcToAddModList
3671 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3679 struct SearchSpace *searchSpc;
3682 searchSpcList->list.count = elementCnt;
3683 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3685 searchSpcList->list.array = NULLP;
3686 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3687 if(!searchSpcList->list.array)
3689 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3693 for(idx = 0; idx < elementCnt; idx++)
3695 searchSpcList->list.array[idx] = NULLP;
3696 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3697 if(!searchSpcList->list.array[idx])
3699 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3705 searchSpc = searchSpcList->list.array[idx];
3707 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3709 searchSpc->controlResourceSetId = NULLP;
3710 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3711 if(!searchSpc->controlResourceSetId)
3713 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3716 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3718 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3719 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3720 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3721 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3723 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3726 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3727 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3729 searchSpc->duration = NULLP;
3730 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3731 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3732 if(!searchSpc->monitoringSymbolsWithinSlot)
3734 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3738 /* Values taken from reference logs :
3741 * Bit string stores 8000
3746 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3747 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3748 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3749 searchSpc->monitoringSymbolsWithinSlot->size);
3750 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3752 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3757 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3758 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3759 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3760 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3762 searchSpc->nrofCandidates = NULLP;
3763 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3764 if(!searchSpc->nrofCandidates)
3766 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3770 searchSpc->nrofCandidates->aggregationLevel1 = \
3771 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3772 searchSpc->nrofCandidates->aggregationLevel2 = \
3773 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3774 searchSpc->nrofCandidates->aggregationLevel4 = \
3775 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3776 searchSpc->nrofCandidates->aggregationLevel8 = \
3777 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3778 searchSpc->nrofCandidates->aggregationLevel16 = \
3779 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3781 searchSpc->searchSpaceType = NULLP;
3782 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3783 if(!searchSpc->searchSpaceType)
3785 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3789 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3791 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3792 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3793 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3794 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3796 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3799 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3800 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3803 }/* End BuildSearchSpcToAddModList */
3805 /*******************************************************************
3807 * @brief Builds BWP DL dedicated PDCCH config
3811 * Function : BuildBWPDlDedPdcchCfg
3813 * Functionality: Builds BWP DL dedicated PDCCH config
3815 * @params[in] struct PDCCH_Config *pdcchCfg
3817 * @return ROK - success
3820 * ****************************************************************/
3821 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3823 pdcchCfg->controlResourceSetToAddModList = NULLP;
3824 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3825 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3826 if(!pdcchCfg->controlResourceSetToAddModList)
3828 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3832 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3837 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3839 pdcchCfg->searchSpacesToAddModList = NULLP;
3840 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3841 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3842 if(!pdcchCfg->searchSpacesToAddModList)
3844 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3848 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3853 pdcchCfg->searchSpacesToReleaseList = NULLP;
3854 pdcchCfg->downlinkPreemption = NULLP;
3855 pdcchCfg->tpc_PUSCH = NULLP;
3856 pdcchCfg->tpc_PUCCH = NULLP;
3857 pdcchCfg->tpc_SRS = NULLP;
3862 /*******************************************************************
3864 * @brief Builds DMRS DL PDSCH Mapping type A
3868 * Function : BuildDMRSDLPdschMapTypeA
3870 * Functionality: Builds DMRS DL PDSCH Mapping type A
3873 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3874 * @return ROK - success
3877 * ****************************************************************/
3878 uint8_t BuildDMRSDLPdschMapTypeA
3880 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3883 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3884 dmrsDlCfg->choice.setup = NULLP;
3885 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3886 if(!dmrsDlCfg->choice.setup)
3888 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3892 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3893 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3894 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3895 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3897 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3900 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3902 dmrsDlCfg->choice.setup->maxLength = NULLP;
3903 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3904 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3905 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3910 /*******************************************************************
3912 * @brief Builds TCI states to add/modify list
3916 * Function : BuildTCIStatesToAddModList
3918 * Functionality:Builds TCI states to add/modify list
3921 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3923 * @return ROK - success
3926 * ****************************************************************/
3927 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3932 /*******************************************************************
3934 * @brief Builds PDSCH time domain allocation list
3938 * Function : BuildPdschTimeDomAllocList
3940 * Functionality: Builds PDSCH time domain allocation list
3943 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3945 * @return ROK - success
3948 * ****************************************************************/
3949 uint8_t BuildPdschTimeDomAllocList
3951 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3956 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3958 timeDomAllocList->present = \
3959 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3961 timeDomAllocList->choice.setup = NULLP;
3962 CU_ALLOC(timeDomAllocList->choice.setup, \
3963 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3964 if(!timeDomAllocList->choice.setup)
3966 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3971 timeDomAllocList->choice.setup->list.count = elementCnt;
3972 timeDomAllocList->choice.setup->list.size = \
3973 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3975 timeDomAllocList->choice.setup->list.array = NULLP;
3976 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3977 timeDomAllocList->choice.setup->list.size);
3978 if(!timeDomAllocList->choice.setup->list.array)
3980 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3984 for(idx = 0; idx < elementCnt; idx++)
3986 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3987 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3988 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3989 if(!timeDomAllocList->choice.setup->list.array[idx])
3991 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3997 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3998 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3999 if(!timeDomAlloc->k0)
4001 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4004 *(timeDomAlloc->k0) = 0;
4005 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4006 timeDomAlloc->startSymbolAndLength = 66;
4009 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4010 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4011 if(!timeDomAlloc->k0)
4013 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4016 *(timeDomAlloc->k0) = 1;
4017 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4018 timeDomAlloc->startSymbolAndLength = 66;
4023 /*******************************************************************
4025 * @brief Builds PDSCH PRB Bundling type
4029 * Function : BuildPdschPrbBundlingType
4031 * Functionality: Builds PDSCH PRB Bundling type
4034 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4036 * @return ROK - success
4039 * ****************************************************************/
4040 uint8_t BuildPdschPrbBundlingType
4042 struct PDSCH_Config__prb_BundlingType *prbBndlType
4045 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4047 prbBndlType->choice.staticBundling = NULLP;
4048 CU_ALLOC(prbBndlType->choice.staticBundling, \
4049 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4050 if(!prbBndlType->choice.staticBundling)
4052 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4055 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4060 /*******************************************************************
4062 * @brief Builds BWP DL dedicated PDSCH config
4066 * Function : BuildBWPDlDedPdschCfg
4068 * Functionality: Builds BWP DL dedicated PDSCH config
4070 * @params[in] struct PDSCH_Config *pdschCfg
4072 * @return ROK - success
4075 * ****************************************************************/
4076 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4078 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4080 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4081 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4082 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4083 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4085 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4089 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4094 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4095 pdschCfg->tci_StatesToAddModList = NULLP;
4096 pdschCfg->tci_StatesToReleaseList = NULLP;
4097 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4099 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4100 if(!pdschCfg->tci_StatesToAddModList)
4102 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4105 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4111 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4113 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4114 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4115 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4116 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4118 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4121 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4125 pdschCfg->pdsch_AggregationFactor = NULLP;
4126 pdschCfg->rateMatchPatternToAddModList = NULLP;
4127 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4128 pdschCfg->rateMatchPatternGroup1 = NULLP;
4129 pdschCfg->rateMatchPatternGroup2 = NULLP;
4130 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4131 pdschCfg->mcs_Table = NULLP;
4133 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4134 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4135 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4137 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4140 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4142 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4147 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4148 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4149 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4150 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4151 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4152 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4153 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4158 /*******************************************************************
4160 * @brief Builds intitial DL BWP
4163 * Function : BuildInitialDlBWP
4165 * Functionality: Builds intitial DL BWP in spCellCfgDed
4167 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4169 * @return ROK - success
4172 * ****************************************************************/
4173 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4175 dlBwp->pdcch_Config = NULLP;
4176 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4177 if(!dlBwp->pdcch_Config)
4179 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4182 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4184 dlBwp->pdcch_Config->choice.setup = NULLP;
4185 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4186 if(!dlBwp->pdcch_Config->choice.setup)
4188 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4191 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4196 dlBwp->pdsch_Config = NULLP;
4197 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4198 if(!dlBwp->pdsch_Config)
4200 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4203 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4205 dlBwp->pdsch_Config->choice.setup = NULLP;
4206 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4207 if(!dlBwp->pdsch_Config->choice.setup)
4209 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4213 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4218 dlBwp->sps_Config = NULLP;
4219 dlBwp->radioLinkMonitoringConfig = NULLP;
4223 /*******************************************************************
4225 * @brief Builds DMRS UL Pusch Mapping type A
4229 * Function : BuildDMRSULPuschMapTypeA
4231 * Functionality: Builds DMRS UL Pusch Mapping type A
4234 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4235 * @return ROK - success
4238 * ****************************************************************/
4239 uint8_t BuildDMRSULPuschMapTypeA
4241 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4244 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4245 dmrsUlCfg->choice.setup= NULLP;
4246 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4247 if(!dmrsUlCfg->choice.setup)
4249 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4253 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4254 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4255 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4256 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4258 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4261 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4263 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4264 dmrsUlCfg->choice.setup->maxLength = NULLP;
4265 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4266 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4267 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4268 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4270 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4274 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4275 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4277 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4279 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4282 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4284 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4285 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4289 /*******************************************************************
4291 * @brief Build PUSCH time domain allocation list
4295 * Function : BuildPuschTimeDomAllocList
4297 * Functionality: Build PUSCH time domain allocation list
4300 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4302 * @return ROK - success
4305 * ****************************************************************/
4306 uint8_t BuildPuschTimeDomAllocList
4308 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4313 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4315 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4316 timeDomAllocList->choice.setup = NULLP;
4317 CU_ALLOC(timeDomAllocList->choice.setup, \
4318 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4319 if(!timeDomAllocList->choice.setup)
4321 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4326 timeDomAllocList->choice.setup->list.count = elementCnt;
4327 timeDomAllocList->choice.setup->list.size = \
4328 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4329 timeDomAllocList->choice.setup->list.array = NULLP;
4330 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4331 timeDomAllocList->choice.setup->list.size);
4332 if(!timeDomAllocList->choice.setup->list.array)
4334 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4338 for(idx = 0; idx < elementCnt; idx++)
4340 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4341 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4342 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4343 if(!timeDomAllocList->choice.setup->list.array[idx])
4345 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4351 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4352 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4353 if(!timeDomAlloc->k2)
4355 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4358 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4359 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4360 timeDomAlloc->startSymbolAndLength = 66;
4363 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4364 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4365 if(!timeDomAlloc->k2)
4367 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4370 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4371 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4372 timeDomAlloc->startSymbolAndLength = 66;
4377 /*******************************************************************
4379 * @brief Builds BWP UL dedicated PUSCH Config
4383 * Function : BuildBWPUlDedPuschCfg
4386 * Builds BWP UL dedicated PUSCH Config
4388 * @params[in] : PUSCH_Config_t *puschCfg
4390 * @return ROK - success
4393 * ****************************************************************/
4394 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4396 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4397 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4398 if(!puschCfg->dataScramblingIdentityPUSCH)
4400 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4403 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4405 puschCfg->txConfig = NULLP;
4406 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4407 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4408 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4409 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4411 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4415 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4420 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4421 puschCfg->pusch_PowerControl = NULLP;
4422 puschCfg->frequencyHopping = NULLP;
4423 puschCfg->frequencyHoppingOffsetLists = NULLP;
4424 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4426 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4427 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4428 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4429 if(!puschCfg->pusch_TimeDomainAllocationList)
4431 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4435 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4440 puschCfg->pusch_AggregationFactor = NULLP;
4441 puschCfg->mcs_Table = NULLP;
4442 puschCfg->mcs_TableTransformPrecoder = NULLP;
4443 puschCfg->transformPrecoder = NULLP;
4444 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4445 if(!puschCfg->transformPrecoder)
4447 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4450 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4452 puschCfg->codebookSubset = NULLP;
4453 puschCfg->maxRank = NULLP;
4454 puschCfg->rbg_Size = NULLP;
4455 puschCfg->uci_OnPUSCH = NULLP;
4456 puschCfg->tp_pi2BPSK = NULLP;
4461 /*******************************************************************
4463 * @brief Builds BWP UL dedicated PUCCH Config
4467 * Function : BuildBWPUlDedPucchCfg
4470 * Builds BWP UL dedicated PUCCH Config
4472 * @params[in] : PUCCH_Config_t *pucchCfg
4474 * @return ROK - success
4477 * ****************************************************************/
4478 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4480 uint8_t arrIdx, elementCnt;
4481 uint8_t rsrcIdx, rsrcSetIdx;
4482 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4483 PUCCH_Resource_t *rsrc = NULLP;
4487 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4488 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4489 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4490 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4491 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4493 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4496 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4497 rsrcSet->pucch_ResourceSetId = 1;
4499 rsrcSet->resourceList.list.count = elementCnt;
4500 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4501 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4502 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4504 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4507 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4511 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4512 pucchCfg->resourceToAddModList->list.count = elementCnt;
4513 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4514 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4515 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4517 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4520 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4521 rsrc->pucch_ResourceId = 1;
4522 rsrc->startingPRB = 0;
4523 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4524 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4525 rsrc->format.choice.format1->initialCyclicShift = 0;
4526 rsrc->format.choice.format1->nrofSymbols = 4;
4527 rsrc->format.choice.format1->startingSymbolIndex = 0;
4528 rsrc->format.choice.format1->timeDomainOCC = 0;
4531 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4532 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4533 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4534 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4535 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4538 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4539 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4541 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4546 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4547 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4548 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4549 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4551 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4555 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4557 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4558 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4560 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4566 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4567 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4572 /*******************************************************************
4574 * @brief Fills SRS resource to add/modify list
4578 * Function : BuildSrsRsrcAddModList
4580 * Functionality: Fills SRS resource to add/modify list
4583 * @return ROK - success
4586 * ****************************************************************/
4587 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4593 resourceList->list.count = elementCnt;
4594 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4595 resourceList->list.array = NULLP;
4596 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4597 if(!resourceList->list.array)
4599 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4603 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4605 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4606 if(!resourceList->list.array[rsrcIdx])
4608 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4614 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4615 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4616 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4618 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4619 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4620 sizeof(struct SRS_Resource__transmissionComb__n2));
4621 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4623 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4626 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4627 = SRS_COMB_OFFSET_N2;
4628 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4629 = SRS_CYCLIC_SHIFT_N2;
4631 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4632 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4633 SRS_Resource__resourceMapping__nrofSymbols_n1;
4634 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4635 SRS_Resource__resourceMapping__repetitionFactor_n1;
4637 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4638 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4639 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4640 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4641 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4642 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4643 SRS_Resource__groupOrSequenceHopping_neither;
4645 /* Setting resource type to aperiodic for intergration purposes */
4646 resourceList->list.array[rsrcIdx]->resourceType.present = \
4647 SRS_Resource__resourceType_PR_aperiodic;
4648 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4649 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4650 sizeof(struct SRS_Resource__resourceType__aperiodic));
4651 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4653 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4656 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4661 /*******************************************************************
4663 * @brief Build SRS resource set Add/mod list
4667 * Function : BuildSrsRsrcSetAddModList
4669 * Functionality: Build SRS resource set Add/mod list
4672 * @return ROK - success
4675 * ****************************************************************/
4676 uint8_t BuildSrsRsrcSetAddModList
4678 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4684 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4687 rsrcSetList->list.count = elementCnt;
4688 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4689 rsrcSetList->list.array = NULLP;
4690 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4691 if(!rsrcSetList->list.array)
4693 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4697 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4699 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4700 if(!rsrcSetList->list.array[rSetIdx])
4702 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4708 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4710 /* Fill Resource Id list in resource set */
4711 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4712 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4713 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4714 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4716 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4721 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4722 rsrcIdList->list.count = elementCnt;
4723 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4724 rsrcIdList->list.array = NULLP;
4725 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4726 if(!rsrcIdList->list.array)
4728 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4732 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4734 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4735 if(!rsrcIdList->list.array[rsrcIdx])
4737 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4743 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4745 /* Fill resource type */
4746 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4747 SRS_ResourceSet__resourceType_PR_aperiodic;
4749 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4750 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4751 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4752 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4754 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4757 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4758 = APERIODIC_SRS_RESRC_TRIGGER;
4760 /* TODO : Fill values for below IEs as expected by Viavi */
4761 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4762 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4765 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4766 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4767 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4768 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4769 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4774 /*******************************************************************
4776 * @brief Builds BWP UL dedicated SRS Config
4780 * Function : BuildBWPUlDedSrsCfg
4782 * Functionality: Builds BWP UL dedicated SRS Config
4784 * @params[in] SRS Config
4785 * @return ROK - success
4788 * ****************************************************************/
4789 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4791 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4792 srsCfg->srs_ResourceSetToAddModList = NULLP;
4793 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4794 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4795 if(!srsCfg->srs_ResourceSetToAddModList)
4797 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4800 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4805 srsCfg->srs_ResourceToReleaseList = NULLP;
4807 /* Resource to Add/Modify list */
4808 srsCfg->srs_ResourceToAddModList = NULLP;
4809 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4810 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4811 if(!srsCfg->srs_ResourceToAddModList)
4813 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4817 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4822 srsCfg->tpc_Accumulation = NULLP;
4827 /*******************************************************************
4829 * @brief Builds inital UL BWP
4833 * Function : BuildInitialUlBWP
4835 * Functionality: Builds initial UL BWP
4837 * @params[in] BWP_UplinkDedicated_t *ulBwp
4838 * @return ROK - success
4841 * ****************************************************************/
4842 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4844 ulBwp->pucch_Config = NULLP;
4845 ulBwp->pucch_Config = NULLP;
4846 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4847 if(!ulBwp->pucch_Config)
4849 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4853 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4854 ulBwp->pucch_Config->choice.setup = NULLP;
4855 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4856 if(!ulBwp->pucch_Config->choice.setup)
4858 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4862 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4867 /* Fill BWP UL dedicated PUSCH config */
4868 ulBwp->pusch_Config = NULLP;
4869 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4870 if(!ulBwp->pusch_Config)
4872 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4876 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4877 ulBwp->pusch_Config->choice.setup = NULLP;
4878 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4879 if(!ulBwp->pusch_Config->choice.setup)
4881 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4885 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4890 ulBwp->configuredGrantConfig = NULLP;
4892 /* Fill BPW UL dedicated SRS config */
4893 ulBwp->srs_Config = NULLP;
4894 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4895 if(!ulBwp->srs_Config)
4897 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4901 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4902 ulBwp->srs_Config->choice.setup = NULLP;
4903 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4904 if(!ulBwp->srs_Config->choice.setup)
4906 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4910 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4915 ulBwp->beamFailureRecoveryConfig = NULLP;
4920 /*******************************************************************
4922 * @brief Builds Pusch Serving cell Config
4926 * Function : BuildPuschSrvCellCfg
4928 * Functionality: Builds Pusch Serving cell Config
4930 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4932 * @return ROK - success
4935 * ****************************************************************/
4936 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4938 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4939 puschCfg->choice.setup = NULLP;
4940 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4941 if(!puschCfg->choice.setup)
4943 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4947 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4948 puschCfg->choice.setup->rateMatching = NULLP;
4949 puschCfg->choice.setup->xOverhead = NULLP;
4950 puschCfg->choice.setup->ext1 = NULLP;
4951 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4952 if(!puschCfg->choice.setup->ext1)
4954 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4958 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4959 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4960 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4962 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4965 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4967 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4968 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4969 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4971 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4974 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4978 /*******************************************************************
4980 * @brief Builds UL config
4983 * Function : BuildUlCfg
4985 * Functionality: Builds UL config in spCellCfgDed
4987 * @params[in] UplinkConfig_t *ulCfg
4989 * @return ROK - success
4992 * ****************************************************************/
4993 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4995 ulCfg->initialUplinkBWP = NULLP;
4996 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4997 if(!ulCfg->initialUplinkBWP)
4999 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5003 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
5008 ulCfg->uplinkBWP_ToReleaseList = NULLP;
5009 ulCfg->uplinkBWP_ToAddModList = NULLP;
5010 ulCfg->firstActiveUplinkBWP_Id = NULLP;
5011 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5012 if(!ulCfg->firstActiveUplinkBWP_Id)
5014 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5017 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5019 ulCfg->pusch_ServingCellConfig = NULLP;
5020 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
5021 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5022 if(!ulCfg->pusch_ServingCellConfig)
5024 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5028 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5033 ulCfg->carrierSwitching = NULLP;
5034 ulCfg->ext1 = NULLP;
5038 /*******************************************************************
5040 * @brief Builds PDSCH serving cell config
5043 * Function : BuildPdschSrvCellCfg
5045 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5047 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5049 * @return ROK - success
5052 * ****************************************************************/
5053 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5055 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5056 pdschCfg->choice.setup = NULLP;
5057 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5058 if(!pdschCfg->choice.setup)
5060 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5064 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5065 pdschCfg->choice.setup->xOverhead = NULLP;
5066 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5067 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5068 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5070 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5073 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5074 pdschCfg->choice.setup->pucch_Cell = NULLP;
5075 pdschCfg->choice.setup->ext1 = NULLP;
5080 /*******************************************************************
5082 * @brief Builds CSI Meas config
5085 * Function : BuildCsiMeasCfg
5087 * Functionality: Builds CSI Meas config in spCellCfgDed
5089 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5091 * @return ROK - success
5094 * ****************************************************************/
5095 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5101 /*******************************************************************
5103 * @brief Builds Spcell config dedicated
5106 * Function : BuildSpCellCfgDed
5108 * Functionality: Builds sp cell config dedicated in spCellCfg
5110 * @params[in] ServingCellConfig_t srvCellCfg
5112 * @return ROK - success
5115 * ****************************************************************/
5116 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5118 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5120 srvCellCfg->initialDownlinkBWP = NULLP;
5121 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5122 if(!srvCellCfg->initialDownlinkBWP)
5124 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5128 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5130 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5133 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5134 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5136 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5137 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5138 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5140 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5143 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5145 srvCellCfg->bwp_InactivityTimer = NULLP;
5147 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5148 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5149 if(!srvCellCfg->defaultDownlinkBWP_Id)
5151 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5154 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5156 srvCellCfg->uplinkConfig = NULLP;
5157 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5158 if(!srvCellCfg->uplinkConfig)
5160 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5164 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5166 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5169 srvCellCfg->supplementaryUplink = NULLP;
5170 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5172 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5173 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5174 if(!srvCellCfg->pdsch_ServingCellConfig)
5176 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5180 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5182 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5186 srvCellCfg->csi_MeasConfig = NULLP;
5188 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5189 if(!srvCellCfg->csi_MeasConfig)
5191 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5195 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5197 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5201 srvCellCfg->sCellDeactivationTimer = NULLP;
5202 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5203 srvCellCfg->tag_Id = TAG_ID;
5204 srvCellCfg->dummy = NULLP;
5205 srvCellCfg->pathlossReferenceLinking = NULLP;
5206 srvCellCfg->servingCellMO = NULLP;
5207 srvCellCfg->ext1 = NULLP;
5211 /*******************************************************************
5213 * @brief Builds Spcell config
5217 * Function : BuildSpCellCfg
5219 * Functionality: Builds sp cell config in DuToCuRrcContainer
5221 * @params[in] SpCellConfig_t spCellCfg
5223 * @return ROK - success
5226 * ****************************************************************/
5227 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5230 spCellCfg->servCellIndex = NULLP;
5231 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5232 if(!spCellCfg->servCellIndex)
5234 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5237 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5239 spCellCfg->reconfigurationWithSync = NULLP;
5240 spCellCfg->rlf_TimersAndConstants = NULLP;
5241 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5242 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5243 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5245 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5248 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5250 spCellCfg->spCellConfigDedicated = NULLP;
5251 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5252 if(!spCellCfg->spCellConfigDedicated)
5254 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5257 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5259 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5264 /*******************************************************************
5266 * @brief Builds Phy cell group config
5270 * Function : BuildPhyCellGrpCfg
5272 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5274 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5276 * @return ROK - success
5279 * ****************************************************************/
5280 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5282 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5283 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5285 phyCellGrpCfg->p_NR_FR1 = NULLP;
5286 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5287 if(!phyCellGrpCfg->p_NR_FR1)
5289 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5292 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5293 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5294 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5295 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5296 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5297 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5298 phyCellGrpCfg->cs_RNTI = NULLP;
5299 phyCellGrpCfg->ext1 = NULLP;
5300 phyCellGrpCfg->ext2 = NULLP;
5305 /*******************************************************************
5307 * @brief Builds tag config
5311 * Function : BuildTagConfig
5313 * Functionality: Builds tag config in MacCellGroupConfig
5315 * @params[in] TAG_Config *tag_Config
5317 * @return ROK - success
5320 * ****************************************************************/
5321 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5323 struct TAG_Config__tag_ToAddModList *tagList;
5324 uint8_t idx, elementCnt;
5326 tagConfig->tag_ToReleaseList = NULLP;
5327 tagConfig->tag_ToAddModList = NULLP;
5328 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5329 if(!tagConfig->tag_ToAddModList)
5331 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5335 elementCnt = 1; //ODU_VALUE_ONE;
5336 tagList = tagConfig->tag_ToAddModList;
5337 tagList->list.count = elementCnt;
5338 tagList->list.size = elementCnt * sizeof(struct TAG *);
5340 tagList->list.array = NULLP;
5341 CU_ALLOC(tagList->list.array, tagList->list.size);
5342 if(!tagList->list.array)
5344 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5348 for(idx=0; idx<tagList->list.count; idx++)
5350 tagList->list.array[idx] = NULLP;
5351 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5352 if(!tagList->list.array[idx])
5354 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5360 tagList->list.array[idx]->tag_Id = TAG_ID;
5361 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5366 /*******************************************************************
5368 * @brief Builds PHR Config
5372 * Function : BuildPhrConfig
5374 * Functionality: Builds phrConfig in MacCellGroupConfig
5376 * @params[in] PHR Config *
5378 * @return ROK - success
5381 * ****************************************************************/
5382 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5385 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5386 phrConfig->choice.setup = NULLP;
5387 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5388 if(!phrConfig->choice.setup)
5390 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5394 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5395 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5396 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5397 phrConfig->choice.setup->multiplePHR = false;
5398 phrConfig->choice.setup->dummy = false;
5399 phrConfig->choice.setup->phr_Type2OtherCell = false;
5400 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5405 /*******************************************************************
5407 * @brief Builds BSR Config
5411 * Function : BuildBsrConfig
5413 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5415 * @params[in] BSR_Config *bsrConfig
5417 * @return ROK - success
5420 * ****************************************************************/
5421 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5423 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5424 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5425 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5430 /*******************************************************************
5432 * @brief Builds scheduling request config
5436 * Function : BuildSchedulingReqConfig
5438 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5440 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5442 * @return ROK - success
5445 * ****************************************************************/
5446 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5448 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5449 uint8_t idx, elementCnt;
5451 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5452 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5453 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5454 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5456 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5460 elementCnt = 1; //ODU_VALUE_ONE;
5461 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5462 schReqList->list.count = elementCnt;
5463 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5465 schReqList->list.array = NULLP;
5466 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5467 if(!schReqList->list.array)
5469 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5473 for(idx=0;idx<schReqList->list.count; idx++)
5475 schReqList->list.array[idx] = NULLP;
5476 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5477 if(!schReqList->list.array[idx])
5479 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5485 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5487 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5488 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5489 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5491 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5494 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5495 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5496 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5500 /*******************************************************************
5502 * @brief Builds Mac cell group config
5506 * Function : BuildMacCellGrpCfg
5508 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5510 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5512 * @return ROK - success
5515 * ****************************************************************/
5516 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5518 macCellGrpCfg->drx_ConfigRrc = NULLP;
5519 macCellGrpCfg->schedulingRequestConfig = NULLP;
5520 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5521 if(!macCellGrpCfg->schedulingRequestConfig)
5523 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5527 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5529 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5533 macCellGrpCfg->bsr_Config = NULLP;
5534 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5535 if(!macCellGrpCfg->bsr_Config)
5537 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5541 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5543 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5547 macCellGrpCfg->tag_Config = NULLP;
5548 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5549 if(!macCellGrpCfg->tag_Config)
5551 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5555 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5557 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5561 macCellGrpCfg->phr_Config = NULLP;
5562 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5563 if(!macCellGrpCfg->phr_Config)
5565 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5569 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5571 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5575 macCellGrpCfg->skipUplinkTxDynamic = false;
5576 macCellGrpCfg->ext1 = NULLP;
5580 /*******************************************************************
5582 * @brief Frees memeory allocated for SearchSpcToAddModList
5586 * Function : FreeSearchSpcToAddModList
5588 * Functionality: Deallocating memory of SearchSpcToAddModList
5590 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5594 4221 * ****************************************************************/
5595 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5599 struct SearchSpace *searchSpc=NULLP;
5601 if(searchSpcList->list.array)
5603 if(searchSpcList->list.array[idx2])
5605 searchSpc = searchSpcList->list.array[idx2];
5606 if(searchSpc->controlResourceSetId)
5608 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5610 if(searchSpc->monitoringSymbolsWithinSlot)
5612 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5614 if(searchSpc->nrofCandidates)
5616 if(searchSpc->searchSpaceType)
5618 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5619 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5620 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5621 SearchSpace__searchSpaceType));
5623 CU_FREE(searchSpc->nrofCandidates,
5624 sizeof(struct SearchSpace__nrofCandidates));
5626 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5627 searchSpc->monitoringSymbolsWithinSlot->size);
5629 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5630 sizeof(BIT_STRING_t));
5632 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5633 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5635 CU_FREE(searchSpc->controlResourceSetId,
5636 sizeof(ControlResourceSetId_t));
5639 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5641 CU_FREE(searchSpcList->list.array[idx1],
5642 sizeof(struct SearchSpace));
5644 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5647 /*******************************************************************
5649 * @brief Frees memory allocated for PdschTimeDomAllocList
5653 * Function : FreePdschTimeDomAllocList
5655 * Functionality: Deallocating memory of PdschTimeDomAllocList
5657 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5661 4221 * ****************************************************************/
5662 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5666 if(timeDomAllocList->choice.setup)
5668 if(timeDomAllocList->choice.setup->list.array)
5670 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5672 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5673 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5675 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5676 timeDomAllocList->choice.setup->list.size);
5678 CU_FREE(timeDomAllocList->choice.setup,\
5679 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5682 /*******************************************************************
5684 * @brief Frees memory allocated for PuschTimeDomAllocList
5688 * Function : FreePuschTimeDomAllocList
5690 * Functionality: Deallocating memory of PuschTimeDomAllocList
5692 * @params[in] PUSCH_Config_t *puschCfg
5696 ***********************************************************************/
5697 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5701 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5703 if(puschCfg->pusch_TimeDomainAllocationList)
5705 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5706 if(timeDomAllocList_t->choice.setup)
5708 if(timeDomAllocList_t->choice.setup->list.array)
5710 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5711 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5713 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5714 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5716 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5717 timeDomAllocList_t->choice.setup->list.size);
5719 CU_FREE(timeDomAllocList_t->choice.setup, \
5720 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5722 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5723 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5724 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5729 /*******************************************************************
5731 * @brief Frees memory allocated for Dedicated PUCCH config
5735 * Function : FreeBWPUlDedPucchCfg
5737 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5739 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5743 * ****************************************************************/
5744 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5746 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5747 PUCCH_Config_t *pucchCfg = NULLP;
5748 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5749 PUCCH_Resource_t *rsrc = NULLP;
5753 if(ulBwpPucchCfg->choice.setup)
5755 pucchCfg = ulBwpPucchCfg->choice.setup;
5757 //Free resource set list
5758 if(pucchCfg->resourceSetToAddModList)
5760 if(pucchCfg->resourceSetToAddModList->list.array)
5762 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5764 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5765 if(rsrcSet->resourceList.list.array)
5767 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5769 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5771 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5773 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5775 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5777 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5780 //Free resource list
5781 if(pucchCfg->resourceToAddModList)
5783 if(pucchCfg->resourceToAddModList->list.array)
5785 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5787 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5788 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5789 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5791 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5793 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5797 if(pucchCfg->format1)
5799 if(pucchCfg->format1->choice.setup)
5801 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5802 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5804 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5808 if(pucchCfg->dl_DataToUL_ACK)
5810 if(pucchCfg->dl_DataToUL_ACK->list.array)
5812 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5814 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5816 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5818 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5821 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5823 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5827 /*******************************************************************
5829 * @brief Frees memory allocated for InitialUlBWP
5833 * Function : FreeInitialUlBWP
5835 * Functionality: Deallocating memory of InitialUlBWP
5837 * @params[in] BWP_UplinkDedicated_t *ulBwp
5841 * ****************************************************************/
5842 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5844 uint8_t rSetIdx, rsrcIdx;
5845 SRS_Config_t *srsCfg = NULLP;
5846 PUSCH_Config_t *puschCfg = NULLP;
5847 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5848 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5849 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5850 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5852 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5854 if(ulBwp->pusch_Config)
5856 if(ulBwp->pusch_Config->choice.setup)
5858 puschCfg=ulBwp->pusch_Config->choice.setup;
5859 if(puschCfg->dataScramblingIdentityPUSCH)
5861 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5863 FreePuschTimeDomAllocList(puschCfg);
5864 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5865 if(dmrsUlCfg->choice.setup)
5867 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5869 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5871 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5873 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5874 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5876 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5879 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5881 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5882 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5884 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5886 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5888 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5890 /* Free SRS-Config */
5891 if(ulBwp->srs_Config)
5893 if(ulBwp->srs_Config->choice.setup)
5895 srsCfg = ulBwp->srs_Config->choice.setup;
5897 /* Free Resource Set to add/mod list */
5898 if(srsCfg->srs_ResourceSetToAddModList)
5900 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5901 if(rsrcSetList->list.array)
5905 /* Free SRS resource Id list in this SRS resource set */
5906 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5908 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5910 if(rsrcIdList->list.array)
5912 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5914 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5916 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5918 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5919 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5922 /* Free resource type info for this SRS resource set */
5923 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5924 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5926 /* Free memory for each resource set */
5927 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5929 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5931 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5933 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5934 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5937 /* Free resource to add/modd list */
5938 if(srsCfg->srs_ResourceToAddModList)
5940 resourceList = srsCfg->srs_ResourceToAddModList;
5941 if(resourceList->list.array)
5944 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5945 sizeof(struct SRS_Resource__transmissionComb__n2));
5946 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5947 sizeof(struct SRS_Resource__resourceType__aperiodic));
5949 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5951 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5953 CU_FREE(resourceList->list.array, resourceList->list.size);
5955 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5956 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5959 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5961 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5965 /*******************************************************************
5967 * @brief Frees memory allocated for initialUplinkBWP
5971 * Function : FreeinitialUplinkBWP
5973 * Functionality: Deallocating memory of initialUplinkBWP
5975 * @params[in] UplinkConfig_t *ulCfg
5980 * ****************************************************************/
5981 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5983 BWP_UplinkDedicated_t *ulBwp=NULLP;
5984 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5986 if(ulCfg->initialUplinkBWP)
5988 ulBwp=ulCfg->initialUplinkBWP;
5989 if(ulCfg->firstActiveUplinkBWP_Id)
5991 if(ulCfg->pusch_ServingCellConfig)
5993 puschCfg=ulCfg->pusch_ServingCellConfig;
5994 if(puschCfg->choice.setup)
5996 if(puschCfg->choice.setup->ext1)
5998 CU_FREE(puschCfg->choice.setup->ext1->\
5999 processingType2Enabled,sizeof(BOOLEAN_t));
6000 CU_FREE(puschCfg->choice.setup->ext1->\
6001 maxMIMO_Layers,sizeof(long));
6002 CU_FREE(puschCfg->choice.setup->ext1, \
6003 sizeof(struct PUSCH_ServingCellConfig__ext1));
6005 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
6007 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
6009 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
6011 FreeInitialUlBWP(ulBwp);
6012 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6015 /*******************************************************************
6017 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6021 * Function : FreeBWPDlDedPdschCfg
6023 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6025 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6030 * ****************************************************************/
6031 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6033 struct PDSCH_Config *pdschCfg=NULLP;
6034 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6035 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6036 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6038 if(dlBwp->pdsch_Config->choice.setup)
6040 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6041 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6043 if(pdschCfg->pdsch_TimeDomainAllocationList)
6045 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6046 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6048 prbBndlType=&pdschCfg->prb_BundlingType;
6049 CU_FREE(prbBndlType->choice.staticBundling,\
6050 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6051 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6053 FreePdschTimeDomAllocList(timeDomAllocList);
6054 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6055 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6057 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6058 if(dmrsDlCfg->choice.setup)
6060 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6062 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6064 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6065 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6067 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6070 /*******************************************************************
6072 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6076 * Function : FreeBWPDlDedPdcchCfg
6078 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6080 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6085 * ****************************************************************/
6086 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6090 struct PDCCH_Config *pdcchCfg=NULLP;
6091 struct ControlResourceSet *controlRSet=NULLP;
6092 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6094 if(dlBwp->pdcch_Config->choice.setup)
6096 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6097 if(pdcchCfg->controlResourceSetToAddModList)
6099 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6100 if(controlRSetList->list.array)
6102 controlRSet = controlRSetList->list.array[idx2];
6105 if(controlRSet->frequencyDomainResources.buf)
6107 if(controlRSet->pdcch_DMRS_ScramblingID)
6109 if(pdcchCfg->searchSpacesToAddModList)
6111 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6112 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6113 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6115 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6117 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6118 controlRSet->frequencyDomainResources.size);
6121 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6123 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6125 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6127 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6128 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6130 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6133 /*******************************************************************
6135 * @brief Builds RLC Config
6139 * Function : BuildRlcConfig
6141 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6143 * @params[in] RLC_Config *rlcConfig
6145 * @return ROK - success
6148 * ****************************************************************/
6149 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6151 rlcConfig->present = rlcLcCfgDb.rlcMode;
6153 switch(rlcConfig->present)
6155 case RLC_Config_PR_am:
6157 rlcConfig->choice.am = NULLP;
6158 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6159 if(!rlcConfig->choice.am)
6161 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6166 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6167 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6168 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6170 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6173 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6174 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6175 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6176 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6177 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6180 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6181 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6182 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6184 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6187 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6188 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6189 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6194 case RLC_Config_PR_um_Bi_Directional:
6196 rlcConfig->choice.um_Bi_Directional = NULLP;
6197 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6198 if(!rlcConfig->choice.um_Bi_Directional)
6200 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6205 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6206 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6207 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6209 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6212 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6215 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6216 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6217 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6219 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6222 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6223 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6230 /*******************************************************************
6232 * @brief Builds MAC LC Config
6236 * Function : BuildMacLCConfig
6238 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6240 * @params[in] struct LogicalChannelConfig macLcConfig
6242 * @return ROK - success
6245 * ****************************************************************/
6246 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6249 macLcConfig->ul_SpecificParameters = NULLP;
6250 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6251 if(!macLcConfig->ul_SpecificParameters)
6253 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6257 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6258 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6259 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6260 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6261 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6262 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6263 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6265 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6266 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6267 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6269 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6272 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6274 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6275 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6276 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6278 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6281 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6283 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6284 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6285 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6289 /*******************************************************************
6291 * @brief Builds RLC Bearer to Add/Mod list
6295 * Function :BuildRlcBearerToAddModList
6297 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6299 * @params[in] rlc_BearerToAddModList
6301 * @return ROK - success
6304 * ****************************************************************/
6305 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6307 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6310 elementCnt = ueCb->numSrb + ueCb->numDrb;
6313 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6315 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6319 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6321 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6328 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6331 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6334 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6337 rlcBearerList->list.count = elementCnt;
6338 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6340 rlcBearerList->list.array = NULLP;
6341 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6342 if(!rlcBearerList->list.array)
6344 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6348 for(idx=0; idx<rlcBearerList->list.count; idx++)
6350 rlcBearerList->list.array[idx] = NULLP;
6351 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6352 if(!rlcBearerList->list.array[idx])
6354 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6361 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6363 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6366 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6368 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6369 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6371 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6375 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6376 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6378 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6379 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6380 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6381 if(!rlcBearerList->list.array[idx]->rlc_Config)
6383 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6387 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6389 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6393 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6394 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6395 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6397 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6401 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6403 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6409 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6411 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6414 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6416 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6417 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6419 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6423 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6424 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6426 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6427 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6428 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6429 if(!rlcBearerList->list.array[idx]->rlc_Config)
6431 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6435 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6437 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6441 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6442 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6443 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6445 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6449 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6451 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6459 /*******************************************************************
6461 * @brief Free memory allocated for CellGroupConfig
6465 * Function : FreeMemCellGrpCfg
6467 * Functionality: Deallocating memory of CellGroupConfig
6469 * @params[in] pointer to CellGroupConfigRrc_t
6471 * @return ROK - success
6474 ******************************************************************/
6475 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6478 SpCellConfig_t *spCellCfg=NULLP;
6479 ServingCellConfig_t *srvCellCfg=NULLP;
6480 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6481 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6482 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6483 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6484 struct RLC_Config *rlcConfig=NULLP;
6485 struct LogicalChannelConfig *macLcConfig=NULLP;
6486 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6487 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6488 struct TAG_Config *tagConfig=NULLP;
6489 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6490 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6491 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6493 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6496 if(rlcBearerList->list.array)
6498 for(idx=0; idx<rlcBearerList->list.count; idx++)
6500 if(rlcBearerList->list.array[idx])
6502 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6503 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6506 if(rlcConfig->choice.am)
6508 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6509 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6510 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6512 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6514 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6517 if(macLcConfig->ul_SpecificParameters)
6519 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6520 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6521 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6523 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6525 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6528 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6530 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6533 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6536 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6537 if(schedulingRequestConfig)
6539 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6542 if(schReqList->list.array)
6544 for(idx=0;idx<schReqList->list.count; idx++)
6546 if(schReqList->list.array[idx])
6548 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6549 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6552 CU_FREE(schReqList->list.array, schReqList->list.size);
6554 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6555 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6556 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6558 if(macCellGrpCfg->bsr_Config)
6560 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6562 tagConfig = macCellGrpCfg->tag_Config;
6565 tagList = tagConfig->tag_ToAddModList;
6568 if(tagList->list.array)
6570 for(idx=0; idx<tagList->list.count; idx++)
6572 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6574 CU_FREE(tagList->list.array, tagList->list.size);
6576 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6578 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6581 phrConfig = macCellGrpCfg->phr_Config;
6584 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6585 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6588 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6591 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6594 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6595 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6598 spCellCfg = cellGrpCfg->spCellConfig;
6601 if(spCellCfg->servCellIndex)
6603 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6605 if(spCellCfg->spCellConfigDedicated)
6607 srvCellCfg = spCellCfg->spCellConfigDedicated;
6608 if(srvCellCfg->initialDownlinkBWP)
6610 dlBwp = srvCellCfg->initialDownlinkBWP;
6611 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6613 if(srvCellCfg->defaultDownlinkBWP_Id)
6615 if(srvCellCfg->uplinkConfig)
6617 if(srvCellCfg->pdsch_ServingCellConfig)
6619 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6620 if(pdschCfg->choice.setup)
6622 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6623 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6625 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6626 ServingCellConfig__pdsch_ServingCellConfig));
6628 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6629 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6631 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6633 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6635 if(dlBwp->pdcch_Config)
6637 if(dlBwp->pdsch_Config)
6639 FreeBWPDlDedPdschCfg(dlBwp);
6640 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6642 FreeBWPDlDedPdcchCfg(dlBwp);
6643 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6645 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6647 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6649 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6651 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6653 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6658 /*******************************************************************
6660 * @brief Fills CellGroupConfig
6664 * Function : fillCellGrpCfg
6666 * Functionality: Fills CellGroupConfig
6668 * @params[in] pointer to CellGroupConfigRrc_t
6670 * @return ROK - success
6673 ******************************************************************/
6675 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6677 uint8_t ret = RFAILED;
6678 CellGroupConfigRrc_t cellGrpCfg;
6679 asn_enc_rval_t encRetVal;
6683 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6685 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6687 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6689 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6693 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6694 cellGrpCfg.mac_CellGroupConfig = NULLP;
6695 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6696 if(!cellGrpCfg.mac_CellGroupConfig)
6698 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6701 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6703 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6707 cellGrpCfg.physicalCellGroupConfig = NULLP;
6708 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6709 if(!cellGrpCfg.physicalCellGroupConfig)
6711 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6714 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6716 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6720 cellGrpCfg.spCellConfig = NULLP;
6721 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6722 if(!cellGrpCfg.spCellConfig)
6724 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6727 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6729 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6733 cellGrpCfg.sCellToAddModList = NULLP;
6734 cellGrpCfg.sCellToReleaseList = NULLP;
6735 cellGrpCfg.ext1 = NULLP;
6737 /* encode cellGrpCfg into duToCuRrcContainer */
6738 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6739 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6741 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6742 /* Encode results */
6743 if(encRetVal.encoded == ENCODE_FAIL)
6745 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6746 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6751 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6752 for(int i=0; i< encBufSize; i++)
6754 DU_LOG("%x",encBuf[i]);
6758 cellGrp->size = encBufSize;
6759 CU_ALLOC(cellGrp->buf, cellGrp->size);
6762 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6765 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6769 FreeMemCellGrpCfg(&cellGrpCfg);
6773 /*******************************************************************
6775 * @brief Free UE Capability RAT container
6779 * Function : freeUeCapRatCont
6782 * Free UE Capability RAT conatiner
6785 * @return ROK - success
6788 * ****************************************************************/
6789 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6792 FeatureSets_t *featureSets;
6794 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6796 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6798 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6799 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6801 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6804 if(ueNrCap->featureSets)
6806 featureSets = ueNrCap->featureSets;
6807 if(featureSets->featureSetsDownlinkPerCC)
6809 if(featureSets->featureSetsDownlinkPerCC->list.array)
6811 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6813 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6814 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6815 sizeof(ModulationOrder_t));
6816 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6818 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6820 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6823 if(featureSets->featureSetsUplinkPerCC)
6825 if(featureSets->featureSetsUplinkPerCC->list.array)
6827 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6829 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6831 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6832 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6833 sizeof(ModulationOrder_t));
6834 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6837 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6839 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6841 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6845 /*******************************************************************
6847 * @brief Free UE capability RAT container list
6851 * Function : freeUeCapRatContList
6853 * Functionality: Free UE capability RAT container list
6856 * @return ROK - success
6859 * ****************************************************************/
6860 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6863 if(ueCapablityList->list.array)
6865 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6867 if(ueCapablityList->list.array[idx])
6868 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6870 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6874 /*******************************************************************
6876 * @brief Free Handover preparation information
6880 * Function : freeHOPreparationInfo
6882 * Functionality: Free Handover preparation information
6885 * @return ROK - success
6888 * ****************************************************************/
6889 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6891 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6893 if(hoPrep->criticalExtensions.choice.c1)
6895 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6897 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6898 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6899 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6900 sizeof(HandoverPreparationInformationRrc_IEs_t));
6902 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6906 /*******************************************************************
6908 * @brief Fill feature sets
6912 * Function : fillFeatureSets
6914 * Functionality: Fill feature sets
6917 * @return ROK - success
6920 * ****************************************************************/
6921 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6923 uint8_t idx, elementCnt;
6925 featureSets->featureSetsDownlink = NULLP;
6926 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6927 if(!featureSets->featureSetsDownlinkPerCC)
6929 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6934 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6935 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6936 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6937 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6939 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6943 for(idx = 0; idx < elementCnt; idx++)
6945 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6946 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6948 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6954 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6955 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6956 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6957 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6958 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6960 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6961 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6963 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6966 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6968 featureSets->featureSetsUplink = NULLP;
6969 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6970 if(!featureSets->featureSetsUplinkPerCC)
6972 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6977 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6978 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6979 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6980 if(!featureSets->featureSetsUplinkPerCC->list.array)
6982 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6986 for(idx = 0; idx < elementCnt; idx++)
6988 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6989 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6991 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6997 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6998 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6999 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
7000 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
7001 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
7002 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
7004 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
7005 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
7007 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
7010 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
7015 /*******************************************************************
7017 * @brief Fill UE capability RAT container
7021 * Function : fillUeCapRatCont
7023 * Functionality: Fill UE capability RAT container
7025 * @params[in] UE Capability RAT container buffer
7026 * @return ROK - success
7029 * ****************************************************************/
7030 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
7033 uint8_t idx, elementCnt;
7034 asn_enc_rval_t encRetVal;
7035 UE_NR_Capability_t ueNrCap;
7039 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7041 /* Filling PDCP parameters */
7042 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7043 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7044 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7045 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7046 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7047 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7048 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7049 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7050 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7051 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7052 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7053 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7054 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7055 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7056 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7057 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7058 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7060 ueNrCap.rlc_Parameters = NULLP;
7061 ueNrCap.mac_Parameters = NULLP;
7063 /* Filling PHY parameters */
7064 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7065 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7066 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7067 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7068 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7070 /* Filling RF parameters */
7072 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7073 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7074 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7075 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7077 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7082 for(idx = 0; idx < elementCnt; idx++)
7084 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7085 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7095 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7096 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7097 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7099 ueNrCap.measAndMobParameters = NULLP;
7100 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7101 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7102 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7103 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7104 ueNrCap.featureSets = NULLP;
7106 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7107 if(!ueNrCap.featureSets)
7109 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7114 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7116 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7121 ueNrCap.featureSetCombinations = NULLP;
7122 ueNrCap.lateNonCriticalExtension = NULLP;
7123 ueNrCap.nonCriticalExtension = NULLP;
7125 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7126 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7127 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7129 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7131 /* Encode results */
7132 if(encRetVal.encoded == ENCODE_FAIL)
7134 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7135 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7140 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7141 for(int i=0; i< encBufSize; i++)
7143 DU_LOG("%x",encBuf[i]);
7147 ueCapRatContBuf->size = encBufSize;
7148 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7149 if(!ueCapRatContBuf->buf)
7151 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7154 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7158 freeUeCapRatCont(&ueNrCap);
7162 /*******************************************************************
7164 * @brief Fill UE Capability RAT container list
7168 * Function : fillUeCapRatContList
7170 * Functionality: Fill UE Capability RAT container list
7173 * @params[in] UE capability RAT container list
7174 * @return ROK - success
7177 * ****************************************************************/
7178 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7180 uint8_t ret = RFAILED;
7181 uint8_t idx, elementCnt;
7186 ueCapablityList->list.count = elementCnt;
7187 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7189 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7190 if(!ueCapablityList->list.array)
7192 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7197 for(idx=0; idx<elementCnt; idx++)
7199 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7200 if(ueCapablityList->list.array[idx] == NULLP)
7202 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7208 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7209 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7211 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7222 /*******************************************************************
7224 * @brief Fill UE Capability RAT container list octet string
7228 * Function : fillUeCapRatContListBuf
7230 * Functionality: Fill UE Capability RAT container list octet string
7233 * @params[in] UE capability RAT container list buffer
7234 * @return ROK - success
7237 * ****************************************************************/
7238 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7240 uint8_t ret = RFAILED;
7241 asn_enc_rval_t encRetVal;
7242 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7246 ret = fillUeCapRatContList(&ueCapablityList);
7249 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7253 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7254 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7255 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7257 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7258 &ueCapablityList, PrepFinalEncBuf, encBuf);
7260 /* Encode results */
7261 if(encRetVal.encoded == ENCODE_FAIL)
7263 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7264 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7269 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7270 for(int i=0; i< encBufSize; i++)
7272 DU_LOG("%x",encBuf[i]);
7276 ueCapablityListBuf->size = encBufSize;
7277 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7278 if(!ueCapablityListBuf->buf)
7280 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7283 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7287 freeUeCapRatContList(&ueCapablityList);
7291 /*******************************************************************
7293 * @brief Free Measurement Timing Configuration
7297 * Function : freeMeasuementTimingConfig
7299 * Functionality: Free Measurement Timing Configuration
7301 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7304 * ****************************************************************/
7305 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7308 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7309 MeasTiming_t *measTiming = NULLP;
7311 if(measTimingConfig.criticalExtensions.choice.c1)
7313 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7315 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7316 if(measTimingCfg->measTiming)
7318 if(measTimingCfg->measTiming->list.array)
7320 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7322 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7323 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7324 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7326 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7328 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7330 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7332 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7336 /*******************************************************************
7338 * @brief Fill Measurement Timing Configuration
7342 * Function : fillMeasTimingCfg
7344 * Functionality: Fill Measurement Timing Configuration
7346 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7347 * @return ROK - success
7350 * ****************************************************************/
7351 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7353 uint8_t elementCnt = 0;
7354 uint8_t measCfgIdx = 0;
7355 MeasTiming_t *measTiming;
7358 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7359 if(!measTimingCfg->measTiming)
7361 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7366 measTimingCfg->measTiming->list.count = elementCnt;
7367 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7368 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7369 if(!measTimingCfg->measTiming->list.array)
7371 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7375 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7377 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7378 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7380 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7386 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7387 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7388 if(!measTiming->frequencyAndTiming)
7390 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7394 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7395 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7397 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7398 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7399 smtc->periodicityAndOffset.choice.sf20 = 0;
7400 smtc->duration = SSB_MTC__duration_sf1;
7404 /*******************************************************************
7406 * @brief Fill Measurement Timing Configuration Octet string
7410 * Function : fillMeasConfigBuf
7412 * Functionality: Fill Measurement Timing Configuration Octet string
7415 * @params[in] MeasConfig_t *measConfgBuf
7416 * @return ROK - success
7419 * ****************************************************************/
7420 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7422 uint8_t ret = RFAILED;
7423 asn_enc_rval_t encRetVal;
7424 MeasurementTimingConfigurationRrc_t measTimingConfig;
7428 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7429 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7430 if(!measTimingConfig.criticalExtensions.choice.c1)
7432 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7435 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7437 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7438 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7440 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7444 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7447 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7451 /* Encode measurement timing configuration into octet string */
7452 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7453 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7455 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7457 /* Encode results */
7458 if(encRetVal.encoded == ENCODE_FAIL)
7460 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7461 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7466 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7467 for(int i=0; i< encBufSize; i++)
7469 DU_LOG("%x",encBuf[i]);
7473 measTimingConfigBuf->size = encBufSize;
7474 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7475 if(!measTimingConfigBuf->buf)
7477 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7480 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7484 freeMeasuementTimingConfig(measTimingConfig);
7488 /******************************************************************
7490 * @brief Free RRC reconfiguration non-critical extension
7494 * Function : freeRrcReconfigNonCriticalExt
7496 * Functionality: Free RRC reconfiguration non-critical extension
7498 * @params[in] RRC reconfiguration IE
7501 * ****************************************************************/
7502 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7504 if(rrcRecfg->masterCellGroup)
7506 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7510 /******************************************************************
7512 * @brief Free measurement object addmod list
7516 * Function : freeMeasObjToAddModList
7518 * Functionality: Free measurement object add mod list
7520 * @params[in] Measurement object add/mod list
7523 * ****************************************************************/
7524 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7527 MeasObjectNR_t *measObject;
7529 if(measObjList->list.array)
7531 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7533 if(measObjList->list.array[objIdx])
7535 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7537 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7538 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7539 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7540 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7541 if(measObject->absThreshSS_BlocksConsolidation)
7543 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7544 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7545 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7546 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7548 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7549 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7550 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7551 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7552 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7554 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7557 CU_FREE(measObjList->list.array, measObjList->list.size);
7561 /******************************************************************
7563 * @brief Free report config add mod list
7567 * Function : freeReportCfgToAddModList
7569 * Functionality: Free report config add mod list
7571 * @params[in] Report config list
7574 * ****************************************************************/
7575 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7577 uint8_t reportCfgIdx;
7578 ReportConfigToAddMod_t *reportCfg;
7579 ReportConfigNR_t *reportCfgNr;
7580 EventTriggerConfig_t *eventTriggCfg;
7582 if(reportCfgList->list.array)
7584 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7586 if(reportCfgList->list.array[reportCfgIdx])
7588 reportCfg = reportCfgList->list.array[reportCfgIdx];
7589 if(reportCfg->reportConfig.choice.reportConfigNR)
7591 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7592 if(reportCfgNr->reportType.choice.eventTriggered)
7594 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7595 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7596 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7597 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7598 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7602 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7604 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7608 /******************************************************************
7610 * @brief Free measurement id to add mod list
7614 * Function : freeMeasIdToAddModList
7616 * Functionality: Free measurement id to add mod list
7618 * @params[in] Measurement id to add mod list
7621 * ****************************************************************/
7622 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7625 if(measIdList->list.array)
7627 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7629 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7631 CU_FREE(measIdList->list.array, measIdList->list.size);
7635 /*******************************************************************
7637 * @brief Free quantity config
7641 * Function : freeQunatityConfig
7643 * Functionality: Free quantity config
7645 * @params[in] Quantity Config
7648 * ****************************************************************/
7649 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7652 QuantityConfigNR_t *quantityCfgNr;
7654 if(quantityCfg->quantityConfigNR_List)
7656 if(quantityCfg->quantityConfigNR_List->list.array)
7658 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7660 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7662 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7663 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7664 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7665 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7666 if(quantityCfgNr->quantityConfigRS_Index)
7668 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7669 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7670 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7671 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7673 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7676 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7678 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7682 /******************************************************************
7684 * @brief Free measurement Config
7688 * Function : freeMeasConfig
7690 * Functionality: Free measurement config
7692 * @params[in] Measurement config
7695 * ****************************************************************/
7696 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7698 if(measConfig->measObjectToAddModList)
7700 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7701 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7703 if(measConfig->reportConfigToAddModList)
7705 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7706 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7708 if(measConfig->measIdToAddModList)
7710 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7711 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7713 if(measConfig->s_MeasureConfig)
7715 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7717 if(measConfig->quantityConfig)
7719 freeQuantityConfig(measConfig->quantityConfig);
7720 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7723 /******************************************************************
7725 * @brief Free DRB to AddMod List
7729 * Function : freeDrbToAddModList
7731 * Functionality: Free SRB to AddMod List
7733 * @params[in] SBR to add/mod list
7736 * ****************************************************************/
7737 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7740 if(drbToAddList->list.array)
7742 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7744 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7746 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7748 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7749 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7750 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7751 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7753 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7754 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7756 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7758 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7762 /******************************************************************
7764 * @brief Free SRB to AddMod List
7768 * Function : freeSrbToAddModList
7770 * Functionality: Free SRB to AddMod List
7772 * @params[in] SBR to add/mod list
7775 * ****************************************************************/
7776 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7779 if(srbToAddList->list.array)
7781 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7783 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7784 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7786 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7787 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7790 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7792 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7796 /******************************************************************
7798 * @brief Free Radio Bearer Config
7802 * Function : freeRadioBearerConfig
7804 * Functionality: Free Radio Bearer config
7806 * @params[in] Radio bearer config
7809 * ****************************************************************/
7810 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7812 if(radioBearerConfig->srb_ToAddModList)
7814 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7815 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7817 if(radioBearerConfig->drb_ToAddModList)
7819 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7820 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7824 /******************************************************************
7826 * @brief Free reconfiguration message
7830 * Function : freeRrcReconfig
7832 * Functionality: Free reconfiguration message
7834 * @params[in] RRC Reconfiguration message
7837 * ****************************************************************/
7838 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7840 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7842 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7844 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7845 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7847 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7849 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7850 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7852 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7854 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7855 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7857 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7861 /******************************************************************
7863 * @brief Fill SRB To Add Mod list
7867 * Function : fillSrbToAddModList
7869 * Functionality: fill SRB to Add Mod list
7871 * @params[in] UE control block
7872 * SRB to Add/Mod list
7873 * @return ROK - success
7876 * ****************************************************************/
7877 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7879 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7882 elementCnt = ueCb->numSrb;
7885 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7887 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7894 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7898 srbToAddList->list.count = elementCnt;
7899 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7901 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7902 if(!srbToAddList->list.array)
7904 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7909 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7911 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7914 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7915 if(!srbToAddList->list.array[srbIdx])
7917 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7921 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7923 /* Reestablish PDCP */
7924 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7925 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7927 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7930 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7932 /* PDCP configuration */
7933 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7934 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7936 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7940 /* Reordering timer */
7941 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7942 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7944 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7947 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7954 /******************************************************************
7956 * @biief Fill DRBeTo Add Mod list
7960 * Function : fillDrbToAddModList
7962 * Functionality: fill DRB to Add Mod list
7964 * @params[in] UE control block
7965 * DRB to Add/Mod list
7966 * @return ROK - success
7969 * ****************************************************************/
7970 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7972 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7975 elementCnt = ueCb->numDrb;
7978 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7980 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7987 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7992 drbToAddList->list.count = elementCnt;
7993 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7995 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7996 if(!drbToAddList->list.array)
7998 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
8003 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
8005 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
8008 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
8009 if(!drbToAddList->list.array[drbIdx])
8011 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
8016 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
8019 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
8020 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
8022 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
8026 /* PDCP Config -> DRB */
8027 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
8028 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
8030 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8034 /* DRB -> Discard Timer */
8035 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8036 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8038 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8041 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8043 /* UL PDCP SN length */
8044 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8045 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8047 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8050 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8052 /* DL PDCP SN length */
8053 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8054 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8056 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8059 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8061 /* Header Compression */
8062 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8063 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8065 /* Reordering timer */
8066 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8067 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8069 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8072 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8080 /******************************************************************
8082 * @brief Fill Radio bearer configuration
8086 * Function : fillRadioBearerConfig
8088 * Functionality: Fill Radio bearer configuration
8090 * @params[in] UE control block
8091 * Radio bearer config pointer
8092 * @return ROK - success
8095 * ****************************************************************/
8096 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8098 /* SRB To Add/Mod List */
8099 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8100 if(!radioBearerConfig->srb_ToAddModList)
8102 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8105 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8107 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8111 /* DRB To Add/Mod List */
8112 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8113 if(!radioBearerConfig->drb_ToAddModList)
8115 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8118 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8120 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8127 /*******************************************************************
8129 * @brief Fill measurement object to add/mod list
8133 * Function : fillMeasObjToAddModList
8135 * Functionality: Fill measurement object to add/mod list
8137 * @params[in] Measurement object to add/mod list
8138 * @return ROK - success
8141 * ****************************************************************/
8142 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8144 uint8_t elementCnt, objIdx;
8145 MeasObjectNR_t *measObject;
8148 measObjList->list.count = elementCnt;
8149 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8151 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8152 if(!measObjList->list.array)
8154 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8158 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8160 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8161 if(!measObjList->list.array[objIdx])
8163 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8169 measObjList->list.array[objIdx]->measObjectId = 1;
8170 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8171 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8172 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8174 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8178 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8181 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8182 if(!measObject->ssbFrequency)
8184 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8187 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8189 /* Subcarrier spacing */
8190 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8191 if(!measObject->ssbSubcarrierSpacing)
8193 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8196 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8199 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8200 if(!measObject->smtc1)
8202 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8205 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8206 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8207 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8209 /* Absoulute threshold SSB consolidation */
8210 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8211 if(!measObject->absThreshSS_BlocksConsolidation)
8213 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8217 /* RSRP threshold */
8218 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8219 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8221 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8224 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8226 /* RSRQ threshold */
8227 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8228 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8230 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8233 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8235 /* SINR threshold */
8236 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8237 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8239 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8242 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8244 /* Number of SSBs to average */
8245 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8246 if(!measObject->nrofSS_BlocksToAverage)
8248 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8251 *(measObject->nrofSS_BlocksToAverage) = 2;
8253 /* Quantity Config index */
8254 measObject->quantityConfigIndex = 1;
8257 /* RSRP offset for SSB */
8258 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8259 if(!measObject->offsetMO.rsrpOffsetSSB)
8261 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8264 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8266 /* RSRQ offset for SSB */
8267 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8268 if(!measObject->offsetMO.rsrpOffsetSSB)
8270 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8273 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8275 /* SINR offset for SSB */
8276 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8277 if(!measObject->offsetMO.sinrOffsetSSB)
8279 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8282 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8287 /*******************************************************************
8289 * @brief Fill Report configuration to Add/mod list
8293 * Function : fillReportCfgToAddModList
8295 * Functionality: Fill Report configuration to Add/mod list
8297 * @params[in] Report Config To Add/Mod List
8298 * @return ROK - success
8301 * ****************************************************************/
8302 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8305 uint8_t reportCfgIdx;
8306 ReportConfigToAddMod_t *reportCfg;
8307 ReportConfigNR_t *reportCfgNr;
8308 EventTriggerConfig_t *eventTriggCfg;
8311 reportCfgList->list.count = elementCnt;
8312 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8314 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8315 if(!reportCfgList->list.array)
8317 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8321 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8323 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8324 if(!reportCfgList->list.array[reportCfgIdx])
8326 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8332 reportCfg = reportCfgList->list.array[reportCfgIdx];
8333 reportCfg->reportConfigId = 1;
8334 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8336 /* Report Configuration for NR */
8337 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8338 if(!reportCfg->reportConfig.choice.reportConfigNR)
8340 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8343 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8346 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8347 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8348 if(!reportCfgNr->reportType.choice.eventTriggered)
8350 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8353 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8356 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8357 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8358 if(!eventTriggCfg->eventId.choice.eventA3)
8360 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8364 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8365 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8366 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8367 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8368 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8369 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8371 /* Reference Signal Type */
8372 eventTriggCfg->rsType = NR_RS_Type_ssb;
8374 /* Report Interval */
8375 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8378 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8380 /* Report Quantity cell */
8381 eventTriggCfg->reportQuantityCell.rsrp = true;
8382 eventTriggCfg->reportQuantityCell.rsrq = false;
8383 eventTriggCfg->reportQuantityCell.sinr = false;
8385 /* Maximum reported cells */
8386 eventTriggCfg->maxReportCells = 3;
8388 /* Report qunatity RS Indexes */
8389 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8390 if(!eventTriggCfg->reportQuantityRS_Indexes)
8392 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8395 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8396 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8397 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8399 /* Maximum number of RS indexes to report */
8400 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8401 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8403 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8406 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8408 /* Include Beam measurement */
8409 eventTriggCfg->includeBeamMeasurements = false;
8414 /*******************************************************************
8416 * @brief Fill measurement Id to add/mod list
8420 * Function : fillMeasIdToAddModList
8422 * Functionality: Fill measurement Id to add/mod list
8424 * @params[in] Measurement Id to add/mod list
8425 * @return ROK - success
8428 * ****************************************************************/
8429 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8435 measIdList->list.count = elementCnt;
8436 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8438 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8439 if(!measIdList->list.array)
8444 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8446 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8447 if(!measIdList->list.array[measIdIdx])
8453 measIdList->list.array[measIdIdx]->measId = 1;
8454 measIdList->list.array[measIdIdx]->measObjectId = 1;
8455 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8460 /*******************************************************************
8462 * @brief Fill s-measurement configuration
8466 * Function : fillSMeasConfig
8468 * Functionality: Fill s-measurement configuration
8470 * @params[in] s-Measurement config
8471 * @return ROK - success
8474 * ****************************************************************/
8475 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8477 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8478 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8483 /*******************************************************************
8485 * @brief Fill quantity config
8489 * Function : fillQunatityConfig
8491 * Functionality: Fill quantity config
8493 * @params[in] Quantity Config
8494 * @return ROK - success
8497 * ****************************************************************/
8498 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8500 uint8_t elementCnt = 0;
8501 uint8_t quanCfgIdx = 0;
8502 QuantityConfigNR_t *quantityCfgNr;
8504 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8505 if(!quantityCfg->quantityConfigNR_List)
8511 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8512 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8514 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8515 if(!quantityCfg->quantityConfigNR_List->list.array)
8520 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8522 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8523 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8530 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8532 /* Quantity Config of Reference signal */
8533 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8534 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8538 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8540 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8541 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8545 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8547 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8548 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8552 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8554 /* Quantity Config RS index */
8555 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8556 if(!quantityCfgNr->quantityConfigRS_Index)
8561 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8562 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8566 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8568 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8569 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8573 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8575 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8576 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8580 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8585 /*******************************************************************
8587 * @brief Fill measurement configuration
8591 * Function : fillMeasConfig
8593 * Functionality: Fill measurement configuration
8595 * @params[in] Measurement config
8596 * @return ROK - success
8599 * ****************************************************************/
8600 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8602 /* Measurement object to add/mod list */
8603 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8604 if(!measConfig->measObjectToAddModList)
8606 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8609 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8611 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8615 /* Report Config To add/mod list */
8616 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8617 if(!measConfig->reportConfigToAddModList)
8619 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8622 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8624 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8628 /* Measurement Id to add/mod list */
8629 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8630 if(!measConfig->measIdToAddModList)
8632 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8635 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8637 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8641 /* S-Measurement config */
8642 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8643 if(!measConfig->s_MeasureConfig)
8645 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8648 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8650 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8654 /* Qunatity Config */
8655 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8656 if(!measConfig->quantityConfig)
8658 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8661 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8663 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8670 /*******************************************************************
8672 * @brief Fill RRC reconfiguration non-critical extension IE
8676 * Function : fillRrcReconfigNonCriticalExt
8678 * Functionality: Fill RRC reconfiguration non-critical extension
8680 * @params[in] RRC Reconfig Non-critical extension
8681 * @return ROK - success
8684 * ****************************************************************/
8685 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8687 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8688 if(!rrcRecfg->masterCellGroup)
8690 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8694 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8695 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8696 if(!rrcRecfg->masterCellGroup->buf)
8698 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8701 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8704 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8705 * received from DU */
8706 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8708 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8716 /*******************************************************************
8718 * @brief Fill RRC reconfiguration structure
8722 * Function : fillRrcReconfig
8724 * Functionality: Fill RRC reconfiguration
8728 * RRC reconfiguration structure
8729 * @return ROK - success
8732 * ****************************************************************/
8733 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8735 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8737 rrcReconfig->rrc_TransactionIdentifier = 1;
8738 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8740 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8741 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8743 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8747 /* Radio Bearer Configuration */
8748 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8749 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8751 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8754 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8756 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8760 /* Measurement Configuration */
8761 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8762 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8764 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8767 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8769 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8773 /* Non Critical extension */
8774 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8775 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8777 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8780 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8782 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8788 /*******************************************************************
8790 * @brief Fill RRC reconfiguration Octet string
8794 * Function : fillRrcReconfigBuf
8796 * Functionality: Fill RRC reconfiguration octet string
8799 * @params[in] OCTET_STRING_t buffer
8800 * @return ROK - success
8803 * ****************************************************************/
8804 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8806 uint8_t ret = RFAILED;
8807 asn_enc_rval_t encRetVal;
8808 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8809 rrcReconfig = &rrcRecfg;
8813 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8815 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8819 /* Encode RRC Reconfiguration */
8820 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8821 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8823 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8825 /* Encode results */
8826 if(encRetVal.encoded == ENCODE_FAIL)
8828 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8829 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8834 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8835 for(int i=0; i< encBufSize; i++)
8837 DU_LOG("%x",encBuf[i]);
8841 rrcReconfigBuf->size = encBufSize;
8842 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8843 if(!rrcReconfigBuf->buf)
8845 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8848 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8853 freeRrcReconfig(rrcReconfig);
8857 /*******************************************************************
8859 * @brief Fill HO preparation information Octet string
8863 * Function : fillHOPreparationInfoBuf
8865 * Functionality: Fill HO preparation information Octet string
8868 * @params[in] HandoverPreparationInformation_t buffer
8869 * @return ROK - success
8872 * ****************************************************************/
8873 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8875 uint8_t ret = RFAILED;
8876 asn_enc_rval_t encRetVal;
8877 HandoverPreparationInformationRrc_t hoPrepInfo;
8878 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8883 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8884 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8885 if(!hoPrepInfo.criticalExtensions.choice.c1)
8887 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8890 hoPrepInfo.criticalExtensions.choice.c1->present = \
8891 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8893 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8894 sizeof(HandoverPreparationInformationRrc_IEs_t));
8895 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8897 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8900 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8902 /* Fill UE Capability RAT container list */
8903 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8906 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8910 /* Fill Source config */
8911 hoPrepInfoIe->sourceConfig = NULLP;
8912 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8913 if(!hoPrepInfoIe->sourceConfig)
8915 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8918 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8922 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8926 hoPrepInfoIe->rrm_Config = NULLP;
8927 hoPrepInfoIe->as_Context = NULLP;
8928 hoPrepInfoIe->nonCriticalExtension = NULLP;
8930 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8931 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8932 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8934 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8935 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8937 /* Encode results */
8938 if(encRetVal.encoded == ENCODE_FAIL)
8940 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8941 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8946 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8947 for(int i=0; i< encBufSize; i++)
8949 DU_LOG("%x",encBuf[i]);
8953 hoPrepInfoBuf->size = encBufSize;
8954 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8955 if(!hoPrepInfoBuf->buf)
8957 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8960 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8964 freeHOPreparationInfo(&hoPrepInfo);
8968 /*******************************************************************
8970 * @brief Fills CuToDuContainer
8974 * Function : fillCuToDuContainer
8976 * Functionality: Fills CuToDuContainer
8978 * @params[in] pointer to CUtoDURRCInformation_t
8980 * @return ROK - success
8983 ******************************************************************/
8985 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8987 uint8_t elementCnt = 0;
8991 /* UE Capabulity RAT Container List */
8992 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8993 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8995 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8998 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
9000 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
9001 if(!rrcMsg->measConfig)
9003 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
9006 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
9008 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9011 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9012 if(rrcMsg->iE_Extensions)
9015 rrcMsg->iE_Extensions->list.count = elementCnt;
9016 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9018 /* Initialize the CUtoDURRCInformation_ExtIEs */
9019 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9021 if(rrcMsg->iE_Extensions->list.array == NULLP)
9023 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9027 for(idx=0; idx<elementCnt; idx++)
9029 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9030 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9032 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9039 /* Cell Group Configuration */
9040 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9041 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9042 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9043 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9044 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9047 /* Handover Preparation Information */
9048 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9049 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9050 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9051 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9052 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9057 /*******************************************************************
9059 * @brief Build the drx cycle
9063 * Function : BuildDrxCycle
9065 * Functionality: Build drx cycle IE
9067 * @params[in] pointer to DRXCycle_t
9069 * @return ROK - success
9072 ******************************************************************/
9073 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9075 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms40;
9076 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9077 if(!drxCycle->shortDRXCycleLength)
9079 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9082 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9084 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9085 if(!drxCycle->shortDRXCycleTimer)
9087 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9090 *(drxCycle->shortDRXCycleTimer) = 4;
9093 /*******************************************************************
9095 * @brief Free CuToDuContainer
9099 * Function : FreeCuToDuInfo
9101 * Functionality: Free CuToDuContainer
9103 * @params[in] pointer to CUtoDURRCInformation_t
9105 * @return ROK - success
9108 ******************************************************************/
9110 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9114 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9116 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9117 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9118 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9120 if(rrcMsg->iE_Extensions)
9122 if(rrcMsg->iE_Extensions->list.array)
9124 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9126 if(rrcMsg->iE_Extensions->list.array[idx])
9128 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9130 case ProtocolIE_ID_id_CellGroupConfig:
9131 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9133 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9134 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9139 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9140 rrcMsg->iE_Extensions->list.array[idx]->id);
9146 for(idx2 = 0; idx2 < idx; idx2++)
9148 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9150 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9154 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9157 /*******************************************************************
9159 * @brief Builds and sends the UE Setup Request
9163 * Function : BuildAndSendUeContextSetupReq
9165 * Functionality: Constructs the UE Setup Request and sends
9166 * it to the CU through SCTP.
9170 * @return ROK - success
9173 * ****************************************************************/
9174 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9176 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9177 uint8_t ret= RFAILED, ret1;
9179 uint8_t idx, idx1, bufLen, duIdx;
9181 DuDb *targetDuDb = NULLP;
9182 F1AP_PDU_t *f1apMsg = NULLP;
9183 UEContextSetupRequest_t *ueSetReq = NULLP;
9184 asn_enc_rval_t encRetVal; /* Encoder return value */
9185 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9189 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9191 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9192 if(f1apMsg == NULLP)
9194 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9198 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9199 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9200 if(f1apMsg->choice.initiatingMessage == NULLP)
9202 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9206 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9207 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9208 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9210 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9212 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9222 ueSetReq->protocolIEs.list.count = elementCnt;
9223 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9225 /* Initialize the UESetup members */
9226 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9228 if(ueSetReq->protocolIEs.list.array == NULLP)
9230 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9234 for(idx1=0; idx1<elementCnt; idx1++)
9236 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9237 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9245 /*GNB CU UE F1AP ID*/
9246 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9247 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9248 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9249 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9251 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9253 /*GNB DU UE F1AP ID*/
9255 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9256 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9257 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9258 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9263 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9264 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9265 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9266 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9268 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9269 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
9270 /* Since we are supporting only one cell per DU, accessing 0th index to
9271 * get target cell info */
9272 spCellId = targetDuDb->cellCb[0].nrCellId;
9275 spCellId = ueCb->cellCb->nrCellId;
9276 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9282 /*Served Cell Index*/
9284 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9285 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9286 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9287 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9289 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9291 /*CellULConfigured*/
9293 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9294 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9295 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9296 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9299 /*CUtoDURRCContainer*/
9301 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9302 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9303 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9304 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9309 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9314 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9315 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9316 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9317 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9319 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9323 /*Special Cells to be SetupList*/
9325 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9326 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9327 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9328 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9329 if(SplCellListret != ROK)
9335 /*SRBs To Be Setup List*/
9337 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9338 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9339 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9340 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9341 if(SrbSetupret != ROK)
9346 /*DRBs to Be Setup List*/
9348 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9349 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9350 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9351 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9357 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9359 /* RRC delivery status request */
9361 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9362 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9363 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9364 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9367 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9369 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9370 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9371 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9373 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9375 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9376 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9377 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9378 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9380 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9383 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9384 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9386 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9388 /* Encode the F1SetupRequest type as APER */
9389 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9391 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9393 /* Encode results */
9394 if(encRetVal.encoded == ENCODE_FAIL)
9396 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9397 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9402 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9403 for(int i=0; i< encBufSize; i++)
9405 DU_LOG("%x",encBuf[i]);
9410 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9412 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9418 FreeUeContextSetupReq(f1apMsg);
9421 }/* End of BuildAndSendUeContextSetupReq*/
9423 /**********************************************************************
9424 * @brief Function to extractTeId received in UE context setup Response
9428 * Function : extractTeId
9431 * - Function to extract TeId
9434 * @return ROK - success
9437 **********************************************************************/
9438 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9442 GTPTunnel_t *gtpDl = NULLP;
9444 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9446 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9448 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9450 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9451 if(gtpDl->gTP_TEID.size > 0)
9453 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9456 DU_LOG("\nERROR --> EGTP: No TeId received");
9464 /****************************************************************
9465 * @brief Function to add Drb tunnels
9469 * Function : addDrbTunnels
9472 * - Function to add Drb tunnels
9475 * @return ROK - success
9478 * ****************************************************************/
9479 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9484 if(teId > MAX_TEID || teId < MIN_TEID)
9486 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9488 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9489 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9490 tnlEvt.lclTeid = teId;
9491 tnlEvt.remTeid = teId;
9492 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9495 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9500 /****************************************************************
9501 * @brief Function to process Drb Setup List
9505 * Function : procDrbSetupList
9508 * - Function to process DRB Setup List
9511 * @return ROK - success
9514 * ****************************************************************/
9515 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9517 uint8_t arrIdx = 0, drbIdx = 0;
9519 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9521 if(drbSetupList != NULLP)
9523 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9525 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9526 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9528 /* extracting teId */
9529 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9532 if(addDrbTunnels(duId, teId)== ROK)
9534 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9536 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9537 * are sent to CU for setting up of Tunnels in DL direction.
9538 * Search for DRB ID in CU databse */
9539 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9541 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9543 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9556 /****************************************************************
9557 * @brief Function to process Ue Context Setup Response
9561 * Function : procUeContextSetupResponse
9564 * - Function to process Ue Context Setup Response
9567 * @return ROK - success
9570 * ****************************************************************/
9571 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9573 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9574 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9576 CuUeCb *ueCb = NULLP;
9577 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9578 OCTET_STRING_t *duToCuRrcContainer;
9580 SEARCH_DU_DB(duIdx, duId, duDb);
9581 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9583 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9585 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9587 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9589 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9592 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9594 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9595 ueCb = &duDb->ueCb[duUeF1apId-1];
9596 /* If ue context is not present in du db, then create UE context
9597 * here. This flow is hit in case of UE handover where UE
9598 * context is created before UE performs RACH on target DU */
9599 if(ueCb->gnbDuUeF1apId == 0)
9601 /* Creating UE context in target DU */
9602 memset(ueCb, 0, sizeof(CuUeCb));
9603 ueCb->cellCb = &duDb->cellCb[0];
9604 ueCb->gnbDuUeF1apId = duUeF1apId;
9605 ueCb->gnbCuUeF1apId = cuUeF1apId;
9606 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9607 ueCb->hoInfo.targetDuId = duId;
9610 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9611 ueCb->cellCb->numUe++;
9615 case ProtocolIE_ID_id_C_RNTI:
9617 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9620 case ProtocolIE_ID_id_DRBs_Setup_List:
9622 /* Adding Tunnels for successful DRB */
9623 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9626 case ProtocolIE_ID_id_DUtoCURRCInformation:
9628 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9629 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9630 DUtoCURRCInformation.cellGroupConfig;
9631 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9632 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9634 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9642 /* If the UE is in handover, UE context modification request is to be sent to
9643 * source DU once UE context setup response is received from target DU */
9644 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9646 DuDb *srcDuDb = NULLP;
9647 CuUeCb *ueCbInSrcDu = NULLP;
9649 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9650 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9651 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9653 /* UE context setup response is received from target DU. Search all
9654 * DUs to find source DU except this target DU Id.*/
9655 if(cuCb.duInfo[duIdx].duId != duId)
9657 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9660 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9661 * received in UE context setup response since CU UE F1AP ID does not
9662 * change for UE in handover.
9663 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9665 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9666 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9668 srcDuDb = &cuCb.duInfo[duIdx];
9669 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9671 /* Store source DU info in the new UE context created in
9673 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9675 /* Copy the received container to UeCb */
9676 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9678 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9680 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9687 if(srcDuDb && ueCbInSrcDu)
9693 ueCb->f1apMsgDb.dlRrcMsgCount++;
9694 rrcMsgType = setDlRRCMsgType(ueCb);
9696 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9697 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9699 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9707 /****************************************************************
9708 * @brief Function to process Ul Rrc Msg received from DU
9712 * Function : procUlRrcMsg
9715 * - Function to process Ul Rrc Msg received from DU
9718 * @return ROK - success
9721 * ****************************************************************/
9723 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9725 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9726 uint8_t *rrcContainer = NULLP;
9727 uint16_t rrcContLen = 0;
9728 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9730 CuUeCb *ueCb = NULLP;
9731 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9734 SEARCH_DU_DB(duIdx, duId, duDb);
9735 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9737 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9739 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9741 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9743 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9746 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9748 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9751 case ProtocolIE_ID_id_SRBID:
9752 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9755 case ProtocolIE_ID_id_RRCContainer:
9757 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9758 CU_ALLOC(rrcContainer, rrcContLen);
9761 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9764 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9766 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9769 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
9770 DuDb *srcDuDb = NULLP;
9772 /* In target DU DB, mark UE as active and delete HO info */
9773 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9774 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9776 /* Release UE context in source DU because the UE is now
9777 * attached to target DU */
9778 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9779 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9781 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9783 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9786 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9797 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9804 ueCb = &duDb->ueCb[duUeF1apId-1];
9805 ueCb->f1apMsgDb.dlRrcMsgCount++;
9806 rrcMsgType = setDlRRCMsgType(ueCb);
9807 if(rrcMsgType == RRC_SETUP_COMPLETE)
9809 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for NAS Security Mode Command");
9810 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9812 if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
9814 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Security Mode Command");
9815 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9817 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
9819 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9820 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9822 else if(rrcMsgType == REGISTRATION_COMPLETE)
9824 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9825 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9827 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9829 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9830 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9836 /****************************************************************
9837 * @brief Build And Send F1ResetAck
9841 * Function : FreeF1ResetAck
9844 * - Build And Send F1ResetRSP
9847 * @return ROK - success
9850 * ****************************************************************/
9851 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9854 ResetAcknowledge_t *f1ResetAck;
9858 if(f1apMsg->choice.successfulOutcome)
9860 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9862 if(f1ResetAck->protocolIEs.list.array)
9864 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9866 if(f1ResetAck->protocolIEs.list.array[idx])
9868 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9871 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9873 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9875 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9879 /****************************************************************
9880 * @brief Build And Send F1ResetAck
9884 * Function : BuildAndSendF1ResetAck
9887 * - Build And Send F1ResetRSP
9890 * @return ROK - success
9893 * ****************************************************************/
9895 uint8_t BuildAndSendF1ResetAck()
9898 uint8_t elementCnt = 0;
9899 uint8_t ret = RFAILED;
9900 F1AP_PDU_t *f1apMsg = NULL;
9901 ResetAcknowledge_t *f1ResetAck = NULLP;
9902 asn_enc_rval_t encRetVal;
9903 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9906 /* Allocate the memory for F1ResetRequest_t */
9907 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9908 if(f1apMsg == NULLP)
9910 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9914 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9916 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9917 if(f1apMsg->choice.successfulOutcome == NULLP)
9919 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9923 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9924 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9925 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9926 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9930 f1ResetAck->protocolIEs.list.count = elementCnt;
9931 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9933 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9934 if(f1ResetAck->protocolIEs.list.array == NULLP)
9936 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9940 for(idx=0; idx<elementCnt; idx++)
9942 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9943 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9950 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9951 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9952 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9953 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9955 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9957 /* Encode the F1SetupRequest type as UPER */
9958 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9960 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9962 /* Check encode results */
9963 if(encRetVal.encoded == ENCODE_FAIL)
9965 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9966 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9971 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9972 for(int i=0; i< encBufSize; i++)
9974 DU_LOG("%x",encBuf[i]);
9979 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9980 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9982 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9990 FreeF1ResetAck(f1apMsg);
9994 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9998 if(ulInfo->list.array)
10000 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
10002 if(ulInfo->list.array[arrIdx])
10004 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
10006 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
10008 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
10010 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10011 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10012 gTPTunnel->gTP_TEID.size);
10014 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10015 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10016 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10018 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10019 sizeof(GTPTunnel_t));
10021 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10024 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10028 /*******************************************************************
10030 * @brief Deletes the EGTP tunnel
10034 * Function : deleteEgtpTunnel
10036 * Functionality: Deletes the EGTP tunnel
10038 * @params[in] uint8_t *buf
10040 * @return ROK - success
10041 * RFAILED - failure
10043 * ****************************************************************/
10044 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10049 teIdStringToInt(buf, &teId);
10050 if(teId > MAX_TEID || teId < MIN_TEID)
10052 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10055 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10056 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10057 tnlEvt.lclTeid = teId;
10058 tnlEvt.remTeid = teId;
10059 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10061 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10066 /*******************************************************************
10068 * @brief Builds the Uplink Tunnel Info
10072 * Function : BuildUlTnlInfoforSetupMod
10074 * Functionality: Constructs the UL TnlInfo For DRB list
10076 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10078 * @return ROK - success
10079 * RFAILED - failure
10081 * ****************************************************************/
10082 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10088 ulInfo->list.count = ulCnt;
10089 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10090 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10091 if(ulInfo->list.array == NULLP)
10093 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10096 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10098 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10099 if(ulInfo->list.array[arrIdx] == NULLP)
10101 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10107 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10108 UPTransportLayerInformation_PR_gTPTunnel;
10111 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10112 sizeof(GTPTunnel_t));
10113 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10115 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10118 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10119 transportLayerAddress.size = 4*sizeof(uint8_t);
10120 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10121 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10122 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10123 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10124 transportLayerAddress.buf == NULLP)
10126 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10130 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10131 transportLayerAddress.buf[0] = 192;
10132 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10133 transportLayerAddress.buf[1] = 168;
10134 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10135 transportLayerAddress.buf[2] = 130;
10136 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10137 transportLayerAddress.buf[3] = 82;
10138 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10139 transportLayerAddress.bits_unused = 0;
10141 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10142 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10143 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10144 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10147 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10148 = 4 * sizeof(uint8_t);
10149 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10150 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10151 gTPTunnel->gTP_TEID.size);
10152 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10155 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10158 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10159 gTP_TEID.buf[0] = 0;
10160 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10161 gTP_TEID.buf[1] = 0;
10162 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10163 gTP_TEID.buf[2] = 0;
10164 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10166 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10167 * fetched based on the Drb Id */
10169 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10170 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10171 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10175 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10176 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10179 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10180 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10181 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10182 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10184 }/*End of BuildULTnlInfo*/
10186 /*******************************************************************
10188 * @brief freeing the DRB item
10192 * Function : FreeDrbItem
10194 * Functionality: freeing the DRB item
10196 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10198 * @return ROK - success
10199 * RFAILED - failure
10201 * ****************************************************************/
10203 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10206 SNSSAI_t *snssai =NULLP;
10207 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10209 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10210 switch(drbItem->qoSInformation.present)
10212 case QoSInformation_PR_NOTHING:
10214 case QoSInformation_PR_eUTRANQoS:
10216 if(drbItem->qoSInformation.choice.eUTRANQoS)
10218 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10222 case QoSInformation_PR_choice_extension:
10224 if(drbItem->qoSInformation.choice.choice_extension)
10226 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10228 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10229 if(snssai->sST.buf)
10231 CU_FREE(snssai->sST.buf,snssai->sST.size);
10235 if(snssai->sD->buf)
10237 CU_FREE(snssai->sD->buf,snssai->sD->size);
10239 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10242 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10243 if(flowMap->list.array)
10245 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10247 if(flowMap->list.array[arrIdx] )
10249 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10250 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10253 CU_FREE(flowMap->list.array,flowMap->list.size);
10256 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10262 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10263 if(drbItem->uLConfiguration)
10265 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10269 /*******************************************************************
10271 * @brief filling the DRB setup Mod item
10275 * Function : FillDrbItemToSetupMod
10277 * Functionality: filling the DRB setup Mod item
10280 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10282 * @return ROK - success
10283 * RFAILED - failure
10285 * ****************************************************************/
10287 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10292 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10293 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10296 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10298 switch(drbItem->qoSInformation.present)
10300 case QoSInformation_PR_NOTHING:
10304 case QoSInformation_PR_eUTRANQoS:
10307 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10308 if(drbItem->qoSInformation.choice.eUTRANQoS)
10310 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10313 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10314 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10315 PriorityLevel_no_priority;
10317 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10318 Pre_emptionCapability_may_trigger_pre_emption;
10320 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10321 Pre_emptionVulnerability_pre_emptable;
10325 case QoSInformation_PR_choice_extension:
10327 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10328 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10330 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10334 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10335 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10336 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10337 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10338 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10341 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10346 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10347 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10350 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10354 /*Flows mapped to DRB List*/
10355 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10356 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10357 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10360 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10366 /*ULUPTNLInformation To Be Setup List*/
10367 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10368 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10371 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10376 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10377 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10383 /*******************************************************************
10385 * @brief Builds the DRB to be Setup Mod ItemIes
10389 * Function : FillDrbItemList
10391 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10393 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10395 * @return ROK - success
10396 * RFAILED - failure
10398 * ****************************************************************/
10400 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10402 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10403 drbItemIe->criticality = Criticality_reject;
10404 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10406 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10408 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10413 /*******************************************************************
10415 * @brief free the DRB to be Setup Mod list
10419 * Function : FreeDrbToBeSetupModList
10421 * Functionality: free the DRB to be Setup Mod list
10423 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10425 * @return ROK - success
10426 * RFAILED - failure
10428 * ****************************************************************/
10429 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10432 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10434 if(drbSet->list.array)
10436 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10438 if(drbSet->list.array[arrIdx] != NULLP)
10442 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10443 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10445 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10448 CU_FREE(drbSet->list.array, drbSet->list.size);
10453 /*******************************************************************
10455 * @brief Builds the DRB to be Setup Mod list
10459 * Function : BuildDrbToBeSetupList
10461 * Functionality: Constructs the DRB to be Setup Mod list
10463 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10465 * @return ROK - success
10466 * RFAILED - failure
10468 * ****************************************************************/
10470 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10476 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10477 drbSet->list.count = drbCnt;
10478 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10479 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10480 if(drbSet->list.array == NULLP)
10482 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10486 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10488 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10489 if(drbSet->list.array[arrIdx] == NULLP)
10491 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10495 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10498 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10505 /*******************************************************************
10507 * @brief Filling the DRB to be modified item
10511 * Function : FillDrbToBeModItem
10513 * Functionality: filling the DRB to be modified item
10515 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10517 * @return ROK - success
10518 * RFAILED - failure
10520 * ****************************************************************/
10522 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10526 DrbInfo *drbToBeMod;
10529 drbItem->dRBID = DRB2 + arrIdx;
10531 /* Search for DRB ID in CU databse */
10532 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10534 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10536 drbToBeMod = &ueCb->drbList[drbIdx];
10542 drbItem->qoSInformation = NULLP;
10543 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10544 if(drbItem->qoSInformation != NULLP)
10546 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10548 switch(drbItem->qoSInformation->present)
10550 case QoSInformation_PR_NOTHING:
10554 case QoSInformation_PR_eUTRANQoS:
10557 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10558 if(drbItem->qoSInformation->choice.eUTRANQoS)
10560 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10563 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10564 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10565 PriorityLevel_no_priority;
10567 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10568 Pre_emptionCapability_may_trigger_pre_emption;
10570 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10571 Pre_emptionVulnerability_pre_emptable;
10575 case QoSInformation_PR_choice_extension:
10577 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10578 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10580 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10584 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10585 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10586 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10587 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10588 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10591 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10596 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10597 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10600 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10604 /*Flows mapped to DRB List*/
10605 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10606 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10607 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10610 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10617 /*ULUPTNLInformation To Be Setup List*/
10618 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10619 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10622 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10628 /*******************************************************************
10630 * @brief Builds the DRB to be modified Item IE
10634 * Function : FillDrbToBeModItemList
10636 * Functionality: Constructs the DRB to be modified Mod Item Ies
10638 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10640 * @return ROK - success
10641 * RFAILED - failure
10643 * ****************************************************************/
10645 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10647 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10648 drbItemIe->criticality = Criticality_reject;
10649 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10650 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10652 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10659 /*******************************************************************
10661 * @brief Builds the DRB to be modified list
10665 * Function : BuildDrbToBeModList
10667 * Functionality: Constructs the DRB to be modified list
10669 * @params[in] DRBs_ToBeModified_List_t *drbSet
10671 * @return ROK - success
10672 * RFAILED - failure
10674 * ****************************************************************/
10676 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10682 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10683 drbSet->list.count = drbCnt;
10684 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10685 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10686 if(drbSet->list.array == NULLP)
10688 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10691 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10693 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10694 if(drbSet->list.array[arrIdx] == NULLP)
10696 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10700 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10703 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10710 /*******************************************************************
10712 * @brief freeing the DRB item
10716 * Function : FreeModifiedDrbItem
10718 * Functionality: freeing the DRB 2 item
10720 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10722 * @return ROK - success
10723 * RFAILED - failure
10725 * ****************************************************************/
10727 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10730 SNSSAI_t *snssai =NULLP;
10731 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10733 if(drbItem->qoSInformation != NULLP)
10735 switch(drbItem->qoSInformation->present)
10737 case QoSInformation_PR_NOTHING:
10739 case QoSInformation_PR_eUTRANQoS:
10741 if(drbItem->qoSInformation->choice.eUTRANQoS)
10743 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10747 case QoSInformation_PR_choice_extension:
10749 if(drbItem->qoSInformation->choice.choice_extension)
10751 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10753 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10754 if(snssai->sST.buf)
10756 CU_FREE(snssai->sST.buf,snssai->sST.size);
10760 if(snssai->sD->buf)
10762 CU_FREE(snssai->sD->buf,snssai->sD->size);
10764 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10767 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10768 if(flowMap->list.array)
10770 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10772 if(flowMap->list.array[arrIdx] )
10774 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10775 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10778 CU_FREE(flowMap->list.array,flowMap->list.size);
10781 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10787 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10788 if(drbItem->uLConfiguration)
10790 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10794 /*******************************************************************
10796 * @brief free the DRB to be modfified list
10800 * Function : FreeDrbToBeModifiedList
10802 * Functionality: free the DRB to be Setup Mod list
10804 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10806 * @return ROK - success
10807 * RFAILED - failure
10809 * ****************************************************************/
10810 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10813 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10815 if(drbSet->list.array)
10817 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10819 if(drbSet->list.array[arrIdx] != NULLP)
10821 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10822 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10823 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10826 CU_FREE(drbSet->list.array, drbSet->list.size);
10831 /*******************************************************************
10833 * @brief free the UeContextModification Request
10837 * Function : FreeUeContextModicationRequest
10839 * Functionality : deallocation of memory allocated in UeContextModiification
10842 * @params[in] F1AP_PDU_t *f1apMsg
10846 * ****************************************************************/
10847 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10849 uint8_t arrIdx =0 , ieId=0;
10850 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10854 if(f1apMsg->choice.initiatingMessage)
10856 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10857 if(ueContextModifyReq->protocolIEs.list.array)
10859 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10861 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10863 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10866 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10868 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10870 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10872 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10873 choice.DRBs_ToBeSetupMod_List);
10876 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10878 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10879 choice.DRBs_ToBeModified_List);
10882 case ProtocolIE_ID_id_TransmissionActionIndicator:
10884 case ProtocolIE_ID_id_RRCContainer:
10886 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10887 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10891 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10894 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10896 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10898 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10902 /*******************************************************************
10904 * @brief Builds the Ue Context Modification Req
10908 * Function : BuildAndSendUeContextModificationReq
10910 * Functionality: Constructs the Ue Context Modification Req
10914 * @return ROK - success
10915 * RFAILED - failure
10917 * ****************************************************************/
10918 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10921 uint8_t elementCnt = 0;
10922 uint8_t ret = RFAILED;
10923 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10924 F1AP_PDU_t *f1apMsg = NULLP;
10925 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10926 asn_enc_rval_t encRetVal;
10927 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10930 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10931 if(f1apMsg == NULLP)
10933 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10937 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10939 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10940 if(f1apMsg->choice.initiatingMessage == NULLP)
10942 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10945 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10946 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10947 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10949 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10951 if(action == MODIFY_UE)
10953 else if(action == QUERY_CONFIG)
10955 else if(action == RRC_RECONFIG_COMPLETE_IND)
10957 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10961 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
10964 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10965 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10967 /* Initialize the UE context modification members */
10968 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10969 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10971 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10975 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10977 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10978 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10980 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10986 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10987 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10988 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10989 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10990 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10993 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10994 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10995 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10996 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10997 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10999 if(action == MODIFY_UE)
11001 /* DRB to be setup list */
11003 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
11004 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11005 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11006 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
11007 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11008 value.choice.DRBs_ToBeSetupMod_List));
11010 /* DRB to be modified list */
11012 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
11013 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11014 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11015 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11016 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11017 value.choice.DRBs_ToBeModified_List));
11019 /* TODO: DRB to be release list */
11023 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11027 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
11029 else if(action == QUERY_CONFIG)
11032 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11033 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11034 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11035 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11036 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11038 else if(action == RRC_RECONFIG_COMPLETE_IND)
11041 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11042 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11043 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11044 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11045 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11046 RRCReconfigurationCompleteIndicator_true;
11048 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11051 if(action == STOP_DATA_TX)
11053 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11054 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11055 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11056 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11057 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11058 TransmissionActionIndicator_stop;
11060 else if (action == RESTART_DATA_TX)
11062 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11063 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11064 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11065 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11066 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11067 TransmissionActionIndicator_restart;
11071 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11072 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11073 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11074 UEContextModificationRequestIEs__value_PR_RRCContainer;
11075 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
11077 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11081 /* RRC delivery status request */
11083 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11084 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11085 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11086 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11090 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11092 /* DRX Configuration Indicator */
11094 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator;
11095 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11096 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator;
11097 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release;
11098 ueCb->drxCfgPresent = false;
11099 memset(&ueCb->drxCfg, 0, sizeof(DrxCfg));
11103 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11105 /* Encode the F1SetupRequest type as APER */
11106 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11108 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11110 /* Encode results */
11111 if(encRetVal.encoded == ENCODE_FAIL)
11113 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11114 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11119 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11121 /* This for loop was going into an infinite loop even though encBufSize
11122 * has a small value. Hence commented this
11124 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11126 DU_LOG("%x",encBuf[ieIdx]);
11131 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11132 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11134 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11142 FreeUeContextModicationRequest(f1apMsg);
11146 /*****************************************************************i
11148 * @brief Free memory allocated for UE Context Release Command
11152 * Function : FreeUeContextReleaseCommand
11155 * - Free memory allocated for UE Context Release Command
11157 * @params[in] F1AP_PDU_t *f1apMsg
11160 * *************************************************************/
11161 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11164 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11168 if(f1apMsg->choice.initiatingMessage)
11170 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11171 if(ueReleaseCommand->protocolIEs.list.array)
11173 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11175 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11177 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11179 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11181 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11184 /*******************************************************************
11186 * @brief Builds the Ue Context Release Command
11190 * Function : BuildAndSendUeContextReleaseCommand
11192 * Functionality: Constructs the Ue Context Release Command
11196 * @return ROK - success
11197 * RFAILED - failure
11199 * ****************************************************************/
11200 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11202 bool memAllocFailed = false;
11203 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11206 F1AP_PDU_t *f1apMsg = NULLP;
11207 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11209 asn_enc_rval_t encRetVal;
11210 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11214 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11215 if(f1apMsg == NULLP)
11217 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11221 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11223 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11224 if(f1apMsg->choice.initiatingMessage == NULLP)
11226 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11229 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11230 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11231 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11233 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11235 SEARCH_DU_DB(duIdx, duId, duDb);
11236 ueCb = &duDb->ueCb[duUeF1apId-1];
11237 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11242 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11243 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11245 /* Initialize the UE context modification members */
11246 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11247 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11249 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11253 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11255 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11256 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11258 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11259 memAllocFailed = true;
11264 if(memAllocFailed == true)
11270 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11271 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11272 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11273 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11274 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11277 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11278 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11279 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11280 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11281 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11283 /* Cause of UE context release */
11285 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11286 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11287 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11288 UEContextReleaseCommandIEs__value_PR_Cause;
11289 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11290 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11291 CauseRadioNetwork_normal_release;
11292 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11294 /* RRC Container for RRC release */
11296 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11297 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11298 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11299 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11300 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11302 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11303 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11304 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11305 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11307 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11310 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11311 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11313 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11315 /* Encode the UE Context Release Command type as APER */
11316 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11318 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11321 /* Encode results */
11322 if(encRetVal.encoded == ENCODE_FAIL)
11324 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11325 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11330 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11331 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11333 DU_LOG("%x",encBuf[ieIdx]);
11337 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11338 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11340 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11348 FreeUeContextReleaseCommand(f1apMsg);
11351 /*******************************************************************
11353 * @brief process Ue context release request
11357 * Function : procUeContextReleaseReq
11360 * - process Ue context release request
11362 * @params[in] F1AP_PDU_t *f1apMsg
11363 * @return ROK - success
11364 * RFAILED - failure
11366 * ****************************************************************/
11367 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11369 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11371 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11372 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11374 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11376 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11378 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11380 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11383 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11385 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11393 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11395 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11400 /*******************************************************************
11402 * @brief processing of Gnb-DU config update
11406 * Function : procGnbDuUpdate
11409 * - processing of Gnb-DU config update
11411 * @params[in] F1AP_PDU_t *f1apMsg
11412 * @return ROK - success
11413 * RFAILED - failure
11415 * ****************************************************************/
11416 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11418 bool cellToBeDelete = false;
11419 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11423 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11425 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11426 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11428 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11430 case ProtocolIE_ID_id_TransactionID:
11432 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11434 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11436 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11437 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11438 Served_Cells_To_Delete_List.list.array[0];
11439 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11440 cellToBeDelete = true;
11443 case ProtocolIE_ID_id_gNB_DU_ID:
11447 if(BuildAndSendDUUpdateAck(duId) != ROK)
11449 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11453 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11454 * commented this trigger for now */
11456 if(cellToBeDelete == false)
11458 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11459 if(BuildAndSendF1ResetReq() != ROK)
11461 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11466 if(cellToBeDelete == true)
11468 SEARCH_DU_DB(duIdx, duId, duDb);
11469 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11470 if(cellCb->numUe == 0)
11472 memset(cellCb, 0, sizeof(CuCellCb));
11476 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11481 /*******************************************************************
11483 * @brief storing slice list in CU database
11487 * Function : buildSliceList
11490 * - storing slice list in CU database
11492 * @params[in] SliceSupportList_t *sliceSupportList
11493 * @return ROK - success
11494 * RFAILED - failure
11496 * ****************************************************************/
11497 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11499 uint8_t sliceListIdx = 0;
11501 if(sliceSupportList)
11503 if(sliceSupportList->list.array)
11505 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11506 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11508 if(sliceSupportList->list.array[sliceListIdx])
11510 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11511 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11513 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11516 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11518 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11519 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11521 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11523 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11524 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11525 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11534 /****************************************************************
11535 * @brief Function to process Srb Setup Mod List
11539 * Function : procSrbSetupModList
11542 * - Function to process SRB Setup Mod List
11545 * @return ROK - success
11546 * RFAILED - failure
11548 * ****************************************************************/
11549 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11551 uint8_t arrIdx = 0, srbIdx;
11552 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11554 if(srbSetupList != NULLP)
11556 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11558 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11559 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11561 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11563 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11565 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11577 /****************************************************************
11578 * @brief Function to process Drb Setup Mod List
11582 * Function : procDrbSetupModList
11585 * - Function to process DRB Setup Mod List
11588 * @return ROK - success
11589 * RFAILED - failure
11591 * ****************************************************************/
11592 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11594 uint8_t arrIdx = 0, drbIdx;
11596 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11598 if(drbSetupList != NULLP)
11600 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11602 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11603 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11605 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11607 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11609 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11610 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11615 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11617 /* extracting teId */
11618 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11621 if(addDrbTunnels(duId, teId)== ROK)
11623 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11635 /*******************************************************************
11637 * @brief processing of GNB_DU_Served_Cells Plmn list information
11641 * Function : procServedCellPlmnList
11644 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11647 * @params[in] F1AP_PDU_t *f1apMsg
11648 * @return ROK - success
11649 * RFAILED - failure
11651 * ****************************************************************/
11652 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11654 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11655 ProtocolExtensionContainer_4624P3_t **ieExtend;
11657 if(srvPlmn->list.array)
11659 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11661 if(srvPlmn->list.array[srvPlmnIdx])
11663 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11666 if((*ieExtend)->list.array)
11668 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11670 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11672 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11674 case ProtocolIE_ID_id_TAISliceSupportList:
11676 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11677 extensionValue.choice.SliceSupportList) != ROK)
11679 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11694 /****************************************************************
11695 * @brief Function to process Ue Context Modification Response
11699 * Function : procUeContextModificationResponse
11702 * - Function to process Ue Context Modification Response
11705 * @return ROK - success
11706 * RFAILED - failure
11708 * ****************************************************************/
11709 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11711 uint8_t idx=0, duIdx=0;
11712 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11713 DuDb *duDb = NULLP;
11714 CuUeCb *ueCb = NULLP;
11715 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11717 SEARCH_DU_DB(duIdx, duId, duDb);
11718 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11720 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11722 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11724 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11726 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11729 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11731 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11732 ueCb = &duDb->ueCb[duUeF1apId-1];
11735 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11737 /* Adding Tunnels for successful DRB */
11738 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11742 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11744 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11747 case ProtocolIE_ID_id_DUtoCURRCInformation:
11749 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11750 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11751 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11753 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11762 /* If UE is in handover and UE context is not yet created at target DU, then send
11763 * UE context setup request to target DU */
11764 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11767 DuDb *tgtDuDb = NULLP;
11768 CuUeCb *ueCbInTgtDu = NULLP;
11770 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11773 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11774 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11776 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11778 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11780 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11785 /* If UE context is not found in Target DU DU, send UE context setup
11787 if(ueCbInTgtDu == NULLP)
11789 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
11791 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11801 /*******************************************************************
11803 * @brief processing of F1 setup request
11807 * Function : procF1SetupReq
11810 * - processing of F1 setup request
11812 * @params[in] F1AP_PDU_t *f1apMsg
11813 * @return ROK - success
11814 * RFAILED - failure
11816 * ****************************************************************/
11817 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11819 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11821 uint64_t nrCellId = 0;
11822 DuDb *duDb = NULLP;
11823 CuCellCb *cellCb = NULLP;
11824 BIT_STRING_t nrcellIdentity;
11825 F1SetupRequest_t *f1SetupReq = NULLP;
11826 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11827 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11829 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11830 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11832 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11834 case ProtocolIE_ID_id_gNB_DU_ID:
11836 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11837 SEARCH_DU_DB(duIdx, duId, duDb);
11840 duDb = &cuCb.duInfo[cuCb.numDu];
11843 memset(duDb, 0, sizeof(DuDb));
11848 case ProtocolIE_ID_id_gNB_DU_Name:
11850 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11853 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11855 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11856 if(duServedCell->list.array)
11858 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11860 if(duServedCell->list.array[plmnidx])
11862 switch(duServedCell->list.array[plmnidx]->id)
11864 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11866 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11867 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11868 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11870 bitStringToInt(&nrcellIdentity, &nrCellId);
11871 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11872 if(cellCb == NULLP)
11874 cellCb = &duDb->cellCb[duDb->numCells];
11875 memset(cellCb, 0, sizeof(CuCellCb));
11876 cellCb->nrCellId = nrCellId;
11877 cellCb->cellStatus = CELL_ACTIVE;
11890 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11894 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11898 /****************************************************************
11900 * @brief processing of UE Context Release Complete
11904 * Function : procUeContextReleaseComplete
11907 * - processing of UE Context Release Complete
11909 * @params[in] F1AP_PDU_t *f1apMsg
11910 * @return ROK - success
11911 * RFAILED - failure
11913 * ****************************************************************/
11914 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11916 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
11917 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11918 DuDb *duDb = NULLP;
11919 CuUeCb *ueCb = NULLP;
11920 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11922 SEARCH_DU_DB(duIdx, duId, duDb);
11925 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11929 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11930 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11932 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11934 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11936 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11939 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11941 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11942 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11943 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11945 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11947 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11948 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11950 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11952 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
11954 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11955 ueCb->cellCb->numUe--;
11956 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
11958 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11965 memset(ueCb, 0, sizeof(CuUeCb));
11973 /*******************************************************************
11975 * @brief Builds the Paging cell list
11979 * Function : BuildPagingCellList
11981 * Functionality: Build the paging cell list
11983 * @params[in] PagingCell_list_t *pagingCelllist,
11985 * @return ROK - success
11986 * RFAILED - failure
11988 * ****************************************************************/
11989 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11991 uint8_t cellIdx =0;
11992 PagingCell_ItemIEs_t *pagingCellItemIes;
11993 PagingCell_Item_t *pagingCellItem;
11995 pagingCelllist->list.count = numCells;
11996 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11997 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11998 if(pagingCelllist->list.array == NULLP)
12000 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12004 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12006 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12007 if(pagingCelllist->list.array[cellIdx] == NULLP)
12009 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12014 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12016 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12017 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
12018 pagingCellItemIes->criticality = Criticality_ignore;
12019 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
12020 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12022 /* Fill NrCgi Information */
12023 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
12029 /*******************************************************************
12031 * @brief Deallocation of memory allocated in paging msg
12035 * Function :FreePagingMsg
12037 * Functionality: Deallocation of memory allocated in paging msg
12039 * @params[in] F1AP_PDU_t *f1apMsg
12043 * ****************************************************************/
12044 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12046 uint8_t ieIdx, cellIdx;
12048 PagingCell_ItemIEs_t *pagingCellItemIes;
12049 PagingCell_Item_t *pagingCellItem;
12050 PagingCell_list_t *pagingCelllist;
12054 if(f1apMsg->choice.initiatingMessage)
12056 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12057 if(paging->protocolIEs.list.array)
12059 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12061 if(paging->protocolIEs.list.array[ieIdx])
12063 switch(paging->protocolIEs.list.array[ieIdx]->id)
12065 case ProtocolIE_ID_id_UEIdentityIndexValue:
12067 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12068 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12072 case ProtocolIE_ID_id_PagingIdentity:
12074 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12076 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12078 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12080 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12081 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12083 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12084 sizeof(struct CNUEPagingIdentity));
12090 case ProtocolIE_ID_id_PagingCell_List:
12092 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12093 if(pagingCelllist->list.array)
12095 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12097 if(pagingCelllist->list.array[cellIdx])
12099 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12100 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12102 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12103 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12104 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12106 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12109 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12114 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12117 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12119 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12121 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12124 /*******************************************************************
12126 * @brief Builds and sends the paging message if UE is in idle mode
12130 * Function : BuildAndSendPagingMsg
12132 * Functionality: Builds and sends the paging message
12134 * @params[in] uint32_t duId, uint8_t gsTmsi
12136 * @return ROK - success
12137 * RFAILED - failure
12139 * ****************************************************************/
12140 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12142 bool memAllocFailed = false;
12143 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12144 uint16_t ueId = 0, duIdx = 0;
12146 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12147 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12148 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12149 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12151 F1AP_PDU_t *f1apMsg = NULLP;
12152 Paging_t *paging = NULLP;
12154 asn_enc_rval_t encRetVal;
12156 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12158 SEARCH_DU_DB(duIdx, duId, duDb);
12161 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12167 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12168 if(f1apMsg == NULLP)
12170 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12174 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12176 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12177 if(f1apMsg->choice.initiatingMessage == NULLP)
12179 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12182 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12183 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12184 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12186 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12189 paging->protocolIEs.list.count = elementCnt;
12190 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12192 /* Initialize the Paging Message members */
12193 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12194 if(paging->protocolIEs.list.array == NULLP)
12196 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12200 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12202 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12203 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12205 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12206 memAllocFailed = true;
12211 if(memAllocFailed == true)
12216 /* UE Identity Index Value */
12218 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12219 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12220 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12221 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12222 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12223 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12224 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12225 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12227 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12231 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12232 ueId = gsTmsi % 1024;
12233 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12235 /* Paging Identity */
12237 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12238 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12239 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12240 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12241 PagingIdentity_PR_cNUEPagingIdentity;
12242 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12243 sizeof(struct CNUEPagingIdentity));
12244 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12246 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12250 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12251 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12253 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12254 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12255 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12256 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12258 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12262 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12263 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12267 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12268 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12269 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12270 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12272 /* Paging Priority */
12274 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12275 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12276 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12277 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12279 /* Paging Cell List */
12281 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12282 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12283 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12284 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12286 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12290 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12292 /* Encode the UE Context Release Command type as APER */
12293 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12295 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12298 /* Encode results */
12299 if(encRetVal.encoded == ENCODE_FAIL)
12301 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12302 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12307 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12308 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12310 DU_LOG("%x",encBuf[ieIdx]);
12314 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12316 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12325 FreePagingMsg(f1apMsg);
12329 /*******************************************************************
12331 * @brief Handles received F1AP message and sends back response
12335 * Function : F1APMsgHdlr
12338 * - Decodes received F1AP control message
12339 * - Prepares response message, encodes and sends to SCTP
12342 * @return ROK - success
12343 * RFAILED - failure
12345 * ****************************************************************/
12346 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12352 F1AP_PDU_t *f1apMsg = NULLP;
12353 asn_dec_rval_t rval; /* Decoder return value */
12354 F1AP_PDU_t f1apasnmsg ;
12356 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12357 ODU_PRINT_MSG(mBuf, 0,0);
12359 /* Copy mBuf into char array to decode it */
12360 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12361 CU_ALLOC(recvBuf, (Size)recvBufLen);
12363 if(recvBuf == NULLP)
12365 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12368 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12370 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12374 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12375 for(i=0; i< recvBufLen; i++)
12377 DU_LOG("%x",recvBuf[i]);
12380 /* Decoding flat buffer into F1AP messsage */
12381 f1apMsg = &f1apasnmsg;
12382 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12384 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12385 CU_FREE(recvBuf, (Size)recvBufLen);
12387 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12389 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12393 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12395 switch(f1apMsg->present)
12397 case F1AP_PDU_PR_initiatingMessage:
12399 switch(f1apMsg->choice.initiatingMessage->value.present)
12401 case InitiatingMessage__value_PR_Reset:
12403 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12404 BuildAndSendF1ResetAck();
12408 case InitiatingMessage__value_PR_F1SetupRequest:
12410 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12411 procF1SetupReq(duId, f1apMsg);
12415 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12417 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12418 procGnbDuUpdate(*duId, f1apMsg);
12421 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12423 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12424 procInitULRRCMsg(*duId, f1apMsg);
12427 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12429 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12430 procUlRrcMsg(*duId, f1apMsg);
12434 case InitiatingMessage__value_PR_RRCDeliveryReport:
12436 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12439 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12441 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12442 procUeContextReleaseReq(*duId, f1apMsg);
12447 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12448 f1apMsg->choice.initiatingMessage->value.present);
12451 }/* End of switch(initiatingMessage) */
12455 case F1AP_PDU_PR_successfulOutcome:
12457 switch(f1apMsg->choice.successfulOutcome->value.present)
12459 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12461 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12464 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12466 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12467 procUeContextSetupResponse(*duId, f1apMsg);
12470 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12472 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12473 procUeContextModificationResponse(*duId, f1apMsg);
12476 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12478 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12479 procUeContextReleaseComplete(*duId, f1apMsg);
12484 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12485 f1apMsg->choice.successfulOutcome->value.present);
12488 }/* End of switch(successfulOutcome) */
12493 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12496 }/* End of switch(f1apMsg->present) */
12498 } /* End of F1APMsgHdlr */
12500 /**********************************************************************
12502 **********************************************************************/