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 Security mode command");
1518 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1520 rrcContainer->size = bufLen;
1521 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1522 if(rrcContainer->buf != NULLP)
1524 memset(rrcContainer->buf, 0, bufLen);
1525 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1529 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1533 else if(rrcMsgType == SECURITY_MODE_COMPLETE)
1535 /*Hardcoded RRC Container from reference logs*/
1536 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1537 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 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, buf, bufLen);
1548 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1552 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1554 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1555 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1557 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1563 /*******************************************************************
1565 * @brief Frees the DLRRCMessageTransfer
1569 * Function : freeDlRrcMessageTransfer
1571 * Functionality: Frees the DLRRCMessageTransfer
1575 * @return ROK - success
1578 * ****************************************************************/
1579 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1582 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1586 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1587 if(dlRRCMsg->protocolIEs.list.array)
1590 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1591 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1592 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1594 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1596 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1598 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1602 /*******************************************************************
1604 * @brief Builds and sends the DLRRCMessageTransfer
1608 * Function : BuildAndSendDLRRCMessageTransfer
1610 * Functionality: Constructs the DL RRC Message Transfer and sends
1611 * it to the CU through SCTP.
1615 * @return ROK - success
1618 * ****************************************************************/
1619 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1621 uint8_t elementCnt = 0;
1624 F1AP_PDU_t *f1apMsg = NULLP;
1625 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1626 asn_enc_rval_t encRetVal; /* Encoder return value */
1628 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1630 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1631 if(f1apMsg == NULLP)
1633 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1637 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1638 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1639 if(f1apMsg->choice.initiatingMessage == NULLP)
1641 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1642 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1646 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1647 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1648 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1649 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1652 dlRRCMsg->protocolIEs.list.count = elementCnt;
1653 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1655 /* Initialize the F1Setup members */
1656 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1657 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1659 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1660 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1661 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1665 for(idx=0; idx<elementCnt; idx++)
1667 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1668 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1670 for(ieId=0; ieId<idx; ieId++)
1672 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1674 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1675 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1676 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1681 /* GNB CU UE F1AP ID */
1683 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1684 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1685 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1686 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1688 /* GNB DU UE F1AP ID */
1690 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1691 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1692 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1693 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1697 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1698 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1699 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1700 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1704 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1705 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1706 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1707 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1709 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1711 /* Encode the F1SetupRequest type as APER */
1712 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1714 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1716 /* Encode results */
1717 if(encRetVal.encoded == ENCODE_FAIL)
1719 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1720 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1725 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1726 for(int i=0; i< encBufSize; i++)
1728 DU_LOG("%x",encBuf[i]);
1733 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1735 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1738 freeDlRrcMessageTransfer(f1apMsg);
1740 }/* End of BuildAndSendDLRRCMessageTransfer */
1742 /*******************************************************************
1744 * @brief Function to set the Dl RRC Msg Type
1748 * Function : setDlRRCMsgType
1750 * Functionality: Constructs the UE Setup Response and sends
1751 * it to the DU through SCTP.
1755 * @return ROK - success
1758 * ****************************************************************/
1760 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1762 uint8_t rrcMsgType = 0;
1763 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1766 rrcMsgType = RRC_SETUP;
1768 case RRC_SETUP_COMPLETE:
1769 rrcMsgType = RRC_SETUP_COMPLETE;
1771 case SECURITY_MODE_COMPLETE:
1772 rrcMsgType = SECURITY_MODE_COMPLETE;
1774 case REGISTRATION_COMPLETE:
1775 rrcMsgType = REGISTRATION_COMPLETE;
1777 case UE_CONTEXT_SETUP_RSP:
1778 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1780 case RRC_RECONFIG_COMPLETE:
1781 rrcMsgType = RRC_RECONFIG_COMPLETE;
1790 /*******************************************************************
1792 * @brief fill long cycle offset value of drx
1796 * Function : fillLongCycleOffsetValue
1798 * Functionality: fill long cycle offset value of drx
1800 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1801 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1803 * @return ROK - success
1806 * ****************************************************************/
1807 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__recvedLongCycleOffsetVal *recvedLongCycleOffsetVal)
1810 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1811 switch(recvedLongCycleOffsetVal->present)
1813 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms10:
1815 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1818 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms20:
1820 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1823 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms32:
1825 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1828 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms40:
1830 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1833 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms60:
1835 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1838 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms64:
1840 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1843 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms70:
1845 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1848 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms80:
1850 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1853 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms128:
1855 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1858 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms160:
1860 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1863 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms256:
1865 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1868 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms320:
1870 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1873 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms512:
1875 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1878 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms640:
1880 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1883 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms1024:
1885 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1888 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms1280:
1890 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1893 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms2048:
1895 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1898 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms2560:
1900 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1903 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms5120:
1905 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1908 case DRX_ConfigRrc__recvedLongCycleOffsetVal_PR_ms10240:
1910 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1918 /*******************************************************************
1920 * @brief Extract configuration from DRX_ConfigRrc
1921 * and store the drx configuration in UeCb
1925 * Function : storeDrxCfgInUeCb
1927 * Functionality: Store drx configuration in UeCb
1929 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
1932 * ****************************************************************/
1933 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
1937 switch(drxSetup->drx_onDurationTimer.present)
1939 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
1941 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
1943 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
1944 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
1947 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
1949 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
1950 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
1955 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
1956 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
1957 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
1958 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
1959 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
1960 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
1961 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
1962 if(drxSetup->shortDRX)
1964 drxCfg->shortDrxPres=true;
1965 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
1966 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
1969 drxCfg->shortDrxPres=false;
1973 /*******************************************************************
1975 * @brief Extract configuration from CellGroupConfig
1979 * Function : extractCellGroupConfig
1981 * Functionality: Extract configuration from CellGroupConfig
1982 * and store in local database
1984 * @params[in] UE control block
1987 * @return ROK - success
1990 * ****************************************************************/
1991 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
1993 uint8_t rbIdx, srbIdx, drbIdx;
1994 bool srbFound, drbFound;
1995 SrbInfo *srbCfgDb = NULLP;
1996 DrbInfo *drbCfgDb = NULLP;
1997 RlcLcCfg *rlcLcCfgDb = NULLP;
1998 MacLcCfg *macLcCfgDb = NULLP;
1999 RLC_BearerConfig_t *rlcCfg = NULLP;
2000 RLC_Config_t *rlcLcCfg = NULLP;
2001 LogicalChannelConfig_t *macLcCfg = NULLP;
2008 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2012 if(cellGrpCfg == NULLP)
2014 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2019 if(cellGrpCfg->mac_CellGroupConfig)
2021 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2023 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2025 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2028 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2030 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2034 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2041 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2046 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2048 /* Update SRB configuration in local DB */
2049 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2051 /* Search if SRB entry is already present in DB */
2052 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2054 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2056 srbCfgDb = &ueCb->srbList[srbIdx];
2062 /* If not, add SRB to UE CB's SRB list */
2065 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2066 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2070 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2071 srbCfgDb->cfgSentToUe = false;
2072 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2073 macLcCfgDb = &srbCfgDb->macLcCfg;
2076 /* Update DRB configuration in local DB */
2077 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2079 /* Search if DRB entry is already present in DB */
2080 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2082 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2084 drbCfgDb = &ueCb->drbList[drbIdx];
2090 /* If not, add DRB to UE CB's SRB list */
2093 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2094 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2098 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2099 drbCfgDb->cfgSentToUe = false;
2100 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2101 macLcCfgDb = &drbCfgDb->macLcCfg;
2105 /* Update RLC configuration for this RB */
2106 rlcLcCfg = rlcCfg->rlc_Config;
2107 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2108 switch(rlcLcCfgDb->rlcMode)
2110 case RLC_Config_PR_am:
2112 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2113 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2114 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2115 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2116 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2118 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2119 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2120 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2124 case RLC_Config_PR_um_Bi_Directional:
2126 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2128 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2129 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2134 /* Update MAC configuration for this LC */
2135 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2136 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2137 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2138 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2139 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2140 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2145 /*******************************************************************
2147 * @brief Function to decode DU to CU RRC container
2151 * Function : extractDuToCuRrcCont
2153 * Functionality: Function to decode DU to CU RRC container
2156 * RRC conatiner octect string to be decoded
2158 * @return ROK - success
2161 * ****************************************************************/
2162 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2164 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2165 asn_dec_rval_t rval; /* Decoder return value */
2167 /* Copy the received container to UeCb */
2168 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2170 /* Decoding DU to CU RRC container octet string to cell group config */
2171 cellGrpCfgMsg = &cellGrpCfg;
2172 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2174 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2176 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2178 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2182 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2184 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2186 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2193 /*******************************************************************
2195 * @brief Function to build Initial UL RRC Message
2199 * Function : procInitULRRCMsg
2201 * Functionality: Function to build Initial UL RRC Message
2205 * @return ROK - success
2208 * ****************************************************************/
2210 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2212 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2214 uint16_t cellIdx=0, nrCellId = 0;
2219 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2221 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2223 SEARCH_DU_DB(duIdx, duId, duDb);
2224 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2226 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2228 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2230 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2231 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2234 case ProtocolIE_ID_id_NRCGI:
2235 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2236 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2241 case ProtocolIE_ID_id_C_RNTI:
2242 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2243 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2245 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2246 memset(ueCb, 0, sizeof(CuUeCb));
2247 ueCb->cellCb = cellCb;
2248 ueCb->crnti = crnti;
2249 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2250 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2251 ueCb->state = UE_ATTACH_IN_PROGRESS;
2254 cellCb->ueCb[cellCb->numUe] = ueCb;
2259 case ProtocolIE_ID_id_RRCContainer:
2262 case ProtocolIE_ID_id_DUtoCURRCContainer:
2264 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2265 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2267 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2268 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2269 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2270 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2272 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2273 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2274 ueCb->f1apMsgDb.duToCuContainer.size);
2276 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2278 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2284 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2291 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2300 ueCb->f1apMsgDb.dlRrcMsgCount++;
2301 rrcMsgType = setDlRRCMsgType(ueCb);
2302 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2307 /*******************************************************************
2309 * @brief Builds Nrcgi
2313 * Function : BuildNrcgi
2315 * Functionality: Building the PLMN ID and NR Cell id
2317 * @params[in] NRCGI_t *nrcgi
2318 * @return ROK - success
2321 * ****************************************************************/
2322 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2325 uint8_t unused_bits = 4;
2326 uint8_t byteSize = 5;
2328 /* Allocate Buffer Memory */
2329 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2330 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2331 if(nrcgi->pLMN_Identity.buf == NULLP)
2335 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2341 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2342 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2343 if(nrcgi->nRCellIdentity.buf == NULLP)
2347 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2351 /*******************************************************************
2353 * @brief Builds Special cell list for UE Setup Request
2357 * Function : BuildSplCellList
2359 * Functionality: Constructs the Special Cell list for UESetReq
2361 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2363 * @return ROK - success
2366 * ****************************************************************/
2367 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2373 spCellLst->list.count = cellCnt;
2374 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2375 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2376 if(spCellLst->list.array == NULLP)
2380 for(idx=0; idx<cellCnt; idx++)
2382 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2383 if(spCellLst->list.array[idx] == NULLP)
2389 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2390 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2391 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2393 /* Special Cell ID -NRCGI */
2394 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2399 /*Special Cell Index*/
2400 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2402 }/* End of BuildSplCellList*/
2404 /*******************************************************************
2406 * @brief Builds SRBS to be setup
2410 * Function : BuildSRBSetup
2412 * Functionality: Constructs the SRB's for UESetReq
2414 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2416 * @return ROK - success
2419 * ****************************************************************/
2420 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2425 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2426 srbCnt = ueCb->numSrb;
2429 srbSet->list.count = srbCnt;
2430 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2431 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2432 if(srbSet->list.array == NULLP)
2434 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2438 for(idx=0; idx<srbCnt; idx++)
2440 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2441 if(srbSet->list.array[idx] == NULLP)
2443 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2448 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2451 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2452 srbSet->list.array[idx]->criticality = Criticality_ignore;
2453 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2454 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2455 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2460 for(idx=0; idx<srbCnt; idx++)
2462 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2463 srbSet->list.array[idx]->criticality = Criticality_ignore;
2464 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2465 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2469 }/* End of BuildSRBSetup*/
2471 /*******************************************************************
2473 * @brief Builds QOS Info for DRB Setum Item
2477 * Function : BuildQOSInfo
2479 * Functionality: Constructs the QOS Info for DRB Setup Item
2481 * @params[in] QoSInformation_t *qosinfo
2482 * int16_t pduSessionID
2484 * @return ROK - success
2487 * ****************************************************************/
2488 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2490 uint8_t elementCnt = 0, qosCntIdx = 0;
2491 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2493 /* NonDynamic5QIDescriptor */
2494 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2495 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2496 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2502 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2506 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2507 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2509 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2511 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2517 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2518 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2522 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2523 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2525 /*MaxDataBurstVolume*/
2526 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2527 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2531 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2532 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2535 /*nRGRAN Allocation Retention Priority*/
2538 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2539 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2540 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2544 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2545 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2546 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2548 qosInfo->priorityLevel = PriorityLevel_lowest;
2549 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2550 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2553 /* PDU session ID */
2556 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2557 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2559 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2563 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2564 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2568 elementCnt = NUM_QOS_EXT;
2569 qosIeExt->list.count = elementCnt;
2570 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2572 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2573 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2575 if(qosIeExt->list.array == NULLP)
2577 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2581 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2583 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2584 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2586 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2589 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2590 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2591 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2592 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2593 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2594 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2595 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2596 qosInfo->pduSessionId = pduSessionID;
2601 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2606 }/*End of BuildQOSInfo*/
2608 /*******************************************************************
2610 * @brief Builds SNSSAI
2614 * Function : BuildSNSSAI
2616 * Functionality: Constructs the SNSSAI For DRB list
2618 * @params[in] SNSSAI_t *snssai
2619 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2621 * @return ROK - success
2624 * ****************************************************************/
2625 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2629 snssai->sST.size = sizeof(uint8_t);
2630 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2631 if(snssai->sST.buf == NULLP)
2636 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2638 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2641 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2642 if(snssai->sD == NULLP)
2646 snssai->sD->size = 3 * sizeof(uint8_t);
2647 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2648 if(snssai->sD->buf == NULLP)
2653 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2655 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2658 drbInfo->snssai = snssaiToCopy;
2660 }/*End of BuildSNSSAI*/
2662 /*******************************************************************
2664 * @brief Builds the flow map.
2668 * Function : BuildFlowsMap
2670 * Functionality: Constructs the flowmap For DRB list
2672 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2674 * @return ROK - success
2677 * ****************************************************************/
2678 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2680 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2681 FlowsMapped *qosFlow;
2686 flowCnt = drbInfo->numFlowMap;
2687 flowMap->list.count = flowCnt;
2688 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2689 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2690 if(flowMap->list.array == NULLP)
2692 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2695 for(idx=0; idx<flowCnt; idx++)
2697 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2698 if(flowMap->list.array[idx] == NULLP)
2700 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2706 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2707 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2709 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2711 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2713 qosFlow = &drbInfo->flowMapList[flowIdx];
2720 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2721 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2726 qosFlow = &drbInfo->flowMapList[idx];
2727 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2730 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2731 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2734 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2738 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2739 drbInfo->numFlowMap++;
2742 }/*End of BuildFlowsMap*/
2744 /*******************************************************************
2746 * @brief Builds the Uplink Tunnel Info
2750 * Function : BuildULTnlInfo
2752 * Functionality: Constructs the UL TnlInfo For DRB list
2754 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2756 * @return ROK - success
2759 * ****************************************************************/
2760 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2766 ulInfo->list.count = ulCnt;
2767 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2768 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2769 if(ulInfo->list.array == NULLP)
2771 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2774 for(idx=0; idx<ulCnt; idx++)
2776 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2777 if(ulInfo->list.array[idx] == NULLP)
2779 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2784 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2786 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2787 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2789 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2792 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2793 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2794 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2795 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2797 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2803 /* NOTE: Below IP address must be changed if running on different IP configuration */
2804 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2805 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2806 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2807 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2808 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2810 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2811 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2812 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2813 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2817 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2818 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2819 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2820 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2821 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2825 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2826 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2827 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2828 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2830 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2836 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2837 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2838 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2839 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2841 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2842 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2843 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2844 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2848 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2849 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2850 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2851 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2854 }/*End of BuildULTnlInfo*/
2856 /*******************************************************************
2858 * @brief Builds DRBS to be setup
2862 * Function : BuildDRBSetup
2864 * Functionality: Constructs the DRB's for UESetReq
2866 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2868 * @return ROK - success
2871 * ****************************************************************/
2872 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2874 uint16_t snssaiIdx=0;
2875 uint8_t idx = 0, extIeIdx = 0;
2876 uint8_t elementCnt = 0, drbCnt = 0;
2877 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2878 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2879 DRBs_ToBeSetup_Item_t *drbSetItem;
2880 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2881 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2883 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2884 drbCnt = ueCb->numDrb;
2886 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2887 drbSet->list.count = drbCnt;
2889 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2890 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2891 if(drbSet->list.array == NULLP)
2893 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2897 for(idx=0; idx<drbCnt; idx++)
2899 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2900 if(drbSet->list.array[idx] == NULLP)
2902 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2906 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2907 drbSet->list.array[idx]->criticality = Criticality_ignore;
2908 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2909 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2911 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2913 drbSetItem->dRBID = idx + 1;
2914 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2917 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2920 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2921 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2922 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2924 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2927 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2928 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2929 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2930 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2931 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2932 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2934 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2935 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2936 if(BuildQOSInforet != ROK)
2938 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2943 snssaiIdx = (idx% cuCb.numSnssaiSupported);
2944 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2945 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2946 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
2948 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2949 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
2950 if(BuildSNSSAIret != ROK)
2952 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2956 /*Flows mapped to DRB List*/
2957 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2958 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2959 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2961 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2962 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2963 if(BuildFlowsMapret != ROK)
2965 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2969 /*ULUPTNLInformation To Be Setup List*/
2970 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2971 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2974 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2976 if(BuildULTnlInforet != ROK)
2978 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2983 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2985 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2986 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
2989 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
2991 /* DL PDCP SN Length */
2992 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2994 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
2995 if(!drbToBeSetupExt)
2997 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3002 drbToBeSetupExt->list.count = elementCnt;
3003 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3005 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3006 if(!drbToBeSetupExt->list.array)
3008 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3012 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3014 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3015 if(!drbToBeSetupExt->list.array[extIeIdx])
3017 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3023 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3025 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3026 drbToBeSetupExtIe->criticality = Criticality_ignore;
3027 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3028 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3029 drbSetItem->iE_Extensions = drbToBeSetupExt;
3032 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3036 }/* End of BuildDRBSetup*/
3038 /*******************************************************************
3040 * @brief Deallocating memory of function BuildAndSendUESetReq
3044 * Function : FreeNrcgi
3046 * Functionality: Deallocating memory for function BuildNrcgi
3048 * @params[in] NRCGI_t *nrcgi
3052 *******************************************************************/
3053 void FreeNrcgi(NRCGI_t *nrcgi)
3055 if(nrcgi->pLMN_Identity.buf != NULLP)
3057 if(nrcgi->nRCellIdentity.buf != NULLP)
3059 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3061 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3064 /*******************************************************************
3066 * @brief Deallocating memory of function BuildAndSendUESetReq
3070 * Function : FreeSplCellList
3072 * Functionality: Deallocating memory for function BuildSplCellList
3074 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3079 * *****************************************************************/
3080 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3083 if(spCellLst->list.array != NULLP)
3085 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3087 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3089 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3091 if(spCellLst->list.array[cellidx]!=NULLP)
3093 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3096 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3099 /*******************************************************************
3101 * @brief Deallocating memory of function BuildAndSendUESetReq
3105 * Function : FreeSRBSetup
3107 * Functionality: Deallocating memory for function BuildSRBSetup
3109 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3114 * ******************************************************************/
3115 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3118 if(srbSet->list.array != NULLP)
3120 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3122 if(srbSet->list.array[srbidx]!=NULLP)
3124 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3127 CU_FREE(srbSet->list.array,srbSet->list.size);
3130 /*******************************************************************
3132 * @brief Deallocating memory of function BuildAndSendUESetReq
3136 * Function : FreeQOSInfo
3138 * Functionality: Deallocating memory for function BuildQOSInfo
3140 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3144 * ****************************************************************/
3145 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3147 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3148 uint8_t qosCntIdx = 0;
3150 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3152 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3154 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3156 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3157 sizeof(MaxDataBurstVolume_t));
3159 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3160 sizeof(AveragingWindow_t));
3162 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3163 sizeof(NonDynamic5QIDescriptor_t));
3165 if(drbQos->iE_Extensions)
3167 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3168 if(qosIeExt->list.array != NULLP)
3170 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3172 if(qosIeExt->list.array[qosCntIdx])
3174 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3177 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3180 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3183 /*******************************************************************
3185 * @brief Deallocating memory of function BuildAndSendUESetReq
3189 * Function : FreeULTnlInfo
3191 * Functionality: Deallocating memory for function BuildULTnlInfo
3193 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3198 * ****************************************************************/
3199 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3202 if(ulInfo->list.array != NULLP)
3204 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3206 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3208 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3210 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3211 transportLayerAddress.buf != NULLP)
3213 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3216 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3217 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3218 gTPTunnel->gTP_TEID.size);
3220 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3221 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3222 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3224 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3225 sizeof(GTPTunnel_t));
3228 if(ulInfo->list.array[ulidx]!=NULLP)
3230 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3233 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3236 /*******************************************************************
3238 * @brief Deallocating memory for BuildAndSendUESetReq
3242 * Function : FreeDRBSetup
3244 * Functionality: Deallocating memory for BuildDRBSetup
3246 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3250 * ****************************************************************/
3251 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3253 DRBs_ToBeSetup_Item_t *drbSetItem;
3254 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3256 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3258 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3259 if(drbSet->list.array != NULLP)
3261 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3263 if(drbSet->list.array[drbidx] != NULLP)
3265 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3266 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3268 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3269 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3271 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3272 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3274 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3275 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3277 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3279 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3281 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3283 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3284 flows_Mapped_To_DRB_List.list.array != NULLP)
3286 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3287 flows_Mapped_To_DRB_List.list.count; flowidx++)
3289 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3290 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3292 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3293 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3294 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3296 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3297 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3298 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3300 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3301 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3302 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3304 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3305 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3307 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3308 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3309 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3310 sizeof(MaxDataBurstVolume_t));
3312 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3313 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3314 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3316 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3317 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3318 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3321 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3322 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3324 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3325 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3328 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3329 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3330 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3332 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3333 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3335 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3336 sizeof(OCTET_STRING_t));
3338 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3339 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3341 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3342 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3344 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3345 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3347 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3348 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3350 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3351 iE_Extensions != NULLP)
3353 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3354 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3355 if(qosIeExt->list.array != NULLP)
3357 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3359 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3361 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3364 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3366 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3367 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3370 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3372 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3375 CU_FREE(drbSet->list.array,drbSet->list.size);
3380 /*******************************************************************
3382 * @brief Free the UE Setup Request
3386 * Function : FreeUeContextSetupReq
3388 * Functionality: Deallocate the memory of BuildUESetReq
3390 * @params[in] F1AP_PDU_t *f1apMsg
3395 * ****************************************************************/
3396 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3399 UEContextSetupRequest_t *ueSetReq = NULLP;
3401 if(f1apMsg != NULLP)
3403 if(f1apMsg->choice.initiatingMessage != NULLP)
3405 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3406 if(ueSetReq->protocolIEs.list.array != NULLP)
3408 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3410 if(ueSetReq->protocolIEs.list.array[idx])
3412 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3414 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3416 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3418 case ProtocolIE_ID_id_SpCell_ID:
3419 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3421 case ProtocolIE_ID_id_ServCellIndex:
3423 case ProtocolIE_ID_id_SpCellULConfigured:
3425 case ProtocolIE_ID_id_CUtoDURRCInformation:
3426 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3428 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3429 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3431 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3432 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3434 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3435 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3437 case ProtocolIE_ID_id_RRCContainer:
3438 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3440 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3441 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3444 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3445 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3446 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3449 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3453 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3455 for(ieId=0; ieId<idx; ieId++)
3457 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3459 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3462 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3464 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3466 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3470 /**Filling cell group info **/
3471 /*******************************************************************
3473 * @brief Build Control resource set to add/modify list
3477 * Function : BuildControlRSetToAddModList
3479 * Functionality: Build Control resource set to add/modify list
3482 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3484 * @return ROK - success
3487 * ****************************************************************/
3488 uint8_t BuildControlRSetToAddModList
3490 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3495 uint8_t numBytes, bitsUnused;
3496 struct ControlResourceSet *controlRSet;
3497 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3498 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3501 controlRSetList->list.count = elementCnt;
3502 controlRSetList->list.size = \
3503 elementCnt * sizeof(struct ControlResourceSet *);
3505 controlRSetList->list.array = NULLP;
3506 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3507 if(!controlRSetList->list.array)
3509 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3513 for(idx = 0; idx < elementCnt; idx++)
3515 controlRSetList->list.array[idx] = NULLP;
3516 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3517 if(!controlRSetList->list.array[idx])
3519 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3525 controlRSet = controlRSetList->list.array[idx];
3526 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3528 /* Values harcoded according to our design:
3531 * Bit string stored ff0000000000
3535 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3536 controlRSet->frequencyDomainResources.buf = NULLP;
3537 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3538 controlRSet->frequencyDomainResources.size);
3539 if(!controlRSet->frequencyDomainResources.buf)
3541 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3545 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3546 coreset0EndPrb = CORESET0_END_PRB;
3547 coreset1StartPrb = coreset0EndPrb + 6;
3548 coreset1NumPrb = CORESET1_NUM_PRB;
3549 /* calculate the PRBs */
3550 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3551 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3552 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3554 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3555 controlRSet->cce_REG_MappingType.present = \
3556 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3558 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3559 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3560 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3561 controlRSet->tci_PresentInDCI = NULLP;
3563 uint8_t tciStateIdx;
3565 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3566 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3567 if(!controlRset->tci_StatesPDCCH_ToAddList)
3569 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3574 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3575 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3576 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3577 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3578 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3580 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3584 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3586 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3587 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3589 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3596 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3598 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3599 if(!controlRset->tci_PresentInDCI)
3601 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3605 *(controlRset->tci_PresentInDCI);
3608 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3609 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3610 if(!controlRSet->pdcch_DMRS_ScramblingID)
3612 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3615 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3618 } /* End BuildControlRSetToAddModList */
3620 /*******************************************************************
3622 * @brief Build search space to add/modify list
3626 * Function : BuildSearchSpcToAddModList
3628 * Functionality: Build search space to add/modify list
3631 * @return ROK - success
3634 * ****************************************************************/
3635 uint8_t BuildSearchSpcToAddModList
3637 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3645 struct SearchSpace *searchSpc;
3648 searchSpcList->list.count = elementCnt;
3649 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3651 searchSpcList->list.array = NULLP;
3652 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3653 if(!searchSpcList->list.array)
3655 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3659 for(idx = 0; idx < elementCnt; idx++)
3661 searchSpcList->list.array[idx] = NULLP;
3662 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3663 if(!searchSpcList->list.array[idx])
3665 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3671 searchSpc = searchSpcList->list.array[idx];
3673 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3675 searchSpc->controlResourceSetId = NULLP;
3676 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3677 if(!searchSpc->controlResourceSetId)
3679 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3682 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3684 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3685 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3686 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3687 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3689 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3692 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3693 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3695 searchSpc->duration = NULLP;
3696 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3697 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3698 if(!searchSpc->monitoringSymbolsWithinSlot)
3700 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3704 /* Values taken from reference logs :
3707 * Bit string stores 8000
3712 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3713 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3714 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3715 searchSpc->monitoringSymbolsWithinSlot->size);
3716 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3718 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3723 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3724 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3725 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3726 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3728 searchSpc->nrofCandidates = NULLP;
3729 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3730 if(!searchSpc->nrofCandidates)
3732 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3736 searchSpc->nrofCandidates->aggregationLevel1 = \
3737 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3738 searchSpc->nrofCandidates->aggregationLevel2 = \
3739 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3740 searchSpc->nrofCandidates->aggregationLevel4 = \
3741 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3742 searchSpc->nrofCandidates->aggregationLevel8 = \
3743 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3744 searchSpc->nrofCandidates->aggregationLevel16 = \
3745 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3747 searchSpc->searchSpaceType = NULLP;
3748 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3749 if(!searchSpc->searchSpaceType)
3751 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3755 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3757 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3758 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3759 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3760 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3762 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3765 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3766 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3769 }/* End BuildSearchSpcToAddModList */
3771 /*******************************************************************
3773 * @brief Builds BWP DL dedicated PDCCH config
3777 * Function : BuildBWPDlDedPdcchCfg
3779 * Functionality: Builds BWP DL dedicated PDCCH config
3781 * @params[in] struct PDCCH_Config *pdcchCfg
3783 * @return ROK - success
3786 * ****************************************************************/
3787 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3789 pdcchCfg->controlResourceSetToAddModList = NULLP;
3790 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3791 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3792 if(!pdcchCfg->controlResourceSetToAddModList)
3794 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3798 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3803 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3805 pdcchCfg->searchSpacesToAddModList = NULLP;
3806 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3807 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3808 if(!pdcchCfg->searchSpacesToAddModList)
3810 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3814 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3819 pdcchCfg->searchSpacesToReleaseList = NULLP;
3820 pdcchCfg->downlinkPreemption = NULLP;
3821 pdcchCfg->tpc_PUSCH = NULLP;
3822 pdcchCfg->tpc_PUCCH = NULLP;
3823 pdcchCfg->tpc_SRS = NULLP;
3828 /*******************************************************************
3830 * @brief Builds DMRS DL PDSCH Mapping type A
3834 * Function : BuildDMRSDLPdschMapTypeA
3836 * Functionality: Builds DMRS DL PDSCH Mapping type A
3839 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3840 * @return ROK - success
3843 * ****************************************************************/
3844 uint8_t BuildDMRSDLPdschMapTypeA
3846 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3849 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3850 dmrsDlCfg->choice.setup = NULLP;
3851 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3852 if(!dmrsDlCfg->choice.setup)
3854 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3858 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3859 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3860 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3861 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3863 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3866 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3868 dmrsDlCfg->choice.setup->maxLength = NULLP;
3869 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3870 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3871 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3876 /*******************************************************************
3878 * @brief Builds TCI states to add/modify list
3882 * Function : BuildTCIStatesToAddModList
3884 * Functionality:Builds TCI states to add/modify list
3887 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3889 * @return ROK - success
3892 * ****************************************************************/
3893 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3898 /*******************************************************************
3900 * @brief Builds PDSCH time domain allocation list
3904 * Function : BuildPdschTimeDomAllocList
3906 * Functionality: Builds PDSCH time domain allocation list
3909 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3911 * @return ROK - success
3914 * ****************************************************************/
3915 uint8_t BuildPdschTimeDomAllocList
3917 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3922 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3924 timeDomAllocList->present = \
3925 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3927 timeDomAllocList->choice.setup = NULLP;
3928 CU_ALLOC(timeDomAllocList->choice.setup, \
3929 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3930 if(!timeDomAllocList->choice.setup)
3932 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3937 timeDomAllocList->choice.setup->list.count = elementCnt;
3938 timeDomAllocList->choice.setup->list.size = \
3939 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3941 timeDomAllocList->choice.setup->list.array = NULLP;
3942 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3943 timeDomAllocList->choice.setup->list.size);
3944 if(!timeDomAllocList->choice.setup->list.array)
3946 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3950 for(idx = 0; idx < elementCnt; idx++)
3952 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3953 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3954 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3955 if(!timeDomAllocList->choice.setup->list.array[idx])
3957 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3963 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3964 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3965 if(!timeDomAlloc->k0)
3967 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3970 *(timeDomAlloc->k0) = 0;
3971 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3972 timeDomAlloc->startSymbolAndLength = 66;
3975 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3976 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3977 if(!timeDomAlloc->k0)
3979 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3982 *(timeDomAlloc->k0) = 1;
3983 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3984 timeDomAlloc->startSymbolAndLength = 66;
3989 /*******************************************************************
3991 * @brief Builds PDSCH PRB Bundling type
3995 * Function : BuildPdschPrbBundlingType
3997 * Functionality: Builds PDSCH PRB Bundling type
4000 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4002 * @return ROK - success
4005 * ****************************************************************/
4006 uint8_t BuildPdschPrbBundlingType
4008 struct PDSCH_Config__prb_BundlingType *prbBndlType
4011 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4013 prbBndlType->choice.staticBundling = NULLP;
4014 CU_ALLOC(prbBndlType->choice.staticBundling, \
4015 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4016 if(!prbBndlType->choice.staticBundling)
4018 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4021 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4026 /*******************************************************************
4028 * @brief Builds BWP DL dedicated PDSCH config
4032 * Function : BuildBWPDlDedPdschCfg
4034 * Functionality: Builds BWP DL dedicated PDSCH config
4036 * @params[in] struct PDSCH_Config *pdschCfg
4038 * @return ROK - success
4041 * ****************************************************************/
4042 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4044 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4046 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4047 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4048 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4049 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4051 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4055 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4060 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4061 pdschCfg->tci_StatesToAddModList = NULLP;
4062 pdschCfg->tci_StatesToReleaseList = NULLP;
4063 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4065 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4066 if(!pdschCfg->tci_StatesToAddModList)
4068 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4071 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4077 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4079 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4080 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4081 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4082 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4084 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4087 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4091 pdschCfg->pdsch_AggregationFactor = NULLP;
4092 pdschCfg->rateMatchPatternToAddModList = NULLP;
4093 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4094 pdschCfg->rateMatchPatternGroup1 = NULLP;
4095 pdschCfg->rateMatchPatternGroup2 = NULLP;
4096 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4097 pdschCfg->mcs_Table = NULLP;
4099 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4100 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4101 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4103 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4106 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4108 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4113 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4114 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4115 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4116 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4117 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4118 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4119 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4124 /*******************************************************************
4126 * @brief Builds intitial DL BWP
4129 * Function : BuildInitialDlBWP
4131 * Functionality: Builds intitial DL BWP in spCellCfgDed
4133 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4135 * @return ROK - success
4138 * ****************************************************************/
4139 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4141 dlBwp->pdcch_Config = NULLP;
4142 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4143 if(!dlBwp->pdcch_Config)
4145 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4148 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4150 dlBwp->pdcch_Config->choice.setup = NULLP;
4151 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4152 if(!dlBwp->pdcch_Config->choice.setup)
4154 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4157 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4162 dlBwp->pdsch_Config = NULLP;
4163 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4164 if(!dlBwp->pdsch_Config)
4166 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4169 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4171 dlBwp->pdsch_Config->choice.setup = NULLP;
4172 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4173 if(!dlBwp->pdsch_Config->choice.setup)
4175 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4179 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4184 dlBwp->sps_Config = NULLP;
4185 dlBwp->radioLinkMonitoringConfig = NULLP;
4189 /*******************************************************************
4191 * @brief Builds DMRS UL Pusch Mapping type A
4195 * Function : BuildDMRSULPuschMapTypeA
4197 * Functionality: Builds DMRS UL Pusch Mapping type A
4200 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4201 * @return ROK - success
4204 * ****************************************************************/
4205 uint8_t BuildDMRSULPuschMapTypeA
4207 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4210 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4211 dmrsUlCfg->choice.setup= NULLP;
4212 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4213 if(!dmrsUlCfg->choice.setup)
4215 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4219 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4220 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4221 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4222 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4224 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4227 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4229 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4230 dmrsUlCfg->choice.setup->maxLength = NULLP;
4231 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4232 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4233 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4234 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4236 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4240 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4241 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4243 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4245 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4248 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4250 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4251 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4255 /*******************************************************************
4257 * @brief Build PUSCH time domain allocation list
4261 * Function : BuildPuschTimeDomAllocList
4263 * Functionality: Build PUSCH time domain allocation list
4266 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4268 * @return ROK - success
4271 * ****************************************************************/
4272 uint8_t BuildPuschTimeDomAllocList
4274 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4279 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4281 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4282 timeDomAllocList->choice.setup = NULLP;
4283 CU_ALLOC(timeDomAllocList->choice.setup, \
4284 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4285 if(!timeDomAllocList->choice.setup)
4287 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4292 timeDomAllocList->choice.setup->list.count = elementCnt;
4293 timeDomAllocList->choice.setup->list.size = \
4294 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4295 timeDomAllocList->choice.setup->list.array = NULLP;
4296 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4297 timeDomAllocList->choice.setup->list.size);
4298 if(!timeDomAllocList->choice.setup->list.array)
4300 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4304 for(idx = 0; idx < elementCnt; idx++)
4306 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4307 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4308 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4309 if(!timeDomAllocList->choice.setup->list.array[idx])
4311 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4317 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4318 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4319 if(!timeDomAlloc->k2)
4321 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4324 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4325 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4326 timeDomAlloc->startSymbolAndLength = 66;
4329 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4330 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4331 if(!timeDomAlloc->k2)
4333 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4336 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4337 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4338 timeDomAlloc->startSymbolAndLength = 66;
4343 /*******************************************************************
4345 * @brief Builds BWP UL dedicated PUSCH Config
4349 * Function : BuildBWPUlDedPuschCfg
4352 * Builds BWP UL dedicated PUSCH Config
4354 * @params[in] : PUSCH_Config_t *puschCfg
4356 * @return ROK - success
4359 * ****************************************************************/
4360 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4362 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4363 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4364 if(!puschCfg->dataScramblingIdentityPUSCH)
4366 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4369 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4371 puschCfg->txConfig = NULLP;
4372 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4373 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4374 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4375 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4377 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4381 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4386 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4387 puschCfg->pusch_PowerControl = NULLP;
4388 puschCfg->frequencyHopping = NULLP;
4389 puschCfg->frequencyHoppingOffsetLists = NULLP;
4390 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4392 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4393 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4394 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4395 if(!puschCfg->pusch_TimeDomainAllocationList)
4397 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4401 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4406 puschCfg->pusch_AggregationFactor = NULLP;
4407 puschCfg->mcs_Table = NULLP;
4408 puschCfg->mcs_TableTransformPrecoder = NULLP;
4409 puschCfg->transformPrecoder = NULLP;
4410 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4411 if(!puschCfg->transformPrecoder)
4413 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4416 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4418 puschCfg->codebookSubset = NULLP;
4419 puschCfg->maxRank = NULLP;
4420 puschCfg->rbg_Size = NULLP;
4421 puschCfg->uci_OnPUSCH = NULLP;
4422 puschCfg->tp_pi2BPSK = NULLP;
4427 /*******************************************************************
4429 * @brief Builds BWP UL dedicated PUCCH Config
4433 * Function : BuildBWPUlDedPucchCfg
4436 * Builds BWP UL dedicated PUCCH Config
4438 * @params[in] : PUCCH_Config_t *pucchCfg
4440 * @return ROK - success
4443 * ****************************************************************/
4444 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4446 uint8_t arrIdx, elementCnt;
4447 uint8_t rsrcIdx, rsrcSetIdx;
4448 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4449 PUCCH_Resource_t *rsrc = NULLP;
4453 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4454 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4455 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4456 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4457 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4459 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4462 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4463 rsrcSet->pucch_ResourceSetId = 1;
4465 rsrcSet->resourceList.list.count = elementCnt;
4466 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4467 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4468 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4470 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4473 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4477 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4478 pucchCfg->resourceToAddModList->list.count = elementCnt;
4479 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4480 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4481 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4483 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4486 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4487 rsrc->pucch_ResourceId = 1;
4488 rsrc->startingPRB = 0;
4489 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4490 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4491 rsrc->format.choice.format1->initialCyclicShift = 0;
4492 rsrc->format.choice.format1->nrofSymbols = 4;
4493 rsrc->format.choice.format1->startingSymbolIndex = 0;
4494 rsrc->format.choice.format1->timeDomainOCC = 0;
4497 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4498 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4499 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4500 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4501 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4504 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4505 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4507 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4512 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4513 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4514 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4515 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4517 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4521 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4523 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4524 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4526 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4532 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4533 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4538 /*******************************************************************
4540 * @brief Fills SRS resource to add/modify list
4544 * Function : BuildSrsRsrcAddModList
4546 * Functionality: Fills SRS resource to add/modify list
4549 * @return ROK - success
4552 * ****************************************************************/
4553 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4559 resourceList->list.count = elementCnt;
4560 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4561 resourceList->list.array = NULLP;
4562 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4563 if(!resourceList->list.array)
4565 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4569 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4571 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4572 if(!resourceList->list.array[rsrcIdx])
4574 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4580 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4581 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4582 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4584 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4585 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4586 sizeof(struct SRS_Resource__transmissionComb__n2));
4587 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4589 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4592 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4593 = SRS_COMB_OFFSET_N2;
4594 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4595 = SRS_CYCLIC_SHIFT_N2;
4597 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4598 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4599 SRS_Resource__resourceMapping__nrofSymbols_n1;
4600 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4601 SRS_Resource__resourceMapping__repetitionFactor_n1;
4603 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4604 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4605 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4606 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4607 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4608 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4609 SRS_Resource__groupOrSequenceHopping_neither;
4611 /* Setting resource type to aperiodic for intergration purposes */
4612 resourceList->list.array[rsrcIdx]->resourceType.present = \
4613 SRS_Resource__resourceType_PR_aperiodic;
4614 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4615 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4616 sizeof(struct SRS_Resource__resourceType__aperiodic));
4617 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4619 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4622 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4627 /*******************************************************************
4629 * @brief Build SRS resource set Add/mod list
4633 * Function : BuildSrsRsrcSetAddModList
4635 * Functionality: Build SRS resource set Add/mod list
4638 * @return ROK - success
4641 * ****************************************************************/
4642 uint8_t BuildSrsRsrcSetAddModList
4644 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4650 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4653 rsrcSetList->list.count = elementCnt;
4654 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4655 rsrcSetList->list.array = NULLP;
4656 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4657 if(!rsrcSetList->list.array)
4659 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4663 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4665 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4666 if(!rsrcSetList->list.array[rSetIdx])
4668 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4674 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4676 /* Fill Resource Id list in resource set */
4677 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4678 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4679 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4680 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4682 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4687 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4688 rsrcIdList->list.count = elementCnt;
4689 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4690 rsrcIdList->list.array = NULLP;
4691 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4692 if(!rsrcIdList->list.array)
4694 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4698 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4700 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4701 if(!rsrcIdList->list.array[rsrcIdx])
4703 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4709 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4711 /* Fill resource type */
4712 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4713 SRS_ResourceSet__resourceType_PR_aperiodic;
4715 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4716 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4717 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4718 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4720 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4723 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4724 = APERIODIC_SRS_RESRC_TRIGGER;
4726 /* TODO : Fill values for below IEs as expected by Viavi */
4727 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4728 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4731 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4732 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4733 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4734 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4735 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4740 /*******************************************************************
4742 * @brief Builds BWP UL dedicated SRS Config
4746 * Function : BuildBWPUlDedSrsCfg
4748 * Functionality: Builds BWP UL dedicated SRS Config
4750 * @params[in] SRS Config
4751 * @return ROK - success
4754 * ****************************************************************/
4755 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4757 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4758 srsCfg->srs_ResourceSetToAddModList = NULLP;
4759 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4760 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4761 if(!srsCfg->srs_ResourceSetToAddModList)
4763 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4766 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4771 srsCfg->srs_ResourceToReleaseList = NULLP;
4773 /* Resource to Add/Modify list */
4774 srsCfg->srs_ResourceToAddModList = NULLP;
4775 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4776 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4777 if(!srsCfg->srs_ResourceToAddModList)
4779 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4783 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4788 srsCfg->tpc_Accumulation = NULLP;
4793 /*******************************************************************
4795 * @brief Builds inital UL BWP
4799 * Function : BuildInitialUlBWP
4801 * Functionality: Builds initial UL BWP
4803 * @params[in] BWP_UplinkDedicated_t *ulBwp
4804 * @return ROK - success
4807 * ****************************************************************/
4808 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4810 ulBwp->pucch_Config = NULLP;
4811 ulBwp->pucch_Config = NULLP;
4812 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4813 if(!ulBwp->pucch_Config)
4815 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4819 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4820 ulBwp->pucch_Config->choice.setup = NULLP;
4821 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4822 if(!ulBwp->pucch_Config->choice.setup)
4824 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4828 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4833 /* Fill BWP UL dedicated PUSCH config */
4834 ulBwp->pusch_Config = NULLP;
4835 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4836 if(!ulBwp->pusch_Config)
4838 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4842 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4843 ulBwp->pusch_Config->choice.setup = NULLP;
4844 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4845 if(!ulBwp->pusch_Config->choice.setup)
4847 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4851 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4856 ulBwp->configuredGrantConfig = NULLP;
4858 /* Fill BPW UL dedicated SRS config */
4859 ulBwp->srs_Config = NULLP;
4860 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4861 if(!ulBwp->srs_Config)
4863 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4867 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4868 ulBwp->srs_Config->choice.setup = NULLP;
4869 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4870 if(!ulBwp->srs_Config->choice.setup)
4872 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4876 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4881 ulBwp->beamFailureRecoveryConfig = NULLP;
4886 /*******************************************************************
4888 * @brief Builds Pusch Serving cell Config
4892 * Function : BuildPuschSrvCellCfg
4894 * Functionality: Builds Pusch Serving cell Config
4896 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4898 * @return ROK - success
4901 * ****************************************************************/
4902 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4904 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4905 puschCfg->choice.setup = NULLP;
4906 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4907 if(!puschCfg->choice.setup)
4909 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4913 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4914 puschCfg->choice.setup->rateMatching = NULLP;
4915 puschCfg->choice.setup->xOverhead = NULLP;
4916 puschCfg->choice.setup->ext1 = NULLP;
4917 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4918 if(!puschCfg->choice.setup->ext1)
4920 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4924 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4925 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4926 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4928 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4931 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4933 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4934 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4935 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4937 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4940 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4944 /*******************************************************************
4946 * @brief Builds UL config
4949 * Function : BuildUlCfg
4951 * Functionality: Builds UL config in spCellCfgDed
4953 * @params[in] UplinkConfig_t *ulCfg
4955 * @return ROK - success
4958 * ****************************************************************/
4959 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4961 ulCfg->initialUplinkBWP = NULLP;
4962 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4963 if(!ulCfg->initialUplinkBWP)
4965 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4969 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4974 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4975 ulCfg->uplinkBWP_ToAddModList = NULLP;
4976 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4977 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4978 if(!ulCfg->firstActiveUplinkBWP_Id)
4980 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4983 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4985 ulCfg->pusch_ServingCellConfig = NULLP;
4986 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4987 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4988 if(!ulCfg->pusch_ServingCellConfig)
4990 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4994 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4999 ulCfg->carrierSwitching = NULLP;
5000 ulCfg->ext1 = NULLP;
5004 /*******************************************************************
5006 * @brief Builds PDSCH serving cell config
5009 * Function : BuildPdschSrvCellCfg
5011 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5013 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5015 * @return ROK - success
5018 * ****************************************************************/
5019 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5021 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5022 pdschCfg->choice.setup = NULLP;
5023 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5024 if(!pdschCfg->choice.setup)
5026 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5030 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5031 pdschCfg->choice.setup->xOverhead = NULLP;
5032 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5033 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5034 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5036 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5039 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5040 pdschCfg->choice.setup->pucch_Cell = NULLP;
5041 pdschCfg->choice.setup->ext1 = NULLP;
5046 /*******************************************************************
5048 * @brief Builds CSI Meas config
5051 * Function : BuildCsiMeasCfg
5053 * Functionality: Builds CSI Meas config in spCellCfgDed
5055 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5057 * @return ROK - success
5060 * ****************************************************************/
5061 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5067 /*******************************************************************
5069 * @brief Builds Spcell config dedicated
5072 * Function : BuildSpCellCfgDed
5074 * Functionality: Builds sp cell config dedicated in spCellCfg
5076 * @params[in] ServingCellConfig_t srvCellCfg
5078 * @return ROK - success
5081 * ****************************************************************/
5082 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5084 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5086 srvCellCfg->initialDownlinkBWP = NULLP;
5087 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5088 if(!srvCellCfg->initialDownlinkBWP)
5090 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5094 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5096 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5099 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5100 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5102 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5103 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5104 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5106 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5109 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5111 srvCellCfg->bwp_InactivityTimer = NULLP;
5113 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5114 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5115 if(!srvCellCfg->defaultDownlinkBWP_Id)
5117 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5120 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5122 srvCellCfg->uplinkConfig = NULLP;
5123 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5124 if(!srvCellCfg->uplinkConfig)
5126 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5130 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5132 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5135 srvCellCfg->supplementaryUplink = NULLP;
5136 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5138 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5139 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5140 if(!srvCellCfg->pdsch_ServingCellConfig)
5142 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5146 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5148 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5152 srvCellCfg->csi_MeasConfig = NULLP;
5154 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5155 if(!srvCellCfg->csi_MeasConfig)
5157 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5161 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5163 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5167 srvCellCfg->sCellDeactivationTimer = NULLP;
5168 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5169 srvCellCfg->tag_Id = TAG_ID;
5170 srvCellCfg->dummy = NULLP;
5171 srvCellCfg->pathlossReferenceLinking = NULLP;
5172 srvCellCfg->servingCellMO = NULLP;
5173 srvCellCfg->ext1 = NULLP;
5177 /*******************************************************************
5179 * @brief Builds Spcell config
5183 * Function : BuildSpCellCfg
5185 * Functionality: Builds sp cell config in DuToCuRrcContainer
5187 * @params[in] SpCellConfig_t spCellCfg
5189 * @return ROK - success
5192 * ****************************************************************/
5193 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5196 spCellCfg->servCellIndex = NULLP;
5197 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5198 if(!spCellCfg->servCellIndex)
5200 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5203 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5205 spCellCfg->reconfigurationWithSync = NULLP;
5206 spCellCfg->rlf_TimersAndConstants = NULLP;
5207 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5208 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5209 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5211 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5214 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5216 spCellCfg->spCellConfigDedicated = NULLP;
5217 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5218 if(!spCellCfg->spCellConfigDedicated)
5220 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5223 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5225 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5230 /*******************************************************************
5232 * @brief Builds Phy cell group config
5236 * Function : BuildPhyCellGrpCfg
5238 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5240 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5242 * @return ROK - success
5245 * ****************************************************************/
5246 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5248 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5249 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5251 phyCellGrpCfg->p_NR_FR1 = NULLP;
5252 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5253 if(!phyCellGrpCfg->p_NR_FR1)
5255 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5258 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5259 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5260 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5261 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5262 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5263 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5264 phyCellGrpCfg->cs_RNTI = NULLP;
5265 phyCellGrpCfg->ext1 = NULLP;
5266 phyCellGrpCfg->ext2 = NULLP;
5271 /*******************************************************************
5273 * @brief Builds tag config
5277 * Function : BuildTagConfig
5279 * Functionality: Builds tag config in MacCellGroupConfig
5281 * @params[in] TAG_Config *tag_Config
5283 * @return ROK - success
5286 * ****************************************************************/
5287 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5289 struct TAG_Config__tag_ToAddModList *tagList;
5290 uint8_t idx, elementCnt;
5292 tagConfig->tag_ToReleaseList = NULLP;
5293 tagConfig->tag_ToAddModList = NULLP;
5294 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5295 if(!tagConfig->tag_ToAddModList)
5297 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5301 elementCnt = 1; //ODU_VALUE_ONE;
5302 tagList = tagConfig->tag_ToAddModList;
5303 tagList->list.count = elementCnt;
5304 tagList->list.size = elementCnt * sizeof(struct TAG *);
5306 tagList->list.array = NULLP;
5307 CU_ALLOC(tagList->list.array, tagList->list.size);
5308 if(!tagList->list.array)
5310 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5314 for(idx=0; idx<tagList->list.count; idx++)
5316 tagList->list.array[idx] = NULLP;
5317 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5318 if(!tagList->list.array[idx])
5320 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5326 tagList->list.array[idx]->tag_Id = TAG_ID;
5327 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5332 /*******************************************************************
5334 * @brief Builds PHR Config
5338 * Function : BuildPhrConfig
5340 * Functionality: Builds phrConfig in MacCellGroupConfig
5342 * @params[in] PHR Config *
5344 * @return ROK - success
5347 * ****************************************************************/
5348 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5351 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5352 phrConfig->choice.setup = NULLP;
5353 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5354 if(!phrConfig->choice.setup)
5356 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5360 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5361 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5362 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5363 phrConfig->choice.setup->multiplePHR = false;
5364 phrConfig->choice.setup->dummy = false;
5365 phrConfig->choice.setup->phr_Type2OtherCell = false;
5366 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5371 /*******************************************************************
5373 * @brief Builds BSR Config
5377 * Function : BuildBsrConfig
5379 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5381 * @params[in] BSR_Config *bsrConfig
5383 * @return ROK - success
5386 * ****************************************************************/
5387 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5389 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5390 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5391 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5396 /*******************************************************************
5398 * @brief Builds scheduling request config
5402 * Function : BuildSchedulingReqConfig
5404 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5406 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5408 * @return ROK - success
5411 * ****************************************************************/
5412 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5414 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5415 uint8_t idx, elementCnt;
5417 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5418 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5419 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5420 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5422 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5426 elementCnt = 1; //ODU_VALUE_ONE;
5427 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5428 schReqList->list.count = elementCnt;
5429 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5431 schReqList->list.array = NULLP;
5432 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5433 if(!schReqList->list.array)
5435 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5439 for(idx=0;idx<schReqList->list.count; idx++)
5441 schReqList->list.array[idx] = NULLP;
5442 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5443 if(!schReqList->list.array[idx])
5445 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5451 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5453 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5454 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5455 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5457 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5460 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5461 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5462 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5466 /*******************************************************************
5468 * @brief Builds Mac cell group config
5472 * Function : BuildMacCellGrpCfg
5474 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5476 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5478 * @return ROK - success
5481 * ****************************************************************/
5482 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5484 macCellGrpCfg->drx_ConfigRrc = NULLP;
5485 macCellGrpCfg->schedulingRequestConfig = NULLP;
5486 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5487 if(!macCellGrpCfg->schedulingRequestConfig)
5489 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5493 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5495 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5499 macCellGrpCfg->bsr_Config = NULLP;
5500 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5501 if(!macCellGrpCfg->bsr_Config)
5503 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5507 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5509 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5513 macCellGrpCfg->tag_Config = NULLP;
5514 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5515 if(!macCellGrpCfg->tag_Config)
5517 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5521 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5523 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5527 macCellGrpCfg->phr_Config = NULLP;
5528 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5529 if(!macCellGrpCfg->phr_Config)
5531 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5535 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5537 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5541 macCellGrpCfg->skipUplinkTxDynamic = false;
5542 macCellGrpCfg->ext1 = NULLP;
5546 /*******************************************************************
5548 * @brief Frees memeory allocated for SearchSpcToAddModList
5552 * Function : FreeSearchSpcToAddModList
5554 * Functionality: Deallocating memory of SearchSpcToAddModList
5556 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5560 4221 * ****************************************************************/
5561 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5565 struct SearchSpace *searchSpc=NULLP;
5567 if(searchSpcList->list.array)
5569 if(searchSpcList->list.array[idx2])
5571 searchSpc = searchSpcList->list.array[idx2];
5572 if(searchSpc->controlResourceSetId)
5574 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5576 if(searchSpc->monitoringSymbolsWithinSlot)
5578 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5580 if(searchSpc->nrofCandidates)
5582 if(searchSpc->searchSpaceType)
5584 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5585 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5586 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5587 SearchSpace__searchSpaceType));
5589 CU_FREE(searchSpc->nrofCandidates,
5590 sizeof(struct SearchSpace__nrofCandidates));
5592 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5593 searchSpc->monitoringSymbolsWithinSlot->size);
5595 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5596 sizeof(BIT_STRING_t));
5598 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5599 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5601 CU_FREE(searchSpc->controlResourceSetId,
5602 sizeof(ControlResourceSetId_t));
5605 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5607 CU_FREE(searchSpcList->list.array[idx1],
5608 sizeof(struct SearchSpace));
5610 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5613 /*******************************************************************
5615 * @brief Frees memory allocated for PdschTimeDomAllocList
5619 * Function : FreePdschTimeDomAllocList
5621 * Functionality: Deallocating memory of PdschTimeDomAllocList
5623 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5627 4221 * ****************************************************************/
5628 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5632 if(timeDomAllocList->choice.setup)
5634 if(timeDomAllocList->choice.setup->list.array)
5636 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5638 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5639 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5641 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5642 timeDomAllocList->choice.setup->list.size);
5644 CU_FREE(timeDomAllocList->choice.setup,\
5645 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5648 /*******************************************************************
5650 * @brief Frees memory allocated for PuschTimeDomAllocList
5654 * Function : FreePuschTimeDomAllocList
5656 * Functionality: Deallocating memory of PuschTimeDomAllocList
5658 * @params[in] PUSCH_Config_t *puschCfg
5662 ***********************************************************************/
5663 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5667 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5669 if(puschCfg->pusch_TimeDomainAllocationList)
5671 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5672 if(timeDomAllocList_t->choice.setup)
5674 if(timeDomAllocList_t->choice.setup->list.array)
5676 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5677 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5679 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5680 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5682 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5683 timeDomAllocList_t->choice.setup->list.size);
5685 CU_FREE(timeDomAllocList_t->choice.setup, \
5686 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5688 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5689 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5690 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5695 /*******************************************************************
5697 * @brief Frees memory allocated for Dedicated PUCCH config
5701 * Function : FreeBWPUlDedPucchCfg
5703 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5705 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5709 * ****************************************************************/
5710 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5712 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5713 PUCCH_Config_t *pucchCfg = NULLP;
5714 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5715 PUCCH_Resource_t *rsrc = NULLP;
5719 if(ulBwpPucchCfg->choice.setup)
5721 pucchCfg = ulBwpPucchCfg->choice.setup;
5723 //Free resource set list
5724 if(pucchCfg->resourceSetToAddModList)
5726 if(pucchCfg->resourceSetToAddModList->list.array)
5728 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5730 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5731 if(rsrcSet->resourceList.list.array)
5733 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5735 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5737 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5739 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5741 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5743 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5746 //Free resource list
5747 if(pucchCfg->resourceToAddModList)
5749 if(pucchCfg->resourceToAddModList->list.array)
5751 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5753 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5754 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5755 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5757 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5759 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5763 if(pucchCfg->format1)
5765 if(pucchCfg->format1->choice.setup)
5767 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5768 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5770 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5774 if(pucchCfg->dl_DataToUL_ACK)
5776 if(pucchCfg->dl_DataToUL_ACK->list.array)
5778 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5780 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5782 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5784 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5787 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5789 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5793 /*******************************************************************
5795 * @brief Frees memory allocated for InitialUlBWP
5799 * Function : FreeInitialUlBWP
5801 * Functionality: Deallocating memory of InitialUlBWP
5803 * @params[in] BWP_UplinkDedicated_t *ulBwp
5807 * ****************************************************************/
5808 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5810 uint8_t rSetIdx, rsrcIdx;
5811 SRS_Config_t *srsCfg = NULLP;
5812 PUSCH_Config_t *puschCfg = NULLP;
5813 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5814 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5815 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5816 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5818 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5820 if(ulBwp->pusch_Config)
5822 if(ulBwp->pusch_Config->choice.setup)
5824 puschCfg=ulBwp->pusch_Config->choice.setup;
5825 if(puschCfg->dataScramblingIdentityPUSCH)
5827 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5829 FreePuschTimeDomAllocList(puschCfg);
5830 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5831 if(dmrsUlCfg->choice.setup)
5833 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5835 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5837 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5839 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5840 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5842 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5845 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5847 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5848 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5850 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5852 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5854 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5856 /* Free SRS-Config */
5857 if(ulBwp->srs_Config)
5859 if(ulBwp->srs_Config->choice.setup)
5861 srsCfg = ulBwp->srs_Config->choice.setup;
5863 /* Free Resource Set to add/mod list */
5864 if(srsCfg->srs_ResourceSetToAddModList)
5866 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5867 if(rsrcSetList->list.array)
5871 /* Free SRS resource Id list in this SRS resource set */
5872 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5874 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5876 if(rsrcIdList->list.array)
5878 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5880 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5882 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5884 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5885 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5888 /* Free resource type info for this SRS resource set */
5889 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5890 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5892 /* Free memory for each resource set */
5893 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5895 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5897 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5899 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5900 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5903 /* Free resource to add/modd list */
5904 if(srsCfg->srs_ResourceToAddModList)
5906 resourceList = srsCfg->srs_ResourceToAddModList;
5907 if(resourceList->list.array)
5910 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5911 sizeof(struct SRS_Resource__transmissionComb__n2));
5912 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5913 sizeof(struct SRS_Resource__resourceType__aperiodic));
5915 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5917 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5919 CU_FREE(resourceList->list.array, resourceList->list.size);
5921 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5922 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5925 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5927 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5931 /*******************************************************************
5933 * @brief Frees memory allocated for initialUplinkBWP
5937 * Function : FreeinitialUplinkBWP
5939 * Functionality: Deallocating memory of initialUplinkBWP
5941 * @params[in] UplinkConfig_t *ulCfg
5946 * ****************************************************************/
5947 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5949 BWP_UplinkDedicated_t *ulBwp=NULLP;
5950 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5952 if(ulCfg->initialUplinkBWP)
5954 ulBwp=ulCfg->initialUplinkBWP;
5955 if(ulCfg->firstActiveUplinkBWP_Id)
5957 if(ulCfg->pusch_ServingCellConfig)
5959 puschCfg=ulCfg->pusch_ServingCellConfig;
5960 if(puschCfg->choice.setup)
5962 if(puschCfg->choice.setup->ext1)
5964 CU_FREE(puschCfg->choice.setup->ext1->\
5965 processingType2Enabled,sizeof(BOOLEAN_t));
5966 CU_FREE(puschCfg->choice.setup->ext1->\
5967 maxMIMO_Layers,sizeof(long));
5968 CU_FREE(puschCfg->choice.setup->ext1, \
5969 sizeof(struct PUSCH_ServingCellConfig__ext1));
5971 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5973 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5975 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5977 FreeInitialUlBWP(ulBwp);
5978 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5981 /*******************************************************************
5983 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5987 * Function : FreeBWPDlDedPdschCfg
5989 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5991 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5996 * ****************************************************************/
5997 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5999 struct PDSCH_Config *pdschCfg=NULLP;
6000 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6001 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6002 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6004 if(dlBwp->pdsch_Config->choice.setup)
6006 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6007 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6009 if(pdschCfg->pdsch_TimeDomainAllocationList)
6011 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6012 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6014 prbBndlType=&pdschCfg->prb_BundlingType;
6015 CU_FREE(prbBndlType->choice.staticBundling,\
6016 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6017 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6019 FreePdschTimeDomAllocList(timeDomAllocList);
6020 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6021 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6023 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6024 if(dmrsDlCfg->choice.setup)
6026 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6028 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6030 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6031 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6033 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6036 /*******************************************************************
6038 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6042 * Function : FreeBWPDlDedPdcchCfg
6044 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6046 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6051 * ****************************************************************/
6052 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6056 struct PDCCH_Config *pdcchCfg=NULLP;
6057 struct ControlResourceSet *controlRSet=NULLP;
6058 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6060 if(dlBwp->pdcch_Config->choice.setup)
6062 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6063 if(pdcchCfg->controlResourceSetToAddModList)
6065 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6066 if(controlRSetList->list.array)
6068 controlRSet = controlRSetList->list.array[idx2];
6071 if(controlRSet->frequencyDomainResources.buf)
6073 if(controlRSet->pdcch_DMRS_ScramblingID)
6075 if(pdcchCfg->searchSpacesToAddModList)
6077 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6078 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6079 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6081 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6083 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6084 controlRSet->frequencyDomainResources.size);
6087 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6089 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6091 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6093 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6094 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6096 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6099 /*******************************************************************
6101 * @brief Builds RLC Config
6105 * Function : BuildRlcConfig
6107 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6109 * @params[in] RLC_Config *rlcConfig
6111 * @return ROK - success
6114 * ****************************************************************/
6115 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6117 rlcConfig->present = rlcLcCfgDb.rlcMode;
6119 switch(rlcConfig->present)
6121 case RLC_Config_PR_am:
6123 rlcConfig->choice.am = NULLP;
6124 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6125 if(!rlcConfig->choice.am)
6127 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6132 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6133 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6134 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6136 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6139 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6140 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6141 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6142 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6143 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6146 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6147 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6148 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6150 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6153 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6154 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6155 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6160 case RLC_Config_PR_um_Bi_Directional:
6162 rlcConfig->choice.um_Bi_Directional = NULLP;
6163 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6164 if(!rlcConfig->choice.um_Bi_Directional)
6166 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6171 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6172 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6173 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6175 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6178 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6181 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6182 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6183 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6185 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6188 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6189 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6196 /*******************************************************************
6198 * @brief Builds MAC LC Config
6202 * Function : BuildMacLCConfig
6204 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6206 * @params[in] struct LogicalChannelConfig macLcConfig
6208 * @return ROK - success
6211 * ****************************************************************/
6212 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6215 macLcConfig->ul_SpecificParameters = NULLP;
6216 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6217 if(!macLcConfig->ul_SpecificParameters)
6219 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6223 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6224 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6225 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6226 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6227 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6228 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6229 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6231 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6232 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6233 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6235 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6238 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6240 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6241 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6242 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6244 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6247 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6249 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6250 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6251 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6255 /*******************************************************************
6257 * @brief Builds RLC Bearer to Add/Mod list
6261 * Function :BuildRlcBearerToAddModList
6263 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6265 * @params[in] rlc_BearerToAddModList
6267 * @return ROK - success
6270 * ****************************************************************/
6271 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6273 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6276 elementCnt = ueCb->numSrb + ueCb->numDrb;
6279 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6281 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6285 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6287 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6294 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6297 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6300 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6303 rlcBearerList->list.count = elementCnt;
6304 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6306 rlcBearerList->list.array = NULLP;
6307 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6308 if(!rlcBearerList->list.array)
6310 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6314 for(idx=0; idx<rlcBearerList->list.count; idx++)
6316 rlcBearerList->list.array[idx] = NULLP;
6317 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6318 if(!rlcBearerList->list.array[idx])
6320 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6327 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6329 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6332 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6334 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6335 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6337 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6341 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6342 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6344 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6345 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6346 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6347 if(!rlcBearerList->list.array[idx]->rlc_Config)
6349 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6353 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6355 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6359 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6360 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6361 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6363 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6367 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6369 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6375 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6377 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6380 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6382 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6383 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6385 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6389 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6390 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6392 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6393 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6394 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6395 if(!rlcBearerList->list.array[idx]->rlc_Config)
6397 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6401 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6403 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6407 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6408 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6409 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6411 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6415 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6417 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6425 /*******************************************************************
6427 * @brief Free memory allocated for CellGroupConfig
6431 * Function : FreeMemCellGrpCfg
6433 * Functionality: Deallocating memory of CellGroupConfig
6435 * @params[in] pointer to CellGroupConfigRrc_t
6437 * @return ROK - success
6440 ******************************************************************/
6441 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6444 SpCellConfig_t *spCellCfg=NULLP;
6445 ServingCellConfig_t *srvCellCfg=NULLP;
6446 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6447 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6448 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6449 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6450 struct RLC_Config *rlcConfig=NULLP;
6451 struct LogicalChannelConfig *macLcConfig=NULLP;
6452 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6453 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6454 struct TAG_Config *tagConfig=NULLP;
6455 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6456 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6457 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6459 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6462 if(rlcBearerList->list.array)
6464 for(idx=0; idx<rlcBearerList->list.count; idx++)
6466 if(rlcBearerList->list.array[idx])
6468 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6469 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6472 if(rlcConfig->choice.am)
6474 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6475 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6476 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6478 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6480 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6483 if(macLcConfig->ul_SpecificParameters)
6485 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6486 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6487 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6489 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6491 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6494 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6496 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6499 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6502 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6503 if(schedulingRequestConfig)
6505 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6508 if(schReqList->list.array)
6510 for(idx=0;idx<schReqList->list.count; idx++)
6512 if(schReqList->list.array[idx])
6514 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6515 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6518 CU_FREE(schReqList->list.array, schReqList->list.size);
6520 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6521 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6522 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6524 if(macCellGrpCfg->bsr_Config)
6526 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6528 tagConfig = macCellGrpCfg->tag_Config;
6531 tagList = tagConfig->tag_ToAddModList;
6534 if(tagList->list.array)
6536 for(idx=0; idx<tagList->list.count; idx++)
6538 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6540 CU_FREE(tagList->list.array, tagList->list.size);
6542 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6544 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6547 phrConfig = macCellGrpCfg->phr_Config;
6550 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6551 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6554 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6557 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6560 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6561 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6564 spCellCfg = cellGrpCfg->spCellConfig;
6567 if(spCellCfg->servCellIndex)
6569 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6571 if(spCellCfg->spCellConfigDedicated)
6573 srvCellCfg = spCellCfg->spCellConfigDedicated;
6574 if(srvCellCfg->initialDownlinkBWP)
6576 dlBwp = srvCellCfg->initialDownlinkBWP;
6577 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6579 if(srvCellCfg->defaultDownlinkBWP_Id)
6581 if(srvCellCfg->uplinkConfig)
6583 if(srvCellCfg->pdsch_ServingCellConfig)
6585 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6586 if(pdschCfg->choice.setup)
6588 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6589 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6591 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6592 ServingCellConfig__pdsch_ServingCellConfig));
6594 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6595 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6597 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6599 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6601 if(dlBwp->pdcch_Config)
6603 if(dlBwp->pdsch_Config)
6605 FreeBWPDlDedPdschCfg(dlBwp);
6606 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6608 FreeBWPDlDedPdcchCfg(dlBwp);
6609 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6611 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6613 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6615 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6617 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6619 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6624 /*******************************************************************
6626 * @brief Fills CellGroupConfig
6630 * Function : fillCellGrpCfg
6632 * Functionality: Fills CellGroupConfig
6634 * @params[in] pointer to CellGroupConfigRrc_t
6636 * @return ROK - success
6639 ******************************************************************/
6641 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6643 uint8_t ret = RFAILED;
6644 CellGroupConfigRrc_t cellGrpCfg;
6645 asn_enc_rval_t encRetVal;
6649 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6651 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6653 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6655 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6659 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6660 cellGrpCfg.mac_CellGroupConfig = NULLP;
6661 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6662 if(!cellGrpCfg.mac_CellGroupConfig)
6664 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6667 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6669 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6673 cellGrpCfg.physicalCellGroupConfig = NULLP;
6674 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6675 if(!cellGrpCfg.physicalCellGroupConfig)
6677 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6680 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6682 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6686 cellGrpCfg.spCellConfig = NULLP;
6687 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6688 if(!cellGrpCfg.spCellConfig)
6690 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6693 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6695 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6699 cellGrpCfg.sCellToAddModList = NULLP;
6700 cellGrpCfg.sCellToReleaseList = NULLP;
6701 cellGrpCfg.ext1 = NULLP;
6703 /* encode cellGrpCfg into duToCuRrcContainer */
6704 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6705 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6707 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6708 /* Encode results */
6709 if(encRetVal.encoded == ENCODE_FAIL)
6711 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6712 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6717 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6718 for(int i=0; i< encBufSize; i++)
6720 DU_LOG("%x",encBuf[i]);
6724 cellGrp->size = encBufSize;
6725 CU_ALLOC(cellGrp->buf, cellGrp->size);
6728 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6731 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6735 FreeMemCellGrpCfg(&cellGrpCfg);
6739 /*******************************************************************
6741 * @brief Free UE Capability RAT container
6745 * Function : freeUeCapRatCont
6748 * Free UE Capability RAT conatiner
6751 * @return ROK - success
6754 * ****************************************************************/
6755 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6758 FeatureSets_t *featureSets;
6760 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6762 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6764 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6765 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6767 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6770 if(ueNrCap->featureSets)
6772 featureSets = ueNrCap->featureSets;
6773 if(featureSets->featureSetsDownlinkPerCC)
6775 if(featureSets->featureSetsDownlinkPerCC->list.array)
6777 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6779 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6780 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6781 sizeof(ModulationOrder_t));
6782 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6784 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6786 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6789 if(featureSets->featureSetsUplinkPerCC)
6791 if(featureSets->featureSetsUplinkPerCC->list.array)
6793 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6795 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6797 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6798 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6799 sizeof(ModulationOrder_t));
6800 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6803 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6805 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6807 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6811 /*******************************************************************
6813 * @brief Free UE capability RAT container list
6817 * Function : freeUeCapRatContList
6819 * Functionality: Free UE capability RAT container list
6822 * @return ROK - success
6825 * ****************************************************************/
6826 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6829 if(ueCapablityList->list.array)
6831 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6833 if(ueCapablityList->list.array[idx])
6834 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6836 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6840 /*******************************************************************
6842 * @brief Free Handover preparation information
6846 * Function : freeHOPreparationInfo
6848 * Functionality: Free Handover preparation information
6851 * @return ROK - success
6854 * ****************************************************************/
6855 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6857 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6859 if(hoPrep->criticalExtensions.choice.c1)
6861 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6863 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6864 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6865 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6866 sizeof(HandoverPreparationInformationRrc_IEs_t));
6868 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6872 /*******************************************************************
6874 * @brief Fill feature sets
6878 * Function : fillFeatureSets
6880 * Functionality: Fill feature sets
6883 * @return ROK - success
6886 * ****************************************************************/
6887 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6889 uint8_t idx, elementCnt;
6891 featureSets->featureSetsDownlink = NULLP;
6892 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6893 if(!featureSets->featureSetsDownlinkPerCC)
6895 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6900 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6901 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6902 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6903 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6905 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6909 for(idx = 0; idx < elementCnt; idx++)
6911 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6912 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6914 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6920 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6921 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6922 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6923 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6924 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6926 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6927 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6929 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6932 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6934 featureSets->featureSetsUplink = NULLP;
6935 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6936 if(!featureSets->featureSetsUplinkPerCC)
6938 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6943 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6944 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6945 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6946 if(!featureSets->featureSetsUplinkPerCC->list.array)
6948 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6952 for(idx = 0; idx < elementCnt; idx++)
6954 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6955 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6957 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6963 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6964 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6965 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6966 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6967 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6968 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6970 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6971 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6973 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6976 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6981 /*******************************************************************
6983 * @brief Fill UE capability RAT container
6987 * Function : fillUeCapRatCont
6989 * Functionality: Fill UE capability RAT container
6991 * @params[in] UE Capability RAT container buffer
6992 * @return ROK - success
6995 * ****************************************************************/
6996 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6999 uint8_t idx, elementCnt;
7000 asn_enc_rval_t encRetVal;
7001 UE_NR_Capability_t ueNrCap;
7005 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7007 /* Filling PDCP parameters */
7008 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7009 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7010 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7011 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7012 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7013 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7014 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7015 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7016 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7017 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7018 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7019 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7020 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7021 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7022 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7023 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7024 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7026 ueNrCap.rlc_Parameters = NULLP;
7027 ueNrCap.mac_Parameters = NULLP;
7029 /* Filling PHY parameters */
7030 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7031 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7032 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7033 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7034 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7036 /* Filling RF parameters */
7038 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7039 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7040 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7041 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7043 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7048 for(idx = 0; idx < elementCnt; idx++)
7050 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7051 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7061 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7062 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7063 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7065 ueNrCap.measAndMobParameters = NULLP;
7066 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7067 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7068 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7069 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7070 ueNrCap.featureSets = NULLP;
7072 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7073 if(!ueNrCap.featureSets)
7075 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7080 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7082 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7087 ueNrCap.featureSetCombinations = NULLP;
7088 ueNrCap.lateNonCriticalExtension = NULLP;
7089 ueNrCap.nonCriticalExtension = NULLP;
7091 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7092 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7093 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7095 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7097 /* Encode results */
7098 if(encRetVal.encoded == ENCODE_FAIL)
7100 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7101 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7106 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7107 for(int i=0; i< encBufSize; i++)
7109 DU_LOG("%x",encBuf[i]);
7113 ueCapRatContBuf->size = encBufSize;
7114 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7115 if(!ueCapRatContBuf->buf)
7117 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7120 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7124 freeUeCapRatCont(&ueNrCap);
7128 /*******************************************************************
7130 * @brief Fill UE Capability RAT container list
7134 * Function : fillUeCapRatContList
7136 * Functionality: Fill UE Capability RAT container list
7139 * @params[in] UE capability RAT container list
7140 * @return ROK - success
7143 * ****************************************************************/
7144 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7146 uint8_t ret = RFAILED;
7147 uint8_t idx, elementCnt;
7152 ueCapablityList->list.count = elementCnt;
7153 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7155 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7156 if(!ueCapablityList->list.array)
7158 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7163 for(idx=0; idx<elementCnt; idx++)
7165 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7166 if(ueCapablityList->list.array[idx] == NULLP)
7168 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7174 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7175 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7177 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7188 /*******************************************************************
7190 * @brief Fill UE Capability RAT container list octet string
7194 * Function : fillUeCapRatContListBuf
7196 * Functionality: Fill UE Capability RAT container list octet string
7199 * @params[in] UE capability RAT container list buffer
7200 * @return ROK - success
7203 * ****************************************************************/
7204 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7206 uint8_t ret = RFAILED;
7207 asn_enc_rval_t encRetVal;
7208 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7212 ret = fillUeCapRatContList(&ueCapablityList);
7215 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7219 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7220 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7221 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7223 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7224 &ueCapablityList, PrepFinalEncBuf, encBuf);
7226 /* Encode results */
7227 if(encRetVal.encoded == ENCODE_FAIL)
7229 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7230 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7235 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7236 for(int i=0; i< encBufSize; i++)
7238 DU_LOG("%x",encBuf[i]);
7242 ueCapablityListBuf->size = encBufSize;
7243 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7244 if(!ueCapablityListBuf->buf)
7246 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7249 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7253 freeUeCapRatContList(&ueCapablityList);
7257 /*******************************************************************
7259 * @brief Free Measurement Timing Configuration
7263 * Function : freeMeasuementTimingConfig
7265 * Functionality: Free Measurement Timing Configuration
7267 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7270 * ****************************************************************/
7271 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7274 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7275 MeasTiming_t *measTiming = NULLP;
7277 if(measTimingConfig.criticalExtensions.choice.c1)
7279 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7281 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7282 if(measTimingCfg->measTiming)
7284 if(measTimingCfg->measTiming->list.array)
7286 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7288 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7289 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7290 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7292 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7294 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7296 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7298 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7302 /*******************************************************************
7304 * @brief Fill Measurement Timing Configuration
7308 * Function : fillMeasTimingCfg
7310 * Functionality: Fill Measurement Timing Configuration
7312 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7313 * @return ROK - success
7316 * ****************************************************************/
7317 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7319 uint8_t elementCnt = 0;
7320 uint8_t measCfgIdx = 0;
7321 MeasTiming_t *measTiming;
7324 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7325 if(!measTimingCfg->measTiming)
7327 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7332 measTimingCfg->measTiming->list.count = elementCnt;
7333 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7334 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7335 if(!measTimingCfg->measTiming->list.array)
7337 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7341 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7343 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7344 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7346 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7352 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7353 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7354 if(!measTiming->frequencyAndTiming)
7356 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7360 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7361 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7363 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7364 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7365 smtc->periodicityAndOffset.choice.sf20 = 0;
7366 smtc->duration = SSB_MTC__duration_sf1;
7370 /*******************************************************************
7372 * @brief Fill Measurement Timing Configuration Octet string
7376 * Function : fillMeasConfigBuf
7378 * Functionality: Fill Measurement Timing Configuration Octet string
7381 * @params[in] MeasConfig_t *measConfgBuf
7382 * @return ROK - success
7385 * ****************************************************************/
7386 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7388 uint8_t ret = RFAILED;
7389 asn_enc_rval_t encRetVal;
7390 MeasurementTimingConfigurationRrc_t measTimingConfig;
7394 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7395 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7396 if(!measTimingConfig.criticalExtensions.choice.c1)
7398 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7401 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7403 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7404 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7406 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7410 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7413 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7417 /* Encode measurement timing configuration into octet string */
7418 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7419 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7421 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7423 /* Encode results */
7424 if(encRetVal.encoded == ENCODE_FAIL)
7426 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7427 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7432 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7433 for(int i=0; i< encBufSize; i++)
7435 DU_LOG("%x",encBuf[i]);
7439 measTimingConfigBuf->size = encBufSize;
7440 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7441 if(!measTimingConfigBuf->buf)
7443 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7446 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7450 freeMeasuementTimingConfig(measTimingConfig);
7454 /******************************************************************
7456 * @brief Free RRC reconfiguration non-critical extension
7460 * Function : freeRrcReconfigNonCriticalExt
7462 * Functionality: Free RRC reconfiguration non-critical extension
7464 * @params[in] RRC reconfiguration IE
7467 * ****************************************************************/
7468 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7470 if(rrcRecfg->masterCellGroup)
7472 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7476 /******************************************************************
7478 * @brief Free measurement object addmod list
7482 * Function : freeMeasObjToAddModList
7484 * Functionality: Free measurement object add mod list
7486 * @params[in] Measurement object add/mod list
7489 * ****************************************************************/
7490 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7493 MeasObjectNR_t *measObject;
7495 if(measObjList->list.array)
7497 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7499 if(measObjList->list.array[objIdx])
7501 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7503 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7504 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7505 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7506 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7507 if(measObject->absThreshSS_BlocksConsolidation)
7509 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7510 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7511 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7512 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7514 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7515 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7516 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7517 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7518 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7520 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7523 CU_FREE(measObjList->list.array, measObjList->list.size);
7527 /******************************************************************
7529 * @brief Free report config add mod list
7533 * Function : freeReportCfgToAddModList
7535 * Functionality: Free report config add mod list
7537 * @params[in] Report config list
7540 * ****************************************************************/
7541 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7543 uint8_t reportCfgIdx;
7544 ReportConfigToAddMod_t *reportCfg;
7545 ReportConfigNR_t *reportCfgNr;
7546 EventTriggerConfig_t *eventTriggCfg;
7548 if(reportCfgList->list.array)
7550 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7552 if(reportCfgList->list.array[reportCfgIdx])
7554 reportCfg = reportCfgList->list.array[reportCfgIdx];
7555 if(reportCfg->reportConfig.choice.reportConfigNR)
7557 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7558 if(reportCfgNr->reportType.choice.eventTriggered)
7560 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7561 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7562 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7563 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7564 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7568 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7570 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7574 /******************************************************************
7576 * @brief Free measurement id to add mod list
7580 * Function : freeMeasIdToAddModList
7582 * Functionality: Free measurement id to add mod list
7584 * @params[in] Measurement id to add mod list
7587 * ****************************************************************/
7588 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7591 if(measIdList->list.array)
7593 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7595 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7597 CU_FREE(measIdList->list.array, measIdList->list.size);
7601 /*******************************************************************
7603 * @brief Free quantity config
7607 * Function : freeQunatityConfig
7609 * Functionality: Free quantity config
7611 * @params[in] Quantity Config
7614 * ****************************************************************/
7615 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7618 QuantityConfigNR_t *quantityCfgNr;
7620 if(quantityCfg->quantityConfigNR_List)
7622 if(quantityCfg->quantityConfigNR_List->list.array)
7624 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7626 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7628 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7629 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7630 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7631 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7632 if(quantityCfgNr->quantityConfigRS_Index)
7634 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7635 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7636 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7637 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7639 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7642 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7644 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7648 /******************************************************************
7650 * @brief Free measurement Config
7654 * Function : freeMeasConfig
7656 * Functionality: Free measurement config
7658 * @params[in] Measurement config
7661 * ****************************************************************/
7662 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7664 if(measConfig->measObjectToAddModList)
7666 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7667 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7669 if(measConfig->reportConfigToAddModList)
7671 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7672 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7674 if(measConfig->measIdToAddModList)
7676 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7677 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7679 if(measConfig->s_MeasureConfig)
7681 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7683 if(measConfig->quantityConfig)
7685 freeQuantityConfig(measConfig->quantityConfig);
7686 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7689 /******************************************************************
7691 * @brief Free DRB to AddMod List
7695 * Function : freeDrbToAddModList
7697 * Functionality: Free SRB to AddMod List
7699 * @params[in] SBR to add/mod list
7702 * ****************************************************************/
7703 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7706 if(drbToAddList->list.array)
7708 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7710 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7712 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7714 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7715 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7716 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7717 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7719 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7720 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7722 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7724 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7728 /******************************************************************
7730 * @brief Free SRB to AddMod List
7734 * Function : freeSrbToAddModList
7736 * Functionality: Free SRB to AddMod List
7738 * @params[in] SBR to add/mod list
7741 * ****************************************************************/
7742 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7745 if(srbToAddList->list.array)
7747 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7749 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7750 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7752 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7753 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7756 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7758 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7762 /******************************************************************
7764 * @brief Free Radio Bearer Config
7768 * Function : freeRadioBearerConfig
7770 * Functionality: Free Radio Bearer config
7772 * @params[in] Radio bearer config
7775 * ****************************************************************/
7776 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7778 if(radioBearerConfig->srb_ToAddModList)
7780 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7781 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7783 if(radioBearerConfig->drb_ToAddModList)
7785 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7786 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7790 /******************************************************************
7792 * @brief Free reconfiguration message
7796 * Function : freeRrcReconfig
7798 * Functionality: Free reconfiguration message
7800 * @params[in] RRC Reconfiguration message
7803 * ****************************************************************/
7804 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7806 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7808 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7810 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7811 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7813 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7815 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7816 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7818 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7820 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7821 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7823 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7827 /******************************************************************
7829 * @brief Fill SRB To Add Mod list
7833 * Function : fillSrbToAddModList
7835 * Functionality: fill SRB to Add Mod list
7837 * @params[in] UE control block
7838 * SRB to Add/Mod list
7839 * @return ROK - success
7842 * ****************************************************************/
7843 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7845 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7848 elementCnt = ueCb->numSrb;
7851 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7853 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7860 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7864 srbToAddList->list.count = elementCnt;
7865 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7867 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7868 if(!srbToAddList->list.array)
7870 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7875 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7877 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7880 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7881 if(!srbToAddList->list.array[srbIdx])
7883 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7887 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7889 /* Reestablish PDCP */
7890 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7891 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7893 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7896 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7898 /* PDCP configuration */
7899 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7900 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7902 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7906 /* Reordering timer */
7907 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7908 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7910 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7913 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7920 /******************************************************************
7922 * @biief Fill DRBeTo Add Mod list
7926 * Function : fillDrbToAddModList
7928 * Functionality: fill DRB to Add Mod list
7930 * @params[in] UE control block
7931 * DRB to Add/Mod list
7932 * @return ROK - success
7935 * ****************************************************************/
7936 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7938 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7941 elementCnt = ueCb->numDrb;
7944 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7946 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7953 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7958 drbToAddList->list.count = elementCnt;
7959 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7961 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7962 if(!drbToAddList->list.array)
7964 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7969 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7971 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7974 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7975 if(!drbToAddList->list.array[drbIdx])
7977 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
7982 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
7985 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7986 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
7988 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
7992 /* PDCP Config -> DRB */
7993 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7994 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7996 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8000 /* DRB -> Discard Timer */
8001 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8002 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8004 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8007 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8009 /* UL PDCP SN length */
8010 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8011 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8013 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8016 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8018 /* DL PDCP SN length */
8019 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8020 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8022 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8025 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8027 /* Header Compression */
8028 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8029 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8031 /* Reordering timer */
8032 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8033 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8035 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8038 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8046 /******************************************************************
8048 * @brief Fill Radio bearer configuration
8052 * Function : fillRadioBearerConfig
8054 * Functionality: Fill Radio bearer configuration
8056 * @params[in] UE control block
8057 * Radio bearer config pointer
8058 * @return ROK - success
8061 * ****************************************************************/
8062 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8064 /* SRB To Add/Mod List */
8065 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8066 if(!radioBearerConfig->srb_ToAddModList)
8068 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8071 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8073 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8077 /* DRB To Add/Mod List */
8078 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8079 if(!radioBearerConfig->drb_ToAddModList)
8081 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8084 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8086 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8093 /*******************************************************************
8095 * @brief Fill measurement object to add/mod list
8099 * Function : fillMeasObjToAddModList
8101 * Functionality: Fill measurement object to add/mod list
8103 * @params[in] Measurement object to add/mod list
8104 * @return ROK - success
8107 * ****************************************************************/
8108 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8110 uint8_t elementCnt, objIdx;
8111 MeasObjectNR_t *measObject;
8114 measObjList->list.count = elementCnt;
8115 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8117 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8118 if(!measObjList->list.array)
8120 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8124 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8126 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8127 if(!measObjList->list.array[objIdx])
8129 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8135 measObjList->list.array[objIdx]->measObjectId = 1;
8136 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8137 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8138 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8140 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8144 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8147 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8148 if(!measObject->ssbFrequency)
8150 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8153 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8155 /* Subcarrier spacing */
8156 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8157 if(!measObject->ssbSubcarrierSpacing)
8159 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8162 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8165 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8166 if(!measObject->smtc1)
8168 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8171 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8172 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8173 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8175 /* Absoulute threshold SSB consolidation */
8176 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8177 if(!measObject->absThreshSS_BlocksConsolidation)
8179 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8183 /* RSRP threshold */
8184 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8185 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8187 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8190 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8192 /* RSRQ threshold */
8193 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8194 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8196 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8199 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8201 /* SINR threshold */
8202 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8203 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8205 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8208 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8210 /* Number of SSBs to average */
8211 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8212 if(!measObject->nrofSS_BlocksToAverage)
8214 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8217 *(measObject->nrofSS_BlocksToAverage) = 2;
8219 /* Quantity Config index */
8220 measObject->quantityConfigIndex = 1;
8223 /* RSRP offset for SSB */
8224 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8225 if(!measObject->offsetMO.rsrpOffsetSSB)
8227 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8230 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8232 /* RSRQ offset for SSB */
8233 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8234 if(!measObject->offsetMO.rsrpOffsetSSB)
8236 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8239 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8241 /* SINR offset for SSB */
8242 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8243 if(!measObject->offsetMO.sinrOffsetSSB)
8245 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8248 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8253 /*******************************************************************
8255 * @brief Fill Report configuration to Add/mod list
8259 * Function : fillReportCfgToAddModList
8261 * Functionality: Fill Report configuration to Add/mod list
8263 * @params[in] Report Config To Add/Mod List
8264 * @return ROK - success
8267 * ****************************************************************/
8268 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8271 uint8_t reportCfgIdx;
8272 ReportConfigToAddMod_t *reportCfg;
8273 ReportConfigNR_t *reportCfgNr;
8274 EventTriggerConfig_t *eventTriggCfg;
8277 reportCfgList->list.count = elementCnt;
8278 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8280 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8281 if(!reportCfgList->list.array)
8283 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8287 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8289 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8290 if(!reportCfgList->list.array[reportCfgIdx])
8292 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8298 reportCfg = reportCfgList->list.array[reportCfgIdx];
8299 reportCfg->reportConfigId = 1;
8300 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8302 /* Report Configuration for NR */
8303 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8304 if(!reportCfg->reportConfig.choice.reportConfigNR)
8306 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8309 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8312 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8313 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8314 if(!reportCfgNr->reportType.choice.eventTriggered)
8316 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8319 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8322 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8323 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8324 if(!eventTriggCfg->eventId.choice.eventA3)
8326 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8330 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8331 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8332 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8333 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8334 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8335 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8337 /* Reference Signal Type */
8338 eventTriggCfg->rsType = NR_RS_Type_ssb;
8340 /* Report Interval */
8341 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8344 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8346 /* Report Quantity cell */
8347 eventTriggCfg->reportQuantityCell.rsrp = true;
8348 eventTriggCfg->reportQuantityCell.rsrq = false;
8349 eventTriggCfg->reportQuantityCell.sinr = false;
8351 /* Maximum reported cells */
8352 eventTriggCfg->maxReportCells = 3;
8354 /* Report qunatity RS Indexes */
8355 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8356 if(!eventTriggCfg->reportQuantityRS_Indexes)
8358 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8361 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8362 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8363 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8365 /* Maximum number of RS indexes to report */
8366 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8367 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8369 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8372 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8374 /* Include Beam measurement */
8375 eventTriggCfg->includeBeamMeasurements = false;
8380 /*******************************************************************
8382 * @brief Fill measurement Id to add/mod list
8386 * Function : fillMeasIdToAddModList
8388 * Functionality: Fill measurement Id to add/mod list
8390 * @params[in] Measurement Id to add/mod list
8391 * @return ROK - success
8394 * ****************************************************************/
8395 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8401 measIdList->list.count = elementCnt;
8402 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8404 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8405 if(!measIdList->list.array)
8410 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8412 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8413 if(!measIdList->list.array[measIdIdx])
8419 measIdList->list.array[measIdIdx]->measId = 1;
8420 measIdList->list.array[measIdIdx]->measObjectId = 1;
8421 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8426 /*******************************************************************
8428 * @brief Fill s-measurement configuration
8432 * Function : fillSMeasConfig
8434 * Functionality: Fill s-measurement configuration
8436 * @params[in] s-Measurement config
8437 * @return ROK - success
8440 * ****************************************************************/
8441 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8443 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8444 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8449 /*******************************************************************
8451 * @brief Fill quantity config
8455 * Function : fillQunatityConfig
8457 * Functionality: Fill quantity config
8459 * @params[in] Quantity Config
8460 * @return ROK - success
8463 * ****************************************************************/
8464 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8466 uint8_t elementCnt = 0;
8467 uint8_t quanCfgIdx = 0;
8468 QuantityConfigNR_t *quantityCfgNr;
8470 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8471 if(!quantityCfg->quantityConfigNR_List)
8477 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8478 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8480 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8481 if(!quantityCfg->quantityConfigNR_List->list.array)
8486 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8488 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8489 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8496 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8498 /* Quantity Config of Reference signal */
8499 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8500 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8504 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8506 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8507 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8511 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8513 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8514 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8518 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8520 /* Quantity Config RS index */
8521 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8522 if(!quantityCfgNr->quantityConfigRS_Index)
8527 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8528 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8532 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8534 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8535 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8539 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8541 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8542 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8546 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8551 /*******************************************************************
8553 * @brief Fill measurement configuration
8557 * Function : fillMeasConfig
8559 * Functionality: Fill measurement configuration
8561 * @params[in] Measurement config
8562 * @return ROK - success
8565 * ****************************************************************/
8566 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8568 /* Measurement object to add/mod list */
8569 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8570 if(!measConfig->measObjectToAddModList)
8572 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8575 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8577 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8581 /* Report Config To add/mod list */
8582 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8583 if(!measConfig->reportConfigToAddModList)
8585 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8588 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8590 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8594 /* Measurement Id to add/mod list */
8595 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8596 if(!measConfig->measIdToAddModList)
8598 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8601 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8603 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8607 /* S-Measurement config */
8608 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8609 if(!measConfig->s_MeasureConfig)
8611 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8614 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8616 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8620 /* Qunatity Config */
8621 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8622 if(!measConfig->quantityConfig)
8624 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8627 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8629 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8636 /*******************************************************************
8638 * @brief Fill RRC reconfiguration non-critical extension IE
8642 * Function : fillRrcReconfigNonCriticalExt
8644 * Functionality: Fill RRC reconfiguration non-critical extension
8646 * @params[in] RRC Reconfig Non-critical extension
8647 * @return ROK - success
8650 * ****************************************************************/
8651 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8653 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8654 if(!rrcRecfg->masterCellGroup)
8656 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8660 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8661 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8662 if(!rrcRecfg->masterCellGroup->buf)
8664 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8667 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8670 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8671 * received from DU */
8672 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8674 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8682 /*******************************************************************
8684 * @brief Fill RRC reconfiguration structure
8688 * Function : fillRrcReconfig
8690 * Functionality: Fill RRC reconfiguration
8694 * RRC reconfiguration structure
8695 * @return ROK - success
8698 * ****************************************************************/
8699 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8701 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8703 rrcReconfig->rrc_TransactionIdentifier = 1;
8704 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8706 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8707 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8709 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8713 /* Radio Bearer Configuration */
8714 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8715 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8717 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8720 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8722 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8726 /* Measurement Configuration */
8727 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8728 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8730 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8733 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8735 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8739 /* Non Critical extension */
8740 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8741 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8743 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8746 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8748 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8754 /*******************************************************************
8756 * @brief Fill RRC reconfiguration Octet string
8760 * Function : fillRrcReconfigBuf
8762 * Functionality: Fill RRC reconfiguration octet string
8765 * @params[in] OCTET_STRING_t buffer
8766 * @return ROK - success
8769 * ****************************************************************/
8770 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8772 uint8_t ret = RFAILED;
8773 asn_enc_rval_t encRetVal;
8774 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8775 rrcReconfig = &rrcRecfg;
8779 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8781 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8785 /* Encode RRC Reconfiguration */
8786 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8787 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8789 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8791 /* Encode results */
8792 if(encRetVal.encoded == ENCODE_FAIL)
8794 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8795 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8800 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8801 for(int i=0; i< encBufSize; i++)
8803 DU_LOG("%x",encBuf[i]);
8807 rrcReconfigBuf->size = encBufSize;
8808 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8809 if(!rrcReconfigBuf->buf)
8811 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8814 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8819 freeRrcReconfig(rrcReconfig);
8823 /*******************************************************************
8825 * @brief Fill HO preparation information Octet string
8829 * Function : fillHOPreparationInfoBuf
8831 * Functionality: Fill HO preparation information Octet string
8834 * @params[in] HandoverPreparationInformation_t buffer
8835 * @return ROK - success
8838 * ****************************************************************/
8839 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8841 uint8_t ret = RFAILED;
8842 asn_enc_rval_t encRetVal;
8843 HandoverPreparationInformationRrc_t hoPrepInfo;
8844 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8849 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8850 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8851 if(!hoPrepInfo.criticalExtensions.choice.c1)
8853 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8856 hoPrepInfo.criticalExtensions.choice.c1->present = \
8857 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8859 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8860 sizeof(HandoverPreparationInformationRrc_IEs_t));
8861 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8863 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8866 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8868 /* Fill UE Capability RAT container list */
8869 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8872 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8876 /* Fill Source config */
8877 hoPrepInfoIe->sourceConfig = NULLP;
8878 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8879 if(!hoPrepInfoIe->sourceConfig)
8881 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8884 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8888 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8892 hoPrepInfoIe->rrm_Config = NULLP;
8893 hoPrepInfoIe->as_Context = NULLP;
8894 hoPrepInfoIe->nonCriticalExtension = NULLP;
8896 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8897 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8898 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8900 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8901 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8903 /* Encode results */
8904 if(encRetVal.encoded == ENCODE_FAIL)
8906 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8907 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8912 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8913 for(int i=0; i< encBufSize; i++)
8915 DU_LOG("%x",encBuf[i]);
8919 hoPrepInfoBuf->size = encBufSize;
8920 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8921 if(!hoPrepInfoBuf->buf)
8923 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8926 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8930 freeHOPreparationInfo(&hoPrepInfo);
8934 /*******************************************************************
8936 * @brief Fills CuToDuContainer
8940 * Function : fillCuToDuContainer
8942 * Functionality: Fills CuToDuContainer
8944 * @params[in] pointer to CUtoDURRCInformation_t
8946 * @return ROK - success
8949 ******************************************************************/
8951 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8953 uint8_t elementCnt = 0;
8957 /* UE Capabulity RAT Container List */
8958 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8959 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8961 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8964 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8966 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8967 if(!rrcMsg->measConfig)
8969 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8972 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8974 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8977 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8978 if(rrcMsg->iE_Extensions)
8981 rrcMsg->iE_Extensions->list.count = elementCnt;
8982 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
8984 /* Initialize the CUtoDURRCInformation_ExtIEs */
8985 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8987 if(rrcMsg->iE_Extensions->list.array == NULLP)
8989 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
8993 for(idx=0; idx<elementCnt; idx++)
8995 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
8996 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
8998 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9005 /* Cell Group Configuration */
9006 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9007 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9008 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9009 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9010 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9013 /* Handover Preparation Information */
9014 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9015 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9016 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9017 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9018 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9023 /*******************************************************************
9025 * @brief Build the drx cycle
9029 * Function : BuildDrxCycle
9031 * Functionality: Build drx cycle IE
9033 * @params[in] pointer to DRXCycle_t
9035 * @return ROK - success
9038 ******************************************************************/
9039 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9041 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms40;
9042 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9043 if(!drxCycle->shortDRXCycleLength)
9045 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9048 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9050 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9051 if(!drxCycle->shortDRXCycleTimer)
9053 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9056 *(drxCycle->shortDRXCycleTimer) = 4;
9059 /*******************************************************************
9061 * @brief Free CuToDuContainer
9065 * Function : FreeCuToDuInfo
9067 * Functionality: Free CuToDuContainer
9069 * @params[in] pointer to CUtoDURRCInformation_t
9071 * @return ROK - success
9074 ******************************************************************/
9076 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9080 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9082 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9083 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9084 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9086 if(rrcMsg->iE_Extensions)
9088 if(rrcMsg->iE_Extensions->list.array)
9090 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9092 if(rrcMsg->iE_Extensions->list.array[idx])
9094 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9096 case ProtocolIE_ID_id_CellGroupConfig:
9097 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9099 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9100 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9105 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9106 rrcMsg->iE_Extensions->list.array[idx]->id);
9112 for(idx2 = 0; idx2 < idx; idx2++)
9114 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9116 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9120 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9123 /*******************************************************************
9125 * @brief Builds and sends the UE Setup Request
9129 * Function : BuildAndSendUeContextSetupReq
9131 * Functionality: Constructs the UE Setup Request and sends
9132 * it to the CU through SCTP.
9136 * @return ROK - success
9139 * ****************************************************************/
9140 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9142 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9143 uint8_t ret= RFAILED, ret1;
9145 uint8_t idx, idx1, bufLen, duIdx;
9147 DuDb *targetDuDb = NULLP;
9148 F1AP_PDU_t *f1apMsg = NULLP;
9149 UEContextSetupRequest_t *ueSetReq = NULLP;
9150 asn_enc_rval_t encRetVal; /* Encoder return value */
9151 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9155 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9157 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9158 if(f1apMsg == NULLP)
9160 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9164 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9165 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9166 if(f1apMsg->choice.initiatingMessage == NULLP)
9168 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9172 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9173 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9174 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9176 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9178 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9188 ueSetReq->protocolIEs.list.count = elementCnt;
9189 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9191 /* Initialize the UESetup members */
9192 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9194 if(ueSetReq->protocolIEs.list.array == NULLP)
9196 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9200 for(idx1=0; idx1<elementCnt; idx1++)
9202 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9203 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9211 /*GNB CU UE F1AP ID*/
9212 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9213 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9214 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9215 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9217 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9219 /*GNB DU UE F1AP ID*/
9221 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9222 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9223 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9224 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9229 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9230 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9231 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9232 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9234 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9235 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
9236 /* Since we are supporting only one cell per DU, accessing 0th index to
9237 * get target cell info */
9238 spCellId = targetDuDb->cellCb[0].nrCellId;
9241 spCellId = ueCb->cellCb->nrCellId;
9242 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9248 /*Served Cell Index*/
9250 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9251 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9252 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9253 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9255 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9257 /*CellULConfigured*/
9259 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9260 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9261 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9262 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9265 /*CUtoDURRCContainer*/
9267 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9268 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9269 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9270 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9275 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9280 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9281 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9282 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9283 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9285 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9289 /*Special Cells to be SetupList*/
9291 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9292 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9293 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9294 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9295 if(SplCellListret != ROK)
9301 /*SRBs To Be Setup List*/
9303 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9304 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9305 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9306 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9307 if(SrbSetupret != ROK)
9312 /*DRBs to Be Setup List*/
9314 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9315 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9316 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9317 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9323 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9325 /* RRC delivery status request */
9327 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9328 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9329 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9330 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9333 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9335 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9336 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9337 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9339 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9341 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9342 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9343 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9344 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9346 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9349 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9350 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9352 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9354 /* Encode the F1SetupRequest type as APER */
9355 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9357 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9359 /* Encode results */
9360 if(encRetVal.encoded == ENCODE_FAIL)
9362 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9363 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9368 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9369 for(int i=0; i< encBufSize; i++)
9371 DU_LOG("%x",encBuf[i]);
9376 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9378 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9384 FreeUeContextSetupReq(f1apMsg);
9387 }/* End of BuildAndSendUeContextSetupReq*/
9389 /**********************************************************************
9390 * @brief Function to extractTeId received in UE context setup Response
9394 * Function : extractTeId
9397 * - Function to extract TeId
9400 * @return ROK - success
9403 **********************************************************************/
9404 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9408 GTPTunnel_t *gtpDl = NULLP;
9410 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9412 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9414 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9416 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9417 if(gtpDl->gTP_TEID.size > 0)
9419 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9422 DU_LOG("\nERROR --> EGTP: No TeId received");
9430 /****************************************************************
9431 * @brief Function to add Drb tunnels
9435 * Function : addDrbTunnels
9438 * - Function to add Drb tunnels
9441 * @return ROK - success
9444 * ****************************************************************/
9445 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9450 if(teId > MAX_TEID || teId < MIN_TEID)
9452 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9454 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9455 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9456 tnlEvt.lclTeid = teId;
9457 tnlEvt.remTeid = teId;
9458 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9461 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9466 /****************************************************************
9467 * @brief Function to process Drb Setup List
9471 * Function : procDrbSetupList
9474 * - Function to process DRB Setup List
9477 * @return ROK - success
9480 * ****************************************************************/
9481 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9483 uint8_t arrIdx = 0, drbIdx = 0;
9485 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9487 if(drbSetupList != NULLP)
9489 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9491 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9492 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9494 /* extracting teId */
9495 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9498 if(addDrbTunnels(duId, teId)== ROK)
9500 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9502 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9503 * are sent to CU for setting up of Tunnels in DL direction.
9504 * Search for DRB ID in CU databse */
9505 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9507 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9509 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9522 /****************************************************************
9523 * @brief Function to process Ue Context Setup Response
9527 * Function : procUeContextSetupResponse
9530 * - Function to process Ue Context Setup Response
9533 * @return ROK - success
9536 * ****************************************************************/
9537 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9539 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9540 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9542 CuUeCb *ueCb = NULLP;
9543 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9544 OCTET_STRING_t *duToCuRrcContainer;
9546 SEARCH_DU_DB(duIdx, duId, duDb);
9547 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9549 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9551 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9553 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9555 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9558 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9560 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9561 ueCb = &duDb->ueCb[duUeF1apId-1];
9562 /* If ue context is not present in du db, then create UE context
9563 * here. This flow is hit in case of UE handover where UE
9564 * context is created before UE performs RACH on target DU */
9565 if(ueCb->gnbDuUeF1apId == 0)
9567 /* Creating UE context in target DU */
9568 memset(ueCb, 0, sizeof(CuUeCb));
9569 ueCb->cellCb = &duDb->cellCb[0];
9570 ueCb->gnbDuUeF1apId = duUeF1apId;
9571 ueCb->gnbCuUeF1apId = cuUeF1apId;
9572 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9573 ueCb->hoInfo.targetDuId = duId;
9576 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9577 ueCb->cellCb->numUe++;
9581 case ProtocolIE_ID_id_C_RNTI:
9583 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9586 case ProtocolIE_ID_id_DRBs_Setup_List:
9588 /* Adding Tunnels for successful DRB */
9589 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9592 case ProtocolIE_ID_id_DUtoCURRCInformation:
9594 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9595 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9596 DUtoCURRCInformation.cellGroupConfig;
9597 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9598 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9600 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9608 /* If the UE is in handover, UE context modification request is to be sent to
9609 * source DU once UE context setup response is received from target DU */
9610 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9612 DuDb *srcDuDb = NULLP;
9613 CuUeCb *ueCbInSrcDu = NULLP;
9615 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9616 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9617 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9619 /* UE context setup response is received from target DU. Search all
9620 * DUs to find source DU except this target DU Id.*/
9621 if(cuCb.duInfo[duIdx].duId != duId)
9623 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9626 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9627 * received in UE context setup response since CU UE F1AP ID does not
9628 * change for UE in handover.
9629 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9631 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9632 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9634 srcDuDb = &cuCb.duInfo[duIdx];
9635 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9637 /* Store source DU info in the new UE context created in
9639 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9641 /* Copy the received container to UeCb */
9642 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9644 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9646 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9653 if(srcDuDb && ueCbInSrcDu)
9659 ueCb->f1apMsgDb.dlRrcMsgCount++;
9660 rrcMsgType = setDlRRCMsgType(ueCb);
9662 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9663 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9665 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9673 /****************************************************************
9674 * @brief Function to process Ul Rrc Msg received from DU
9678 * Function : procUlRrcMsg
9681 * - Function to process Ul Rrc Msg received from DU
9684 * @return ROK - success
9687 * ****************************************************************/
9689 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9691 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9692 uint8_t *rrcContainer = NULLP;
9693 uint16_t rrcContLen = 0;
9694 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9696 CuUeCb *ueCb = NULLP;
9697 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9700 SEARCH_DU_DB(duIdx, duId, duDb);
9701 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9703 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9705 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9707 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9709 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9712 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9714 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9717 case ProtocolIE_ID_id_SRBID:
9718 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9721 case ProtocolIE_ID_id_RRCContainer:
9723 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9724 CU_ALLOC(rrcContainer, rrcContLen);
9727 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9730 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9732 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9735 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
9736 DuDb *srcDuDb = NULLP;
9738 /* In target DU DB, mark UE as active and delete HO info */
9739 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9740 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9742 /* Release UE context in source DU because the UE is now
9743 * attached to target DU */
9744 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9745 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9747 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9749 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9752 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9763 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9770 ueCb = &duDb->ueCb[duUeF1apId-1];
9771 ueCb->f1apMsgDb.dlRrcMsgCount++;
9772 rrcMsgType = setDlRRCMsgType(ueCb);
9773 if(rrcMsgType == RRC_SETUP_COMPLETE)
9775 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for Security Mode Command");
9776 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9778 else if(rrcMsgType == SECURITY_MODE_COMPLETE)
9780 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9781 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9783 else if(rrcMsgType == REGISTRATION_COMPLETE)
9785 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9786 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9788 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9790 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9791 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9797 /****************************************************************
9798 * @brief Build And Send F1ResetAck
9802 * Function : FreeF1ResetAck
9805 * - Build And Send F1ResetRSP
9808 * @return ROK - success
9811 * ****************************************************************/
9812 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9815 ResetAcknowledge_t *f1ResetAck;
9819 if(f1apMsg->choice.successfulOutcome)
9821 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9823 if(f1ResetAck->protocolIEs.list.array)
9825 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9827 if(f1ResetAck->protocolIEs.list.array[idx])
9829 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9832 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9834 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9836 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9840 /****************************************************************
9841 * @brief Build And Send F1ResetAck
9845 * Function : BuildAndSendF1ResetAck
9848 * - Build And Send F1ResetRSP
9851 * @return ROK - success
9854 * ****************************************************************/
9856 uint8_t BuildAndSendF1ResetAck()
9859 uint8_t elementCnt = 0;
9860 uint8_t ret = RFAILED;
9861 F1AP_PDU_t *f1apMsg = NULL;
9862 ResetAcknowledge_t *f1ResetAck = NULLP;
9863 asn_enc_rval_t encRetVal;
9864 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9867 /* Allocate the memory for F1ResetRequest_t */
9868 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9869 if(f1apMsg == NULLP)
9871 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9875 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9877 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9878 if(f1apMsg->choice.successfulOutcome == NULLP)
9880 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9884 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9885 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9886 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9887 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9891 f1ResetAck->protocolIEs.list.count = elementCnt;
9892 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9894 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9895 if(f1ResetAck->protocolIEs.list.array == NULLP)
9897 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9901 for(idx=0; idx<elementCnt; idx++)
9903 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9904 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9911 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9912 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9913 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9914 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9916 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9918 /* Encode the F1SetupRequest type as UPER */
9919 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9921 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9923 /* Check encode results */
9924 if(encRetVal.encoded == ENCODE_FAIL)
9926 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9927 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9932 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9933 for(int i=0; i< encBufSize; i++)
9935 DU_LOG("%x",encBuf[i]);
9940 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9941 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9943 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9951 FreeF1ResetAck(f1apMsg);
9955 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9959 if(ulInfo->list.array)
9961 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9963 if(ulInfo->list.array[arrIdx])
9965 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9967 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9969 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9971 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9972 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9973 gTPTunnel->gTP_TEID.size);
9975 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9976 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9977 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9979 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9980 sizeof(GTPTunnel_t));
9982 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9985 CU_FREE(ulInfo->list.array,ulInfo->list.size);
9989 /*******************************************************************
9991 * @brief Deletes the EGTP tunnel
9995 * Function : deleteEgtpTunnel
9997 * Functionality: Deletes the EGTP tunnel
9999 * @params[in] uint8_t *buf
10001 * @return ROK - success
10002 * RFAILED - failure
10004 * ****************************************************************/
10005 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10010 teIdStringToInt(buf, &teId);
10011 if(teId > MAX_TEID || teId < MIN_TEID)
10013 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10016 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10017 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10018 tnlEvt.lclTeid = teId;
10019 tnlEvt.remTeid = teId;
10020 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10022 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10027 /*******************************************************************
10029 * @brief Builds the Uplink Tunnel Info
10033 * Function : BuildUlTnlInfoforSetupMod
10035 * Functionality: Constructs the UL TnlInfo For DRB list
10037 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10039 * @return ROK - success
10040 * RFAILED - failure
10042 * ****************************************************************/
10043 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10049 ulInfo->list.count = ulCnt;
10050 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10051 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10052 if(ulInfo->list.array == NULLP)
10054 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10057 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10059 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10060 if(ulInfo->list.array[arrIdx] == NULLP)
10062 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10068 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10069 UPTransportLayerInformation_PR_gTPTunnel;
10072 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10073 sizeof(GTPTunnel_t));
10074 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10076 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10079 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10080 transportLayerAddress.size = 4*sizeof(uint8_t);
10081 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10082 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10083 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10084 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10085 transportLayerAddress.buf == NULLP)
10087 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10091 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10092 transportLayerAddress.buf[0] = 192;
10093 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10094 transportLayerAddress.buf[1] = 168;
10095 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10096 transportLayerAddress.buf[2] = 130;
10097 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10098 transportLayerAddress.buf[3] = 82;
10099 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10100 transportLayerAddress.bits_unused = 0;
10102 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10103 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10104 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10105 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10108 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10109 = 4 * sizeof(uint8_t);
10110 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10111 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10112 gTPTunnel->gTP_TEID.size);
10113 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10116 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10119 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10120 gTP_TEID.buf[0] = 0;
10121 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10122 gTP_TEID.buf[1] = 0;
10123 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10124 gTP_TEID.buf[2] = 0;
10125 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10127 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10128 * fetched based on the Drb Id */
10130 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10131 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10132 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10136 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10137 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10140 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10141 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10142 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10143 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10145 }/*End of BuildULTnlInfo*/
10147 /*******************************************************************
10149 * @brief freeing the DRB item
10153 * Function : FreeDrbItem
10155 * Functionality: freeing the DRB item
10157 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10159 * @return ROK - success
10160 * RFAILED - failure
10162 * ****************************************************************/
10164 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10167 SNSSAI_t *snssai =NULLP;
10168 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10170 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10171 switch(drbItem->qoSInformation.present)
10173 case QoSInformation_PR_NOTHING:
10175 case QoSInformation_PR_eUTRANQoS:
10177 if(drbItem->qoSInformation.choice.eUTRANQoS)
10179 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10183 case QoSInformation_PR_choice_extension:
10185 if(drbItem->qoSInformation.choice.choice_extension)
10187 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10189 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10190 if(snssai->sST.buf)
10192 CU_FREE(snssai->sST.buf,snssai->sST.size);
10196 if(snssai->sD->buf)
10198 CU_FREE(snssai->sD->buf,snssai->sD->size);
10200 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10203 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10204 if(flowMap->list.array)
10206 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10208 if(flowMap->list.array[arrIdx] )
10210 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10211 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10214 CU_FREE(flowMap->list.array,flowMap->list.size);
10217 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10223 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10224 if(drbItem->uLConfiguration)
10226 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10230 /*******************************************************************
10232 * @brief filling the DRB setup Mod item
10236 * Function : FillDrbItemToSetupMod
10238 * Functionality: filling the DRB setup Mod item
10241 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10243 * @return ROK - success
10244 * RFAILED - failure
10246 * ****************************************************************/
10248 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10253 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10254 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10257 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10259 switch(drbItem->qoSInformation.present)
10261 case QoSInformation_PR_NOTHING:
10265 case QoSInformation_PR_eUTRANQoS:
10268 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10269 if(drbItem->qoSInformation.choice.eUTRANQoS)
10271 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10274 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10275 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10276 PriorityLevel_no_priority;
10278 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10279 Pre_emptionCapability_may_trigger_pre_emption;
10281 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10282 Pre_emptionVulnerability_pre_emptable;
10286 case QoSInformation_PR_choice_extension:
10288 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10289 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10291 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10295 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10296 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10297 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10298 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10299 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10302 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10307 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10308 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10311 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10315 /*Flows mapped to DRB List*/
10316 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10317 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10318 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10321 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10327 /*ULUPTNLInformation To Be Setup List*/
10328 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10329 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10332 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10337 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10338 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10344 /*******************************************************************
10346 * @brief Builds the DRB to be Setup Mod ItemIes
10350 * Function : FillDrbItemList
10352 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10354 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10356 * @return ROK - success
10357 * RFAILED - failure
10359 * ****************************************************************/
10361 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10363 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10364 drbItemIe->criticality = Criticality_reject;
10365 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10367 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10369 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10374 /*******************************************************************
10376 * @brief free the DRB to be Setup Mod list
10380 * Function : FreeDrbToBeSetupModList
10382 * Functionality: free the DRB to be Setup Mod list
10384 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10386 * @return ROK - success
10387 * RFAILED - failure
10389 * ****************************************************************/
10390 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10393 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10395 if(drbSet->list.array)
10397 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10399 if(drbSet->list.array[arrIdx] != NULLP)
10403 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10404 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10406 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10409 CU_FREE(drbSet->list.array, drbSet->list.size);
10414 /*******************************************************************
10416 * @brief Builds the DRB to be Setup Mod list
10420 * Function : BuildDrbToBeSetupList
10422 * Functionality: Constructs the DRB to be Setup Mod list
10424 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10426 * @return ROK - success
10427 * RFAILED - failure
10429 * ****************************************************************/
10431 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10437 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10438 drbSet->list.count = drbCnt;
10439 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10440 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10441 if(drbSet->list.array == NULLP)
10443 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10447 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10449 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10450 if(drbSet->list.array[arrIdx] == NULLP)
10452 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10456 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10459 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10466 /*******************************************************************
10468 * @brief Filling the DRB to be modified item
10472 * Function : FillDrbToBeModItem
10474 * Functionality: filling the DRB to be modified item
10476 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10478 * @return ROK - success
10479 * RFAILED - failure
10481 * ****************************************************************/
10483 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10487 DrbInfo *drbToBeMod;
10490 drbItem->dRBID = DRB2 + arrIdx;
10492 /* Search for DRB ID in CU databse */
10493 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10495 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10497 drbToBeMod = &ueCb->drbList[drbIdx];
10503 drbItem->qoSInformation = NULLP;
10504 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10505 if(drbItem->qoSInformation != NULLP)
10507 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10509 switch(drbItem->qoSInformation->present)
10511 case QoSInformation_PR_NOTHING:
10515 case QoSInformation_PR_eUTRANQoS:
10518 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10519 if(drbItem->qoSInformation->choice.eUTRANQoS)
10521 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10524 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10525 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10526 PriorityLevel_no_priority;
10528 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10529 Pre_emptionCapability_may_trigger_pre_emption;
10531 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10532 Pre_emptionVulnerability_pre_emptable;
10536 case QoSInformation_PR_choice_extension:
10538 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10539 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10541 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10545 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10546 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10547 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10548 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10549 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10552 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10557 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10558 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10561 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10565 /*Flows mapped to DRB List*/
10566 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10567 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10568 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10571 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10578 /*ULUPTNLInformation To Be Setup List*/
10579 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10580 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10583 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10589 /*******************************************************************
10591 * @brief Builds the DRB to be modified Item IE
10595 * Function : FillDrbToBeModItemList
10597 * Functionality: Constructs the DRB to be modified Mod Item Ies
10599 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10601 * @return ROK - success
10602 * RFAILED - failure
10604 * ****************************************************************/
10606 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10608 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10609 drbItemIe->criticality = Criticality_reject;
10610 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10611 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10613 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10620 /*******************************************************************
10622 * @brief Builds the DRB to be modified list
10626 * Function : BuildDrbToBeModList
10628 * Functionality: Constructs the DRB to be modified list
10630 * @params[in] DRBs_ToBeModified_List_t *drbSet
10632 * @return ROK - success
10633 * RFAILED - failure
10635 * ****************************************************************/
10637 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10643 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10644 drbSet->list.count = drbCnt;
10645 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10646 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10647 if(drbSet->list.array == NULLP)
10649 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10652 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10654 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10655 if(drbSet->list.array[arrIdx] == NULLP)
10657 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10661 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10664 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10671 /*******************************************************************
10673 * @brief freeing the DRB item
10677 * Function : FreeModifiedDrbItem
10679 * Functionality: freeing the DRB 2 item
10681 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10683 * @return ROK - success
10684 * RFAILED - failure
10686 * ****************************************************************/
10688 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10691 SNSSAI_t *snssai =NULLP;
10692 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10694 if(drbItem->qoSInformation != NULLP)
10696 switch(drbItem->qoSInformation->present)
10698 case QoSInformation_PR_NOTHING:
10700 case QoSInformation_PR_eUTRANQoS:
10702 if(drbItem->qoSInformation->choice.eUTRANQoS)
10704 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10708 case QoSInformation_PR_choice_extension:
10710 if(drbItem->qoSInformation->choice.choice_extension)
10712 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10714 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10715 if(snssai->sST.buf)
10717 CU_FREE(snssai->sST.buf,snssai->sST.size);
10721 if(snssai->sD->buf)
10723 CU_FREE(snssai->sD->buf,snssai->sD->size);
10725 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10728 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10729 if(flowMap->list.array)
10731 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10733 if(flowMap->list.array[arrIdx] )
10735 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10736 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10739 CU_FREE(flowMap->list.array,flowMap->list.size);
10742 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10748 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10749 if(drbItem->uLConfiguration)
10751 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10755 /*******************************************************************
10757 * @brief free the DRB to be modfified list
10761 * Function : FreeDrbToBeModifiedList
10763 * Functionality: free the DRB to be Setup Mod list
10765 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10767 * @return ROK - success
10768 * RFAILED - failure
10770 * ****************************************************************/
10771 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10774 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10776 if(drbSet->list.array)
10778 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10780 if(drbSet->list.array[arrIdx] != NULLP)
10782 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10783 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10784 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10787 CU_FREE(drbSet->list.array, drbSet->list.size);
10792 /*******************************************************************
10794 * @brief free the UeContextModification Request
10798 * Function : FreeUeContextModicationRequest
10800 * Functionality : deallocation of memory allocated in UeContextModiification
10803 * @params[in] F1AP_PDU_t *f1apMsg
10807 * ****************************************************************/
10808 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10810 uint8_t arrIdx =0 , ieId=0;
10811 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10815 if(f1apMsg->choice.initiatingMessage)
10817 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10818 if(ueContextModifyReq->protocolIEs.list.array)
10820 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10822 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10824 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10827 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10829 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10831 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10833 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10834 choice.DRBs_ToBeSetupMod_List);
10837 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10839 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10840 choice.DRBs_ToBeModified_List);
10843 case ProtocolIE_ID_id_TransmissionActionIndicator:
10845 case ProtocolIE_ID_id_RRCContainer:
10847 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10848 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10852 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10855 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10857 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10859 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10863 /*******************************************************************
10865 * @brief Builds the Ue Context Modification Req
10869 * Function : BuildAndSendUeContextModificationReq
10871 * Functionality: Constructs the Ue Context Modification Req
10875 * @return ROK - success
10876 * RFAILED - failure
10878 * ****************************************************************/
10879 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10882 uint8_t elementCnt = 0;
10883 uint8_t ret = RFAILED;
10884 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10885 F1AP_PDU_t *f1apMsg = NULLP;
10886 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10887 asn_enc_rval_t encRetVal;
10888 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10891 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10892 if(f1apMsg == NULLP)
10894 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10898 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10900 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10901 if(f1apMsg->choice.initiatingMessage == NULLP)
10903 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10906 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10907 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10908 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10910 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10912 if(action == MODIFY_UE)
10914 else if(action == QUERY_CONFIG)
10916 else if(action == RRC_RECONFIG_COMPLETE_IND)
10918 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10921 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10922 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10924 /* Initialize the UE context modification members */
10925 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10926 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10928 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10932 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10934 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10935 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10937 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10943 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10944 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10945 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10946 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10947 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10950 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10951 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10952 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10953 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10954 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10956 if(action == MODIFY_UE)
10958 /* DRB to be setup list */
10960 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10961 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10962 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10963 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10964 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10965 value.choice.DRBs_ToBeSetupMod_List));
10967 /* DRB to be modified list */
10969 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
10970 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10971 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10972 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
10973 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10974 value.choice.DRBs_ToBeModified_List));
10976 /* TODO: DRB to be release list */
10980 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
10984 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
10986 else if(action == QUERY_CONFIG)
10989 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
10990 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10991 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10992 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
10993 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
10995 else if(action == RRC_RECONFIG_COMPLETE_IND)
10998 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
10999 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11000 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11001 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11002 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11003 RRCReconfigurationCompleteIndicator_true;
11005 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11008 if(action == STOP_DATA_TX)
11010 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11011 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11012 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11013 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11014 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11015 TransmissionActionIndicator_stop;
11017 else if (action == RESTART_DATA_TX)
11019 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11020 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11021 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11022 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11023 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11024 TransmissionActionIndicator_restart;
11028 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11029 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11030 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11031 UEContextModificationRequestIEs__value_PR_RRCContainer;
11032 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
11034 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11038 /* RRC delivery status request */
11040 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11041 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11042 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11043 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11046 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11048 /* Encode the F1SetupRequest type as APER */
11049 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11051 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11053 /* Encode results */
11054 if(encRetVal.encoded == ENCODE_FAIL)
11056 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11057 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11062 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11064 /* This for loop was going into an infinite loop even though encBufSize
11065 * has a small value. Hence commented this
11067 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11069 DU_LOG("%x",encBuf[ieIdx]);
11074 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11075 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11077 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11085 FreeUeContextModicationRequest(f1apMsg);
11089 /*****************************************************************i
11091 * @brief Free memory allocated for UE Context Release Command
11095 * Function : FreeUeContextReleaseCommand
11098 * - Free memory allocated for UE Context Release Command
11100 * @params[in] F1AP_PDU_t *f1apMsg
11103 * *************************************************************/
11104 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11107 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11111 if(f1apMsg->choice.initiatingMessage)
11113 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11114 if(ueReleaseCommand->protocolIEs.list.array)
11116 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11118 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11120 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11122 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11124 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11127 /*******************************************************************
11129 * @brief Builds the Ue Context Release Command
11133 * Function : BuildAndSendUeContextReleaseCommand
11135 * Functionality: Constructs the Ue Context Release Command
11139 * @return ROK - success
11140 * RFAILED - failure
11142 * ****************************************************************/
11143 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11145 bool memAllocFailed = false;
11146 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11149 F1AP_PDU_t *f1apMsg = NULLP;
11150 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11152 asn_enc_rval_t encRetVal;
11153 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11157 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11158 if(f1apMsg == NULLP)
11160 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11164 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11166 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11167 if(f1apMsg->choice.initiatingMessage == NULLP)
11169 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11172 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11173 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11174 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11176 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11178 SEARCH_DU_DB(duIdx, duId, duDb);
11179 ueCb = &duDb->ueCb[duUeF1apId-1];
11180 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11185 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11186 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11188 /* Initialize the UE context modification members */
11189 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11190 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11192 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11196 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11198 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11199 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11201 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11202 memAllocFailed = true;
11207 if(memAllocFailed == true)
11213 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11214 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11215 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11216 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11217 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11220 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11221 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11222 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11223 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11224 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11226 /* Cause of UE context release */
11228 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11229 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11230 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11231 UEContextReleaseCommandIEs__value_PR_Cause;
11232 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11233 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11234 CauseRadioNetwork_normal_release;
11235 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11237 /* RRC Container for RRC release */
11239 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11240 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11241 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11242 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11243 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11245 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11246 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11247 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11248 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11250 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11253 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11254 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11256 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11258 /* Encode the UE Context Release Command type as APER */
11259 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11261 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11264 /* Encode results */
11265 if(encRetVal.encoded == ENCODE_FAIL)
11267 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11268 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11273 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11274 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11276 DU_LOG("%x",encBuf[ieIdx]);
11280 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11281 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11283 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11291 FreeUeContextReleaseCommand(f1apMsg);
11294 /*******************************************************************
11296 * @brief process Ue context release request
11300 * Function : procUeContextReleaseReq
11303 * - process Ue context release request
11305 * @params[in] F1AP_PDU_t *f1apMsg
11306 * @return ROK - success
11307 * RFAILED - failure
11309 * ****************************************************************/
11310 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11312 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11314 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11315 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11317 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11319 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11321 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11323 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11326 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11328 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11336 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11338 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11343 /*******************************************************************
11345 * @brief processing of Gnb-DU config update
11349 * Function : procGnbDuUpdate
11352 * - processing of Gnb-DU config update
11354 * @params[in] F1AP_PDU_t *f1apMsg
11355 * @return ROK - success
11356 * RFAILED - failure
11358 * ****************************************************************/
11359 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11361 bool cellToBeDelete = false;
11362 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11366 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11368 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11369 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11371 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11373 case ProtocolIE_ID_id_TransactionID:
11375 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11377 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11379 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11380 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11381 Served_Cells_To_Delete_List.list.array[0];
11382 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11383 cellToBeDelete = true;
11386 case ProtocolIE_ID_id_gNB_DU_ID:
11390 if(BuildAndSendDUUpdateAck(duId) != ROK)
11392 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11396 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11397 * commented this trigger for now */
11399 if(cellToBeDelete == false)
11401 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11402 if(BuildAndSendF1ResetReq() != ROK)
11404 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11409 if(cellToBeDelete == true)
11411 SEARCH_DU_DB(duIdx, duId, duDb);
11412 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11413 if(cellCb->numUe == 0)
11415 memset(cellCb, 0, sizeof(CuCellCb));
11419 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11424 /*******************************************************************
11426 * @brief storing slice list in CU database
11430 * Function : buildSliceList
11433 * - storing slice list in CU database
11435 * @params[in] SliceSupportList_t *sliceSupportList
11436 * @return ROK - success
11437 * RFAILED - failure
11439 * ****************************************************************/
11440 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11442 uint8_t sliceListIdx = 0;
11444 if(sliceSupportList)
11446 if(sliceSupportList->list.array)
11448 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11449 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11451 if(sliceSupportList->list.array[sliceListIdx])
11453 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11454 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11456 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11459 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11461 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11462 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11464 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11466 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11467 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11468 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11477 /****************************************************************
11478 * @brief Function to process Srb Setup Mod List
11482 * Function : procSrbSetupModList
11485 * - Function to process SRB Setup Mod List
11488 * @return ROK - success
11489 * RFAILED - failure
11491 * ****************************************************************/
11492 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11494 uint8_t arrIdx = 0, srbIdx;
11495 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11497 if(srbSetupList != NULLP)
11499 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11501 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11502 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11504 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11506 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11508 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11520 /****************************************************************
11521 * @brief Function to process Drb Setup Mod List
11525 * Function : procDrbSetupModList
11528 * - Function to process DRB Setup Mod List
11531 * @return ROK - success
11532 * RFAILED - failure
11534 * ****************************************************************/
11535 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11537 uint8_t arrIdx = 0, drbIdx;
11539 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11541 if(drbSetupList != NULLP)
11543 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11545 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11546 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11548 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11550 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11552 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11553 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11558 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11560 /* extracting teId */
11561 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11564 if(addDrbTunnels(duId, teId)== ROK)
11566 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11578 /*******************************************************************
11580 * @brief processing of GNB_DU_Served_Cells Plmn list information
11584 * Function : procServedCellPlmnList
11587 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11590 * @params[in] F1AP_PDU_t *f1apMsg
11591 * @return ROK - success
11592 * RFAILED - failure
11594 * ****************************************************************/
11595 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11597 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11598 ProtocolExtensionContainer_4624P3_t **ieExtend;
11600 if(srvPlmn->list.array)
11602 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11604 if(srvPlmn->list.array[srvPlmnIdx])
11606 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11609 if((*ieExtend)->list.array)
11611 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11613 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11615 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11617 case ProtocolIE_ID_id_TAISliceSupportList:
11619 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11620 extensionValue.choice.SliceSupportList) != ROK)
11622 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11637 /****************************************************************
11638 * @brief Function to process Ue Context Modification Response
11642 * Function : procUeContextModificationResponse
11645 * - Function to process Ue Context Modification Response
11648 * @return ROK - success
11649 * RFAILED - failure
11651 * ****************************************************************/
11652 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11654 uint8_t idx=0, duIdx=0;
11655 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11656 DuDb *duDb = NULLP;
11657 CuUeCb *ueCb = NULLP;
11658 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11660 SEARCH_DU_DB(duIdx, duId, duDb);
11661 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11663 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11665 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11667 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11669 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11672 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11674 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11675 ueCb = &duDb->ueCb[duUeF1apId-1];
11678 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11680 /* Adding Tunnels for successful DRB */
11681 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11685 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11687 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11690 case ProtocolIE_ID_id_DUtoCURRCInformation:
11692 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11693 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11694 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11696 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11705 /* If UE is in handover and UE context is not yet created at target DU, then send
11706 * UE context setup request to target DU */
11707 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11710 DuDb *tgtDuDb = NULLP;
11711 CuUeCb *ueCbInTgtDu = NULLP;
11713 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11716 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11717 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11719 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11721 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11723 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11728 /* If UE context is not found in Target DU DU, send UE context setup
11730 if(ueCbInTgtDu == NULLP)
11732 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
11734 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11744 /*******************************************************************
11746 * @brief processing of F1 setup request
11750 * Function : procF1SetupReq
11753 * - processing of F1 setup request
11755 * @params[in] F1AP_PDU_t *f1apMsg
11756 * @return ROK - success
11757 * RFAILED - failure
11759 * ****************************************************************/
11760 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11762 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11764 uint64_t nrCellId = 0;
11765 DuDb *duDb = NULLP;
11766 CuCellCb *cellCb = NULLP;
11767 BIT_STRING_t nrcellIdentity;
11768 F1SetupRequest_t *f1SetupReq = NULLP;
11769 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11770 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11772 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11773 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11775 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11777 case ProtocolIE_ID_id_gNB_DU_ID:
11779 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11780 SEARCH_DU_DB(duIdx, duId, duDb);
11783 duDb = &cuCb.duInfo[cuCb.numDu];
11786 memset(duDb, 0, sizeof(DuDb));
11791 case ProtocolIE_ID_id_gNB_DU_Name:
11793 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11796 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11798 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11799 if(duServedCell->list.array)
11801 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11803 if(duServedCell->list.array[plmnidx])
11805 switch(duServedCell->list.array[plmnidx]->id)
11807 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11809 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11810 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11811 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11813 bitStringToInt(&nrcellIdentity, &nrCellId);
11814 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11815 if(cellCb == NULLP)
11817 cellCb = &duDb->cellCb[duDb->numCells];
11818 memset(cellCb, 0, sizeof(CuCellCb));
11819 cellCb->nrCellId = nrCellId;
11820 cellCb->cellStatus = CELL_ACTIVE;
11833 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11837 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11841 /****************************************************************
11843 * @brief processing of UE Context Release Complete
11847 * Function : procUeContextReleaseComplete
11850 * - processing of UE Context Release Complete
11852 * @params[in] F1AP_PDU_t *f1apMsg
11853 * @return ROK - success
11854 * RFAILED - failure
11856 * ****************************************************************/
11857 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11859 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
11860 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11861 DuDb *duDb = NULLP;
11862 CuUeCb *ueCb = NULLP;
11863 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11865 SEARCH_DU_DB(duIdx, duId, duDb);
11868 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11872 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11873 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11875 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11877 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11879 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11882 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11884 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11885 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11886 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11888 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11890 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11891 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11893 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11895 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
11897 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11898 ueCb->cellCb->numUe--;
11899 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
11901 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11908 memset(ueCb, 0, sizeof(CuUeCb));
11916 /*******************************************************************
11918 * @brief Builds the Paging cell list
11922 * Function : BuildPagingCellList
11924 * Functionality: Build the paging cell list
11926 * @params[in] PagingCell_list_t *pagingCelllist,
11928 * @return ROK - success
11929 * RFAILED - failure
11931 * ****************************************************************/
11932 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11934 uint8_t cellIdx =0;
11935 PagingCell_ItemIEs_t *pagingCellItemIes;
11936 PagingCell_Item_t *pagingCellItem;
11938 pagingCelllist->list.count = numCells;
11939 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11940 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11941 if(pagingCelllist->list.array == NULLP)
11943 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11947 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11949 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11950 if(pagingCelllist->list.array[cellIdx] == NULLP)
11952 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11957 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11959 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11960 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
11961 pagingCellItemIes->criticality = Criticality_ignore;
11962 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
11963 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11965 /* Fill NrCgi Information */
11966 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
11972 /*******************************************************************
11974 * @brief Deallocation of memory allocated in paging msg
11978 * Function :FreePagingMsg
11980 * Functionality: Deallocation of memory allocated in paging msg
11982 * @params[in] F1AP_PDU_t *f1apMsg
11986 * ****************************************************************/
11987 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
11989 uint8_t ieIdx, cellIdx;
11991 PagingCell_ItemIEs_t *pagingCellItemIes;
11992 PagingCell_Item_t *pagingCellItem;
11993 PagingCell_list_t *pagingCelllist;
11997 if(f1apMsg->choice.initiatingMessage)
11999 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12000 if(paging->protocolIEs.list.array)
12002 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12004 if(paging->protocolIEs.list.array[ieIdx])
12006 switch(paging->protocolIEs.list.array[ieIdx]->id)
12008 case ProtocolIE_ID_id_UEIdentityIndexValue:
12010 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12011 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12015 case ProtocolIE_ID_id_PagingIdentity:
12017 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12019 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12021 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12023 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12024 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12026 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12027 sizeof(struct CNUEPagingIdentity));
12033 case ProtocolIE_ID_id_PagingCell_List:
12035 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12036 if(pagingCelllist->list.array)
12038 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12040 if(pagingCelllist->list.array[cellIdx])
12042 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12043 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12045 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12046 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12047 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12049 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12052 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12057 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12060 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12062 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12064 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12067 /*******************************************************************
12069 * @brief Builds and sends the paging message if UE is in idle mode
12073 * Function : BuildAndSendPagingMsg
12075 * Functionality: Builds and sends the paging message
12077 * @params[in] uint32_t duId, uint8_t gsTmsi
12079 * @return ROK - success
12080 * RFAILED - failure
12082 * ****************************************************************/
12083 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12085 bool memAllocFailed = false;
12086 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12087 uint16_t ueId = 0, duIdx = 0;
12089 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12090 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12091 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12092 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12094 F1AP_PDU_t *f1apMsg = NULLP;
12095 Paging_t *paging = NULLP;
12097 asn_enc_rval_t encRetVal;
12099 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12101 SEARCH_DU_DB(duIdx, duId, duDb);
12104 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12110 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12111 if(f1apMsg == NULLP)
12113 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12117 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12119 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12120 if(f1apMsg->choice.initiatingMessage == NULLP)
12122 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12125 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12126 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12127 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12129 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12132 paging->protocolIEs.list.count = elementCnt;
12133 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12135 /* Initialize the Paging Message members */
12136 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12137 if(paging->protocolIEs.list.array == NULLP)
12139 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12143 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12145 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12146 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12148 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12149 memAllocFailed = true;
12154 if(memAllocFailed == true)
12159 /* UE Identity Index Value */
12161 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12162 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12163 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12164 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12165 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12166 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12167 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12168 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12170 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12174 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12175 ueId = gsTmsi % 1024;
12176 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12178 /* Paging Identity */
12180 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12181 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12182 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12183 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12184 PagingIdentity_PR_cNUEPagingIdentity;
12185 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12186 sizeof(struct CNUEPagingIdentity));
12187 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12189 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12193 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12194 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12196 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12197 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12198 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12199 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12201 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12205 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12206 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12210 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12211 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12212 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12213 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12215 /* Paging Priority */
12217 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12218 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12219 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12220 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12222 /* Paging Cell List */
12224 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12225 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12226 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12227 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12229 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12233 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12235 /* Encode the UE Context Release Command type as APER */
12236 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12238 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12241 /* Encode results */
12242 if(encRetVal.encoded == ENCODE_FAIL)
12244 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12245 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12250 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12251 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12253 DU_LOG("%x",encBuf[ieIdx]);
12257 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12259 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12268 FreePagingMsg(f1apMsg);
12272 /*******************************************************************
12274 * @brief Handles received F1AP message and sends back response
12278 * Function : F1APMsgHdlr
12281 * - Decodes received F1AP control message
12282 * - Prepares response message, encodes and sends to SCTP
12285 * @return ROK - success
12286 * RFAILED - failure
12288 * ****************************************************************/
12289 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12295 F1AP_PDU_t *f1apMsg = NULLP;
12296 asn_dec_rval_t rval; /* Decoder return value */
12297 F1AP_PDU_t f1apasnmsg ;
12299 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12300 ODU_PRINT_MSG(mBuf, 0,0);
12302 /* Copy mBuf into char array to decode it */
12303 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12304 CU_ALLOC(recvBuf, (Size)recvBufLen);
12306 if(recvBuf == NULLP)
12308 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12311 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12313 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12317 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12318 for(i=0; i< recvBufLen; i++)
12320 DU_LOG("%x",recvBuf[i]);
12323 /* Decoding flat buffer into F1AP messsage */
12324 f1apMsg = &f1apasnmsg;
12325 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12327 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12328 CU_FREE(recvBuf, (Size)recvBufLen);
12330 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12332 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12336 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12338 switch(f1apMsg->present)
12340 case F1AP_PDU_PR_initiatingMessage:
12342 switch(f1apMsg->choice.initiatingMessage->value.present)
12344 case InitiatingMessage__value_PR_Reset:
12346 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12347 BuildAndSendF1ResetAck();
12351 case InitiatingMessage__value_PR_F1SetupRequest:
12353 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12354 procF1SetupReq(duId, f1apMsg);
12358 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12360 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12361 procGnbDuUpdate(*duId, f1apMsg);
12364 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12366 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12367 procInitULRRCMsg(*duId, f1apMsg);
12370 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12372 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12373 procUlRrcMsg(*duId, f1apMsg);
12377 case InitiatingMessage__value_PR_RRCDeliveryReport:
12379 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12382 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12384 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12385 procUeContextReleaseReq(*duId, f1apMsg);
12390 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12391 f1apMsg->choice.initiatingMessage->value.present);
12394 }/* End of switch(initiatingMessage) */
12398 case F1AP_PDU_PR_successfulOutcome:
12400 switch(f1apMsg->choice.successfulOutcome->value.present)
12402 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12404 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12407 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12409 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12410 procUeContextSetupResponse(*duId, f1apMsg);
12413 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12415 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12416 procUeContextModificationResponse(*duId, f1apMsg);
12419 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12421 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12422 procUeContextReleaseComplete(*duId, f1apMsg);
12427 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12428 f1apMsg->choice.successfulOutcome->value.present);
12431 }/* End of switch(successfulOutcome) */
12436 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12439 }/* End of switch(f1apMsg->present) */
12441 } /* End of F1APMsgHdlr */
12443 /**********************************************************************
12445 **********************************************************************/