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"
28 #include "ModulationOrder.h"
30 #include "UE-CapabilityRAT-Container.h"
31 #include "UE-CapabilityRAT-ContainerList.h"
32 #include "UE-CapabilityRAT-ContainerListRRC.h"
33 #include "HandoverPreparationInformationRrc-IEs.h"
34 #include "HandoverPreparationInformationRrc.h"
35 #include "SupportedBandwidth.h"
36 #include "FeatureSetUplinkPerCC.h"
37 #include "FeatureSetDownlinkPerCC.h"
38 #include "FeatureSets.h"
39 #include "RF-Parameters.h"
40 #include "UE-NR-Capability.h"
41 #include "ProtocolExtensionContainer.h"
42 #include "CellGroupConfigRrc.h"
43 #include "MAC-CellGroupConfig.h"
44 #include "SchedulingRequestConfig.h"
45 #include "SchedulingRequestToAddMod.h"
46 #include "BSR-Config.h"
47 #include "TAG-Config.h"
49 #include "PHR-Config.h"
50 #include "RLC-Config.h"
51 #include "UL-AM-RLC.h"
52 #include "DL-AM-RLC.h"
53 #include "LogicalChannelConfig.h"
54 #include "RLC-BearerConfig.h"
55 #include "PhysicalCellGroupConfig.h"
56 #include "SpCellConfig.h"
57 #include "ServingCellConfig.h"
58 #include "ControlResourceSet.h"
59 #include "SearchSpace.h"
60 #include "PDCCH-Config.h"
61 #include "PDSCH-TimeDomainResourceAllocation.h"
62 #include "PDSCH-TimeDomainResourceAllocationList.h"
63 #include "DMRS-DownlinkConfig.h"
64 #include "PDSCH-Config.h"
65 #include "BWP-DownlinkDedicated.h"
66 #include "PUSCH-TimeDomainResourceAllocation.h"
67 #include "PUSCH-TimeDomainResourceAllocationList.h"
68 #include "DMRS-UplinkConfig.h"
69 #include "PUSCH-Config.h"
70 #include "SRS-ResourceId.h"
71 #include "SRS-Resource.h"
72 #include "SRS-ResourceSet.h"
73 #include "SRS-Config.h"
74 #include "PUCCH-Config.h"
75 #include "PUCCH-ResourceSet.h"
76 #include "PUCCH-Resource.h"
77 #include "PUCCH-format1.h"
78 #include "PUCCH-FormatConfig.h"
79 #include "BWP-UplinkDedicated.h"
80 #include "PUSCH-ServingCellConfig.h"
81 #include "UplinkConfig.h"
82 #include "PDSCH-ServingCellConfig.h"
83 #include "EUTRANQoS.h"
84 #include "GBR-QosInformation.h"
85 #include "DRBs-ToBeSetupMod-List.h"
86 #include "DRBs-ToBeSetupMod-Item.h"
87 #include "DRBs-Setup-Item.h"
88 #include "DLUPTNLInformation-ToBeSetup-List.h"
89 #include "DLUPTNLInformation-ToBeSetup-Item.h"
90 #include "UPTransportLayerInformation.h"
91 #include "GTPTunnel.h"
92 #include "QoSInformation.h"
93 #include "Cells-to-be-Activated-List.h"
94 #include "DL-CCCH-Message.h"
95 #include "SRB-ToAddModList.h"
96 #include "SRB-ToAddMod.h"
97 #include "RRCSetup-IEs.h"
99 #include "DL-DCCH-Message.h"
100 #include "RRCReconfiguration-IEs.h"
101 #include "RRCReconfiguration.h"
102 #include "DRB-ToAddModList.h"
103 #include "DRB-ToAddMod.h"
104 #include "SDAP-Config.h"
106 #include "MeasTiming.h"
107 #include "MeasTimingList.h"
108 #include "MeasurementTimingConfigurationRrc-IEs.h"
109 #include "MeasurementTimingConfigurationRrc.h"
110 #include "PDCP-Config.h"
111 #include "RSRP-Range.h"
112 #include "RSRQ-Range.h"
113 #include "SINR-Range.h"
114 #include "ThresholdNR.h"
115 #include "MeasObjectToAddMod.h"
116 #include "MeasObjectNR.h"
117 #include "MeasObjectToAddModList.h"
118 #include "EventTriggerConfig.h"
119 #include "ReportConfigNR.h"
120 #include "ReportConfigToAddMod.h"
121 #include "ReportConfigToAddModList.h"
122 #include "MeasIdToAddMod.h"
123 #include "MeasIdToAddModList.h"
124 #include "FilterCoefficient.h"
125 #include "QuantityConfigNR.h"
126 #include "QuantityConfig.h"
127 #include "MeasConfigRrc.h"
128 #include "AS-Config.h"
129 #include "RRCReconfiguration-v1530-IEs.h"
130 #include "CNUEPagingIdentity.h"
131 #include "PagingCell-Item.h"
132 #include "UL-DCCH-Message.h"
133 #include "DRX-ConfigRrc.h"
135 #include "cu_stub_sctp.h"
136 #include "cu_stub_egtp.h"
137 #include "cu_f1ap_msg_hdl.h"
140 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
141 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
143 /*******************************************************************
145 * @brief Sends F1 msg over SCTP
149 * Function : SendF1APMsg
151 * Functionality: Sends F1 msg over SCTP
153 * @params[in] Region region
155 * @return ROK - success
158 * ****************************************************************/
159 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
161 Buffer *mBuf = NULLP;
163 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
165 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
167 ODU_PRINT_MSG(mBuf, 0,0);
169 if(sctpSend(duId, mBuf) != ROK)
171 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
172 ODU_PUT_MSG_BUF(mBuf);
178 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
179 ODU_PUT_MSG_BUF(mBuf);
182 ODU_PUT_MSG_BUF(mBuf);
186 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
193 /********************************************************************
195 * @brief Builds and sends the F1SetupResponse
199 * Function : BuildAndSendF1SetupRsp
201 * Functionality: Constructs the F1SetupResponse message and sends
202 * it back to the DU through SCTP.
204 * @params[in] void **buf,Buffer to which encoded pattern is written into
205 * @params[in] int *size,size of buffer
207 * @return ROK - success
210 * ****************************************************************/
211 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
214 uint8_t elementCnt,cellCnt;
215 F1AP_PDU_t *f1apMsg = NULL;
216 F1SetupResponse_t *f1SetupRsp;
217 GNB_CU_Name_t *cuName;
218 Cells_to_be_Activated_List_t *cellToActivate;
219 RRC_Version_t *rrcVer;
220 asn_enc_rval_t encRetVal;
221 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
223 /* Allocate the memory for F1SetupRequest_t */
224 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
227 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
230 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
232 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
233 if(f1apMsg->choice.successfulOutcome == NULLP)
235 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
236 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
240 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
241 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
242 f1apMsg->choice.successfulOutcome->value.present = \
243 SuccessfulOutcome__value_PR_F1SetupResponse;
244 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
247 f1SetupRsp->protocolIEs.list.count = elementCnt;
248 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
250 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
251 elementCnt * sizeof(F1SetupResponseIEs_t *));
252 if(f1SetupRsp->protocolIEs.list.array == NULLP)
254 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
255 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
256 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
260 for(idx=0; idx<elementCnt; idx++)
262 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
263 sizeof(F1SetupResponseIEs_t));
264 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
266 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
267 elementCnt * sizeof(F1SetupResponseIEs_t *));
268 CU_FREE(f1apMsg->choice.successfulOutcome, \
269 sizeof(SuccessfulOutcome_t));
270 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
277 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
278 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
279 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
280 F1SetupResponseIEs__value_PR_TransactionID;
281 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
286 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
287 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
288 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
289 F1SetupResponseIEs__value_PR_GNB_CU_Name;
290 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
291 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
293 CU_ALLOC(cuName->buf, sizeof(cuName->size));
294 if(cuName->buf == NULLP)
296 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
298 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
299 sizeof(F1SetupResponseIEs_t));
301 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
302 elementCnt * sizeof(F1SetupResponseIEs_t *));
303 CU_FREE(f1apMsg->choice.successfulOutcome,\
304 sizeof(SuccessfulOutcome_t));
305 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
308 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
310 /*Cells to be activated list*/
312 f1SetupRsp->protocolIEs.list.array[idx]->id = \
313 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
314 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
315 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
316 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
317 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
318 Cells_to_be_Activated_List;
320 cellToActivate->list.count = cellCnt;
321 cellToActivate->list.size = \
322 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
323 CU_ALLOC(cellToActivate->list.array,\
324 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
325 if(cellToActivate->list.array == NULLP)
327 CU_FREE(cuName->buf, sizeof(cuName->size));
328 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
330 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
331 sizeof(F1SetupResponseIEs_t));
333 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
334 elementCnt * sizeof(F1SetupResponseIEs_t *));
335 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
336 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
339 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
341 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
342 if(cellToActivate->list.array[ieIdx] == NULLP)
344 CU_FREE(cellToActivate->list.array,\
345 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
346 CU_FREE(cuName->buf, sizeof(cuName->size));
347 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
349 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
350 sizeof(F1SetupResponseIEs_t));
352 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
353 elementCnt * sizeof(F1SetupResponseIEs_t *));
354 CU_FREE(f1apMsg->choice.successfulOutcome, \
355 sizeof(SuccessfulOutcome_t));
356 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
360 cellToActivate->list.array[0]->id = \
361 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
362 cellToActivate->list.array[0]->criticality = Criticality_ignore;
363 cellToActivate->list.array[0]->value.present = \
364 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
365 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
366 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
367 CU_ALLOC(cellToActivate->list.array[0]->\
368 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
370 if(cellToActivate->list.array[0]->value.choice.\
371 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
374 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
376 CU_FREE(cellToActivate->list.array[ieIdx],\
377 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
380 CU_FREE(cellToActivate->list.array,\
381 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
382 CU_FREE(cuName->buf, sizeof(cuName->size));
383 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
385 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
386 sizeof(F1SetupResponseIEs_t));
388 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
389 elementCnt * sizeof(F1SetupResponseIEs_t *));
390 CU_FREE(f1apMsg->choice.successfulOutcome, \
391 sizeof(SuccessfulOutcome_t));
392 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
395 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
396 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
397 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
398 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
399 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
400 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
401 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
402 nRCGI.nRCellIdentity.size);
403 if(cellToActivate->list.array[0]->value.choice.\
404 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
406 CU_FREE(cellToActivate->list.array[0]->\
407 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
409 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
411 CU_FREE(cellToActivate->list.array[ieIdx],\
412 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
415 CU_FREE(cellToActivate->list.array,\
416 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
417 CU_FREE(cuName->buf, sizeof(cuName->size));
418 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
420 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
421 sizeof(F1SetupResponseIEs_t));
423 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
424 elementCnt * sizeof(F1SetupResponseIEs_t *));
425 CU_FREE(f1apMsg->choice.successfulOutcome, \
426 sizeof(SuccessfulOutcome_t));
427 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
430 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
433 f1SetupRsp->protocolIEs.list.array[idx]->id = \
434 ProtocolIE_ID_id_GNB_CU_RRC_Version;
435 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
436 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
437 F1SetupResponseIEs__value_PR_RRC_Version;
438 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
439 rrcVer->latest_RRC_Version.size = RRC_SIZE;
441 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
442 if(rrcVer->latest_RRC_Version.buf == NULLP)
444 CU_FREE(cuName->buf, sizeof(cuName->size));
445 for(ieIdx=0; ieIdx<elementCnt; idx++)
447 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
448 sizeof(F1SetupResponseIEs_t));
450 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
451 elementCnt * sizeof(F1SetupResponseIEs_t *));
452 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
453 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
457 /* Need to check RRC Version */
458 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
459 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
460 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
461 if(rrcVer->iE_Extensions == NULLP)
463 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
464 CU_FREE(cuName->buf, sizeof(cuName->size));
465 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
467 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
468 sizeof(F1SetupResponseIEs_t));
470 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
471 elementCnt * sizeof(F1SetupResponseIEs_t *));
472 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
473 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
476 rrcVer->iE_Extensions->list.count = 1;
477 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
478 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
479 sizeof(struct RRC_Version_ExtIEs *));
480 if(rrcVer->iE_Extensions->list.array == NULLP)
482 CU_FREE(rrcVer->iE_Extensions,\
483 sizeof(ProtocolExtensionContainer_4624P81_t));
484 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
485 CU_FREE(cuName->buf, sizeof(cuName->size));
486 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
488 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
489 sizeof(F1SetupResponseIEs_t));
491 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
492 elementCnt * sizeof(F1SetupResponseIEs_t *));
493 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
494 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
497 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
498 sizeof(struct RRC_Version_ExtIEs));
499 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
501 CU_FREE(rrcVer->iE_Extensions->list.array,\
502 sizeof(struct RRC_Version_ExtIEs *));
503 CU_FREE(rrcVer->iE_Extensions,\
504 sizeof(ProtocolExtensionContainer_4624P81_t));
505 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
506 CU_FREE(cuName->buf, sizeof(cuName->size));
507 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
509 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
510 sizeof(F1SetupResponseIEs_t));
512 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
513 elementCnt * sizeof(F1SetupResponseIEs_t *));
514 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
515 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
518 rrcVer->iE_Extensions->list.array[0]->id = \
519 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
520 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
521 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
522 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
523 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
524 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
525 CU_ALLOC(rrcVer->iE_Extensions->list.\
526 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
528 if(rrcVer->iE_Extensions->list.\
529 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
531 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
532 sizeof(struct RRC_Version_ExtIEs));
533 CU_FREE(rrcVer->iE_Extensions->list.array,\
534 sizeof(struct RRC_Version_ExtIEs *));
535 CU_FREE(rrcVer->iE_Extensions,\
536 sizeof(ProtocolExtensionContainer_4624P81_t));
537 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
538 CU_FREE(cuName->buf, sizeof(cuName->size));
539 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
541 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
542 sizeof(F1SetupResponseIEs_t));
544 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
545 elementCnt * sizeof(F1SetupResponseIEs_t *));
546 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
547 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
550 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
551 Latest_RRC_Version_Enhanced.buf[0] = 0;
552 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
553 Latest_RRC_Version_Enhanced.buf[1] = 5;
554 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
555 Latest_RRC_Version_Enhanced.buf[2] = 15;
557 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
559 /* Encode the F1SetupRequest type as UPER */
560 memset(encBuf, 0, ENC_BUF_MAX_LEN);
562 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
565 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
566 CU_FREE(cuName->buf, sizeof(cuName->size));
567 for(idx=0; idx<elementCnt; idx++)
569 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
571 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
572 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
573 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
575 /* Check encode results */
576 if(encRetVal.encoded == ENCODE_FAIL)
578 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
579 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
584 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
585 for(int i=0; i< encBufSize; i++)
587 DU_LOG("%x",encBuf[i]);
592 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
594 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
599 }/* End of BuildAndSendF1SetupRsp */
601 /*******************************************************************
603 * @brief Builds and sends the DUUpdateAcknowledge
607 * Function : BuildAndSendDUUpdateAck
609 * Functionality: Constructs the DU Update Acknowledge message and sends
610 * it to the DU through SCTP.
614 * @return ROK - success
617 * ****************************************************************/
619 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
623 F1AP_PDU_t *f1apMsg = NULL;
624 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
625 asn_enc_rval_t enRetVal; /* Encoder return value */
627 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
629 /* Allocate the memory for F1SetupRequest_t */
630 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
633 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
637 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
639 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
640 if(f1apMsg->choice.successfulOutcome == NULLP)
642 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
643 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
647 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
648 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
649 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
650 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
653 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
654 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
656 /* Initialize the F1Setup members */
657 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
658 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
660 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
661 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
662 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
666 for(idx=0; idx<elementCnt; idx++)
668 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
669 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
671 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
672 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
673 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
680 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
681 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
682 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
683 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
684 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
686 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
688 /* Encode the F1SetupRequest type as UPER */
689 memset(encBuf, 0, ENC_BUF_MAX_LEN);
691 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
694 for(idx=0; idx<elementCnt; idx++)
696 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
698 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
699 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
700 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
702 /* Checking encode results */
703 if(enRetVal.encoded == ENCODE_FAIL)
705 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
706 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
711 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
712 for(int i=0; i< encBufSize; i++)
714 DU_LOG("%x",encBuf[i]);
719 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
720 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
722 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
728 }/* End of BuildAndSendDUUpdateAck*/
730 /*******************************************************************
732 * @brief deallocating the memory of F1reset msg
736 * Function : FreeF1ResetReq
739 * - freeing memory of F1reset request msg
745 * ****************************************************************/
746 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
749 Reset_t *f1ResetMsg = NULLP;
753 if(f1apMsg->choice.initiatingMessage)
755 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
756 if(f1ResetMsg->protocolIEs.list.array)
758 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
760 if(f1ResetMsg->protocolIEs.list.array[idx])
762 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
765 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
767 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
769 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
772 /*******************************************************************
774 * @brief build ansld ans send f1reset msg
778 * Function : BuildAndSendF1ResetReq
780 * Functionality: build and send f1reset msg
782 * @return ROK - success
785 * ****************************************************************/
786 uint8_t BuildAndSendF1ResetReq()
788 uint8_t elementCnt=0;
790 uint8_t ret= RFAILED;
791 Reset_t *f1ResetMsg = NULLP;
792 F1AP_PDU_t *f1apMsg = NULLP;
793 asn_enc_rval_t encRetVal;
794 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
797 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
800 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
803 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
804 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
805 if(f1apMsg->choice.initiatingMessage == NULLP)
807 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
810 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
811 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
812 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
814 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
817 f1ResetMsg->protocolIEs.list.count = elementCnt;
818 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
820 /* Initialize the F1Reset members */
821 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
822 if(f1ResetMsg->protocolIEs.list.array == NULLP)
824 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
827 for(idx=0; idx<elementCnt; idx++)
829 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
830 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
832 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
839 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
840 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
841 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
842 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
846 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
847 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
848 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
849 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
850 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
854 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
855 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
856 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
857 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
858 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
860 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
862 /* Encode the F1SetupRequest type as APER */
863 memset(encBuf, 0, ENC_BUF_MAX_LEN);
865 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
869 if(encRetVal.encoded == ENCODE_FAIL)
871 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
872 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
877 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
878 for(idx=0; idx< encBufSize; idx++)
880 DU_LOG("%x",encBuf[idx]);
884 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
885 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
887 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
895 FreeF1ResetReq(f1apMsg);
899 /*******************************************************************
901 * @brief Fills Radio Bearer Config
905 * Function : fillSrbCfg
907 * Functionality: Fills Radio Bearer Config
909 * @params[in] SRB_ToAddModList *
911 * @return ROK - success
914 * ****************************************************************/
915 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
917 uint8_t elementCnt = 0;
918 uint8_t idx, ieId, srbIdx = 0;
920 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
922 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
926 if(bearerCfg != NULLP)
928 bearerCfg->list.count = elementCnt;
929 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
930 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
931 if(bearerCfg->list.array != NULLP)
933 for(idx = 0; idx < elementCnt; idx++)
935 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
936 if(bearerCfg->list.array[idx] == NULLP)
938 for(ieId = 0; ieId < idx; ieId++)
940 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
942 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
949 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
954 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
956 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
957 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
963 /*******************************************************************
965 * @brief Fills Master CellGroup Info
969 * Function : fillMasterCellGroup
971 * Functionality: Fills Master Cell Group IE
973 * @params[in] RRCSetup_IEs_t *
975 * @return ROK - success
978 * ****************************************************************/
980 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
983 masterCellGroup->buf = NULLP;
984 if(ueCb->f1apMsgDb.duToCuContainer.buf)
986 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
987 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
988 if(masterCellGroup->buf != NULLP)
990 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
994 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1005 /*******************************************************************
1007 * @brief Fills RRC setup IE
1011 * Function : fillRRCSetupIE
1013 * Functionality: Fills RRC Setup IE
1015 * @params[in] RRCSetup_IEs_t *
1017 * @return ROK - success
1020 * ****************************************************************/
1022 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1024 uint8_t ret = ROK, srbIdx = 0;
1027 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1028 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1030 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1034 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1038 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1042 /* If SRB configuration are filled successfully in RRC Setup, mark these
1043 * configurartion as sent to UE */
1044 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1046 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1047 ueCb->srbList[srbIdx].cfgSentToUe = true;
1052 /*******************************************************************
1054 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1058 * Function : fillDlCcchRrcMsg
1060 * Functionality: Fills DL DCCCH Message required for
1061 * DLRRCMessageTransfer
1063 * @params[in] RRCContainer_t *rrcContainer
1065 * @return ROK - success
1068 * ****************************************************************/
1070 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1074 DL_CCCH_Message_t dl_CCCH_Msg;
1075 asn_enc_rval_t encRetVal;
1077 if(rrcContainer != NULLP)
1079 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1081 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1082 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1084 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1085 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1086 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1088 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1089 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1090 RRCSetup__criticalExtensions_PR_rrcSetup;
1092 /* Fill RRC Setup IE */
1093 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1094 sizeof(RRCSetup_IEs_t));
1095 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1097 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1101 /* encode DL-CCCH message into RRC Container */
1102 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1103 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1105 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1106 /* Encode results */
1107 if(encRetVal.encoded == ENCODE_FAIL)
1109 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1110 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1115 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1116 for(int i = 0; i< encBufSize; i++)
1118 DU_LOG("%x",encBuf[i]);
1120 rrcContainer->size = encBufSize;
1121 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1122 if(rrcContainer->buf != NULLP)
1124 memset(rrcContainer->buf, 0, encBufSize);
1125 for(idx2 = 0; idx2 < encBufSize; idx2++)
1127 rrcContainer->buf[idx2] = encBuf[idx2];
1139 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1145 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1151 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1157 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1162 /*******************************************************************
1164 * @brief Fills QOS flow configuration
1168 * Function : fillQosFlowsToAdd
1170 * Functionality: Fills QOS flow configuration
1172 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1174 * @return ROK - success
1177 * ****************************************************************/
1178 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1180 uint8_t idx, ied, elementCnt;
1183 qosFlow->list.count = elementCnt;
1184 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1185 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1186 if(qosFlow->list.array != NULLP)
1188 for(idx = 0; idx < elementCnt; idx++)
1190 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1191 if(qosFlow->list.array[idx] == NULLP)
1193 for(ied = 0; ied < idx; ied++)
1195 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1197 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1203 *qosFlow->list.array[idx] = 9;
1207 /*******************************************************************
1209 * @brief Fills CN Assoc for Drb to Add/Mod List
1213 * Function : fillCnAssoc
1215 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1217 * @params[in] struct DRB_ToAddMod__cnAssociation *
1219 * @return ROK - success
1222 * ****************************************************************/
1224 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1228 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1229 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1231 cnAssoc->choice.eps_BearerIdentity = 5;
1233 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1235 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1236 if(cnAssoc->choice.sdap_Config)
1238 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1239 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1240 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1241 cnAssoc->choice.sdap_Config->defaultDRB = true;
1242 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1243 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1244 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1245 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1246 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1248 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1252 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1253 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1259 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1266 /*******************************************************************
1268 * @brief Fills Radio Bearer Config for Drb
1272 * Function : fillDrbCfg
1274 * Functionality: Fills Radio Bearer Config for Drb
1276 * @params[in] drbId, DRB_ToAddModList *
1278 * @return ROK - success
1281 * ****************************************************************/
1282 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1284 uint8_t idx, ied, ret, elementCnt;
1290 drbCfg->list.count = elementCnt;
1291 drbCfg->list.size =\
1292 elementCnt * sizeof(DRB_ToAddMod_t *);
1293 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1294 if(drbCfg->list.array != NULLP)
1296 for(idx = 0; idx < elementCnt; idx++)
1298 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1299 if(drbCfg->list.array[idx] == NULLP)
1301 for(ied = 0; ied < idx; ied++)
1303 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1305 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1315 /* CN ASSOCIATION */
1316 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1317 if(drbCfg->list.array[idx]->cnAssociation)
1319 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1322 drbCfg->list.array[idx]->drb_Identity = drbId;
1327 /*******************************************************************
1329 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1333 * Function : fillRrcReconfigIE
1335 * Functionality: Fills RRC Reconfig Message required for
1336 * DLRRCMessageTransfer
1338 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1340 * @return ROK - success
1343 * ****************************************************************/
1345 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1348 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1349 if(rrcReconfigMsg->radioBearerConfig)
1351 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1352 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1354 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1359 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1360 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1362 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1365 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1366 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1367 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1373 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1374 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1380 /*******************************************************************
1382 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1386 * Function : fillDlDcchRrcMsg
1388 * Functionality: Fills DL DCCH Message required for
1389 * DLRRCMessageTransfer
1391 * @params[in] RRCContainer_t *rrcContainer
1393 * @return ROK - success
1396 * ****************************************************************/
1398 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1401 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1402 DL_DCCH_Message_t dl_DCCH_Msg;
1403 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1404 asn_enc_rval_t encRetVal;
1406 if(rrcContainer != NULLP)
1408 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1410 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1411 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1413 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1414 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1415 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1417 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1418 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1421 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1422 * configurartion as sent to UE */
1423 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1425 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1426 ueCb->srbList[srbIdx].cfgSentToUe = true;
1428 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1430 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1431 ueCb->drbList[drbIdx].cfgSentToUe = true;
1434 /* encode DL-DCCH message into RRC Container */
1435 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1436 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1438 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1439 /* Encode results */
1440 if(encRetVal.encoded == ENCODE_FAIL)
1442 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1443 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1448 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1449 for(int i = 0; i< encBufSize; i++)
1451 DU_LOG("%x",encBuf[i]);
1453 rrcContainer->size = encBufSize;
1454 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1455 if(rrcContainer->buf != NULLP)
1457 memset(rrcContainer->buf, 0, encBufSize);
1458 for(idx2 = 0; idx2 < encBufSize; idx2++)
1460 rrcContainer->buf[idx2] = encBuf[idx2];
1468 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1474 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1480 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1486 /*******************************************************************
1488 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1492 * Function : BuildDLRRCContainer
1494 * Functionality: Builds RRC Container IE required for
1495 * DLRRCMessageTransfer
1499 * @return ROK - success
1502 * ****************************************************************/
1504 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1506 uint8_t ret, bufLen;
1509 if(rrcMsgType == RRC_SETUP)
1511 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1513 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1515 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1517 DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
1518 char secModeBuf[30]={0x00, 0x02, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1519 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1521 rrcContainer->size = bufLen;
1522 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1523 if(rrcContainer->buf != NULLP)
1525 memset(rrcContainer->buf, 0, bufLen);
1526 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1530 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1534 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1536 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1537 char secModeBuf[9]={0x00, 0x03, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1539 rrcContainer->size = bufLen;
1540 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1541 if(rrcContainer->buf != NULLP)
1543 memset(rrcContainer->buf, 0, bufLen);
1544 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1548 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1552 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1554 /*Hardcoded RRC Container from reference logs*/
1555 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1556 char buf[14] ={0x00, 0x04, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1558 rrcContainer->size = bufLen;
1559 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1560 if(rrcContainer->buf != NULLP)
1562 memset(rrcContainer->buf, 0, bufLen);
1563 memcpy(rrcContainer->buf, buf, bufLen);
1567 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1571 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1573 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1574 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1576 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1582 /*******************************************************************
1584 * @brief Frees the DLRRCMessageTransfer
1588 * Function : freeDlRrcMessageTransfer
1590 * Functionality: Frees the DLRRCMessageTransfer
1594 * @return ROK - success
1597 * ****************************************************************/
1598 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1601 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1605 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1606 if(dlRRCMsg->protocolIEs.list.array)
1609 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1610 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1611 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1613 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1615 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1617 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1621 /*******************************************************************
1623 * @brief Builds and sends the DLRRCMessageTransfer
1627 * Function : BuildAndSendDLRRCMessageTransfer
1629 * Functionality: Constructs the DL RRC Message Transfer and sends
1630 * it to the CU through SCTP.
1634 * @return ROK - success
1637 * ****************************************************************/
1638 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1640 uint8_t elementCnt = 0;
1643 F1AP_PDU_t *f1apMsg = NULLP;
1644 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1645 asn_enc_rval_t encRetVal; /* Encoder return value */
1647 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1649 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1650 if(f1apMsg == NULLP)
1652 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1656 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1657 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1658 if(f1apMsg->choice.initiatingMessage == NULLP)
1660 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1661 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1665 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1666 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1667 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1668 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1671 dlRRCMsg->protocolIEs.list.count = elementCnt;
1672 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1674 /* Initialize the F1Setup members */
1675 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1676 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1678 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1679 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1680 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1684 for(idx=0; idx<elementCnt; idx++)
1686 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1687 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1689 for(ieId=0; ieId<idx; ieId++)
1691 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1693 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1694 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1695 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1700 /* GNB CU UE F1AP ID */
1702 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1703 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1704 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1705 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1707 /* GNB DU UE F1AP ID */
1709 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1710 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1711 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1712 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1716 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1717 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1718 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1719 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1723 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1724 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1725 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1726 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1728 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1730 /* Encode the F1SetupRequest type as APER */
1731 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1733 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1735 /* Encode results */
1736 if(encRetVal.encoded == ENCODE_FAIL)
1738 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1739 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1744 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1745 for(int i=0; i< encBufSize; i++)
1747 DU_LOG("%x",encBuf[i]);
1752 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1754 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1757 freeDlRrcMessageTransfer(f1apMsg);
1759 }/* End of BuildAndSendDLRRCMessageTransfer */
1761 /*******************************************************************
1763 * @brief Function to set the Dl RRC Msg Type
1767 * Function : setDlRRCMsgType
1769 * Functionality: Constructs the UE Setup Response and sends
1770 * it to the DU through SCTP.
1774 * @return ROK - success
1777 * ****************************************************************/
1779 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1781 uint8_t rrcMsgType = 0;
1782 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1785 rrcMsgType = RRC_SETUP;
1787 case RRC_SETUP_COMPLETE:
1788 rrcMsgType = RRC_SETUP_COMPLETE;
1790 case NAS_SECURITY_MODE_COMPLETE:
1791 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1793 case RRC_SECURITY_MODE_COMPLETE:
1794 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1796 case REGISTRATION_COMPLETE:
1797 rrcMsgType = REGISTRATION_COMPLETE;
1799 case UE_CONTEXT_SETUP_RSP:
1800 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1802 case RRC_RECONFIG_COMPLETE:
1803 rrcMsgType = RRC_RECONFIG_COMPLETE;
1812 /*******************************************************************
1814 * @brief fill long cycle offset value of drx
1818 * Function : fillLongCycleOffsetValue
1820 * Functionality: fill long cycle offset value of drx
1822 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1823 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1825 * @return ROK - success
1828 * ****************************************************************/
1829 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *recvedLongCycleOffsetVal)
1832 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1833 switch(recvedLongCycleOffsetVal->present)
1835 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10:
1837 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1840 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20:
1842 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1845 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32:
1847 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1850 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40:
1852 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1855 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60:
1857 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1860 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64:
1862 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1865 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70:
1867 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1870 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80:
1872 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1875 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128:
1877 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1880 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160:
1882 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1885 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256:
1887 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1890 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320:
1892 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1895 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512:
1897 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1900 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640:
1902 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1905 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024:
1907 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1910 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280:
1912 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1915 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048:
1917 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1920 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560:
1922 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1925 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120:
1927 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1930 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240:
1932 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1940 /*******************************************************************
1942 * @brief Extract configuration from DRX_ConfigRrc
1943 * and store the drx configuration in UeCb
1947 * Function : storeDrxCfgInUeCb
1949 * Functionality: Store drx configuration in UeCb
1951 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
1954 * ****************************************************************/
1955 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
1957 switch(drxSetup->drx_onDurationTimer.present)
1959 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
1961 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
1963 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
1964 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
1967 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
1969 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
1970 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
1974 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
1975 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
1976 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
1977 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
1978 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
1979 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
1980 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
1981 if(drxSetup->shortDRX)
1983 drxCfg->shortDrxPres=true;
1984 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
1985 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
1988 drxCfg->shortDrxPres=false;
1992 /*******************************************************************
1994 * @brief Extract configuration from CellGroupConfig
1998 * Function : extractCellGroupConfig
2000 * Functionality: Extract configuration from CellGroupConfig
2001 * and store in local database
2003 * @params[in] UE control block
2006 * @return ROK - success
2009 * ****************************************************************/
2010 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
2012 uint8_t rbIdx, srbIdx, drbIdx;
2013 bool srbFound, drbFound;
2014 SrbInfo *srbCfgDb = NULLP;
2015 DrbInfo *drbCfgDb = NULLP;
2016 RlcLcCfg *rlcLcCfgDb = NULLP;
2017 MacLcCfg *macLcCfgDb = NULLP;
2018 RLC_BearerConfig_t *rlcCfg = NULLP;
2019 RLC_Config_t *rlcLcCfg = NULLP;
2020 LogicalChannelConfig_t *macLcCfg = NULLP;
2027 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2031 if(cellGrpCfg == NULLP)
2033 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2038 if(cellGrpCfg->mac_CellGroupConfig)
2040 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2042 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2044 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2047 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2049 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup)
2051 ueCb->drxCfgPresent = true;
2052 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2057 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2064 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2069 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2071 /* Update SRB configuration in local DB */
2072 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2074 /* Search if SRB entry is already present in DB */
2075 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2077 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2079 srbCfgDb = &ueCb->srbList[srbIdx];
2085 /* If not, add SRB to UE CB's SRB list */
2088 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2089 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2093 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2094 srbCfgDb->cfgSentToUe = false;
2095 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2096 macLcCfgDb = &srbCfgDb->macLcCfg;
2099 /* Update DRB configuration in local DB */
2100 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2102 /* Search if DRB entry is already present in DB */
2103 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2105 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2107 drbCfgDb = &ueCb->drbList[drbIdx];
2113 /* If not, add DRB to UE CB's SRB list */
2116 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2117 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2121 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2122 drbCfgDb->cfgSentToUe = false;
2123 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2124 macLcCfgDb = &drbCfgDb->macLcCfg;
2128 /* Update RLC configuration for this RB */
2129 rlcLcCfg = rlcCfg->rlc_Config;
2130 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2131 switch(rlcLcCfgDb->rlcMode)
2133 case RLC_Config_PR_am:
2135 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2136 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2137 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2138 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2139 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2141 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2142 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2143 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2147 case RLC_Config_PR_um_Bi_Directional:
2149 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2151 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2152 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2157 /* Update MAC configuration for this LC */
2158 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2159 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2160 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2161 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2162 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2163 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2168 /*******************************************************************
2170 * @brief Function to decode DU to CU RRC container
2174 * Function : extractDuToCuRrcCont
2176 * Functionality: Function to decode DU to CU RRC container
2179 * RRC conatiner octect string to be decoded
2181 * @return ROK - success
2184 * ****************************************************************/
2185 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2187 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2188 asn_dec_rval_t rval; /* Decoder return value */
2190 /* Copy the received container to UeCb */
2191 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2193 /* Decoding DU to CU RRC container octet string to cell group config */
2194 cellGrpCfgMsg = &cellGrpCfg;
2195 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2197 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2199 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2201 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2205 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2207 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2209 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2216 /*******************************************************************
2218 * @brief Function to build Initial UL RRC Message
2222 * Function : procInitULRRCMsg
2224 * Functionality: Function to build Initial UL RRC Message
2228 * @return ROK - success
2231 * ****************************************************************/
2233 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2235 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2237 uint16_t cellIdx=0, nrCellId = 0;
2242 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2244 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2246 SEARCH_DU_DB(duIdx, duId, duDb);
2247 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2249 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2251 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2253 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2254 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2257 case ProtocolIE_ID_id_NRCGI:
2258 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2259 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2264 case ProtocolIE_ID_id_C_RNTI:
2265 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2266 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2268 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2269 memset(ueCb, 0, sizeof(CuUeCb));
2270 ueCb->cellCb = cellCb;
2271 ueCb->crnti = crnti;
2272 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2273 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2274 ueCb->state = UE_ATTACH_IN_PROGRESS;
2277 cellCb->ueCb[cellCb->numUe] = ueCb;
2282 case ProtocolIE_ID_id_RRCContainer:
2285 case ProtocolIE_ID_id_DUtoCURRCContainer:
2287 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2288 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2290 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2291 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2292 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2293 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2295 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2296 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2297 ueCb->f1apMsgDb.duToCuContainer.size);
2299 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2301 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2307 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2314 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2323 ueCb->f1apMsgDb.dlRrcMsgCount++;
2324 rrcMsgType = setDlRRCMsgType(ueCb);
2325 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2330 /*******************************************************************
2332 * @brief Builds Nrcgi
2336 * Function : BuildNrcgi
2338 * Functionality: Building the PLMN ID and NR Cell id
2340 * @params[in] NRCGI_t *nrcgi
2341 * @return ROK - success
2344 * ****************************************************************/
2345 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2348 uint8_t unused_bits = 4;
2349 uint8_t byteSize = 5;
2351 /* Allocate Buffer Memory */
2352 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2353 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2354 if(nrcgi->pLMN_Identity.buf == NULLP)
2358 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2364 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2365 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2366 if(nrcgi->nRCellIdentity.buf == NULLP)
2370 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2374 /*******************************************************************
2376 * @brief Builds Special cell list for UE Setup Request
2380 * Function : BuildSplCellList
2382 * Functionality: Constructs the Special Cell list for UESetReq
2384 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2386 * @return ROK - success
2389 * ****************************************************************/
2390 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2396 spCellLst->list.count = cellCnt;
2397 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2398 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2399 if(spCellLst->list.array == NULLP)
2403 for(idx=0; idx<cellCnt; idx++)
2405 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2406 if(spCellLst->list.array[idx] == NULLP)
2412 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2413 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2414 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2416 /* Special Cell ID -NRCGI */
2417 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2422 /*Special Cell Index*/
2423 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2425 }/* End of BuildSplCellList*/
2427 /*******************************************************************
2429 * @brief Builds SRBS to be setup
2433 * Function : BuildSRBSetup
2435 * Functionality: Constructs the SRB's for UESetReq
2437 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2439 * @return ROK - success
2442 * ****************************************************************/
2443 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2448 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2449 srbCnt = ueCb->numSrb;
2452 srbSet->list.count = srbCnt;
2453 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2454 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2455 if(srbSet->list.array == NULLP)
2457 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2461 for(idx=0; idx<srbCnt; idx++)
2463 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2464 if(srbSet->list.array[idx] == NULLP)
2466 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2471 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2474 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2475 srbSet->list.array[idx]->criticality = Criticality_ignore;
2476 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2477 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2478 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2483 for(idx=0; idx<srbCnt; idx++)
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 = ueCb->srbList[idx].srbId;
2492 }/* End of BuildSRBSetup*/
2494 /*******************************************************************
2496 * @brief Builds QOS Info for DRB Setum Item
2500 * Function : BuildQOSInfo
2502 * Functionality: Constructs the QOS Info for DRB Setup Item
2504 * @params[in] QoSInformation_t *qosinfo
2505 * int16_t pduSessionID
2507 * @return ROK - success
2510 * ****************************************************************/
2511 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2513 uint8_t elementCnt = 0, qosCntIdx = 0;
2514 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2516 /* NonDynamic5QIDescriptor */
2517 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2518 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2519 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2525 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2529 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2530 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2532 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2534 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2540 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2541 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2545 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2546 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2548 /*MaxDataBurstVolume*/
2549 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2550 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2554 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2555 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2558 /*nRGRAN Allocation Retention Priority*/
2561 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2562 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2563 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2567 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2568 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2569 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2571 qosInfo->priorityLevel = PriorityLevel_lowest;
2572 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2573 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2576 /* PDU session ID */
2579 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2580 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2582 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2586 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2587 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2591 elementCnt = NUM_QOS_EXT;
2592 qosIeExt->list.count = elementCnt;
2593 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2595 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2596 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2598 if(qosIeExt->list.array == NULLP)
2600 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2604 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2606 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2607 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2609 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2612 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2613 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2614 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2615 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2616 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2617 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2618 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2619 qosInfo->pduSessionId = pduSessionID;
2624 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2629 }/*End of BuildQOSInfo*/
2631 /*******************************************************************
2633 * @brief Builds SNSSAI
2637 * Function : BuildSNSSAI
2639 * Functionality: Constructs the SNSSAI For DRB list
2641 * @params[in] SNSSAI_t *snssai
2642 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2644 * @return ROK - success
2647 * ****************************************************************/
2648 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2652 snssai->sST.size = sizeof(uint8_t);
2653 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2654 if(snssai->sST.buf == NULLP)
2659 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2661 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2664 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2665 if(snssai->sD == NULLP)
2669 snssai->sD->size = 3 * sizeof(uint8_t);
2670 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2671 if(snssai->sD->buf == NULLP)
2676 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2678 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2681 drbInfo->snssai = snssaiToCopy;
2683 }/*End of BuildSNSSAI*/
2685 /*******************************************************************
2687 * @brief Builds the flow map.
2691 * Function : BuildFlowsMap
2693 * Functionality: Constructs the flowmap For DRB list
2695 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2697 * @return ROK - success
2700 * ****************************************************************/
2701 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2703 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2704 FlowsMapped *qosFlow;
2709 flowCnt = drbInfo->numFlowMap;
2710 flowMap->list.count = flowCnt;
2711 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2712 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2713 if(flowMap->list.array == NULLP)
2715 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2718 for(idx=0; idx<flowCnt; idx++)
2720 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2721 if(flowMap->list.array[idx] == NULLP)
2723 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2729 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2730 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2732 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2734 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2736 qosFlow = &drbInfo->flowMapList[flowIdx];
2743 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2744 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2749 qosFlow = &drbInfo->flowMapList[idx];
2750 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2753 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2754 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2757 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2761 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2762 drbInfo->numFlowMap++;
2765 }/*End of BuildFlowsMap*/
2767 /*******************************************************************
2769 * @brief Builds the Uplink Tunnel Info
2773 * Function : BuildULTnlInfo
2775 * Functionality: Constructs the UL TnlInfo For DRB list
2777 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2779 * @return ROK - success
2782 * ****************************************************************/
2783 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2789 ulInfo->list.count = ulCnt;
2790 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2791 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2792 if(ulInfo->list.array == NULLP)
2794 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2797 for(idx=0; idx<ulCnt; idx++)
2799 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2800 if(ulInfo->list.array[idx] == NULLP)
2802 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2807 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2809 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2810 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2812 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2815 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2816 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2817 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2818 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2820 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2826 /* NOTE: Below IP address must be changed if running on different IP configuration */
2827 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2828 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2829 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2830 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2831 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2833 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2834 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2835 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2836 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2840 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2841 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2842 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2843 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2844 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2848 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2849 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2850 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2851 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2853 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2859 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2860 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2861 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2862 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2864 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2865 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2866 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2867 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2871 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2872 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2873 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2874 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2877 }/*End of BuildULTnlInfo*/
2879 /*******************************************************************
2881 * @brief Builds DRBS to be setup
2885 * Function : BuildDRBSetup
2887 * Functionality: Constructs the DRB's for UESetReq
2889 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2891 * @return ROK - success
2894 * ****************************************************************/
2895 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2897 uint16_t snssaiIdx=0;
2898 uint8_t idx = 0, extIeIdx = 0;
2899 uint8_t elementCnt = 0, drbCnt = 0;
2900 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2901 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2902 DRBs_ToBeSetup_Item_t *drbSetItem;
2903 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2904 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2906 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2907 drbCnt = ueCb->numDrb;
2909 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2910 drbSet->list.count = drbCnt;
2912 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2913 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2914 if(drbSet->list.array == NULLP)
2916 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2920 for(idx=0; idx<drbCnt; idx++)
2922 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2923 if(drbSet->list.array[idx] == NULLP)
2925 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2929 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2930 drbSet->list.array[idx]->criticality = Criticality_ignore;
2931 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2932 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2934 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2936 drbSetItem->dRBID = idx + 1;
2937 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2940 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2943 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2944 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2945 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2947 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2950 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2951 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2952 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2953 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2954 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2955 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2957 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2958 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2959 if(BuildQOSInforet != ROK)
2961 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2966 snssaiIdx = (idx% cuCb.numSnssaiSupported);
2967 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2968 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2969 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
2971 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2972 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
2973 if(BuildSNSSAIret != ROK)
2975 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2979 /*Flows mapped to DRB List*/
2980 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2981 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2982 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2984 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2985 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2986 if(BuildFlowsMapret != ROK)
2988 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2992 /*ULUPTNLInformation To Be Setup List*/
2993 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2994 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2997 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2999 if(BuildULTnlInforet != ROK)
3001 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
3006 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3008 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3009 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
3012 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
3014 /* DL PDCP SN Length */
3015 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
3017 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
3018 if(!drbToBeSetupExt)
3020 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3025 drbToBeSetupExt->list.count = elementCnt;
3026 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3028 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3029 if(!drbToBeSetupExt->list.array)
3031 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3035 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3037 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3038 if(!drbToBeSetupExt->list.array[extIeIdx])
3040 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3046 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3048 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3049 drbToBeSetupExtIe->criticality = Criticality_ignore;
3050 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3051 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3052 drbSetItem->iE_Extensions = drbToBeSetupExt;
3055 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3059 }/* End of BuildDRBSetup*/
3061 /*******************************************************************
3063 * @brief Deallocating memory of function BuildAndSendUESetReq
3067 * Function : FreeNrcgi
3069 * Functionality: Deallocating memory for function BuildNrcgi
3071 * @params[in] NRCGI_t *nrcgi
3075 *******************************************************************/
3076 void FreeNrcgi(NRCGI_t *nrcgi)
3078 if(nrcgi->pLMN_Identity.buf != NULLP)
3080 if(nrcgi->nRCellIdentity.buf != NULLP)
3082 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3084 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3087 /*******************************************************************
3089 * @brief Deallocating memory of function BuildAndSendUESetReq
3093 * Function : FreeSplCellList
3095 * Functionality: Deallocating memory for function BuildSplCellList
3097 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3102 * *****************************************************************/
3103 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3106 if(spCellLst->list.array != NULLP)
3108 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3110 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3112 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3114 if(spCellLst->list.array[cellidx]!=NULLP)
3116 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3119 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3122 /*******************************************************************
3124 * @brief Deallocating memory of function BuildAndSendUESetReq
3128 * Function : FreeSRBSetup
3130 * Functionality: Deallocating memory for function BuildSRBSetup
3132 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3137 * ******************************************************************/
3138 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3141 if(srbSet->list.array != NULLP)
3143 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3145 if(srbSet->list.array[srbidx]!=NULLP)
3147 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3150 CU_FREE(srbSet->list.array,srbSet->list.size);
3153 /*******************************************************************
3155 * @brief Deallocating memory of function BuildAndSendUESetReq
3159 * Function : FreeQOSInfo
3161 * Functionality: Deallocating memory for function BuildQOSInfo
3163 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3167 * ****************************************************************/
3168 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3170 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3171 uint8_t qosCntIdx = 0;
3173 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3175 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3177 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3179 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3180 sizeof(MaxDataBurstVolume_t));
3182 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3183 sizeof(AveragingWindow_t));
3185 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3186 sizeof(NonDynamic5QIDescriptor_t));
3188 if(drbQos->iE_Extensions)
3190 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3191 if(qosIeExt->list.array != NULLP)
3193 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3195 if(qosIeExt->list.array[qosCntIdx])
3197 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3200 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3203 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3206 /*******************************************************************
3208 * @brief Deallocating memory of function BuildAndSendUESetReq
3212 * Function : FreeULTnlInfo
3214 * Functionality: Deallocating memory for function BuildULTnlInfo
3216 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3221 * ****************************************************************/
3222 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3225 if(ulInfo->list.array != NULLP)
3227 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3229 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3231 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3233 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3234 transportLayerAddress.buf != NULLP)
3236 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3239 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3240 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3241 gTPTunnel->gTP_TEID.size);
3243 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3244 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3245 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3247 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3248 sizeof(GTPTunnel_t));
3251 if(ulInfo->list.array[ulidx]!=NULLP)
3253 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3256 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3259 /*******************************************************************
3261 * @brief Deallocating memory for BuildAndSendUESetReq
3265 * Function : FreeDRBSetup
3267 * Functionality: Deallocating memory for BuildDRBSetup
3269 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3273 * ****************************************************************/
3274 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3276 DRBs_ToBeSetup_Item_t *drbSetItem;
3277 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3279 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3281 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3282 if(drbSet->list.array != NULLP)
3284 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3286 if(drbSet->list.array[drbidx] != NULLP)
3288 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3289 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3291 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3292 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3294 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3295 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3297 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3298 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3300 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3302 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3304 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3306 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3307 flows_Mapped_To_DRB_List.list.array != NULLP)
3309 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3310 flows_Mapped_To_DRB_List.list.count; flowidx++)
3312 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3313 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3315 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3316 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3317 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3319 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3320 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3321 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3323 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3324 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3325 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3327 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3328 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3330 CU_FREE(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->maxDataBurstVolume,\
3333 sizeof(MaxDataBurstVolume_t));
3335 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3336 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3337 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3339 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3340 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3341 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3344 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3345 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3347 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3348 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3351 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3352 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3353 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3355 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3356 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3358 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3359 sizeof(OCTET_STRING_t));
3361 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3362 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3364 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3365 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3367 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3368 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3370 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3371 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3373 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3374 iE_Extensions != NULLP)
3376 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3377 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3378 if(qosIeExt->list.array != NULLP)
3380 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3382 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3384 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3387 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3389 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3390 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3393 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3395 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3398 CU_FREE(drbSet->list.array,drbSet->list.size);
3403 /*******************************************************************
3405 * @brief Free the UE Setup Request
3409 * Function : FreeUeContextSetupReq
3411 * Functionality: Deallocate the memory of BuildUESetReq
3413 * @params[in] F1AP_PDU_t *f1apMsg
3418 * ****************************************************************/
3419 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3422 UEContextSetupRequest_t *ueSetReq = NULLP;
3424 if(f1apMsg != NULLP)
3426 if(f1apMsg->choice.initiatingMessage != NULLP)
3428 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3429 if(ueSetReq->protocolIEs.list.array != NULLP)
3431 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3433 if(ueSetReq->protocolIEs.list.array[idx])
3435 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3437 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3439 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3441 case ProtocolIE_ID_id_SpCell_ID:
3442 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3444 case ProtocolIE_ID_id_ServCellIndex:
3446 case ProtocolIE_ID_id_SpCellULConfigured:
3448 case ProtocolIE_ID_id_CUtoDURRCInformation:
3449 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3451 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3452 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3454 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3455 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3457 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3458 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3460 case ProtocolIE_ID_id_RRCContainer:
3461 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3463 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3464 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3467 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3468 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3469 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3472 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3476 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3478 for(ieId=0; ieId<idx; ieId++)
3480 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3482 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3485 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3487 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3489 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3493 /**Filling cell group info **/
3494 /*******************************************************************
3496 * @brief Build Control resource set to add/modify list
3500 * Function : BuildControlRSetToAddModList
3502 * Functionality: Build Control resource set to add/modify list
3505 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3507 * @return ROK - success
3510 * ****************************************************************/
3511 uint8_t BuildControlRSetToAddModList
3513 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3518 uint8_t numBytes, bitsUnused;
3519 struct ControlResourceSet *controlRSet;
3520 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3521 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3524 controlRSetList->list.count = elementCnt;
3525 controlRSetList->list.size = \
3526 elementCnt * sizeof(struct ControlResourceSet *);
3528 controlRSetList->list.array = NULLP;
3529 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3530 if(!controlRSetList->list.array)
3532 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3536 for(idx = 0; idx < elementCnt; idx++)
3538 controlRSetList->list.array[idx] = NULLP;
3539 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3540 if(!controlRSetList->list.array[idx])
3542 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3548 controlRSet = controlRSetList->list.array[idx];
3549 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3551 /* Values harcoded according to our design:
3554 * Bit string stored ff0000000000
3558 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3559 controlRSet->frequencyDomainResources.buf = NULLP;
3560 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3561 controlRSet->frequencyDomainResources.size);
3562 if(!controlRSet->frequencyDomainResources.buf)
3564 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3568 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3569 coreset0EndPrb = CORESET0_END_PRB;
3570 coreset1StartPrb = coreset0EndPrb + 6;
3571 coreset1NumPrb = CORESET1_NUM_PRB;
3572 /* calculate the PRBs */
3573 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3574 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3575 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3577 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3578 controlRSet->cce_REG_MappingType.present = \
3579 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3581 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3582 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3583 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3584 controlRSet->tci_PresentInDCI = NULLP;
3586 uint8_t tciStateIdx;
3588 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3589 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3590 if(!controlRset->tci_StatesPDCCH_ToAddList)
3592 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3597 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3598 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3599 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3600 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3601 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3603 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3607 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3609 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3610 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3612 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3619 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3621 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3622 if(!controlRset->tci_PresentInDCI)
3624 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3628 *(controlRset->tci_PresentInDCI);
3631 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3632 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3633 if(!controlRSet->pdcch_DMRS_ScramblingID)
3635 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3638 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3641 } /* End BuildControlRSetToAddModList */
3643 /*******************************************************************
3645 * @brief Build search space to add/modify list
3649 * Function : BuildSearchSpcToAddModList
3651 * Functionality: Build search space to add/modify list
3654 * @return ROK - success
3657 * ****************************************************************/
3658 uint8_t BuildSearchSpcToAddModList
3660 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3668 struct SearchSpace *searchSpc;
3671 searchSpcList->list.count = elementCnt;
3672 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3674 searchSpcList->list.array = NULLP;
3675 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3676 if(!searchSpcList->list.array)
3678 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3682 for(idx = 0; idx < elementCnt; idx++)
3684 searchSpcList->list.array[idx] = NULLP;
3685 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3686 if(!searchSpcList->list.array[idx])
3688 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3694 searchSpc = searchSpcList->list.array[idx];
3696 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3698 searchSpc->controlResourceSetId = NULLP;
3699 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3700 if(!searchSpc->controlResourceSetId)
3702 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3705 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3707 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3708 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3709 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3710 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3712 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3715 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3716 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3718 searchSpc->duration = NULLP;
3719 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3720 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3721 if(!searchSpc->monitoringSymbolsWithinSlot)
3723 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3727 /* Values taken from reference logs :
3730 * Bit string stores 8000
3735 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3736 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3737 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3738 searchSpc->monitoringSymbolsWithinSlot->size);
3739 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3741 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3746 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3747 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3748 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3749 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3751 searchSpc->nrofCandidates = NULLP;
3752 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3753 if(!searchSpc->nrofCandidates)
3755 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3759 searchSpc->nrofCandidates->aggregationLevel1 = \
3760 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3761 searchSpc->nrofCandidates->aggregationLevel2 = \
3762 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3763 searchSpc->nrofCandidates->aggregationLevel4 = \
3764 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3765 searchSpc->nrofCandidates->aggregationLevel8 = \
3766 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3767 searchSpc->nrofCandidates->aggregationLevel16 = \
3768 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3770 searchSpc->searchSpaceType = NULLP;
3771 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3772 if(!searchSpc->searchSpaceType)
3774 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3778 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3780 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3781 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3782 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3783 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3785 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3788 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3789 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3792 }/* End BuildSearchSpcToAddModList */
3794 /*******************************************************************
3796 * @brief Builds BWP DL dedicated PDCCH config
3800 * Function : BuildBWPDlDedPdcchCfg
3802 * Functionality: Builds BWP DL dedicated PDCCH config
3804 * @params[in] struct PDCCH_Config *pdcchCfg
3806 * @return ROK - success
3809 * ****************************************************************/
3810 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3812 pdcchCfg->controlResourceSetToAddModList = NULLP;
3813 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3814 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3815 if(!pdcchCfg->controlResourceSetToAddModList)
3817 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3821 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3826 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3828 pdcchCfg->searchSpacesToAddModList = NULLP;
3829 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3830 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3831 if(!pdcchCfg->searchSpacesToAddModList)
3833 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3837 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3842 pdcchCfg->searchSpacesToReleaseList = NULLP;
3843 pdcchCfg->downlinkPreemption = NULLP;
3844 pdcchCfg->tpc_PUSCH = NULLP;
3845 pdcchCfg->tpc_PUCCH = NULLP;
3846 pdcchCfg->tpc_SRS = NULLP;
3851 /*******************************************************************
3853 * @brief Builds DMRS DL PDSCH Mapping type A
3857 * Function : BuildDMRSDLPdschMapTypeA
3859 * Functionality: Builds DMRS DL PDSCH Mapping type A
3862 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3863 * @return ROK - success
3866 * ****************************************************************/
3867 uint8_t BuildDMRSDLPdschMapTypeA
3869 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3872 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3873 dmrsDlCfg->choice.setup = NULLP;
3874 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3875 if(!dmrsDlCfg->choice.setup)
3877 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3881 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3882 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3883 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3884 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3886 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3889 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3891 dmrsDlCfg->choice.setup->maxLength = NULLP;
3892 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3893 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3894 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3899 /*******************************************************************
3901 * @brief Builds TCI states to add/modify list
3905 * Function : BuildTCIStatesToAddModList
3907 * Functionality:Builds TCI states to add/modify list
3910 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3912 * @return ROK - success
3915 * ****************************************************************/
3916 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3921 /*******************************************************************
3923 * @brief Builds PDSCH time domain allocation list
3927 * Function : BuildPdschTimeDomAllocList
3929 * Functionality: Builds PDSCH time domain allocation list
3932 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3934 * @return ROK - success
3937 * ****************************************************************/
3938 uint8_t BuildPdschTimeDomAllocList
3940 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3945 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3947 timeDomAllocList->present = \
3948 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3950 timeDomAllocList->choice.setup = NULLP;
3951 CU_ALLOC(timeDomAllocList->choice.setup, \
3952 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3953 if(!timeDomAllocList->choice.setup)
3955 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3960 timeDomAllocList->choice.setup->list.count = elementCnt;
3961 timeDomAllocList->choice.setup->list.size = \
3962 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3964 timeDomAllocList->choice.setup->list.array = NULLP;
3965 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3966 timeDomAllocList->choice.setup->list.size);
3967 if(!timeDomAllocList->choice.setup->list.array)
3969 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3973 for(idx = 0; idx < elementCnt; idx++)
3975 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3976 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3977 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3978 if(!timeDomAllocList->choice.setup->list.array[idx])
3980 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3986 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3987 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3988 if(!timeDomAlloc->k0)
3990 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3993 *(timeDomAlloc->k0) = 0;
3994 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3995 timeDomAlloc->startSymbolAndLength = 66;
3998 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3999 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
4000 if(!timeDomAlloc->k0)
4002 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4005 *(timeDomAlloc->k0) = 1;
4006 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4007 timeDomAlloc->startSymbolAndLength = 66;
4012 /*******************************************************************
4014 * @brief Builds PDSCH PRB Bundling type
4018 * Function : BuildPdschPrbBundlingType
4020 * Functionality: Builds PDSCH PRB Bundling type
4023 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4025 * @return ROK - success
4028 * ****************************************************************/
4029 uint8_t BuildPdschPrbBundlingType
4031 struct PDSCH_Config__prb_BundlingType *prbBndlType
4034 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4036 prbBndlType->choice.staticBundling = NULLP;
4037 CU_ALLOC(prbBndlType->choice.staticBundling, \
4038 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4039 if(!prbBndlType->choice.staticBundling)
4041 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4044 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4049 /*******************************************************************
4051 * @brief Builds BWP DL dedicated PDSCH config
4055 * Function : BuildBWPDlDedPdschCfg
4057 * Functionality: Builds BWP DL dedicated PDSCH config
4059 * @params[in] struct PDSCH_Config *pdschCfg
4061 * @return ROK - success
4064 * ****************************************************************/
4065 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4067 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4069 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4070 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4071 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4072 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4074 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4078 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4083 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4084 pdschCfg->tci_StatesToAddModList = NULLP;
4085 pdschCfg->tci_StatesToReleaseList = NULLP;
4086 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4088 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4089 if(!pdschCfg->tci_StatesToAddModList)
4091 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4094 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4100 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4102 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4103 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4104 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4105 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4107 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4110 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4114 pdschCfg->pdsch_AggregationFactor = NULLP;
4115 pdschCfg->rateMatchPatternToAddModList = NULLP;
4116 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4117 pdschCfg->rateMatchPatternGroup1 = NULLP;
4118 pdschCfg->rateMatchPatternGroup2 = NULLP;
4119 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4120 pdschCfg->mcs_Table = NULLP;
4122 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4123 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4124 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4126 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4129 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4131 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4136 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4137 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4138 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4139 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4140 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4141 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4142 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4147 /*******************************************************************
4149 * @brief Builds intitial DL BWP
4152 * Function : BuildInitialDlBWP
4154 * Functionality: Builds intitial DL BWP in spCellCfgDed
4156 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4158 * @return ROK - success
4161 * ****************************************************************/
4162 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4164 dlBwp->pdcch_Config = NULLP;
4165 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4166 if(!dlBwp->pdcch_Config)
4168 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4171 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4173 dlBwp->pdcch_Config->choice.setup = NULLP;
4174 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4175 if(!dlBwp->pdcch_Config->choice.setup)
4177 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4180 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4185 dlBwp->pdsch_Config = NULLP;
4186 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4187 if(!dlBwp->pdsch_Config)
4189 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4192 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4194 dlBwp->pdsch_Config->choice.setup = NULLP;
4195 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4196 if(!dlBwp->pdsch_Config->choice.setup)
4198 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4202 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4207 dlBwp->sps_Config = NULLP;
4208 dlBwp->radioLinkMonitoringConfig = NULLP;
4212 /*******************************************************************
4214 * @brief Builds DMRS UL Pusch Mapping type A
4218 * Function : BuildDMRSULPuschMapTypeA
4220 * Functionality: Builds DMRS UL Pusch Mapping type A
4223 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4224 * @return ROK - success
4227 * ****************************************************************/
4228 uint8_t BuildDMRSULPuschMapTypeA
4230 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4233 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4234 dmrsUlCfg->choice.setup= NULLP;
4235 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4236 if(!dmrsUlCfg->choice.setup)
4238 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4242 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4243 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4244 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4245 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4247 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4250 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4252 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4253 dmrsUlCfg->choice.setup->maxLength = NULLP;
4254 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4255 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4256 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4257 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4259 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4263 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4264 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4266 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4268 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4271 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4273 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4274 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4278 /*******************************************************************
4280 * @brief Build PUSCH time domain allocation list
4284 * Function : BuildPuschTimeDomAllocList
4286 * Functionality: Build PUSCH time domain allocation list
4289 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4291 * @return ROK - success
4294 * ****************************************************************/
4295 uint8_t BuildPuschTimeDomAllocList
4297 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4302 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4304 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4305 timeDomAllocList->choice.setup = NULLP;
4306 CU_ALLOC(timeDomAllocList->choice.setup, \
4307 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4308 if(!timeDomAllocList->choice.setup)
4310 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4315 timeDomAllocList->choice.setup->list.count = elementCnt;
4316 timeDomAllocList->choice.setup->list.size = \
4317 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4318 timeDomAllocList->choice.setup->list.array = NULLP;
4319 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4320 timeDomAllocList->choice.setup->list.size);
4321 if(!timeDomAllocList->choice.setup->list.array)
4323 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4327 for(idx = 0; idx < elementCnt; idx++)
4329 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4330 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4331 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4332 if(!timeDomAllocList->choice.setup->list.array[idx])
4334 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4340 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4341 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4342 if(!timeDomAlloc->k2)
4344 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4347 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4348 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4349 timeDomAlloc->startSymbolAndLength = 66;
4352 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4353 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4354 if(!timeDomAlloc->k2)
4356 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4359 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4360 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4361 timeDomAlloc->startSymbolAndLength = 66;
4366 /*******************************************************************
4368 * @brief Builds BWP UL dedicated PUSCH Config
4372 * Function : BuildBWPUlDedPuschCfg
4375 * Builds BWP UL dedicated PUSCH Config
4377 * @params[in] : PUSCH_Config_t *puschCfg
4379 * @return ROK - success
4382 * ****************************************************************/
4383 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4385 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4386 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4387 if(!puschCfg->dataScramblingIdentityPUSCH)
4389 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4392 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4394 puschCfg->txConfig = NULLP;
4395 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4396 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4397 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4398 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4400 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4404 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4409 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4410 puschCfg->pusch_PowerControl = NULLP;
4411 puschCfg->frequencyHopping = NULLP;
4412 puschCfg->frequencyHoppingOffsetLists = NULLP;
4413 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4415 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4416 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4417 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4418 if(!puschCfg->pusch_TimeDomainAllocationList)
4420 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4424 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4429 puschCfg->pusch_AggregationFactor = NULLP;
4430 puschCfg->mcs_Table = NULLP;
4431 puschCfg->mcs_TableTransformPrecoder = NULLP;
4432 puschCfg->transformPrecoder = NULLP;
4433 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4434 if(!puschCfg->transformPrecoder)
4436 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4439 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4441 puschCfg->codebookSubset = NULLP;
4442 puschCfg->maxRank = NULLP;
4443 puschCfg->rbg_Size = NULLP;
4444 puschCfg->uci_OnPUSCH = NULLP;
4445 puschCfg->tp_pi2BPSK = NULLP;
4450 /*******************************************************************
4452 * @brief Builds BWP UL dedicated PUCCH Config
4456 * Function : BuildBWPUlDedPucchCfg
4459 * Builds BWP UL dedicated PUCCH Config
4461 * @params[in] : PUCCH_Config_t *pucchCfg
4463 * @return ROK - success
4466 * ****************************************************************/
4467 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4469 uint8_t arrIdx, elementCnt;
4470 uint8_t rsrcIdx, rsrcSetIdx;
4471 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4472 PUCCH_Resource_t *rsrc = NULLP;
4476 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4477 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4478 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4479 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4480 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4482 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4485 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4486 rsrcSet->pucch_ResourceSetId = 1;
4488 rsrcSet->resourceList.list.count = elementCnt;
4489 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4490 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4491 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4493 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4496 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4500 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4501 pucchCfg->resourceToAddModList->list.count = elementCnt;
4502 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4503 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4504 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4506 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4509 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4510 rsrc->pucch_ResourceId = 1;
4511 rsrc->startingPRB = 0;
4512 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4513 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4514 rsrc->format.choice.format1->initialCyclicShift = 0;
4515 rsrc->format.choice.format1->nrofSymbols = 4;
4516 rsrc->format.choice.format1->startingSymbolIndex = 0;
4517 rsrc->format.choice.format1->timeDomainOCC = 0;
4520 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4521 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4522 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4523 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4524 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4527 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4528 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4530 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4535 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4536 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4537 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4538 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4540 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4544 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4546 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4547 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4549 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4555 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4556 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4561 /*******************************************************************
4563 * @brief Fills SRS resource to add/modify list
4567 * Function : BuildSrsRsrcAddModList
4569 * Functionality: Fills SRS resource to add/modify list
4572 * @return ROK - success
4575 * ****************************************************************/
4576 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4582 resourceList->list.count = elementCnt;
4583 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4584 resourceList->list.array = NULLP;
4585 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4586 if(!resourceList->list.array)
4588 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4592 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4594 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4595 if(!resourceList->list.array[rsrcIdx])
4597 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4603 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4604 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4605 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4607 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4608 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4609 sizeof(struct SRS_Resource__transmissionComb__n2));
4610 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4612 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4615 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4616 = SRS_COMB_OFFSET_N2;
4617 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4618 = SRS_CYCLIC_SHIFT_N2;
4620 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4621 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4622 SRS_Resource__resourceMapping__nrofSymbols_n1;
4623 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4624 SRS_Resource__resourceMapping__repetitionFactor_n1;
4626 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4627 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4628 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4629 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4630 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4631 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4632 SRS_Resource__groupOrSequenceHopping_neither;
4634 /* Setting resource type to aperiodic for intergration purposes */
4635 resourceList->list.array[rsrcIdx]->resourceType.present = \
4636 SRS_Resource__resourceType_PR_aperiodic;
4637 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4638 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4639 sizeof(struct SRS_Resource__resourceType__aperiodic));
4640 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4642 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4645 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4650 /*******************************************************************
4652 * @brief Build SRS resource set Add/mod list
4656 * Function : BuildSrsRsrcSetAddModList
4658 * Functionality: Build SRS resource set Add/mod list
4661 * @return ROK - success
4664 * ****************************************************************/
4665 uint8_t BuildSrsRsrcSetAddModList
4667 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4673 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4676 rsrcSetList->list.count = elementCnt;
4677 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4678 rsrcSetList->list.array = NULLP;
4679 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4680 if(!rsrcSetList->list.array)
4682 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4686 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4688 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4689 if(!rsrcSetList->list.array[rSetIdx])
4691 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4697 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4699 /* Fill Resource Id list in resource set */
4700 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4701 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4702 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4703 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4705 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4710 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4711 rsrcIdList->list.count = elementCnt;
4712 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4713 rsrcIdList->list.array = NULLP;
4714 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4715 if(!rsrcIdList->list.array)
4717 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4721 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4723 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4724 if(!rsrcIdList->list.array[rsrcIdx])
4726 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4732 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4734 /* Fill resource type */
4735 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4736 SRS_ResourceSet__resourceType_PR_aperiodic;
4738 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4739 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4740 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4741 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4743 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4746 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4747 = APERIODIC_SRS_RESRC_TRIGGER;
4749 /* TODO : Fill values for below IEs as expected by Viavi */
4750 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4751 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4754 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4755 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4756 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4757 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4758 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4763 /*******************************************************************
4765 * @brief Builds BWP UL dedicated SRS Config
4769 * Function : BuildBWPUlDedSrsCfg
4771 * Functionality: Builds BWP UL dedicated SRS Config
4773 * @params[in] SRS Config
4774 * @return ROK - success
4777 * ****************************************************************/
4778 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4780 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4781 srsCfg->srs_ResourceSetToAddModList = NULLP;
4782 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4783 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4784 if(!srsCfg->srs_ResourceSetToAddModList)
4786 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4789 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4794 srsCfg->srs_ResourceToReleaseList = NULLP;
4796 /* Resource to Add/Modify list */
4797 srsCfg->srs_ResourceToAddModList = NULLP;
4798 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4799 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4800 if(!srsCfg->srs_ResourceToAddModList)
4802 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4806 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4811 srsCfg->tpc_Accumulation = NULLP;
4816 /*******************************************************************
4818 * @brief Builds inital UL BWP
4822 * Function : BuildInitialUlBWP
4824 * Functionality: Builds initial UL BWP
4826 * @params[in] BWP_UplinkDedicated_t *ulBwp
4827 * @return ROK - success
4830 * ****************************************************************/
4831 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4833 ulBwp->pucch_Config = NULLP;
4834 ulBwp->pucch_Config = NULLP;
4835 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4836 if(!ulBwp->pucch_Config)
4838 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4842 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4843 ulBwp->pucch_Config->choice.setup = NULLP;
4844 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4845 if(!ulBwp->pucch_Config->choice.setup)
4847 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4851 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4856 /* Fill BWP UL dedicated PUSCH config */
4857 ulBwp->pusch_Config = NULLP;
4858 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4859 if(!ulBwp->pusch_Config)
4861 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4865 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4866 ulBwp->pusch_Config->choice.setup = NULLP;
4867 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4868 if(!ulBwp->pusch_Config->choice.setup)
4870 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4874 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4879 ulBwp->configuredGrantConfig = NULLP;
4881 /* Fill BPW UL dedicated SRS config */
4882 ulBwp->srs_Config = NULLP;
4883 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4884 if(!ulBwp->srs_Config)
4886 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4890 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4891 ulBwp->srs_Config->choice.setup = NULLP;
4892 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4893 if(!ulBwp->srs_Config->choice.setup)
4895 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4899 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4904 ulBwp->beamFailureRecoveryConfig = NULLP;
4909 /*******************************************************************
4911 * @brief Builds Pusch Serving cell Config
4915 * Function : BuildPuschSrvCellCfg
4917 * Functionality: Builds Pusch Serving cell Config
4919 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4921 * @return ROK - success
4924 * ****************************************************************/
4925 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4927 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4928 puschCfg->choice.setup = NULLP;
4929 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4930 if(!puschCfg->choice.setup)
4932 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4936 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4937 puschCfg->choice.setup->rateMatching = NULLP;
4938 puschCfg->choice.setup->xOverhead = NULLP;
4939 puschCfg->choice.setup->ext1 = NULLP;
4940 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4941 if(!puschCfg->choice.setup->ext1)
4943 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4947 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4948 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4949 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4951 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4954 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4956 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4957 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4958 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4960 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4963 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4967 /*******************************************************************
4969 * @brief Builds UL config
4972 * Function : BuildUlCfg
4974 * Functionality: Builds UL config in spCellCfgDed
4976 * @params[in] UplinkConfig_t *ulCfg
4978 * @return ROK - success
4981 * ****************************************************************/
4982 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4984 ulCfg->initialUplinkBWP = NULLP;
4985 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4986 if(!ulCfg->initialUplinkBWP)
4988 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4992 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4997 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4998 ulCfg->uplinkBWP_ToAddModList = NULLP;
4999 ulCfg->firstActiveUplinkBWP_Id = NULLP;
5000 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5001 if(!ulCfg->firstActiveUplinkBWP_Id)
5003 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5006 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5008 ulCfg->pusch_ServingCellConfig = NULLP;
5009 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
5010 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5011 if(!ulCfg->pusch_ServingCellConfig)
5013 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5017 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5022 ulCfg->carrierSwitching = NULLP;
5023 ulCfg->ext1 = NULLP;
5027 /*******************************************************************
5029 * @brief Builds PDSCH serving cell config
5032 * Function : BuildPdschSrvCellCfg
5034 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5036 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5038 * @return ROK - success
5041 * ****************************************************************/
5042 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5044 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5045 pdschCfg->choice.setup = NULLP;
5046 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5047 if(!pdschCfg->choice.setup)
5049 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5053 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5054 pdschCfg->choice.setup->xOverhead = NULLP;
5055 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5056 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5057 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5059 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5062 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5063 pdschCfg->choice.setup->pucch_Cell = NULLP;
5064 pdschCfg->choice.setup->ext1 = NULLP;
5069 /*******************************************************************
5071 * @brief Builds CSI Meas config
5074 * Function : BuildCsiMeasCfg
5076 * Functionality: Builds CSI Meas config in spCellCfgDed
5078 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5080 * @return ROK - success
5083 * ****************************************************************/
5084 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5090 /*******************************************************************
5092 * @brief Builds Spcell config dedicated
5095 * Function : BuildSpCellCfgDed
5097 * Functionality: Builds sp cell config dedicated in spCellCfg
5099 * @params[in] ServingCellConfig_t srvCellCfg
5101 * @return ROK - success
5104 * ****************************************************************/
5105 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5107 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5109 srvCellCfg->initialDownlinkBWP = NULLP;
5110 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5111 if(!srvCellCfg->initialDownlinkBWP)
5113 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5117 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5119 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5122 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5123 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5125 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5126 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5127 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5129 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5132 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5134 srvCellCfg->bwp_InactivityTimer = NULLP;
5136 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5137 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5138 if(!srvCellCfg->defaultDownlinkBWP_Id)
5140 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5143 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5145 srvCellCfg->uplinkConfig = NULLP;
5146 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5147 if(!srvCellCfg->uplinkConfig)
5149 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5153 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5155 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5158 srvCellCfg->supplementaryUplink = NULLP;
5159 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5161 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5162 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5163 if(!srvCellCfg->pdsch_ServingCellConfig)
5165 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5169 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5171 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5175 srvCellCfg->csi_MeasConfig = NULLP;
5177 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5178 if(!srvCellCfg->csi_MeasConfig)
5180 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5184 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5186 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5190 srvCellCfg->sCellDeactivationTimer = NULLP;
5191 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5192 srvCellCfg->tag_Id = TAG_ID;
5193 srvCellCfg->dummy = NULLP;
5194 srvCellCfg->pathlossReferenceLinking = NULLP;
5195 srvCellCfg->servingCellMO = NULLP;
5196 srvCellCfg->ext1 = NULLP;
5200 /*******************************************************************
5202 * @brief Builds Spcell config
5206 * Function : BuildSpCellCfg
5208 * Functionality: Builds sp cell config in DuToCuRrcContainer
5210 * @params[in] SpCellConfig_t spCellCfg
5212 * @return ROK - success
5215 * ****************************************************************/
5216 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5219 spCellCfg->servCellIndex = NULLP;
5220 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5221 if(!spCellCfg->servCellIndex)
5223 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5226 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5228 spCellCfg->reconfigurationWithSync = NULLP;
5229 spCellCfg->rlf_TimersAndConstants = NULLP;
5230 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5231 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5232 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5234 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5237 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5239 spCellCfg->spCellConfigDedicated = NULLP;
5240 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5241 if(!spCellCfg->spCellConfigDedicated)
5243 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5246 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5248 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5253 /*******************************************************************
5255 * @brief Builds Phy cell group config
5259 * Function : BuildPhyCellGrpCfg
5261 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5263 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5265 * @return ROK - success
5268 * ****************************************************************/
5269 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5271 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5272 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5274 phyCellGrpCfg->p_NR_FR1 = NULLP;
5275 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5276 if(!phyCellGrpCfg->p_NR_FR1)
5278 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5281 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5282 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5283 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5284 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5285 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5286 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5287 phyCellGrpCfg->cs_RNTI = NULLP;
5288 phyCellGrpCfg->ext1 = NULLP;
5289 phyCellGrpCfg->ext2 = NULLP;
5294 /*******************************************************************
5296 * @brief Builds tag config
5300 * Function : BuildTagConfig
5302 * Functionality: Builds tag config in MacCellGroupConfig
5304 * @params[in] TAG_Config *tag_Config
5306 * @return ROK - success
5309 * ****************************************************************/
5310 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5312 struct TAG_Config__tag_ToAddModList *tagList;
5313 uint8_t idx, elementCnt;
5315 tagConfig->tag_ToReleaseList = NULLP;
5316 tagConfig->tag_ToAddModList = NULLP;
5317 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5318 if(!tagConfig->tag_ToAddModList)
5320 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5324 elementCnt = 1; //ODU_VALUE_ONE;
5325 tagList = tagConfig->tag_ToAddModList;
5326 tagList->list.count = elementCnt;
5327 tagList->list.size = elementCnt * sizeof(struct TAG *);
5329 tagList->list.array = NULLP;
5330 CU_ALLOC(tagList->list.array, tagList->list.size);
5331 if(!tagList->list.array)
5333 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5337 for(idx=0; idx<tagList->list.count; idx++)
5339 tagList->list.array[idx] = NULLP;
5340 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5341 if(!tagList->list.array[idx])
5343 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5349 tagList->list.array[idx]->tag_Id = TAG_ID;
5350 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5355 /*******************************************************************
5357 * @brief Builds PHR Config
5361 * Function : BuildPhrConfig
5363 * Functionality: Builds phrConfig in MacCellGroupConfig
5365 * @params[in] PHR Config *
5367 * @return ROK - success
5370 * ****************************************************************/
5371 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5374 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5375 phrConfig->choice.setup = NULLP;
5376 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5377 if(!phrConfig->choice.setup)
5379 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5383 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5384 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5385 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5386 phrConfig->choice.setup->multiplePHR = false;
5387 phrConfig->choice.setup->dummy = false;
5388 phrConfig->choice.setup->phr_Type2OtherCell = false;
5389 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5394 /*******************************************************************
5396 * @brief Builds BSR Config
5400 * Function : BuildBsrConfig
5402 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5404 * @params[in] BSR_Config *bsrConfig
5406 * @return ROK - success
5409 * ****************************************************************/
5410 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5412 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5413 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5414 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5419 /*******************************************************************
5421 * @brief Builds scheduling request config
5425 * Function : BuildSchedulingReqConfig
5427 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5429 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5431 * @return ROK - success
5434 * ****************************************************************/
5435 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5437 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5438 uint8_t idx, elementCnt;
5440 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5441 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5442 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5443 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5445 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5449 elementCnt = 1; //ODU_VALUE_ONE;
5450 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5451 schReqList->list.count = elementCnt;
5452 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5454 schReqList->list.array = NULLP;
5455 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5456 if(!schReqList->list.array)
5458 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5462 for(idx=0;idx<schReqList->list.count; idx++)
5464 schReqList->list.array[idx] = NULLP;
5465 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5466 if(!schReqList->list.array[idx])
5468 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5474 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5476 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5477 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5478 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5480 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5483 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5484 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5485 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5489 /*******************************************************************
5491 * @brief Builds Mac cell group config
5495 * Function : BuildMacCellGrpCfg
5497 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5499 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5501 * @return ROK - success
5504 * ****************************************************************/
5505 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5507 macCellGrpCfg->drx_ConfigRrc = NULLP;
5508 macCellGrpCfg->schedulingRequestConfig = NULLP;
5509 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5510 if(!macCellGrpCfg->schedulingRequestConfig)
5512 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5516 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5518 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5522 macCellGrpCfg->bsr_Config = NULLP;
5523 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5524 if(!macCellGrpCfg->bsr_Config)
5526 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5530 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5532 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5536 macCellGrpCfg->tag_Config = NULLP;
5537 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5538 if(!macCellGrpCfg->tag_Config)
5540 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5544 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5546 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5550 macCellGrpCfg->phr_Config = NULLP;
5551 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5552 if(!macCellGrpCfg->phr_Config)
5554 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5558 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5560 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5564 macCellGrpCfg->skipUplinkTxDynamic = false;
5565 macCellGrpCfg->ext1 = NULLP;
5569 /*******************************************************************
5571 * @brief Frees memeory allocated for SearchSpcToAddModList
5575 * Function : FreeSearchSpcToAddModList
5577 * Functionality: Deallocating memory of SearchSpcToAddModList
5579 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5583 4221 * ****************************************************************/
5584 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5588 struct SearchSpace *searchSpc=NULLP;
5590 if(searchSpcList->list.array)
5592 if(searchSpcList->list.array[idx2])
5594 searchSpc = searchSpcList->list.array[idx2];
5595 if(searchSpc->controlResourceSetId)
5597 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5599 if(searchSpc->monitoringSymbolsWithinSlot)
5601 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5603 if(searchSpc->nrofCandidates)
5605 if(searchSpc->searchSpaceType)
5607 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5608 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5609 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5610 SearchSpace__searchSpaceType));
5612 CU_FREE(searchSpc->nrofCandidates,
5613 sizeof(struct SearchSpace__nrofCandidates));
5615 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5616 searchSpc->monitoringSymbolsWithinSlot->size);
5618 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5619 sizeof(BIT_STRING_t));
5621 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5622 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5624 CU_FREE(searchSpc->controlResourceSetId,
5625 sizeof(ControlResourceSetId_t));
5628 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5630 CU_FREE(searchSpcList->list.array[idx1],
5631 sizeof(struct SearchSpace));
5633 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5636 /*******************************************************************
5638 * @brief Frees memory allocated for PdschTimeDomAllocList
5642 * Function : FreePdschTimeDomAllocList
5644 * Functionality: Deallocating memory of PdschTimeDomAllocList
5646 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5650 4221 * ****************************************************************/
5651 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5655 if(timeDomAllocList->choice.setup)
5657 if(timeDomAllocList->choice.setup->list.array)
5659 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5661 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5662 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5664 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5665 timeDomAllocList->choice.setup->list.size);
5667 CU_FREE(timeDomAllocList->choice.setup,\
5668 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5671 /*******************************************************************
5673 * @brief Frees memory allocated for PuschTimeDomAllocList
5677 * Function : FreePuschTimeDomAllocList
5679 * Functionality: Deallocating memory of PuschTimeDomAllocList
5681 * @params[in] PUSCH_Config_t *puschCfg
5685 ***********************************************************************/
5686 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5690 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5692 if(puschCfg->pusch_TimeDomainAllocationList)
5694 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5695 if(timeDomAllocList_t->choice.setup)
5697 if(timeDomAllocList_t->choice.setup->list.array)
5699 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5700 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5702 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5703 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5705 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5706 timeDomAllocList_t->choice.setup->list.size);
5708 CU_FREE(timeDomAllocList_t->choice.setup, \
5709 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5711 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5712 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5713 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5718 /*******************************************************************
5720 * @brief Frees memory allocated for Dedicated PUCCH config
5724 * Function : FreeBWPUlDedPucchCfg
5726 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5728 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5732 * ****************************************************************/
5733 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5735 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5736 PUCCH_Config_t *pucchCfg = NULLP;
5737 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5738 PUCCH_Resource_t *rsrc = NULLP;
5742 if(ulBwpPucchCfg->choice.setup)
5744 pucchCfg = ulBwpPucchCfg->choice.setup;
5746 //Free resource set list
5747 if(pucchCfg->resourceSetToAddModList)
5749 if(pucchCfg->resourceSetToAddModList->list.array)
5751 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5753 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5754 if(rsrcSet->resourceList.list.array)
5756 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5758 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5760 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5762 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5764 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5766 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5769 //Free resource list
5770 if(pucchCfg->resourceToAddModList)
5772 if(pucchCfg->resourceToAddModList->list.array)
5774 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5776 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5777 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5778 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5780 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5782 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5786 if(pucchCfg->format1)
5788 if(pucchCfg->format1->choice.setup)
5790 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5791 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5793 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5797 if(pucchCfg->dl_DataToUL_ACK)
5799 if(pucchCfg->dl_DataToUL_ACK->list.array)
5801 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5803 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5805 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5807 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5810 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5812 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5816 /*******************************************************************
5818 * @brief Frees memory allocated for InitialUlBWP
5822 * Function : FreeInitialUlBWP
5824 * Functionality: Deallocating memory of InitialUlBWP
5826 * @params[in] BWP_UplinkDedicated_t *ulBwp
5830 * ****************************************************************/
5831 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5833 uint8_t rSetIdx, rsrcIdx;
5834 SRS_Config_t *srsCfg = NULLP;
5835 PUSCH_Config_t *puschCfg = NULLP;
5836 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5837 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5838 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5839 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5841 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5843 if(ulBwp->pusch_Config)
5845 if(ulBwp->pusch_Config->choice.setup)
5847 puschCfg=ulBwp->pusch_Config->choice.setup;
5848 if(puschCfg->dataScramblingIdentityPUSCH)
5850 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5852 FreePuschTimeDomAllocList(puschCfg);
5853 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5854 if(dmrsUlCfg->choice.setup)
5856 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5858 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5860 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5862 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5863 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5865 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5868 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5870 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5871 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5873 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5875 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5877 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5879 /* Free SRS-Config */
5880 if(ulBwp->srs_Config)
5882 if(ulBwp->srs_Config->choice.setup)
5884 srsCfg = ulBwp->srs_Config->choice.setup;
5886 /* Free Resource Set to add/mod list */
5887 if(srsCfg->srs_ResourceSetToAddModList)
5889 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5890 if(rsrcSetList->list.array)
5894 /* Free SRS resource Id list in this SRS resource set */
5895 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5897 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5899 if(rsrcIdList->list.array)
5901 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5903 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5905 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5907 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5908 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5911 /* Free resource type info for this SRS resource set */
5912 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5913 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5915 /* Free memory for each resource set */
5916 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5918 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5920 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5922 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5923 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5926 /* Free resource to add/modd list */
5927 if(srsCfg->srs_ResourceToAddModList)
5929 resourceList = srsCfg->srs_ResourceToAddModList;
5930 if(resourceList->list.array)
5933 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5934 sizeof(struct SRS_Resource__transmissionComb__n2));
5935 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5936 sizeof(struct SRS_Resource__resourceType__aperiodic));
5938 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5940 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5942 CU_FREE(resourceList->list.array, resourceList->list.size);
5944 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5945 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5948 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5950 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5954 /*******************************************************************
5956 * @brief Frees memory allocated for initialUplinkBWP
5960 * Function : FreeinitialUplinkBWP
5962 * Functionality: Deallocating memory of initialUplinkBWP
5964 * @params[in] UplinkConfig_t *ulCfg
5969 * ****************************************************************/
5970 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5972 BWP_UplinkDedicated_t *ulBwp=NULLP;
5973 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5975 if(ulCfg->initialUplinkBWP)
5977 ulBwp=ulCfg->initialUplinkBWP;
5978 if(ulCfg->firstActiveUplinkBWP_Id)
5980 if(ulCfg->pusch_ServingCellConfig)
5982 puschCfg=ulCfg->pusch_ServingCellConfig;
5983 if(puschCfg->choice.setup)
5985 if(puschCfg->choice.setup->ext1)
5987 CU_FREE(puschCfg->choice.setup->ext1->\
5988 processingType2Enabled,sizeof(BOOLEAN_t));
5989 CU_FREE(puschCfg->choice.setup->ext1->\
5990 maxMIMO_Layers,sizeof(long));
5991 CU_FREE(puschCfg->choice.setup->ext1, \
5992 sizeof(struct PUSCH_ServingCellConfig__ext1));
5994 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5996 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5998 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
6000 FreeInitialUlBWP(ulBwp);
6001 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6004 /*******************************************************************
6006 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6010 * Function : FreeBWPDlDedPdschCfg
6012 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6014 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6019 * ****************************************************************/
6020 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6022 struct PDSCH_Config *pdschCfg=NULLP;
6023 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6024 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6025 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6027 if(dlBwp->pdsch_Config->choice.setup)
6029 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6030 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6032 if(pdschCfg->pdsch_TimeDomainAllocationList)
6034 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6035 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6037 prbBndlType=&pdschCfg->prb_BundlingType;
6038 CU_FREE(prbBndlType->choice.staticBundling,\
6039 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6040 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6042 FreePdschTimeDomAllocList(timeDomAllocList);
6043 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6044 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6046 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6047 if(dmrsDlCfg->choice.setup)
6049 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6051 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6053 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6054 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6056 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6059 /*******************************************************************
6061 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6065 * Function : FreeBWPDlDedPdcchCfg
6067 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6069 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6074 * ****************************************************************/
6075 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6079 struct PDCCH_Config *pdcchCfg=NULLP;
6080 struct ControlResourceSet *controlRSet=NULLP;
6081 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6083 if(dlBwp->pdcch_Config->choice.setup)
6085 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6086 if(pdcchCfg->controlResourceSetToAddModList)
6088 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6089 if(controlRSetList->list.array)
6091 controlRSet = controlRSetList->list.array[idx2];
6094 if(controlRSet->frequencyDomainResources.buf)
6096 if(controlRSet->pdcch_DMRS_ScramblingID)
6098 if(pdcchCfg->searchSpacesToAddModList)
6100 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6101 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6102 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6104 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6106 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6107 controlRSet->frequencyDomainResources.size);
6110 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6112 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6114 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6116 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6117 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6119 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6122 /*******************************************************************
6124 * @brief Builds RLC Config
6128 * Function : BuildRlcConfig
6130 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6132 * @params[in] RLC_Config *rlcConfig
6134 * @return ROK - success
6137 * ****************************************************************/
6138 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6140 rlcConfig->present = rlcLcCfgDb.rlcMode;
6142 switch(rlcConfig->present)
6144 case RLC_Config_PR_am:
6146 rlcConfig->choice.am = NULLP;
6147 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6148 if(!rlcConfig->choice.am)
6150 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6155 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6156 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6157 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6159 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6162 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6163 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6164 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6165 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6166 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6169 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6170 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6171 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6173 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6176 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6177 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6178 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6183 case RLC_Config_PR_um_Bi_Directional:
6185 rlcConfig->choice.um_Bi_Directional = NULLP;
6186 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6187 if(!rlcConfig->choice.um_Bi_Directional)
6189 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6194 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6195 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6196 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6198 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6201 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6204 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6205 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6206 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6208 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6211 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6212 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6219 /*******************************************************************
6221 * @brief Builds MAC LC Config
6225 * Function : BuildMacLCConfig
6227 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6229 * @params[in] struct LogicalChannelConfig macLcConfig
6231 * @return ROK - success
6234 * ****************************************************************/
6235 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6238 macLcConfig->ul_SpecificParameters = NULLP;
6239 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6240 if(!macLcConfig->ul_SpecificParameters)
6242 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6246 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6247 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6248 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6249 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6250 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6251 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6252 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6254 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6255 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6256 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6258 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6261 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6263 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6264 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6265 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6267 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6270 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6272 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6273 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6274 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6278 /*******************************************************************
6280 * @brief Builds RLC Bearer to Add/Mod list
6284 * Function :BuildRlcBearerToAddModList
6286 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6288 * @params[in] rlc_BearerToAddModList
6290 * @return ROK - success
6293 * ****************************************************************/
6294 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6296 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6299 elementCnt = ueCb->numSrb + ueCb->numDrb;
6302 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6304 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6308 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6310 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6317 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6320 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6323 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6326 rlcBearerList->list.count = elementCnt;
6327 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6329 rlcBearerList->list.array = NULLP;
6330 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6331 if(!rlcBearerList->list.array)
6333 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6337 for(idx=0; idx<rlcBearerList->list.count; idx++)
6339 rlcBearerList->list.array[idx] = NULLP;
6340 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6341 if(!rlcBearerList->list.array[idx])
6343 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6350 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6352 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6355 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6357 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6358 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6360 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6364 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6365 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6367 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6368 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6369 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6370 if(!rlcBearerList->list.array[idx]->rlc_Config)
6372 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6376 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6378 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6382 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6383 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6384 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6386 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6390 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6392 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6398 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6400 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6403 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6405 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6406 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6408 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6412 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6413 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6415 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6416 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6417 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6418 if(!rlcBearerList->list.array[idx]->rlc_Config)
6420 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6424 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6426 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6430 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6431 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6432 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6434 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6438 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6440 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6448 /*******************************************************************
6450 * @brief Free memory allocated for CellGroupConfig
6454 * Function : FreeMemCellGrpCfg
6456 * Functionality: Deallocating memory of CellGroupConfig
6458 * @params[in] pointer to CellGroupConfigRrc_t
6460 * @return ROK - success
6463 ******************************************************************/
6464 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6467 SpCellConfig_t *spCellCfg=NULLP;
6468 ServingCellConfig_t *srvCellCfg=NULLP;
6469 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6470 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6471 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6472 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6473 struct RLC_Config *rlcConfig=NULLP;
6474 struct LogicalChannelConfig *macLcConfig=NULLP;
6475 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6476 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6477 struct TAG_Config *tagConfig=NULLP;
6478 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6479 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6480 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6482 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6485 if(rlcBearerList->list.array)
6487 for(idx=0; idx<rlcBearerList->list.count; idx++)
6489 if(rlcBearerList->list.array[idx])
6491 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6492 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6495 if(rlcConfig->choice.am)
6497 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6498 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6499 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6501 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6503 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6506 if(macLcConfig->ul_SpecificParameters)
6508 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6509 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6510 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6512 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6514 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6517 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6519 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6522 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6525 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6526 if(schedulingRequestConfig)
6528 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6531 if(schReqList->list.array)
6533 for(idx=0;idx<schReqList->list.count; idx++)
6535 if(schReqList->list.array[idx])
6537 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6538 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6541 CU_FREE(schReqList->list.array, schReqList->list.size);
6543 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6544 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6545 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6547 if(macCellGrpCfg->bsr_Config)
6549 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6551 tagConfig = macCellGrpCfg->tag_Config;
6554 tagList = tagConfig->tag_ToAddModList;
6557 if(tagList->list.array)
6559 for(idx=0; idx<tagList->list.count; idx++)
6561 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6563 CU_FREE(tagList->list.array, tagList->list.size);
6565 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6567 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6570 phrConfig = macCellGrpCfg->phr_Config;
6573 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6574 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6577 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6580 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6583 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6584 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6587 spCellCfg = cellGrpCfg->spCellConfig;
6590 if(spCellCfg->servCellIndex)
6592 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6594 if(spCellCfg->spCellConfigDedicated)
6596 srvCellCfg = spCellCfg->spCellConfigDedicated;
6597 if(srvCellCfg->initialDownlinkBWP)
6599 dlBwp = srvCellCfg->initialDownlinkBWP;
6600 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6602 if(srvCellCfg->defaultDownlinkBWP_Id)
6604 if(srvCellCfg->uplinkConfig)
6606 if(srvCellCfg->pdsch_ServingCellConfig)
6608 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6609 if(pdschCfg->choice.setup)
6611 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6612 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6614 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6615 ServingCellConfig__pdsch_ServingCellConfig));
6617 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6618 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6620 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6622 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6624 if(dlBwp->pdcch_Config)
6626 if(dlBwp->pdsch_Config)
6628 FreeBWPDlDedPdschCfg(dlBwp);
6629 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6631 FreeBWPDlDedPdcchCfg(dlBwp);
6632 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6634 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6636 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6638 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6640 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6642 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6647 /*******************************************************************
6649 * @brief Fills CellGroupConfig
6653 * Function : fillCellGrpCfg
6655 * Functionality: Fills CellGroupConfig
6657 * @params[in] pointer to CellGroupConfigRrc_t
6659 * @return ROK - success
6662 ******************************************************************/
6664 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6666 uint8_t ret = RFAILED;
6667 CellGroupConfigRrc_t cellGrpCfg;
6668 asn_enc_rval_t encRetVal;
6672 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6674 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6676 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6678 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6682 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6683 cellGrpCfg.mac_CellGroupConfig = NULLP;
6684 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6685 if(!cellGrpCfg.mac_CellGroupConfig)
6687 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6690 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6692 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6696 cellGrpCfg.physicalCellGroupConfig = NULLP;
6697 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6698 if(!cellGrpCfg.physicalCellGroupConfig)
6700 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6703 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6705 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6709 cellGrpCfg.spCellConfig = NULLP;
6710 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6711 if(!cellGrpCfg.spCellConfig)
6713 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6716 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6718 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6722 cellGrpCfg.sCellToAddModList = NULLP;
6723 cellGrpCfg.sCellToReleaseList = NULLP;
6724 cellGrpCfg.ext1 = NULLP;
6726 /* encode cellGrpCfg into duToCuRrcContainer */
6727 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6728 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6730 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6731 /* Encode results */
6732 if(encRetVal.encoded == ENCODE_FAIL)
6734 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6735 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6740 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6741 for(int i=0; i< encBufSize; i++)
6743 DU_LOG("%x",encBuf[i]);
6747 cellGrp->size = encBufSize;
6748 CU_ALLOC(cellGrp->buf, cellGrp->size);
6751 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6754 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6758 FreeMemCellGrpCfg(&cellGrpCfg);
6762 /*******************************************************************
6764 * @brief Free UE Capability RAT container
6768 * Function : freeUeCapRatCont
6771 * Free UE Capability RAT conatiner
6774 * @return ROK - success
6777 * ****************************************************************/
6778 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6781 FeatureSets_t *featureSets;
6783 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6785 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6787 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6788 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6790 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6793 if(ueNrCap->featureSets)
6795 featureSets = ueNrCap->featureSets;
6796 if(featureSets->featureSetsDownlinkPerCC)
6798 if(featureSets->featureSetsDownlinkPerCC->list.array)
6800 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6802 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6803 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6804 sizeof(ModulationOrder_t));
6805 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6807 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6809 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6812 if(featureSets->featureSetsUplinkPerCC)
6814 if(featureSets->featureSetsUplinkPerCC->list.array)
6816 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6818 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6820 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6821 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6822 sizeof(ModulationOrder_t));
6823 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6826 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6828 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6830 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6834 /*******************************************************************
6836 * @brief Free UE capability RAT container list
6840 * Function : freeUeCapRatContList
6842 * Functionality: Free UE capability RAT container list
6845 * @return ROK - success
6848 * ****************************************************************/
6849 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6852 if(ueCapablityList->list.array)
6854 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6856 if(ueCapablityList->list.array[idx])
6857 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6859 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6863 /*******************************************************************
6865 * @brief Free Handover preparation information
6869 * Function : freeHOPreparationInfo
6871 * Functionality: Free Handover preparation information
6874 * @return ROK - success
6877 * ****************************************************************/
6878 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6880 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6882 if(hoPrep->criticalExtensions.choice.c1)
6884 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6886 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6887 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6888 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6889 sizeof(HandoverPreparationInformationRrc_IEs_t));
6891 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6895 /*******************************************************************
6897 * @brief Fill feature sets
6901 * Function : fillFeatureSets
6903 * Functionality: Fill feature sets
6906 * @return ROK - success
6909 * ****************************************************************/
6910 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6912 uint8_t idx, elementCnt;
6914 featureSets->featureSetsDownlink = NULLP;
6915 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6916 if(!featureSets->featureSetsDownlinkPerCC)
6918 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6923 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6924 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6925 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6926 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6928 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6932 for(idx = 0; idx < elementCnt; idx++)
6934 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6935 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6937 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6943 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6944 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6945 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6946 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6947 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6949 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6950 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6952 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6955 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6957 featureSets->featureSetsUplink = NULLP;
6958 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6959 if(!featureSets->featureSetsUplinkPerCC)
6961 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6966 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6967 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6968 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6969 if(!featureSets->featureSetsUplinkPerCC->list.array)
6971 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6975 for(idx = 0; idx < elementCnt; idx++)
6977 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6978 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6980 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6986 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6987 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6988 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6989 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6990 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6991 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6993 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6994 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6996 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6999 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
7004 /*******************************************************************
7006 * @brief Fill UE capability RAT container
7010 * Function : fillUeCapRatCont
7012 * Functionality: Fill UE capability RAT container
7014 * @params[in] UE Capability RAT container buffer
7015 * @return ROK - success
7018 * ****************************************************************/
7019 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
7022 uint8_t idx, elementCnt;
7023 asn_enc_rval_t encRetVal;
7024 UE_NR_Capability_t ueNrCap;
7028 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7030 /* Filling PDCP parameters */
7031 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7032 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7033 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7034 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7035 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7036 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7037 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7038 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7039 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7040 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7041 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7042 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7043 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7044 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7045 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7046 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7047 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7049 ueNrCap.rlc_Parameters = NULLP;
7050 ueNrCap.mac_Parameters = NULLP;
7052 /* Filling PHY parameters */
7053 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7054 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7055 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7056 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7057 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7059 /* Filling RF parameters */
7061 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7062 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7063 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7064 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7066 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7071 for(idx = 0; idx < elementCnt; idx++)
7073 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7074 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7084 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7085 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7086 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7088 ueNrCap.measAndMobParameters = NULLP;
7089 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7090 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7091 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7092 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7093 ueNrCap.featureSets = NULLP;
7095 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7096 if(!ueNrCap.featureSets)
7098 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7103 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7105 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7110 ueNrCap.featureSetCombinations = NULLP;
7111 ueNrCap.lateNonCriticalExtension = NULLP;
7112 ueNrCap.nonCriticalExtension = NULLP;
7114 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7115 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7116 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7118 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7120 /* Encode results */
7121 if(encRetVal.encoded == ENCODE_FAIL)
7123 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7124 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7129 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7130 for(int i=0; i< encBufSize; i++)
7132 DU_LOG("%x",encBuf[i]);
7136 ueCapRatContBuf->size = encBufSize;
7137 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7138 if(!ueCapRatContBuf->buf)
7140 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7143 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7147 freeUeCapRatCont(&ueNrCap);
7151 /*******************************************************************
7153 * @brief Fill UE Capability RAT container list
7157 * Function : fillUeCapRatContList
7159 * Functionality: Fill UE Capability RAT container list
7162 * @params[in] UE capability RAT container list
7163 * @return ROK - success
7166 * ****************************************************************/
7167 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7169 uint8_t ret = RFAILED;
7170 uint8_t idx, elementCnt;
7175 ueCapablityList->list.count = elementCnt;
7176 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7178 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7179 if(!ueCapablityList->list.array)
7181 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7186 for(idx=0; idx<elementCnt; idx++)
7188 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7189 if(ueCapablityList->list.array[idx] == NULLP)
7191 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7197 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7198 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7200 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7211 /*******************************************************************
7213 * @brief Fill UE Capability RAT container list octet string
7217 * Function : fillUeCapRatContListBuf
7219 * Functionality: Fill UE Capability RAT container list octet string
7222 * @params[in] UE capability RAT container list buffer
7223 * @return ROK - success
7226 * ****************************************************************/
7227 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7229 uint8_t ret = RFAILED;
7230 asn_enc_rval_t encRetVal;
7231 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7235 ret = fillUeCapRatContList(&ueCapablityList);
7238 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7242 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7243 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7244 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7246 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7247 &ueCapablityList, PrepFinalEncBuf, encBuf);
7249 /* Encode results */
7250 if(encRetVal.encoded == ENCODE_FAIL)
7252 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7253 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7258 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7259 for(int i=0; i< encBufSize; i++)
7261 DU_LOG("%x",encBuf[i]);
7265 ueCapablityListBuf->size = encBufSize;
7266 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7267 if(!ueCapablityListBuf->buf)
7269 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7272 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7276 freeUeCapRatContList(&ueCapablityList);
7280 /*******************************************************************
7282 * @brief Free Measurement Timing Configuration
7286 * Function : freeMeasuementTimingConfig
7288 * Functionality: Free Measurement Timing Configuration
7290 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7293 * ****************************************************************/
7294 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7297 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7298 MeasTiming_t *measTiming = NULLP;
7300 if(measTimingConfig.criticalExtensions.choice.c1)
7302 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7304 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7305 if(measTimingCfg->measTiming)
7307 if(measTimingCfg->measTiming->list.array)
7309 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7311 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7312 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7313 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7315 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7317 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7319 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7321 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7325 /*******************************************************************
7327 * @brief Fill Measurement Timing Configuration
7331 * Function : fillMeasTimingCfg
7333 * Functionality: Fill Measurement Timing Configuration
7335 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7336 * @return ROK - success
7339 * ****************************************************************/
7340 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7342 uint8_t elementCnt = 0;
7343 uint8_t measCfgIdx = 0;
7344 MeasTiming_t *measTiming;
7347 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7348 if(!measTimingCfg->measTiming)
7350 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7355 measTimingCfg->measTiming->list.count = elementCnt;
7356 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7357 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7358 if(!measTimingCfg->measTiming->list.array)
7360 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7364 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7366 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7367 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7369 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7375 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7376 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7377 if(!measTiming->frequencyAndTiming)
7379 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7383 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7384 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7386 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7387 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7388 smtc->periodicityAndOffset.choice.sf20 = 0;
7389 smtc->duration = SSB_MTC__duration_sf1;
7393 /*******************************************************************
7395 * @brief Fill Measurement Timing Configuration Octet string
7399 * Function : fillMeasConfigBuf
7401 * Functionality: Fill Measurement Timing Configuration Octet string
7404 * @params[in] MeasConfig_t *measConfgBuf
7405 * @return ROK - success
7408 * ****************************************************************/
7409 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7411 uint8_t ret = RFAILED;
7412 asn_enc_rval_t encRetVal;
7413 MeasurementTimingConfigurationRrc_t measTimingConfig;
7417 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7418 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7419 if(!measTimingConfig.criticalExtensions.choice.c1)
7421 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7424 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7426 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7427 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7429 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7433 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7436 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7440 /* Encode measurement timing configuration into octet string */
7441 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7442 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7444 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7446 /* Encode results */
7447 if(encRetVal.encoded == ENCODE_FAIL)
7449 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7450 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7455 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7456 for(int i=0; i< encBufSize; i++)
7458 DU_LOG("%x",encBuf[i]);
7462 measTimingConfigBuf->size = encBufSize;
7463 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7464 if(!measTimingConfigBuf->buf)
7466 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7469 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7473 freeMeasuementTimingConfig(measTimingConfig);
7477 /******************************************************************
7479 * @brief Free RRC reconfiguration non-critical extension
7483 * Function : freeRrcReconfigNonCriticalExt
7485 * Functionality: Free RRC reconfiguration non-critical extension
7487 * @params[in] RRC reconfiguration IE
7490 * ****************************************************************/
7491 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7493 if(rrcRecfg->masterCellGroup)
7495 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7499 /******************************************************************
7501 * @brief Free measurement object addmod list
7505 * Function : freeMeasObjToAddModList
7507 * Functionality: Free measurement object add mod list
7509 * @params[in] Measurement object add/mod list
7512 * ****************************************************************/
7513 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7516 MeasObjectNR_t *measObject;
7518 if(measObjList->list.array)
7520 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7522 if(measObjList->list.array[objIdx])
7524 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7526 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7527 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7528 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7529 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7530 if(measObject->absThreshSS_BlocksConsolidation)
7532 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7533 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7534 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7535 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7537 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7538 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7539 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7540 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7541 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7543 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7546 CU_FREE(measObjList->list.array, measObjList->list.size);
7550 /******************************************************************
7552 * @brief Free report config add mod list
7556 * Function : freeReportCfgToAddModList
7558 * Functionality: Free report config add mod list
7560 * @params[in] Report config list
7563 * ****************************************************************/
7564 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7566 uint8_t reportCfgIdx;
7567 ReportConfigToAddMod_t *reportCfg;
7568 ReportConfigNR_t *reportCfgNr;
7569 EventTriggerConfig_t *eventTriggCfg;
7571 if(reportCfgList->list.array)
7573 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7575 if(reportCfgList->list.array[reportCfgIdx])
7577 reportCfg = reportCfgList->list.array[reportCfgIdx];
7578 if(reportCfg->reportConfig.choice.reportConfigNR)
7580 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7581 if(reportCfgNr->reportType.choice.eventTriggered)
7583 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7584 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7585 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7586 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7587 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7591 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7593 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7597 /******************************************************************
7599 * @brief Free measurement id to add mod list
7603 * Function : freeMeasIdToAddModList
7605 * Functionality: Free measurement id to add mod list
7607 * @params[in] Measurement id to add mod list
7610 * ****************************************************************/
7611 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7614 if(measIdList->list.array)
7616 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7618 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7620 CU_FREE(measIdList->list.array, measIdList->list.size);
7624 /*******************************************************************
7626 * @brief Free quantity config
7630 * Function : freeQunatityConfig
7632 * Functionality: Free quantity config
7634 * @params[in] Quantity Config
7637 * ****************************************************************/
7638 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7641 QuantityConfigNR_t *quantityCfgNr;
7643 if(quantityCfg->quantityConfigNR_List)
7645 if(quantityCfg->quantityConfigNR_List->list.array)
7647 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7649 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7651 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7652 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7653 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7654 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7655 if(quantityCfgNr->quantityConfigRS_Index)
7657 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7658 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7659 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7660 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7662 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7665 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7667 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7671 /******************************************************************
7673 * @brief Free measurement Config
7677 * Function : freeMeasConfig
7679 * Functionality: Free measurement config
7681 * @params[in] Measurement config
7684 * ****************************************************************/
7685 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7687 if(measConfig->measObjectToAddModList)
7689 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7690 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7692 if(measConfig->reportConfigToAddModList)
7694 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7695 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7697 if(measConfig->measIdToAddModList)
7699 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7700 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7702 if(measConfig->s_MeasureConfig)
7704 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7706 if(measConfig->quantityConfig)
7708 freeQuantityConfig(measConfig->quantityConfig);
7709 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7712 /******************************************************************
7714 * @brief Free DRB to AddMod List
7718 * Function : freeDrbToAddModList
7720 * Functionality: Free SRB to AddMod List
7722 * @params[in] SBR to add/mod list
7725 * ****************************************************************/
7726 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7729 if(drbToAddList->list.array)
7731 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7733 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7735 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7737 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7738 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7739 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7740 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7742 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7743 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7745 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7747 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7751 /******************************************************************
7753 * @brief Free SRB to AddMod List
7757 * Function : freeSrbToAddModList
7759 * Functionality: Free SRB to AddMod List
7761 * @params[in] SBR to add/mod list
7764 * ****************************************************************/
7765 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7768 if(srbToAddList->list.array)
7770 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7772 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7773 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7775 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7776 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7779 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7781 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7785 /******************************************************************
7787 * @brief Free Radio Bearer Config
7791 * Function : freeRadioBearerConfig
7793 * Functionality: Free Radio Bearer config
7795 * @params[in] Radio bearer config
7798 * ****************************************************************/
7799 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7801 if(radioBearerConfig->srb_ToAddModList)
7803 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7804 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7806 if(radioBearerConfig->drb_ToAddModList)
7808 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7809 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7813 /******************************************************************
7815 * @brief Free reconfiguration message
7819 * Function : freeRrcReconfig
7821 * Functionality: Free reconfiguration message
7823 * @params[in] RRC Reconfiguration message
7826 * ****************************************************************/
7827 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7829 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7831 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7833 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7834 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7836 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7838 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7839 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7841 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7843 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7844 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7846 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7850 /******************************************************************
7852 * @brief Fill SRB To Add Mod list
7856 * Function : fillSrbToAddModList
7858 * Functionality: fill SRB to Add Mod list
7860 * @params[in] UE control block
7861 * SRB to Add/Mod list
7862 * @return ROK - success
7865 * ****************************************************************/
7866 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7868 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7871 elementCnt = ueCb->numSrb;
7874 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7876 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7883 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7887 srbToAddList->list.count = elementCnt;
7888 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7890 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7891 if(!srbToAddList->list.array)
7893 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7898 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7900 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7903 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7904 if(!srbToAddList->list.array[srbIdx])
7906 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7910 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7912 /* Reestablish PDCP */
7913 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7914 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7916 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7919 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7921 /* PDCP configuration */
7922 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7923 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7925 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7929 /* Reordering timer */
7930 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7931 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7933 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7936 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7943 /******************************************************************
7945 * @biief Fill DRBeTo Add Mod list
7949 * Function : fillDrbToAddModList
7951 * Functionality: fill DRB to Add Mod list
7953 * @params[in] UE control block
7954 * DRB to Add/Mod list
7955 * @return ROK - success
7958 * ****************************************************************/
7959 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7961 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7964 elementCnt = ueCb->numDrb;
7967 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7969 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7976 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7981 drbToAddList->list.count = elementCnt;
7982 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7984 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7985 if(!drbToAddList->list.array)
7987 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7992 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7994 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7997 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7998 if(!drbToAddList->list.array[drbIdx])
8000 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
8005 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
8008 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
8009 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
8011 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
8015 /* PDCP Config -> DRB */
8016 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
8017 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
8019 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8023 /* DRB -> Discard Timer */
8024 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8025 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8027 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8030 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8032 /* UL PDCP SN length */
8033 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8034 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8036 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8039 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8041 /* DL PDCP SN length */
8042 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8043 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8045 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8048 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8050 /* Header Compression */
8051 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8052 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8054 /* Reordering timer */
8055 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8056 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8058 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8061 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8069 /******************************************************************
8071 * @brief Fill Radio bearer configuration
8075 * Function : fillRadioBearerConfig
8077 * Functionality: Fill Radio bearer configuration
8079 * @params[in] UE control block
8080 * Radio bearer config pointer
8081 * @return ROK - success
8084 * ****************************************************************/
8085 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8087 /* SRB To Add/Mod List */
8088 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8089 if(!radioBearerConfig->srb_ToAddModList)
8091 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8094 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8096 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8100 /* DRB To Add/Mod List */
8101 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8102 if(!radioBearerConfig->drb_ToAddModList)
8104 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8107 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8109 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8116 /*******************************************************************
8118 * @brief Fill measurement object to add/mod list
8122 * Function : fillMeasObjToAddModList
8124 * Functionality: Fill measurement object to add/mod list
8126 * @params[in] Measurement object to add/mod list
8127 * @return ROK - success
8130 * ****************************************************************/
8131 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8133 uint8_t elementCnt, objIdx;
8134 MeasObjectNR_t *measObject;
8137 measObjList->list.count = elementCnt;
8138 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8140 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8141 if(!measObjList->list.array)
8143 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8147 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8149 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8150 if(!measObjList->list.array[objIdx])
8152 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8158 measObjList->list.array[objIdx]->measObjectId = 1;
8159 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8160 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8161 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8163 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8167 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8170 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8171 if(!measObject->ssbFrequency)
8173 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8176 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8178 /* Subcarrier spacing */
8179 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8180 if(!measObject->ssbSubcarrierSpacing)
8182 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8185 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8188 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8189 if(!measObject->smtc1)
8191 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8194 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8195 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8196 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8198 /* Absoulute threshold SSB consolidation */
8199 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8200 if(!measObject->absThreshSS_BlocksConsolidation)
8202 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8206 /* RSRP threshold */
8207 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8208 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8210 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8213 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8215 /* RSRQ threshold */
8216 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8217 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8219 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8222 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8224 /* SINR threshold */
8225 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8226 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8228 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8231 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8233 /* Number of SSBs to average */
8234 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8235 if(!measObject->nrofSS_BlocksToAverage)
8237 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8240 *(measObject->nrofSS_BlocksToAverage) = 2;
8242 /* Quantity Config index */
8243 measObject->quantityConfigIndex = 1;
8246 /* RSRP offset for SSB */
8247 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8248 if(!measObject->offsetMO.rsrpOffsetSSB)
8250 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8253 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8255 /* RSRQ offset for SSB */
8256 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8257 if(!measObject->offsetMO.rsrpOffsetSSB)
8259 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8262 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8264 /* SINR offset for SSB */
8265 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8266 if(!measObject->offsetMO.sinrOffsetSSB)
8268 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8271 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8276 /*******************************************************************
8278 * @brief Fill Report configuration to Add/mod list
8282 * Function : fillReportCfgToAddModList
8284 * Functionality: Fill Report configuration to Add/mod list
8286 * @params[in] Report Config To Add/Mod List
8287 * @return ROK - success
8290 * ****************************************************************/
8291 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8294 uint8_t reportCfgIdx;
8295 ReportConfigToAddMod_t *reportCfg;
8296 ReportConfigNR_t *reportCfgNr;
8297 EventTriggerConfig_t *eventTriggCfg;
8300 reportCfgList->list.count = elementCnt;
8301 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8303 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8304 if(!reportCfgList->list.array)
8306 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8310 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8312 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8313 if(!reportCfgList->list.array[reportCfgIdx])
8315 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8321 reportCfg = reportCfgList->list.array[reportCfgIdx];
8322 reportCfg->reportConfigId = 1;
8323 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8325 /* Report Configuration for NR */
8326 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8327 if(!reportCfg->reportConfig.choice.reportConfigNR)
8329 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8332 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8335 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8336 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8337 if(!reportCfgNr->reportType.choice.eventTriggered)
8339 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8342 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8345 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8346 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8347 if(!eventTriggCfg->eventId.choice.eventA3)
8349 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8353 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8354 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8355 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8356 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8357 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8358 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8360 /* Reference Signal Type */
8361 eventTriggCfg->rsType = NR_RS_Type_ssb;
8363 /* Report Interval */
8364 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8367 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8369 /* Report Quantity cell */
8370 eventTriggCfg->reportQuantityCell.rsrp = true;
8371 eventTriggCfg->reportQuantityCell.rsrq = false;
8372 eventTriggCfg->reportQuantityCell.sinr = false;
8374 /* Maximum reported cells */
8375 eventTriggCfg->maxReportCells = 3;
8377 /* Report qunatity RS Indexes */
8378 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8379 if(!eventTriggCfg->reportQuantityRS_Indexes)
8381 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8384 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8385 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8386 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8388 /* Maximum number of RS indexes to report */
8389 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8390 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8392 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8395 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8397 /* Include Beam measurement */
8398 eventTriggCfg->includeBeamMeasurements = false;
8403 /*******************************************************************
8405 * @brief Fill measurement Id to add/mod list
8409 * Function : fillMeasIdToAddModList
8411 * Functionality: Fill measurement Id to add/mod list
8413 * @params[in] Measurement Id to add/mod list
8414 * @return ROK - success
8417 * ****************************************************************/
8418 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8424 measIdList->list.count = elementCnt;
8425 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8427 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8428 if(!measIdList->list.array)
8433 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8435 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8436 if(!measIdList->list.array[measIdIdx])
8442 measIdList->list.array[measIdIdx]->measId = 1;
8443 measIdList->list.array[measIdIdx]->measObjectId = 1;
8444 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8449 /*******************************************************************
8451 * @brief Fill s-measurement configuration
8455 * Function : fillSMeasConfig
8457 * Functionality: Fill s-measurement configuration
8459 * @params[in] s-Measurement config
8460 * @return ROK - success
8463 * ****************************************************************/
8464 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8466 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8467 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8472 /*******************************************************************
8474 * @brief Fill quantity config
8478 * Function : fillQunatityConfig
8480 * Functionality: Fill quantity config
8482 * @params[in] Quantity Config
8483 * @return ROK - success
8486 * ****************************************************************/
8487 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8489 uint8_t elementCnt = 0;
8490 uint8_t quanCfgIdx = 0;
8491 QuantityConfigNR_t *quantityCfgNr;
8493 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8494 if(!quantityCfg->quantityConfigNR_List)
8500 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8501 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8503 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8504 if(!quantityCfg->quantityConfigNR_List->list.array)
8509 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8511 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8512 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8519 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8521 /* Quantity Config of Reference signal */
8522 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8523 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8527 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8529 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8530 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8534 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8536 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8537 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8541 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8543 /* Quantity Config RS index */
8544 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8545 if(!quantityCfgNr->quantityConfigRS_Index)
8550 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8551 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8555 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8557 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8558 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8562 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8564 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8565 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8569 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8574 /*******************************************************************
8576 * @brief Fill measurement configuration
8580 * Function : fillMeasConfig
8582 * Functionality: Fill measurement configuration
8584 * @params[in] Measurement config
8585 * @return ROK - success
8588 * ****************************************************************/
8589 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8591 /* Measurement object to add/mod list */
8592 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8593 if(!measConfig->measObjectToAddModList)
8595 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8598 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8600 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8604 /* Report Config To add/mod list */
8605 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8606 if(!measConfig->reportConfigToAddModList)
8608 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8611 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8613 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8617 /* Measurement Id to add/mod list */
8618 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8619 if(!measConfig->measIdToAddModList)
8621 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8624 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8626 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8630 /* S-Measurement config */
8631 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8632 if(!measConfig->s_MeasureConfig)
8634 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8637 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8639 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8643 /* Qunatity Config */
8644 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8645 if(!measConfig->quantityConfig)
8647 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8650 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8652 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8659 /*******************************************************************
8661 * @brief Fill RRC reconfiguration non-critical extension IE
8665 * Function : fillRrcReconfigNonCriticalExt
8667 * Functionality: Fill RRC reconfiguration non-critical extension
8669 * @params[in] RRC Reconfig Non-critical extension
8670 * @return ROK - success
8673 * ****************************************************************/
8674 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8676 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8677 if(!rrcRecfg->masterCellGroup)
8679 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8683 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8684 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8685 if(!rrcRecfg->masterCellGroup->buf)
8687 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8690 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8693 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8694 * received from DU */
8695 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8697 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8705 /*******************************************************************
8707 * @brief Fill RRC reconfiguration structure
8711 * Function : fillRrcReconfig
8713 * Functionality: Fill RRC reconfiguration
8717 * RRC reconfiguration structure
8718 * @return ROK - success
8721 * ****************************************************************/
8722 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8724 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8726 rrcReconfig->rrc_TransactionIdentifier = 1;
8727 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8729 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8730 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8732 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8736 /* Radio Bearer Configuration */
8737 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8738 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8740 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8743 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8745 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8749 /* Measurement Configuration */
8750 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8751 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8753 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8756 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8758 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8762 /* Non Critical extension */
8763 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8764 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8766 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8769 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8771 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8777 /*******************************************************************
8779 * @brief Fill RRC reconfiguration Octet string
8783 * Function : fillRrcReconfigBuf
8785 * Functionality: Fill RRC reconfiguration octet string
8788 * @params[in] OCTET_STRING_t buffer
8789 * @return ROK - success
8792 * ****************************************************************/
8793 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8795 uint8_t ret = RFAILED;
8796 asn_enc_rval_t encRetVal;
8797 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8798 rrcReconfig = &rrcRecfg;
8802 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8804 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8808 /* Encode RRC Reconfiguration */
8809 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8810 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8812 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8814 /* Encode results */
8815 if(encRetVal.encoded == ENCODE_FAIL)
8817 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8818 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8823 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8824 for(int i=0; i< encBufSize; i++)
8826 DU_LOG("%x",encBuf[i]);
8830 rrcReconfigBuf->size = encBufSize;
8831 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8832 if(!rrcReconfigBuf->buf)
8834 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8837 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8842 freeRrcReconfig(rrcReconfig);
8846 /*******************************************************************
8848 * @brief Fill HO preparation information Octet string
8852 * Function : fillHOPreparationInfoBuf
8854 * Functionality: Fill HO preparation information Octet string
8857 * @params[in] HandoverPreparationInformation_t buffer
8858 * @return ROK - success
8861 * ****************************************************************/
8862 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8864 uint8_t ret = RFAILED;
8865 asn_enc_rval_t encRetVal;
8866 HandoverPreparationInformationRrc_t hoPrepInfo;
8867 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8872 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8873 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8874 if(!hoPrepInfo.criticalExtensions.choice.c1)
8876 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8879 hoPrepInfo.criticalExtensions.choice.c1->present = \
8880 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8882 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8883 sizeof(HandoverPreparationInformationRrc_IEs_t));
8884 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8886 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8889 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8891 /* Fill UE Capability RAT container list */
8892 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8895 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8899 /* Fill Source config */
8900 hoPrepInfoIe->sourceConfig = NULLP;
8901 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8902 if(!hoPrepInfoIe->sourceConfig)
8904 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8907 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8911 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8915 hoPrepInfoIe->rrm_Config = NULLP;
8916 hoPrepInfoIe->as_Context = NULLP;
8917 hoPrepInfoIe->nonCriticalExtension = NULLP;
8919 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8920 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8921 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8923 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8924 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8926 /* Encode results */
8927 if(encRetVal.encoded == ENCODE_FAIL)
8929 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8930 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8935 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8936 for(int i=0; i< encBufSize; i++)
8938 DU_LOG("%x",encBuf[i]);
8942 hoPrepInfoBuf->size = encBufSize;
8943 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8944 if(!hoPrepInfoBuf->buf)
8946 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8949 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8953 freeHOPreparationInfo(&hoPrepInfo);
8957 /*******************************************************************
8959 * @brief Fills CuToDuContainer
8963 * Function : fillCuToDuContainer
8965 * Functionality: Fills CuToDuContainer
8967 * @params[in] pointer to CUtoDURRCInformation_t
8969 * @return ROK - success
8972 ******************************************************************/
8974 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8976 uint8_t elementCnt = 0;
8980 /* UE Capabulity RAT Container List */
8981 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8982 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8984 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8987 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8989 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8990 if(!rrcMsg->measConfig)
8992 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8995 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8997 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9000 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9001 if(rrcMsg->iE_Extensions)
9004 rrcMsg->iE_Extensions->list.count = elementCnt;
9005 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9007 /* Initialize the CUtoDURRCInformation_ExtIEs */
9008 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9010 if(rrcMsg->iE_Extensions->list.array == NULLP)
9012 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9016 for(idx=0; idx<elementCnt; idx++)
9018 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9019 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9021 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9028 /* Cell Group Configuration */
9029 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9030 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9031 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9032 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9033 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9036 /* Handover Preparation Information */
9037 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9038 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9039 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9040 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9041 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9046 /*******************************************************************
9048 * @brief Build the drx cycle
9052 * Function : BuildDrxCycle
9054 * Functionality: Build drx cycle IE
9056 * @params[in] pointer to DRXCycle_t
9058 * @return ROK - success
9061 ******************************************************************/
9062 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9064 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms40;
9065 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9066 if(!drxCycle->shortDRXCycleLength)
9068 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9071 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9073 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9074 if(!drxCycle->shortDRXCycleTimer)
9076 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9079 *(drxCycle->shortDRXCycleTimer) = 4;
9082 /*******************************************************************
9084 * @brief Free CuToDuContainer
9088 * Function : FreeCuToDuInfo
9090 * Functionality: Free CuToDuContainer
9092 * @params[in] pointer to CUtoDURRCInformation_t
9094 * @return ROK - success
9097 ******************************************************************/
9099 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9103 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9105 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9106 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9107 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9109 if(rrcMsg->iE_Extensions)
9111 if(rrcMsg->iE_Extensions->list.array)
9113 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9115 if(rrcMsg->iE_Extensions->list.array[idx])
9117 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9119 case ProtocolIE_ID_id_CellGroupConfig:
9120 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9122 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9123 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9128 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9129 rrcMsg->iE_Extensions->list.array[idx]->id);
9135 for(idx2 = 0; idx2 < idx; idx2++)
9137 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9139 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9143 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9146 /*******************************************************************
9148 * @brief Builds and sends the UE Setup Request
9152 * Function : BuildAndSendUeContextSetupReq
9154 * Functionality: Constructs the UE Setup Request and sends
9155 * it to the CU through SCTP.
9159 * @return ROK - success
9162 * ****************************************************************/
9163 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9165 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9166 uint8_t ret= RFAILED, ret1;
9168 uint8_t idx, idx1, bufLen, duIdx;
9170 DuDb *targetDuDb = NULLP;
9171 F1AP_PDU_t *f1apMsg = NULLP;
9172 UEContextSetupRequest_t *ueSetReq = NULLP;
9173 asn_enc_rval_t encRetVal; /* Encoder return value */
9174 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9178 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9180 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9181 if(f1apMsg == NULLP)
9183 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9187 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9188 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9189 if(f1apMsg->choice.initiatingMessage == NULLP)
9191 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9195 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9196 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9197 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9199 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9201 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9211 ueSetReq->protocolIEs.list.count = elementCnt;
9212 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9214 /* Initialize the UESetup members */
9215 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9217 if(ueSetReq->protocolIEs.list.array == NULLP)
9219 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9223 for(idx1=0; idx1<elementCnt; idx1++)
9225 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9226 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9234 /*GNB CU UE F1AP ID*/
9235 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9236 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9237 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9238 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9240 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9242 /*GNB DU UE F1AP ID*/
9244 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9245 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9246 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9247 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9252 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9253 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9254 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9255 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9257 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9258 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
9259 /* Since we are supporting only one cell per DU, accessing 0th index to
9260 * get target cell info */
9261 spCellId = targetDuDb->cellCb[0].nrCellId;
9264 spCellId = ueCb->cellCb->nrCellId;
9265 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9271 /*Served Cell Index*/
9273 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9274 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9275 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9276 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9278 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9280 /*CellULConfigured*/
9282 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9283 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9284 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9285 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9288 /*CUtoDURRCContainer*/
9290 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9291 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9292 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9293 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9298 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9303 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9304 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9305 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9306 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9308 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9312 /*Special Cells to be SetupList*/
9314 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9315 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9316 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9317 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9318 if(SplCellListret != ROK)
9324 /*SRBs To Be Setup List*/
9326 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9327 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9328 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9329 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9330 if(SrbSetupret != ROK)
9335 /*DRBs to Be Setup List*/
9337 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9338 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9339 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9340 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9346 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9348 /* RRC delivery status request */
9350 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9351 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9352 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9353 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9356 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9358 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9359 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9360 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9362 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9364 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9365 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9366 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9367 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9369 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9372 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9373 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9375 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9377 /* Encode the F1SetupRequest type as APER */
9378 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9380 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9382 /* Encode results */
9383 if(encRetVal.encoded == ENCODE_FAIL)
9385 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9386 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9391 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9392 for(int i=0; i< encBufSize; i++)
9394 DU_LOG("%x",encBuf[i]);
9399 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9401 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9407 FreeUeContextSetupReq(f1apMsg);
9410 }/* End of BuildAndSendUeContextSetupReq*/
9412 /**********************************************************************
9413 * @brief Function to extractTeId received in UE context setup Response
9417 * Function : extractTeId
9420 * - Function to extract TeId
9423 * @return ROK - success
9426 **********************************************************************/
9427 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9431 GTPTunnel_t *gtpDl = NULLP;
9433 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9435 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9437 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9439 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9440 if(gtpDl->gTP_TEID.size > 0)
9442 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9445 DU_LOG("\nERROR --> EGTP: No TeId received");
9453 /****************************************************************
9454 * @brief Function to add Drb tunnels
9458 * Function : addDrbTunnels
9461 * - Function to add Drb tunnels
9464 * @return ROK - success
9467 * ****************************************************************/
9468 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9473 if(teId > MAX_TEID || teId < MIN_TEID)
9475 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9477 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9478 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9479 tnlEvt.lclTeid = teId;
9480 tnlEvt.remTeid = teId;
9481 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9484 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9489 /****************************************************************
9490 * @brief Function to process Drb Setup List
9494 * Function : procDrbSetupList
9497 * - Function to process DRB Setup List
9500 * @return ROK - success
9503 * ****************************************************************/
9504 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9506 uint8_t arrIdx = 0, drbIdx = 0;
9508 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9510 if(drbSetupList != NULLP)
9512 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9514 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9515 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9517 /* extracting teId */
9518 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9521 if(addDrbTunnels(duId, teId)== ROK)
9523 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9525 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9526 * are sent to CU for setting up of Tunnels in DL direction.
9527 * Search for DRB ID in CU databse */
9528 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9530 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9532 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9545 /****************************************************************
9546 * @brief Function to process Ue Context Setup Response
9550 * Function : procUeContextSetupResponse
9553 * - Function to process Ue Context Setup Response
9556 * @return ROK - success
9559 * ****************************************************************/
9560 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9562 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9563 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9565 CuUeCb *ueCb = NULLP;
9566 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9567 OCTET_STRING_t *duToCuRrcContainer;
9569 SEARCH_DU_DB(duIdx, duId, duDb);
9570 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9572 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9574 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9576 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9578 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9581 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9583 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9584 ueCb = &duDb->ueCb[duUeF1apId-1];
9585 /* If ue context is not present in du db, then create UE context
9586 * here. This flow is hit in case of UE handover where UE
9587 * context is created before UE performs RACH on target DU */
9588 if(ueCb->gnbDuUeF1apId == 0)
9590 /* Creating UE context in target DU */
9591 memset(ueCb, 0, sizeof(CuUeCb));
9592 ueCb->cellCb = &duDb->cellCb[0];
9593 ueCb->gnbDuUeF1apId = duUeF1apId;
9594 ueCb->gnbCuUeF1apId = cuUeF1apId;
9595 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9596 ueCb->hoInfo.targetDuId = duId;
9599 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9600 ueCb->cellCb->numUe++;
9604 case ProtocolIE_ID_id_C_RNTI:
9606 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9609 case ProtocolIE_ID_id_DRBs_Setup_List:
9611 /* Adding Tunnels for successful DRB */
9612 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9615 case ProtocolIE_ID_id_DUtoCURRCInformation:
9617 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9618 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9619 DUtoCURRCInformation.cellGroupConfig;
9620 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9621 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9623 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9631 /* If the UE is in handover, UE context modification request is to be sent to
9632 * source DU once UE context setup response is received from target DU */
9633 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9635 DuDb *srcDuDb = NULLP;
9636 CuUeCb *ueCbInSrcDu = NULLP;
9638 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9639 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9640 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9642 /* UE context setup response is received from target DU. Search all
9643 * DUs to find source DU except this target DU Id.*/
9644 if(cuCb.duInfo[duIdx].duId != duId)
9646 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9649 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9650 * received in UE context setup response since CU UE F1AP ID does not
9651 * change for UE in handover.
9652 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9654 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9655 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9657 srcDuDb = &cuCb.duInfo[duIdx];
9658 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9660 /* Store source DU info in the new UE context created in
9662 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9664 /* Copy the received container to UeCb */
9665 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9667 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9669 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9676 if(srcDuDb && ueCbInSrcDu)
9682 ueCb->f1apMsgDb.dlRrcMsgCount++;
9683 rrcMsgType = setDlRRCMsgType(ueCb);
9685 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9686 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9688 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9696 /****************************************************************
9697 * @brief Function to process Ul Rrc Msg received from DU
9701 * Function : procUlRrcMsg
9704 * - Function to process Ul Rrc Msg received from DU
9707 * @return ROK - success
9710 * ****************************************************************/
9712 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9714 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9715 uint8_t *rrcContainer = NULLP;
9716 uint16_t rrcContLen = 0;
9717 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9719 CuUeCb *ueCb = NULLP;
9720 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9723 SEARCH_DU_DB(duIdx, duId, duDb);
9724 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9726 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9728 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9730 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9732 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9735 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9737 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9740 case ProtocolIE_ID_id_SRBID:
9741 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9744 case ProtocolIE_ID_id_RRCContainer:
9746 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9747 CU_ALLOC(rrcContainer, rrcContLen);
9750 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9753 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9755 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9758 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
9759 DuDb *srcDuDb = NULLP;
9761 /* In target DU DB, mark UE as active and delete HO info */
9762 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9763 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9765 /* Release UE context in source DU because the UE is now
9766 * attached to target DU */
9767 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9768 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9770 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9772 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9775 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9786 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9793 ueCb = &duDb->ueCb[duUeF1apId-1];
9794 ueCb->f1apMsgDb.dlRrcMsgCount++;
9795 rrcMsgType = setDlRRCMsgType(ueCb);
9796 if(rrcMsgType == RRC_SETUP_COMPLETE)
9798 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for NAS Security Mode Command");
9799 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9801 if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
9803 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Security Mode Command");
9804 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9806 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
9808 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9809 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9811 else if(rrcMsgType == REGISTRATION_COMPLETE)
9813 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9814 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9816 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9818 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9819 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9825 /****************************************************************
9826 * @brief Build And Send F1ResetAck
9830 * Function : FreeF1ResetAck
9833 * - Build And Send F1ResetRSP
9836 * @return ROK - success
9839 * ****************************************************************/
9840 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9843 ResetAcknowledge_t *f1ResetAck;
9847 if(f1apMsg->choice.successfulOutcome)
9849 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9851 if(f1ResetAck->protocolIEs.list.array)
9853 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9855 if(f1ResetAck->protocolIEs.list.array[idx])
9857 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9860 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9862 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9864 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9868 /****************************************************************
9869 * @brief Build And Send F1ResetAck
9873 * Function : BuildAndSendF1ResetAck
9876 * - Build And Send F1ResetRSP
9879 * @return ROK - success
9882 * ****************************************************************/
9884 uint8_t BuildAndSendF1ResetAck()
9887 uint8_t elementCnt = 0;
9888 uint8_t ret = RFAILED;
9889 F1AP_PDU_t *f1apMsg = NULL;
9890 ResetAcknowledge_t *f1ResetAck = NULLP;
9891 asn_enc_rval_t encRetVal;
9892 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9895 /* Allocate the memory for F1ResetRequest_t */
9896 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9897 if(f1apMsg == NULLP)
9899 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9903 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9905 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9906 if(f1apMsg->choice.successfulOutcome == NULLP)
9908 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9912 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9913 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9914 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9915 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9919 f1ResetAck->protocolIEs.list.count = elementCnt;
9920 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9922 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9923 if(f1ResetAck->protocolIEs.list.array == NULLP)
9925 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9929 for(idx=0; idx<elementCnt; idx++)
9931 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9932 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9939 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9940 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9941 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9942 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9944 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9946 /* Encode the F1SetupRequest type as UPER */
9947 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9949 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9951 /* Check encode results */
9952 if(encRetVal.encoded == ENCODE_FAIL)
9954 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9955 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9960 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9961 for(int i=0; i< encBufSize; i++)
9963 DU_LOG("%x",encBuf[i]);
9968 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9969 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9971 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9979 FreeF1ResetAck(f1apMsg);
9983 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9987 if(ulInfo->list.array)
9989 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9991 if(ulInfo->list.array[arrIdx])
9993 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9995 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9997 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9999 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10000 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10001 gTPTunnel->gTP_TEID.size);
10003 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10004 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10005 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10007 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10008 sizeof(GTPTunnel_t));
10010 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10013 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10017 /*******************************************************************
10019 * @brief Deletes the EGTP tunnel
10023 * Function : deleteEgtpTunnel
10025 * Functionality: Deletes the EGTP tunnel
10027 * @params[in] uint8_t *buf
10029 * @return ROK - success
10030 * RFAILED - failure
10032 * ****************************************************************/
10033 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10038 teIdStringToInt(buf, &teId);
10039 if(teId > MAX_TEID || teId < MIN_TEID)
10041 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10044 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10045 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10046 tnlEvt.lclTeid = teId;
10047 tnlEvt.remTeid = teId;
10048 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10050 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10055 /*******************************************************************
10057 * @brief Builds the Uplink Tunnel Info
10061 * Function : BuildUlTnlInfoforSetupMod
10063 * Functionality: Constructs the UL TnlInfo For DRB list
10065 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10067 * @return ROK - success
10068 * RFAILED - failure
10070 * ****************************************************************/
10071 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10077 ulInfo->list.count = ulCnt;
10078 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10079 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10080 if(ulInfo->list.array == NULLP)
10082 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10085 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10087 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10088 if(ulInfo->list.array[arrIdx] == NULLP)
10090 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10096 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10097 UPTransportLayerInformation_PR_gTPTunnel;
10100 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10101 sizeof(GTPTunnel_t));
10102 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10104 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10107 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10108 transportLayerAddress.size = 4*sizeof(uint8_t);
10109 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10110 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10111 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10112 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10113 transportLayerAddress.buf == NULLP)
10115 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10119 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10120 transportLayerAddress.buf[0] = 192;
10121 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10122 transportLayerAddress.buf[1] = 168;
10123 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10124 transportLayerAddress.buf[2] = 130;
10125 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10126 transportLayerAddress.buf[3] = 82;
10127 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10128 transportLayerAddress.bits_unused = 0;
10130 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10131 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10132 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10133 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10136 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10137 = 4 * sizeof(uint8_t);
10138 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10139 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10140 gTPTunnel->gTP_TEID.size);
10141 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10144 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10147 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10148 gTP_TEID.buf[0] = 0;
10149 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10150 gTP_TEID.buf[1] = 0;
10151 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10152 gTP_TEID.buf[2] = 0;
10153 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10155 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10156 * fetched based on the Drb Id */
10158 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10159 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10160 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10164 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10165 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10168 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10169 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10170 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10171 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10173 }/*End of BuildULTnlInfo*/
10175 /*******************************************************************
10177 * @brief freeing the DRB item
10181 * Function : FreeDrbItem
10183 * Functionality: freeing the DRB item
10185 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10187 * @return ROK - success
10188 * RFAILED - failure
10190 * ****************************************************************/
10192 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10195 SNSSAI_t *snssai =NULLP;
10196 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10198 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10199 switch(drbItem->qoSInformation.present)
10201 case QoSInformation_PR_NOTHING:
10203 case QoSInformation_PR_eUTRANQoS:
10205 if(drbItem->qoSInformation.choice.eUTRANQoS)
10207 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10211 case QoSInformation_PR_choice_extension:
10213 if(drbItem->qoSInformation.choice.choice_extension)
10215 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10217 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10218 if(snssai->sST.buf)
10220 CU_FREE(snssai->sST.buf,snssai->sST.size);
10224 if(snssai->sD->buf)
10226 CU_FREE(snssai->sD->buf,snssai->sD->size);
10228 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10231 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10232 if(flowMap->list.array)
10234 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10236 if(flowMap->list.array[arrIdx] )
10238 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10239 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10242 CU_FREE(flowMap->list.array,flowMap->list.size);
10245 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10251 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10252 if(drbItem->uLConfiguration)
10254 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10258 /*******************************************************************
10260 * @brief filling the DRB setup Mod item
10264 * Function : FillDrbItemToSetupMod
10266 * Functionality: filling the DRB setup Mod item
10269 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10271 * @return ROK - success
10272 * RFAILED - failure
10274 * ****************************************************************/
10276 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10281 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10282 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10285 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10287 switch(drbItem->qoSInformation.present)
10289 case QoSInformation_PR_NOTHING:
10293 case QoSInformation_PR_eUTRANQoS:
10296 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10297 if(drbItem->qoSInformation.choice.eUTRANQoS)
10299 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10302 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10303 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10304 PriorityLevel_no_priority;
10306 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10307 Pre_emptionCapability_may_trigger_pre_emption;
10309 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10310 Pre_emptionVulnerability_pre_emptable;
10314 case QoSInformation_PR_choice_extension:
10316 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10317 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10319 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10323 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10324 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10325 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10326 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10327 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10330 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10335 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10336 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10339 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10343 /*Flows mapped to DRB List*/
10344 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10345 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10346 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10349 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10355 /*ULUPTNLInformation To Be Setup List*/
10356 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10357 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10360 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10365 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10366 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10372 /*******************************************************************
10374 * @brief Builds the DRB to be Setup Mod ItemIes
10378 * Function : FillDrbItemList
10380 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10382 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10384 * @return ROK - success
10385 * RFAILED - failure
10387 * ****************************************************************/
10389 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10391 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10392 drbItemIe->criticality = Criticality_reject;
10393 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10395 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10397 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10402 /*******************************************************************
10404 * @brief free the DRB to be Setup Mod list
10408 * Function : FreeDrbToBeSetupModList
10410 * Functionality: free the DRB to be Setup Mod list
10412 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10414 * @return ROK - success
10415 * RFAILED - failure
10417 * ****************************************************************/
10418 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10421 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10423 if(drbSet->list.array)
10425 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10427 if(drbSet->list.array[arrIdx] != NULLP)
10431 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10432 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10434 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10437 CU_FREE(drbSet->list.array, drbSet->list.size);
10442 /*******************************************************************
10444 * @brief Builds the DRB to be Setup Mod list
10448 * Function : BuildDrbToBeSetupList
10450 * Functionality: Constructs the DRB to be Setup Mod list
10452 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10454 * @return ROK - success
10455 * RFAILED - failure
10457 * ****************************************************************/
10459 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10465 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10466 drbSet->list.count = drbCnt;
10467 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10468 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10469 if(drbSet->list.array == NULLP)
10471 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10475 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10477 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10478 if(drbSet->list.array[arrIdx] == NULLP)
10480 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10484 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10487 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10494 /*******************************************************************
10496 * @brief Filling the DRB to be modified item
10500 * Function : FillDrbToBeModItem
10502 * Functionality: filling the DRB to be modified item
10504 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10506 * @return ROK - success
10507 * RFAILED - failure
10509 * ****************************************************************/
10511 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10515 DrbInfo *drbToBeMod;
10518 drbItem->dRBID = DRB2 + arrIdx;
10520 /* Search for DRB ID in CU databse */
10521 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10523 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10525 drbToBeMod = &ueCb->drbList[drbIdx];
10531 drbItem->qoSInformation = NULLP;
10532 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10533 if(drbItem->qoSInformation != NULLP)
10535 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10537 switch(drbItem->qoSInformation->present)
10539 case QoSInformation_PR_NOTHING:
10543 case QoSInformation_PR_eUTRANQoS:
10546 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10547 if(drbItem->qoSInformation->choice.eUTRANQoS)
10549 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10552 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10553 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10554 PriorityLevel_no_priority;
10556 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10557 Pre_emptionCapability_may_trigger_pre_emption;
10559 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10560 Pre_emptionVulnerability_pre_emptable;
10564 case QoSInformation_PR_choice_extension:
10566 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10567 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10569 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10573 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10574 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10575 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10576 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10577 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10580 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10585 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10586 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10589 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10593 /*Flows mapped to DRB List*/
10594 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10595 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10596 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10599 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10606 /*ULUPTNLInformation To Be Setup List*/
10607 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10608 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10611 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10617 /*******************************************************************
10619 * @brief Builds the DRB to be modified Item IE
10623 * Function : FillDrbToBeModItemList
10625 * Functionality: Constructs the DRB to be modified Mod Item Ies
10627 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10629 * @return ROK - success
10630 * RFAILED - failure
10632 * ****************************************************************/
10634 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10636 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10637 drbItemIe->criticality = Criticality_reject;
10638 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10639 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10641 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10648 /*******************************************************************
10650 * @brief Builds the DRB to be modified list
10654 * Function : BuildDrbToBeModList
10656 * Functionality: Constructs the DRB to be modified list
10658 * @params[in] DRBs_ToBeModified_List_t *drbSet
10660 * @return ROK - success
10661 * RFAILED - failure
10663 * ****************************************************************/
10665 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10671 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10672 drbSet->list.count = drbCnt;
10673 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10674 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10675 if(drbSet->list.array == NULLP)
10677 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10680 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10682 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10683 if(drbSet->list.array[arrIdx] == NULLP)
10685 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10689 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10692 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10699 /*******************************************************************
10701 * @brief freeing the DRB item
10705 * Function : FreeModifiedDrbItem
10707 * Functionality: freeing the DRB 2 item
10709 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10711 * @return ROK - success
10712 * RFAILED - failure
10714 * ****************************************************************/
10716 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10719 SNSSAI_t *snssai =NULLP;
10720 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10722 if(drbItem->qoSInformation != NULLP)
10724 switch(drbItem->qoSInformation->present)
10726 case QoSInformation_PR_NOTHING:
10728 case QoSInformation_PR_eUTRANQoS:
10730 if(drbItem->qoSInformation->choice.eUTRANQoS)
10732 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10736 case QoSInformation_PR_choice_extension:
10738 if(drbItem->qoSInformation->choice.choice_extension)
10740 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10742 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10743 if(snssai->sST.buf)
10745 CU_FREE(snssai->sST.buf,snssai->sST.size);
10749 if(snssai->sD->buf)
10751 CU_FREE(snssai->sD->buf,snssai->sD->size);
10753 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10756 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10757 if(flowMap->list.array)
10759 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10761 if(flowMap->list.array[arrIdx] )
10763 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10764 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10767 CU_FREE(flowMap->list.array,flowMap->list.size);
10770 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10776 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10777 if(drbItem->uLConfiguration)
10779 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10783 /*******************************************************************
10785 * @brief free the DRB to be modfified list
10789 * Function : FreeDrbToBeModifiedList
10791 * Functionality: free the DRB to be Setup Mod list
10793 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10795 * @return ROK - success
10796 * RFAILED - failure
10798 * ****************************************************************/
10799 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10802 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10804 if(drbSet->list.array)
10806 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10808 if(drbSet->list.array[arrIdx] != NULLP)
10810 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10811 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10812 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10815 CU_FREE(drbSet->list.array, drbSet->list.size);
10820 /*******************************************************************
10822 * @brief free the UeContextModification Request
10826 * Function : FreeUeContextModicationRequest
10828 * Functionality : deallocation of memory allocated in UeContextModiification
10831 * @params[in] F1AP_PDU_t *f1apMsg
10835 * ****************************************************************/
10836 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10838 uint8_t arrIdx =0 , ieId=0;
10839 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10843 if(f1apMsg->choice.initiatingMessage)
10845 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10846 if(ueContextModifyReq->protocolIEs.list.array)
10848 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10850 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10852 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10855 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10857 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10859 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10861 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10862 choice.DRBs_ToBeSetupMod_List);
10865 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10867 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10868 choice.DRBs_ToBeModified_List);
10871 case ProtocolIE_ID_id_TransmissionActionIndicator:
10873 case ProtocolIE_ID_id_RRCContainer:
10875 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10876 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10880 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10883 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10885 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10887 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10891 /*******************************************************************
10893 * @brief Builds the Ue Context Modification Req
10897 * Function : BuildAndSendUeContextModificationReq
10899 * Functionality: Constructs the Ue Context Modification Req
10903 * @return ROK - success
10904 * RFAILED - failure
10906 * ****************************************************************/
10907 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10910 uint8_t elementCnt = 0;
10911 uint8_t ret = RFAILED;
10912 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10913 F1AP_PDU_t *f1apMsg = NULLP;
10914 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10915 asn_enc_rval_t encRetVal;
10916 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10919 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10920 if(f1apMsg == NULLP)
10922 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10926 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10928 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10929 if(f1apMsg->choice.initiatingMessage == NULLP)
10931 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10934 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10935 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10936 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10938 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10940 if(action == MODIFY_UE)
10942 else if(action == QUERY_CONFIG)
10944 else if(action == RRC_RECONFIG_COMPLETE_IND)
10946 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10950 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
10953 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10954 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10956 /* Initialize the UE context modification members */
10957 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10958 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10960 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10964 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10966 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10967 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10969 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10975 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10976 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10977 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10978 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10979 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10982 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10983 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10984 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10985 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10986 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10988 if(action == MODIFY_UE)
10990 /* DRB to be setup list */
10992 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10993 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10994 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10995 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10996 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10997 value.choice.DRBs_ToBeSetupMod_List));
10999 /* DRB to be modified list */
11001 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
11002 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11003 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
11004 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11005 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11006 value.choice.DRBs_ToBeModified_List));
11008 /* TODO: DRB to be release list */
11012 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11016 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
11018 else if(action == QUERY_CONFIG)
11021 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11022 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11023 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11024 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11025 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11027 else if(action == RRC_RECONFIG_COMPLETE_IND)
11030 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11031 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11032 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11033 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11034 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11035 RRCReconfigurationCompleteIndicator_true;
11037 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11040 if(action == STOP_DATA_TX)
11042 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11043 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11044 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11045 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11046 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11047 TransmissionActionIndicator_stop;
11049 else if (action == RESTART_DATA_TX)
11051 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11052 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11053 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11054 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11055 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11056 TransmissionActionIndicator_restart;
11060 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11061 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11062 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11063 UEContextModificationRequestIEs__value_PR_RRCContainer;
11064 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
11066 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11070 /* RRC delivery status request */
11072 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11073 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11074 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11075 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11079 if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
11081 /* DRX Configuration Indicator */
11083 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator;
11084 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11085 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator;
11086 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release;
11087 ueCb->drxCfgPresent = false;
11088 memset(&ueCb->drxCfg, 0, sizeof(DrxCfg));
11092 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11094 /* Encode the F1SetupRequest type as APER */
11095 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11097 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11099 /* Encode results */
11100 if(encRetVal.encoded == ENCODE_FAIL)
11102 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11103 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11108 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11110 /* This for loop was going into an infinite loop even though encBufSize
11111 * has a small value. Hence commented this
11113 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11115 DU_LOG("%x",encBuf[ieIdx]);
11120 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11121 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11123 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11131 FreeUeContextModicationRequest(f1apMsg);
11135 /*****************************************************************i
11137 * @brief Free memory allocated for UE Context Release Command
11141 * Function : FreeUeContextReleaseCommand
11144 * - Free memory allocated for UE Context Release Command
11146 * @params[in] F1AP_PDU_t *f1apMsg
11149 * *************************************************************/
11150 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11153 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11157 if(f1apMsg->choice.initiatingMessage)
11159 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11160 if(ueReleaseCommand->protocolIEs.list.array)
11162 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11164 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11166 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11168 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11170 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11173 /*******************************************************************
11175 * @brief Builds the Ue Context Release Command
11179 * Function : BuildAndSendUeContextReleaseCommand
11181 * Functionality: Constructs the Ue Context Release Command
11185 * @return ROK - success
11186 * RFAILED - failure
11188 * ****************************************************************/
11189 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11191 bool memAllocFailed = false;
11192 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11195 F1AP_PDU_t *f1apMsg = NULLP;
11196 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11198 asn_enc_rval_t encRetVal;
11199 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11203 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11204 if(f1apMsg == NULLP)
11206 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11210 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11212 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11213 if(f1apMsg->choice.initiatingMessage == NULLP)
11215 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11218 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11219 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11220 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11222 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11224 SEARCH_DU_DB(duIdx, duId, duDb);
11225 ueCb = &duDb->ueCb[duUeF1apId-1];
11226 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11231 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11232 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11234 /* Initialize the UE context modification members */
11235 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11236 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11238 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11242 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11244 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11245 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11247 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11248 memAllocFailed = true;
11253 if(memAllocFailed == true)
11259 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11260 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11261 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11262 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11263 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11266 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11267 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11268 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11269 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11270 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11272 /* Cause of UE context release */
11274 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11275 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11276 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11277 UEContextReleaseCommandIEs__value_PR_Cause;
11278 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11279 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11280 CauseRadioNetwork_normal_release;
11281 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11283 /* RRC Container for RRC release */
11285 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11286 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11287 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11288 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11289 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11291 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11292 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11293 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11294 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11296 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11299 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11300 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11302 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11304 /* Encode the UE Context Release Command type as APER */
11305 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11307 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11310 /* Encode results */
11311 if(encRetVal.encoded == ENCODE_FAIL)
11313 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11314 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11319 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11320 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11322 DU_LOG("%x",encBuf[ieIdx]);
11326 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11327 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11329 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11337 FreeUeContextReleaseCommand(f1apMsg);
11340 /*******************************************************************
11342 * @brief process Ue context release request
11346 * Function : procUeContextReleaseReq
11349 * - process Ue context release request
11351 * @params[in] F1AP_PDU_t *f1apMsg
11352 * @return ROK - success
11353 * RFAILED - failure
11355 * ****************************************************************/
11356 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11358 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11360 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11361 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11363 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11365 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11367 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11369 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11372 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11374 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11382 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11384 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11389 /*******************************************************************
11391 * @brief processing of Gnb-DU config update
11395 * Function : procGnbDuUpdate
11398 * - processing of Gnb-DU config update
11400 * @params[in] F1AP_PDU_t *f1apMsg
11401 * @return ROK - success
11402 * RFAILED - failure
11404 * ****************************************************************/
11405 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11407 bool cellToBeDelete = false;
11408 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11412 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11414 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11415 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11417 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11419 case ProtocolIE_ID_id_TransactionID:
11421 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11423 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11425 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11426 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11427 Served_Cells_To_Delete_List.list.array[0];
11428 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11429 cellToBeDelete = true;
11432 case ProtocolIE_ID_id_gNB_DU_ID:
11436 if(BuildAndSendDUUpdateAck(duId) != ROK)
11438 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11442 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11443 * commented this trigger for now */
11445 if(cellToBeDelete == false)
11447 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11448 if(BuildAndSendF1ResetReq() != ROK)
11450 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11455 if(cellToBeDelete == true)
11457 SEARCH_DU_DB(duIdx, duId, duDb);
11458 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11459 if(cellCb->numUe == 0)
11461 memset(cellCb, 0, sizeof(CuCellCb));
11465 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11470 /*******************************************************************
11472 * @brief storing slice list in CU database
11476 * Function : buildSliceList
11479 * - storing slice list in CU database
11481 * @params[in] SliceSupportList_t *sliceSupportList
11482 * @return ROK - success
11483 * RFAILED - failure
11485 * ****************************************************************/
11486 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11488 uint8_t sliceListIdx = 0;
11490 if(sliceSupportList)
11492 if(sliceSupportList->list.array)
11494 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11495 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11497 if(sliceSupportList->list.array[sliceListIdx])
11499 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11500 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11502 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11505 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11507 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11508 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11510 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11512 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11513 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11514 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11523 /****************************************************************
11524 * @brief Function to process Srb Setup Mod List
11528 * Function : procSrbSetupModList
11531 * - Function to process SRB Setup Mod List
11534 * @return ROK - success
11535 * RFAILED - failure
11537 * ****************************************************************/
11538 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11540 uint8_t arrIdx = 0, srbIdx;
11541 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11543 if(srbSetupList != NULLP)
11545 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11547 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11548 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11550 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11552 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11554 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11566 /****************************************************************
11567 * @brief Function to process Drb Setup Mod List
11571 * Function : procDrbSetupModList
11574 * - Function to process DRB Setup Mod List
11577 * @return ROK - success
11578 * RFAILED - failure
11580 * ****************************************************************/
11581 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11583 uint8_t arrIdx = 0, drbIdx;
11585 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11587 if(drbSetupList != NULLP)
11589 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11591 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11592 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11594 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11596 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11598 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11599 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11604 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11606 /* extracting teId */
11607 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11610 if(addDrbTunnels(duId, teId)== ROK)
11612 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11624 /*******************************************************************
11626 * @brief processing of GNB_DU_Served_Cells Plmn list information
11630 * Function : procServedCellPlmnList
11633 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11636 * @params[in] F1AP_PDU_t *f1apMsg
11637 * @return ROK - success
11638 * RFAILED - failure
11640 * ****************************************************************/
11641 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11643 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11644 ProtocolExtensionContainer_4624P3_t **ieExtend;
11646 if(srvPlmn->list.array)
11648 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11650 if(srvPlmn->list.array[srvPlmnIdx])
11652 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11655 if((*ieExtend)->list.array)
11657 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11659 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11661 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11663 case ProtocolIE_ID_id_TAISliceSupportList:
11665 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11666 extensionValue.choice.SliceSupportList) != ROK)
11668 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11683 /****************************************************************
11684 * @brief Function to process Ue Context Modification Response
11688 * Function : procUeContextModificationResponse
11691 * - Function to process Ue Context Modification Response
11694 * @return ROK - success
11695 * RFAILED - failure
11697 * ****************************************************************/
11698 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11700 uint8_t idx=0, duIdx=0;
11701 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11702 DuDb *duDb = NULLP;
11703 CuUeCb *ueCb = NULLP;
11704 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11706 SEARCH_DU_DB(duIdx, duId, duDb);
11707 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11709 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11711 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11713 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11715 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11718 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11720 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11721 ueCb = &duDb->ueCb[duUeF1apId-1];
11724 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11726 /* Adding Tunnels for successful DRB */
11727 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11731 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11733 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11736 case ProtocolIE_ID_id_DUtoCURRCInformation:
11738 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11739 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11740 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11742 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11751 /* If UE is in handover and UE context is not yet created at target DU, then send
11752 * UE context setup request to target DU */
11753 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11756 DuDb *tgtDuDb = NULLP;
11757 CuUeCb *ueCbInTgtDu = NULLP;
11759 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11762 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11763 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11765 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11767 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11769 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11774 /* If UE context is not found in Target DU DU, send UE context setup
11776 if(ueCbInTgtDu == NULLP)
11778 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
11780 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11790 /*******************************************************************
11792 * @brief processing of F1 setup request
11796 * Function : procF1SetupReq
11799 * - processing of F1 setup request
11801 * @params[in] F1AP_PDU_t *f1apMsg
11802 * @return ROK - success
11803 * RFAILED - failure
11805 * ****************************************************************/
11806 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11808 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11810 uint64_t nrCellId = 0;
11811 DuDb *duDb = NULLP;
11812 CuCellCb *cellCb = NULLP;
11813 BIT_STRING_t nrcellIdentity;
11814 F1SetupRequest_t *f1SetupReq = NULLP;
11815 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11816 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11818 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11819 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11821 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11823 case ProtocolIE_ID_id_gNB_DU_ID:
11825 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11826 SEARCH_DU_DB(duIdx, duId, duDb);
11829 duDb = &cuCb.duInfo[cuCb.numDu];
11832 memset(duDb, 0, sizeof(DuDb));
11837 case ProtocolIE_ID_id_gNB_DU_Name:
11839 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11842 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11844 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11845 if(duServedCell->list.array)
11847 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11849 if(duServedCell->list.array[plmnidx])
11851 switch(duServedCell->list.array[plmnidx]->id)
11853 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11855 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11856 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11857 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11859 bitStringToInt(&nrcellIdentity, &nrCellId);
11860 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11861 if(cellCb == NULLP)
11863 cellCb = &duDb->cellCb[duDb->numCells];
11864 memset(cellCb, 0, sizeof(CuCellCb));
11865 cellCb->nrCellId = nrCellId;
11866 cellCb->cellStatus = CELL_ACTIVE;
11879 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11883 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11887 /****************************************************************
11889 * @brief processing of UE Context Release Complete
11893 * Function : procUeContextReleaseComplete
11896 * - processing of UE Context Release Complete
11898 * @params[in] F1AP_PDU_t *f1apMsg
11899 * @return ROK - success
11900 * RFAILED - failure
11902 * ****************************************************************/
11903 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11905 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
11906 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11907 DuDb *duDb = NULLP;
11908 CuUeCb *ueCb = NULLP;
11909 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11911 SEARCH_DU_DB(duIdx, duId, duDb);
11914 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11918 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11919 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11921 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11923 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11925 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11928 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11930 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11931 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11932 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11934 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11936 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11937 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11939 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11941 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
11943 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11944 ueCb->cellCb->numUe--;
11945 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
11947 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11954 memset(ueCb, 0, sizeof(CuUeCb));
11962 /*******************************************************************
11964 * @brief Builds the Paging cell list
11968 * Function : BuildPagingCellList
11970 * Functionality: Build the paging cell list
11972 * @params[in] PagingCell_list_t *pagingCelllist,
11974 * @return ROK - success
11975 * RFAILED - failure
11977 * ****************************************************************/
11978 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11980 uint8_t cellIdx =0;
11981 PagingCell_ItemIEs_t *pagingCellItemIes;
11982 PagingCell_Item_t *pagingCellItem;
11984 pagingCelllist->list.count = numCells;
11985 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11986 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11987 if(pagingCelllist->list.array == NULLP)
11989 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11993 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11995 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11996 if(pagingCelllist->list.array[cellIdx] == NULLP)
11998 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
12003 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12005 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12006 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
12007 pagingCellItemIes->criticality = Criticality_ignore;
12008 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
12009 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12011 /* Fill NrCgi Information */
12012 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
12018 /*******************************************************************
12020 * @brief Deallocation of memory allocated in paging msg
12024 * Function :FreePagingMsg
12026 * Functionality: Deallocation of memory allocated in paging msg
12028 * @params[in] F1AP_PDU_t *f1apMsg
12032 * ****************************************************************/
12033 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12035 uint8_t ieIdx, cellIdx;
12037 PagingCell_ItemIEs_t *pagingCellItemIes;
12038 PagingCell_Item_t *pagingCellItem;
12039 PagingCell_list_t *pagingCelllist;
12043 if(f1apMsg->choice.initiatingMessage)
12045 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12046 if(paging->protocolIEs.list.array)
12048 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12050 if(paging->protocolIEs.list.array[ieIdx])
12052 switch(paging->protocolIEs.list.array[ieIdx]->id)
12054 case ProtocolIE_ID_id_UEIdentityIndexValue:
12056 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12057 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12061 case ProtocolIE_ID_id_PagingIdentity:
12063 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12065 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12067 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12069 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12070 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12072 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12073 sizeof(struct CNUEPagingIdentity));
12079 case ProtocolIE_ID_id_PagingCell_List:
12081 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12082 if(pagingCelllist->list.array)
12084 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12086 if(pagingCelllist->list.array[cellIdx])
12088 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12089 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12091 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12092 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12093 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12095 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12098 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12103 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12106 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12108 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12110 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12113 /*******************************************************************
12115 * @brief Builds and sends the paging message if UE is in idle mode
12119 * Function : BuildAndSendPagingMsg
12121 * Functionality: Builds and sends the paging message
12123 * @params[in] uint32_t duId, uint8_t gsTmsi
12125 * @return ROK - success
12126 * RFAILED - failure
12128 * ****************************************************************/
12129 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12131 bool memAllocFailed = false;
12132 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12133 uint16_t ueId = 0, duIdx = 0;
12135 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12136 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12137 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12138 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12140 F1AP_PDU_t *f1apMsg = NULLP;
12141 Paging_t *paging = NULLP;
12143 asn_enc_rval_t encRetVal;
12145 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12147 SEARCH_DU_DB(duIdx, duId, duDb);
12150 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12156 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12157 if(f1apMsg == NULLP)
12159 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12163 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12165 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12166 if(f1apMsg->choice.initiatingMessage == NULLP)
12168 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12171 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12172 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12173 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12175 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12178 paging->protocolIEs.list.count = elementCnt;
12179 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12181 /* Initialize the Paging Message members */
12182 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12183 if(paging->protocolIEs.list.array == NULLP)
12185 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12189 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12191 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12192 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12194 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12195 memAllocFailed = true;
12200 if(memAllocFailed == true)
12205 /* UE Identity Index Value */
12207 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12208 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12209 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12210 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12211 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12212 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12213 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12214 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12216 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12220 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12221 ueId = gsTmsi % 1024;
12222 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12224 /* Paging Identity */
12226 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12227 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12228 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12229 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12230 PagingIdentity_PR_cNUEPagingIdentity;
12231 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12232 sizeof(struct CNUEPagingIdentity));
12233 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12235 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12239 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12240 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12242 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12243 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12244 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12245 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12247 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12251 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12252 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12256 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12257 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12258 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12259 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12261 /* Paging Priority */
12263 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12264 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12265 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12266 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12268 /* Paging Cell List */
12270 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12271 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12272 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12273 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12275 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12279 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12281 /* Encode the UE Context Release Command type as APER */
12282 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12284 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12287 /* Encode results */
12288 if(encRetVal.encoded == ENCODE_FAIL)
12290 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12291 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12296 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12297 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12299 DU_LOG("%x",encBuf[ieIdx]);
12303 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12305 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12314 FreePagingMsg(f1apMsg);
12318 /*******************************************************************
12320 * @brief Handles received F1AP message and sends back response
12324 * Function : F1APMsgHdlr
12327 * - Decodes received F1AP control message
12328 * - Prepares response message, encodes and sends to SCTP
12331 * @return ROK - success
12332 * RFAILED - failure
12334 * ****************************************************************/
12335 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12341 F1AP_PDU_t *f1apMsg = NULLP;
12342 asn_dec_rval_t rval; /* Decoder return value */
12343 F1AP_PDU_t f1apasnmsg ;
12345 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12346 ODU_PRINT_MSG(mBuf, 0,0);
12348 /* Copy mBuf into char array to decode it */
12349 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12350 CU_ALLOC(recvBuf, (Size)recvBufLen);
12352 if(recvBuf == NULLP)
12354 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12357 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12359 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12363 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12364 for(i=0; i< recvBufLen; i++)
12366 DU_LOG("%x",recvBuf[i]);
12369 /* Decoding flat buffer into F1AP messsage */
12370 f1apMsg = &f1apasnmsg;
12371 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12373 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12374 CU_FREE(recvBuf, (Size)recvBufLen);
12376 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12378 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12382 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12384 switch(f1apMsg->present)
12386 case F1AP_PDU_PR_initiatingMessage:
12388 switch(f1apMsg->choice.initiatingMessage->value.present)
12390 case InitiatingMessage__value_PR_Reset:
12392 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12393 BuildAndSendF1ResetAck();
12397 case InitiatingMessage__value_PR_F1SetupRequest:
12399 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12400 procF1SetupReq(duId, f1apMsg);
12404 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12406 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12407 procGnbDuUpdate(*duId, f1apMsg);
12410 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12412 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12413 procInitULRRCMsg(*duId, f1apMsg);
12416 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12418 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12419 procUlRrcMsg(*duId, f1apMsg);
12423 case InitiatingMessage__value_PR_RRCDeliveryReport:
12425 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12428 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12430 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12431 procUeContextReleaseReq(*duId, f1apMsg);
12436 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12437 f1apMsg->choice.initiatingMessage->value.present);
12440 }/* End of switch(initiatingMessage) */
12444 case F1AP_PDU_PR_successfulOutcome:
12446 switch(f1apMsg->choice.successfulOutcome->value.present)
12448 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12450 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12453 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12455 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12456 procUeContextSetupResponse(*duId, f1apMsg);
12459 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12461 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12462 procUeContextModificationResponse(*duId, f1apMsg);
12465 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12467 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12468 procUeContextReleaseComplete(*duId, f1apMsg);
12473 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12474 f1apMsg->choice.successfulOutcome->value.present);
12477 }/* End of switch(successfulOutcome) */
12482 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12485 }/* End of switch(f1apMsg->present) */
12487 } /* End of F1APMsgHdlr */
12489 /**********************************************************************
12491 **********************************************************************/