1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ProtocolIE-Field.h"
25 #include "ProtocolExtensionField.h"
26 #include "ProtocolIE-SingleContainer.h"
28 #include "ModulationOrder.h"
30 #include "UE-CapabilityRAT-Container.h"
31 #include "UE-CapabilityRAT-ContainerList.h"
32 #include "UE-CapabilityRAT-ContainerListRRC.h"
33 #include "HandoverPreparationInformationRrc-IEs.h"
34 #include "HandoverPreparationInformationRrc.h"
35 #include "SupportedBandwidth.h"
36 #include "FeatureSetUplinkPerCC.h"
37 #include "FeatureSetDownlinkPerCC.h"
38 #include "FeatureSets.h"
39 #include "RF-Parameters.h"
40 #include "UE-NR-Capability.h"
41 #include "ProtocolExtensionContainer.h"
42 #include "CellGroupConfigRrc.h"
43 #include "MAC-CellGroupConfig.h"
44 #include "SchedulingRequestConfig.h"
45 #include "SchedulingRequestToAddMod.h"
46 #include "BSR-Config.h"
47 #include "TAG-Config.h"
49 #include "PHR-Config.h"
50 #include "RLC-Config.h"
51 #include "UL-AM-RLC.h"
52 #include "DL-AM-RLC.h"
53 #include "LogicalChannelConfig.h"
54 #include "RLC-BearerConfig.h"
55 #include "PhysicalCellGroupConfig.h"
56 #include "SpCellConfig.h"
57 #include "ServingCellConfig.h"
58 #include "ControlResourceSet.h"
59 #include "SearchSpace.h"
60 #include "PDCCH-Config.h"
61 #include "PDSCH-TimeDomainResourceAllocation.h"
62 #include "PDSCH-TimeDomainResourceAllocationList.h"
63 #include "DMRS-DownlinkConfig.h"
64 #include "PDSCH-Config.h"
65 #include "BWP-DownlinkDedicated.h"
66 #include "PUSCH-TimeDomainResourceAllocation.h"
67 #include "PUSCH-TimeDomainResourceAllocationList.h"
68 #include "DMRS-UplinkConfig.h"
69 #include "PUSCH-Config.h"
70 #include "SRS-ResourceId.h"
71 #include "SRS-Resource.h"
72 #include "SRS-ResourceSet.h"
73 #include "SRS-Config.h"
74 #include "PUCCH-Config.h"
75 #include "PUCCH-ResourceSet.h"
76 #include "PUCCH-Resource.h"
77 #include "PUCCH-format1.h"
78 #include "PUCCH-FormatConfig.h"
79 #include "BWP-UplinkDedicated.h"
80 #include "PUSCH-ServingCellConfig.h"
81 #include "UplinkConfig.h"
82 #include "PDSCH-ServingCellConfig.h"
83 #include "EUTRANQoS.h"
84 #include "GBR-QosInformation.h"
85 #include "DRBs-ToBeSetupMod-List.h"
86 #include "DRBs-ToBeSetupMod-Item.h"
87 #include "DRBs-Setup-Item.h"
88 #include "DLUPTNLInformation-ToBeSetup-List.h"
89 #include "DLUPTNLInformation-ToBeSetup-Item.h"
90 #include "UPTransportLayerInformation.h"
91 #include "GTPTunnel.h"
92 #include "QoSInformation.h"
93 #include "Cells-to-be-Activated-List.h"
94 #include "DL-CCCH-Message.h"
95 #include "SRB-ToAddModList.h"
96 #include "SRB-ToAddMod.h"
97 #include "RRCSetup-IEs.h"
99 #include "DL-DCCH-Message.h"
100 #include "RRCReconfiguration-IEs.h"
101 #include "RRCReconfiguration.h"
102 #include "DRB-ToAddModList.h"
103 #include "DRB-ToAddMod.h"
104 #include "SDAP-Config.h"
106 #include "MeasTiming.h"
107 #include "MeasTimingList.h"
108 #include "MeasurementTimingConfigurationRrc-IEs.h"
109 #include "MeasurementTimingConfigurationRrc.h"
110 #include "PDCP-Config.h"
111 #include "RSRP-Range.h"
112 #include "RSRQ-Range.h"
113 #include "SINR-Range.h"
114 #include "ThresholdNR.h"
115 #include "MeasObjectToAddMod.h"
116 #include "MeasObjectNR.h"
117 #include "MeasObjectToAddModList.h"
118 #include "EventTriggerConfig.h"
119 #include "ReportConfigNR.h"
120 #include "ReportConfigToAddMod.h"
121 #include "ReportConfigToAddModList.h"
122 #include "MeasIdToAddMod.h"
123 #include "MeasIdToAddModList.h"
124 #include "FilterCoefficient.h"
125 #include "QuantityConfigNR.h"
126 #include "QuantityConfig.h"
127 #include "MeasConfigRrc.h"
128 #include "AS-Config.h"
129 #include "RRCReconfiguration-v1530-IEs.h"
130 #include "CNUEPagingIdentity.h"
131 #include "PagingCell-Item.h"
132 #include "UL-DCCH-Message.h"
133 #include "DRX-ConfigRrc.h"
135 #include "cu_stub_sctp.h"
136 #include "cu_stub_egtp.h"
137 #include "cu_f1ap_msg_hdl.h"
140 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
141 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
143 /*******************************************************************
145 * @brief Sends F1 msg over SCTP
149 * Function : SendF1APMsg
151 * Functionality: Sends F1 msg over SCTP
153 * @params[in] Region region
155 * @return ROK - success
158 * ****************************************************************/
159 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
161 Buffer *mBuf = NULLP;
163 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
165 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
167 ODU_PRINT_MSG(mBuf, 0,0);
169 if(sctpSend(duId, mBuf) != ROK)
171 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
172 ODU_PUT_MSG_BUF(mBuf);
178 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
179 ODU_PUT_MSG_BUF(mBuf);
182 ODU_PUT_MSG_BUF(mBuf);
186 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
193 /********************************************************************
195 * @brief Builds and sends the F1SetupResponse
199 * Function : BuildAndSendF1SetupRsp
201 * Functionality: Constructs the F1SetupResponse message and sends
202 * it back to the DU through SCTP.
204 * @params[in] void **buf,Buffer to which encoded pattern is written into
205 * @params[in] int *size,size of buffer
207 * @return ROK - success
210 * ****************************************************************/
211 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
214 uint8_t elementCnt,cellCnt;
215 F1AP_PDU_t *f1apMsg = NULL;
216 F1SetupResponse_t *f1SetupRsp;
217 GNB_CU_Name_t *cuName;
218 Cells_to_be_Activated_List_t *cellToActivate;
219 RRC_Version_t *rrcVer;
220 asn_enc_rval_t encRetVal;
221 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
223 /* Allocate the memory for F1SetupRequest_t */
224 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
227 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
230 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
232 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
233 if(f1apMsg->choice.successfulOutcome == NULLP)
235 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
236 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
240 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
241 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
242 f1apMsg->choice.successfulOutcome->value.present = \
243 SuccessfulOutcome__value_PR_F1SetupResponse;
244 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
247 f1SetupRsp->protocolIEs.list.count = elementCnt;
248 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
250 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
251 elementCnt * sizeof(F1SetupResponseIEs_t *));
252 if(f1SetupRsp->protocolIEs.list.array == NULLP)
254 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
255 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
256 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
260 for(idx=0; idx<elementCnt; idx++)
262 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
263 sizeof(F1SetupResponseIEs_t));
264 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
266 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
267 elementCnt * sizeof(F1SetupResponseIEs_t *));
268 CU_FREE(f1apMsg->choice.successfulOutcome, \
269 sizeof(SuccessfulOutcome_t));
270 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
277 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
278 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
279 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
280 F1SetupResponseIEs__value_PR_TransactionID;
281 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
286 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
287 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
288 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
289 F1SetupResponseIEs__value_PR_GNB_CU_Name;
290 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
291 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
293 CU_ALLOC(cuName->buf, sizeof(cuName->size));
294 if(cuName->buf == NULLP)
296 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
298 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
299 sizeof(F1SetupResponseIEs_t));
301 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
302 elementCnt * sizeof(F1SetupResponseIEs_t *));
303 CU_FREE(f1apMsg->choice.successfulOutcome,\
304 sizeof(SuccessfulOutcome_t));
305 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
308 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
310 /*Cells to be activated list*/
312 f1SetupRsp->protocolIEs.list.array[idx]->id = \
313 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
314 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
315 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
316 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
317 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
318 Cells_to_be_Activated_List;
320 cellToActivate->list.count = cellCnt;
321 cellToActivate->list.size = \
322 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
323 CU_ALLOC(cellToActivate->list.array,\
324 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
325 if(cellToActivate->list.array == NULLP)
327 CU_FREE(cuName->buf, sizeof(cuName->size));
328 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
330 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
331 sizeof(F1SetupResponseIEs_t));
333 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
334 elementCnt * sizeof(F1SetupResponseIEs_t *));
335 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
336 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
339 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
341 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
342 if(cellToActivate->list.array[ieIdx] == NULLP)
344 CU_FREE(cellToActivate->list.array,\
345 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
346 CU_FREE(cuName->buf, sizeof(cuName->size));
347 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
349 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
350 sizeof(F1SetupResponseIEs_t));
352 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
353 elementCnt * sizeof(F1SetupResponseIEs_t *));
354 CU_FREE(f1apMsg->choice.successfulOutcome, \
355 sizeof(SuccessfulOutcome_t));
356 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
360 cellToActivate->list.array[0]->id = \
361 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
362 cellToActivate->list.array[0]->criticality = Criticality_ignore;
363 cellToActivate->list.array[0]->value.present = \
364 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
365 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
366 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
367 CU_ALLOC(cellToActivate->list.array[0]->\
368 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
370 if(cellToActivate->list.array[0]->value.choice.\
371 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
374 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
376 CU_FREE(cellToActivate->list.array[ieIdx],\
377 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
380 CU_FREE(cellToActivate->list.array,\
381 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
382 CU_FREE(cuName->buf, sizeof(cuName->size));
383 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
385 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
386 sizeof(F1SetupResponseIEs_t));
388 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
389 elementCnt * sizeof(F1SetupResponseIEs_t *));
390 CU_FREE(f1apMsg->choice.successfulOutcome, \
391 sizeof(SuccessfulOutcome_t));
392 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
395 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
396 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
397 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
398 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
399 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
400 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
401 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
402 nRCGI.nRCellIdentity.size);
403 if(cellToActivate->list.array[0]->value.choice.\
404 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
406 CU_FREE(cellToActivate->list.array[0]->\
407 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
409 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
411 CU_FREE(cellToActivate->list.array[ieIdx],\
412 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
415 CU_FREE(cellToActivate->list.array,\
416 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
417 CU_FREE(cuName->buf, sizeof(cuName->size));
418 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
420 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
421 sizeof(F1SetupResponseIEs_t));
423 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
424 elementCnt * sizeof(F1SetupResponseIEs_t *));
425 CU_FREE(f1apMsg->choice.successfulOutcome, \
426 sizeof(SuccessfulOutcome_t));
427 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
430 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
433 f1SetupRsp->protocolIEs.list.array[idx]->id = \
434 ProtocolIE_ID_id_GNB_CU_RRC_Version;
435 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
436 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
437 F1SetupResponseIEs__value_PR_RRC_Version;
438 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
439 rrcVer->latest_RRC_Version.size = RRC_SIZE;
441 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
442 if(rrcVer->latest_RRC_Version.buf == NULLP)
444 CU_FREE(cuName->buf, sizeof(cuName->size));
445 for(ieIdx=0; ieIdx<elementCnt; idx++)
447 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
448 sizeof(F1SetupResponseIEs_t));
450 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
451 elementCnt * sizeof(F1SetupResponseIEs_t *));
452 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
453 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
457 /* Need to check RRC Version */
458 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
459 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
460 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
461 if(rrcVer->iE_Extensions == NULLP)
463 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
464 CU_FREE(cuName->buf, sizeof(cuName->size));
465 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
467 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
468 sizeof(F1SetupResponseIEs_t));
470 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
471 elementCnt * sizeof(F1SetupResponseIEs_t *));
472 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
473 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
476 rrcVer->iE_Extensions->list.count = 1;
477 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
478 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
479 sizeof(struct RRC_Version_ExtIEs *));
480 if(rrcVer->iE_Extensions->list.array == NULLP)
482 CU_FREE(rrcVer->iE_Extensions,\
483 sizeof(ProtocolExtensionContainer_4624P81_t));
484 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
485 CU_FREE(cuName->buf, sizeof(cuName->size));
486 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
488 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
489 sizeof(F1SetupResponseIEs_t));
491 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
492 elementCnt * sizeof(F1SetupResponseIEs_t *));
493 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
494 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
497 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
498 sizeof(struct RRC_Version_ExtIEs));
499 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
501 CU_FREE(rrcVer->iE_Extensions->list.array,\
502 sizeof(struct RRC_Version_ExtIEs *));
503 CU_FREE(rrcVer->iE_Extensions,\
504 sizeof(ProtocolExtensionContainer_4624P81_t));
505 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
506 CU_FREE(cuName->buf, sizeof(cuName->size));
507 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
509 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
510 sizeof(F1SetupResponseIEs_t));
512 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
513 elementCnt * sizeof(F1SetupResponseIEs_t *));
514 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
515 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
518 rrcVer->iE_Extensions->list.array[0]->id = \
519 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
520 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
521 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
522 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
523 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
524 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
525 CU_ALLOC(rrcVer->iE_Extensions->list.\
526 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
528 if(rrcVer->iE_Extensions->list.\
529 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
531 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
532 sizeof(struct RRC_Version_ExtIEs));
533 CU_FREE(rrcVer->iE_Extensions->list.array,\
534 sizeof(struct RRC_Version_ExtIEs *));
535 CU_FREE(rrcVer->iE_Extensions,\
536 sizeof(ProtocolExtensionContainer_4624P81_t));
537 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
538 CU_FREE(cuName->buf, sizeof(cuName->size));
539 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
541 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
542 sizeof(F1SetupResponseIEs_t));
544 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
545 elementCnt * sizeof(F1SetupResponseIEs_t *));
546 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
547 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
550 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
551 Latest_RRC_Version_Enhanced.buf[0] = 0;
552 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
553 Latest_RRC_Version_Enhanced.buf[1] = 5;
554 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
555 Latest_RRC_Version_Enhanced.buf[2] = 15;
557 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
559 /* Encode the F1SetupRequest type as UPER */
560 memset(encBuf, 0, ENC_BUF_MAX_LEN);
562 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
565 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
566 CU_FREE(cuName->buf, sizeof(cuName->size));
567 for(idx=0; idx<elementCnt; idx++)
569 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
571 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
572 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
573 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
575 /* Check encode results */
576 if(encRetVal.encoded == ENCODE_FAIL)
578 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
579 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
584 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
585 for(int i=0; i< encBufSize; i++)
587 DU_LOG("%x",encBuf[i]);
592 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
594 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
599 }/* End of BuildAndSendF1SetupRsp */
601 /*******************************************************************
603 * @brief Builds and sends the DUUpdateAcknowledge
607 * Function : BuildAndSendDUUpdateAck
609 * Functionality: Constructs the DU Update Acknowledge message and sends
610 * it to the DU through SCTP.
614 * @return ROK - success
617 * ****************************************************************/
619 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
623 F1AP_PDU_t *f1apMsg = NULL;
624 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
625 asn_enc_rval_t enRetVal; /* Encoder return value */
627 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
629 /* Allocate the memory for F1SetupRequest_t */
630 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
633 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
637 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
639 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
640 if(f1apMsg->choice.successfulOutcome == NULLP)
642 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
643 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
647 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
648 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
649 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
650 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
653 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
654 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
656 /* Initialize the F1Setup members */
657 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
658 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
660 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
661 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
662 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
666 for(idx=0; idx<elementCnt; idx++)
668 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
669 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
671 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
672 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
673 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
680 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
681 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
682 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
683 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
684 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
686 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
688 /* Encode the F1SetupRequest type as UPER */
689 memset(encBuf, 0, ENC_BUF_MAX_LEN);
691 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
694 for(idx=0; idx<elementCnt; idx++)
696 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
698 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
699 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
700 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
702 /* Checking encode results */
703 if(enRetVal.encoded == ENCODE_FAIL)
705 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
706 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
711 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
712 for(int i=0; i< encBufSize; i++)
714 DU_LOG("%x",encBuf[i]);
719 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
720 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
722 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
728 }/* End of BuildAndSendDUUpdateAck*/
730 /*******************************************************************
732 * @brief deallocating the memory of F1reset msg
736 * Function : FreeF1ResetReq
739 * - freeing memory of F1reset request msg
745 * ****************************************************************/
746 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
749 Reset_t *f1ResetMsg = NULLP;
753 if(f1apMsg->choice.initiatingMessage)
755 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
756 if(f1ResetMsg->protocolIEs.list.array)
758 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
760 if(f1ResetMsg->protocolIEs.list.array[idx])
762 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
765 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
767 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
769 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
772 /*******************************************************************
774 * @brief build ansld ans send f1reset msg
778 * Function : BuildAndSendF1ResetReq
780 * Functionality: build and send f1reset msg
782 * @return ROK - success
785 * ****************************************************************/
786 uint8_t BuildAndSendF1ResetReq()
788 uint8_t elementCnt=0;
790 uint8_t ret= RFAILED;
791 Reset_t *f1ResetMsg = NULLP;
792 F1AP_PDU_t *f1apMsg = NULLP;
793 asn_enc_rval_t encRetVal;
794 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
797 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
800 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
803 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
804 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
805 if(f1apMsg->choice.initiatingMessage == NULLP)
807 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
810 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
811 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
812 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
814 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
817 f1ResetMsg->protocolIEs.list.count = elementCnt;
818 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
820 /* Initialize the F1Reset members */
821 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
822 if(f1ResetMsg->protocolIEs.list.array == NULLP)
824 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
827 for(idx=0; idx<elementCnt; idx++)
829 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
830 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
832 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
839 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
840 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
841 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
842 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
846 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
847 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
848 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
849 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
850 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
854 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
855 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
856 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
857 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
858 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
860 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
862 /* Encode the F1SetupRequest type as APER */
863 memset(encBuf, 0, ENC_BUF_MAX_LEN);
865 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
869 if(encRetVal.encoded == ENCODE_FAIL)
871 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
872 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
877 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
878 for(idx=0; idx< encBufSize; idx++)
880 DU_LOG("%x",encBuf[idx]);
884 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
885 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
887 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
895 FreeF1ResetReq(f1apMsg);
899 /*******************************************************************
901 * @brief Fills Radio Bearer Config
905 * Function : fillSrbCfg
907 * Functionality: Fills Radio Bearer Config
909 * @params[in] SRB_ToAddModList *
911 * @return ROK - success
914 * ****************************************************************/
915 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
917 uint8_t elementCnt = 0;
918 uint8_t idx, ieId, srbIdx = 0;
920 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
922 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
926 if(bearerCfg != NULLP)
928 bearerCfg->list.count = elementCnt;
929 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
930 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
931 if(bearerCfg->list.array != NULLP)
933 for(idx = 0; idx < elementCnt; idx++)
935 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
936 if(bearerCfg->list.array[idx] == NULLP)
938 for(ieId = 0; ieId < idx; ieId++)
940 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
942 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
949 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
954 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
956 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
957 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
963 /*******************************************************************
965 * @brief Fills Master CellGroup Info
969 * Function : fillMasterCellGroup
971 * Functionality: Fills Master Cell Group IE
973 * @params[in] RRCSetup_IEs_t *
975 * @return ROK - success
978 * ****************************************************************/
980 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
983 masterCellGroup->buf = NULLP;
984 if(ueCb->f1apMsgDb.duToCuContainer.buf)
986 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
987 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
988 if(masterCellGroup->buf != NULLP)
990 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
994 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1005 /*******************************************************************
1007 * @brief Fills RRC setup IE
1011 * Function : fillRRCSetupIE
1013 * Functionality: Fills RRC Setup IE
1015 * @params[in] RRCSetup_IEs_t *
1017 * @return ROK - success
1020 * ****************************************************************/
1022 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1024 uint8_t ret = ROK, srbIdx = 0;
1027 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1028 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1030 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1034 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1038 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1042 /* If SRB configuration are filled successfully in RRC Setup, mark these
1043 * configurartion as sent to UE */
1044 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1046 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1047 ueCb->srbList[srbIdx].cfgSentToUe = true;
1052 /*******************************************************************
1054 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1058 * Function : fillDlCcchRrcMsg
1060 * Functionality: Fills DL DCCCH Message required for
1061 * DLRRCMessageTransfer
1063 * @params[in] RRCContainer_t *rrcContainer
1065 * @return ROK - success
1068 * ****************************************************************/
1070 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1074 DL_CCCH_Message_t dl_CCCH_Msg;
1075 asn_enc_rval_t encRetVal;
1077 if(rrcContainer != NULLP)
1079 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1081 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1082 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1084 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1085 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1086 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1088 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1089 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1090 RRCSetup__criticalExtensions_PR_rrcSetup;
1092 /* Fill RRC Setup IE */
1093 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1094 sizeof(RRCSetup_IEs_t));
1095 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1097 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1101 /* encode DL-CCCH message into RRC Container */
1102 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1103 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1105 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1106 /* Encode results */
1107 if(encRetVal.encoded == ENCODE_FAIL)
1109 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1110 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1115 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1116 for(int i = 0; i< encBufSize; i++)
1118 DU_LOG("%x",encBuf[i]);
1120 rrcContainer->size = encBufSize;
1121 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1122 if(rrcContainer->buf != NULLP)
1124 memset(rrcContainer->buf, 0, encBufSize);
1125 for(idx2 = 0; idx2 < encBufSize; idx2++)
1127 rrcContainer->buf[idx2] = encBuf[idx2];
1139 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1145 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1151 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1157 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1162 /*******************************************************************
1164 * @brief Fills QOS flow configuration
1168 * Function : fillQosFlowsToAdd
1170 * Functionality: Fills QOS flow configuration
1172 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1174 * @return ROK - success
1177 * ****************************************************************/
1178 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1180 uint8_t idx, ied, elementCnt;
1183 qosFlow->list.count = elementCnt;
1184 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1185 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1186 if(qosFlow->list.array != NULLP)
1188 for(idx = 0; idx < elementCnt; idx++)
1190 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1191 if(qosFlow->list.array[idx] == NULLP)
1193 for(ied = 0; ied < idx; ied++)
1195 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1197 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1203 *qosFlow->list.array[idx] = 9;
1207 /*******************************************************************
1209 * @brief Fills CN Assoc for Drb to Add/Mod List
1213 * Function : fillCnAssoc
1215 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1217 * @params[in] struct DRB_ToAddMod__cnAssociation *
1219 * @return ROK - success
1222 * ****************************************************************/
1224 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1228 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1229 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1231 cnAssoc->choice.eps_BearerIdentity = 5;
1233 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1235 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1236 if(cnAssoc->choice.sdap_Config)
1238 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1239 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1240 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1241 cnAssoc->choice.sdap_Config->defaultDRB = true;
1242 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1243 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1244 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1245 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1246 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1248 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1252 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1253 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1259 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1266 /*******************************************************************
1268 * @brief Fills Radio Bearer Config for Drb
1272 * Function : fillDrbCfg
1274 * Functionality: Fills Radio Bearer Config for Drb
1276 * @params[in] drbId, DRB_ToAddModList *
1278 * @return ROK - success
1281 * ****************************************************************/
1282 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1284 uint8_t idx, ied, ret, elementCnt;
1290 drbCfg->list.count = elementCnt;
1291 drbCfg->list.size =\
1292 elementCnt * sizeof(DRB_ToAddMod_t *);
1293 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1294 if(drbCfg->list.array != NULLP)
1296 for(idx = 0; idx < elementCnt; idx++)
1298 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1299 if(drbCfg->list.array[idx] == NULLP)
1301 for(ied = 0; ied < idx; ied++)
1303 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1305 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1315 /* CN ASSOCIATION */
1316 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1317 if(drbCfg->list.array[idx]->cnAssociation)
1319 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1322 drbCfg->list.array[idx]->drb_Identity = drbId;
1327 /*******************************************************************
1329 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1333 * Function : fillRrcReconfigIE
1335 * Functionality: Fills RRC Reconfig Message required for
1336 * DLRRCMessageTransfer
1338 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1340 * @return ROK - success
1343 * ****************************************************************/
1345 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1348 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1349 if(rrcReconfigMsg->radioBearerConfig)
1351 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1352 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1354 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1359 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1360 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1362 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1365 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1366 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1367 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1373 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1374 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1380 /*******************************************************************
1382 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1386 * Function : fillDlDcchRrcMsg
1388 * Functionality: Fills DL DCCH Message required for
1389 * DLRRCMessageTransfer
1391 * @params[in] RRCContainer_t *rrcContainer
1393 * @return ROK - success
1396 * ****************************************************************/
1398 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1401 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1402 DL_DCCH_Message_t dl_DCCH_Msg;
1403 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1404 asn_enc_rval_t encRetVal;
1406 if(rrcContainer != NULLP)
1408 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1410 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1411 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1413 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1414 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1415 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1417 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1418 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1421 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1422 * configurartion as sent to UE */
1423 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1425 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1426 ueCb->srbList[srbIdx].cfgSentToUe = true;
1428 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1430 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1431 ueCb->drbList[drbIdx].cfgSentToUe = true;
1434 /* encode DL-DCCH message into RRC Container */
1435 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1436 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1438 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1439 /* Encode results */
1440 if(encRetVal.encoded == ENCODE_FAIL)
1442 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1443 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1448 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1449 for(int i = 0; i< encBufSize; i++)
1451 DU_LOG("%x",encBuf[i]);
1453 rrcContainer->size = encBufSize;
1454 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1455 if(rrcContainer->buf != NULLP)
1457 memset(rrcContainer->buf, 0, encBufSize);
1458 for(idx2 = 0; idx2 < encBufSize; idx2++)
1460 rrcContainer->buf[idx2] = encBuf[idx2];
1468 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1474 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1480 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1486 /*******************************************************************
1488 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1492 * Function : BuildDLRRCContainer
1494 * Functionality: Builds RRC Container IE required for
1495 * DLRRCMessageTransfer
1499 * @return ROK - success
1502 * ****************************************************************/
1504 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1506 uint8_t ret, bufLen;
1509 if(rrcMsgType == RRC_SETUP)
1511 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1513 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1515 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1517 DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
1518 char secModeBuf[30]={0x00, 0x02, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1519 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1521 rrcContainer->size = bufLen;
1522 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1523 if(rrcContainer->buf != NULLP)
1525 memset(rrcContainer->buf, 0, bufLen);
1526 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1530 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1534 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1536 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1537 char secModeBuf[9]={0x00, 0x03, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1539 rrcContainer->size = bufLen;
1540 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1541 if(rrcContainer->buf != NULLP)
1543 memset(rrcContainer->buf, 0, bufLen);
1544 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1548 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1552 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1554 /*Hardcoded RRC Container from reference logs*/
1555 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1556 char buf[14] ={0x00, 0x04, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1558 rrcContainer->size = bufLen;
1559 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1560 if(rrcContainer->buf != NULLP)
1562 memset(rrcContainer->buf, 0, bufLen);
1563 memcpy(rrcContainer->buf, buf, bufLen);
1567 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1571 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1573 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1574 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1576 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1582 /*******************************************************************
1584 * @brief Frees the DLRRCMessageTransfer
1588 * Function : freeDlRrcMessageTransfer
1590 * Functionality: Frees the DLRRCMessageTransfer
1594 * @return ROK - success
1597 * ****************************************************************/
1598 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1601 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1605 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1606 if(dlRRCMsg->protocolIEs.list.array)
1609 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1610 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1611 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1613 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1615 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1617 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1621 /*******************************************************************
1623 * @brief Builds and sends the DLRRCMessageTransfer
1627 * Function : BuildAndSendDLRRCMessageTransfer
1629 * Functionality: Constructs the DL RRC Message Transfer and sends
1630 * it to the CU through SCTP.
1634 * @return ROK - success
1637 * ****************************************************************/
1638 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1640 uint8_t elementCnt = 0;
1643 F1AP_PDU_t *f1apMsg = NULLP;
1644 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1645 asn_enc_rval_t encRetVal; /* Encoder return value */
1647 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1649 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1650 if(f1apMsg == NULLP)
1652 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1656 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1657 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1658 if(f1apMsg->choice.initiatingMessage == NULLP)
1660 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1661 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1665 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1666 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1667 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1668 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1671 dlRRCMsg->protocolIEs.list.count = elementCnt;
1672 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1674 /* Initialize the F1Setup members */
1675 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1676 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1678 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1679 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1680 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1684 for(idx=0; idx<elementCnt; idx++)
1686 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1687 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1689 for(ieId=0; ieId<idx; ieId++)
1691 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1693 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1694 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1695 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1700 /* GNB CU UE F1AP ID */
1702 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1703 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1704 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1705 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1707 /* GNB DU UE F1AP ID */
1709 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1710 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1711 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1712 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1716 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1717 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1718 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1719 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1723 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1724 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1725 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1726 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1728 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1730 /* Encode the F1SetupRequest type as APER */
1731 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1733 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1735 /* Encode results */
1736 if(encRetVal.encoded == ENCODE_FAIL)
1738 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1739 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1744 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1745 for(int i=0; i< encBufSize; i++)
1747 DU_LOG("%x",encBuf[i]);
1752 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1754 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1757 freeDlRrcMessageTransfer(f1apMsg);
1759 }/* End of BuildAndSendDLRRCMessageTransfer */
1761 /*******************************************************************
1763 * @brief Function to set the Dl RRC Msg Type
1767 * Function : setDlRRCMsgType
1769 * Functionality: Constructs the UE Setup Response and sends
1770 * it to the DU through SCTP.
1774 * @return ROK - success
1777 * ****************************************************************/
1779 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1781 uint8_t rrcMsgType = 0;
1782 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1785 rrcMsgType = RRC_SETUP;
1787 case RRC_SETUP_COMPLETE:
1788 rrcMsgType = RRC_SETUP_COMPLETE;
1790 case NAS_SECURITY_MODE_COMPLETE:
1791 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1793 case RRC_SECURITY_MODE_COMPLETE:
1794 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1796 case REGISTRATION_COMPLETE:
1797 rrcMsgType = REGISTRATION_COMPLETE;
1799 case UE_CONTEXT_SETUP_RSP:
1800 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1802 case RRC_RECONFIG_COMPLETE:
1803 rrcMsgType = RRC_RECONFIG_COMPLETE;
1812 /*******************************************************************
1814 * @brief fill long cycle offset value of drx
1818 * Function : fillLongCycleOffsetValue
1820 * Functionality: fill long cycle offset value of drx
1822 * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset,
1823 * struct DRX_ConfigRrc__drx_LongCycleStartOffset recvedLongCycleOffsetVal
1825 * @return ROK - success
1828 * ****************************************************************/
1829 void fillLongCycleOffsetValue(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *recvedLongCycleOffsetVal)
1832 drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = recvedLongCycleOffsetVal->present;
1833 switch(recvedLongCycleOffsetVal->present)
1835 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10:
1837 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10;
1840 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20:
1842 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms20;
1845 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32:
1847 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms32;
1850 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40:
1852 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms40;
1855 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60:
1857 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms60;
1860 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64:
1862 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms64;
1865 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70:
1867 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms70;
1870 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80:
1872 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms80;
1875 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128:
1877 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms128;
1880 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160:
1882 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms160;
1885 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256:
1887 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms256;
1890 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320:
1892 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms320;
1895 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512:
1897 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms512;
1900 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640:
1902 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms640;
1905 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024:
1907 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1024;
1910 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280:
1912 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms1280;
1915 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048:
1917 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2048;
1920 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560:
1922 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms2560;
1925 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120:
1927 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms5120;
1930 case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240:
1932 drxLongCycleStartOffset->drxLongCycleStartOffsetVal = recvedLongCycleOffsetVal->choice.ms10240;
1940 /*******************************************************************
1942 * @brief Extract configuration from DRX_ConfigRrc
1943 * and store the drx configuration in UeCb
1947 * Function : storeDrxCfgInUeCb
1949 * Functionality: Store drx configuration in UeCb
1951 * @params[in] (struct DRX_ConfigRrc *setup, DrxCfg *drxCfg)
1954 * ****************************************************************/
1955 void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg)
1959 switch(drxSetup->drx_onDurationTimer.present)
1961 case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING:
1963 case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds:
1965 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true;
1966 drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds;
1969 case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds:
1971 drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false;
1972 drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds;
1977 fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset);
1978 drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer;
1979 drxCfg->drxHarqRttTimerDl = drxSetup->drx_HARQ_RTT_TimerDL;
1980 drxCfg->drxHarqRttTimerUl = drxSetup->drx_HARQ_RTT_TimerUL;
1981 drxCfg->drxRetransmissionTimerDl = drxSetup->drx_RetransmissionTimerDL;
1982 drxCfg->drxRetransmissionTimerUl = drxSetup->drx_RetransmissionTimerUL;
1983 drxCfg->drxSlotOffset = drxSetup->drx_SlotOffset;
1984 if(drxSetup->shortDRX)
1986 drxCfg->shortDrxPres=true;
1987 drxCfg->shortDrx.drxShortCycle = drxSetup->shortDRX->drx_ShortCycle;
1988 drxCfg->shortDrx.drxShortCycleTimer = drxSetup->shortDRX->drx_ShortCycleTimer;
1991 drxCfg->shortDrxPres=false;
1995 /*******************************************************************
1997 * @brief Extract configuration from CellGroupConfig
2001 * Function : extractCellGroupConfig
2003 * Functionality: Extract configuration from CellGroupConfig
2004 * and store in local database
2006 * @params[in] UE control block
2009 * @return ROK - success
2012 * ****************************************************************/
2013 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
2015 uint8_t rbIdx, srbIdx, drbIdx;
2016 bool srbFound, drbFound;
2017 SrbInfo *srbCfgDb = NULLP;
2018 DrbInfo *drbCfgDb = NULLP;
2019 RlcLcCfg *rlcLcCfgDb = NULLP;
2020 MacLcCfg *macLcCfgDb = NULLP;
2021 RLC_BearerConfig_t *rlcCfg = NULLP;
2022 RLC_Config_t *rlcLcCfg = NULLP;
2023 LogicalChannelConfig_t *macLcCfg = NULLP;
2030 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
2034 if(cellGrpCfg == NULLP)
2036 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
2041 if(cellGrpCfg->mac_CellGroupConfig)
2043 if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc)
2045 switch(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->present)
2047 case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING:
2050 case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup:
2052 storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg);
2056 case MAC_CellGroupConfig__drx_ConfigRrc_PR_release:
2063 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
2068 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
2070 /* Update SRB configuration in local DB */
2071 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
2073 /* Search if SRB entry is already present in DB */
2074 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
2076 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
2078 srbCfgDb = &ueCb->srbList[srbIdx];
2084 /* If not, add SRB to UE CB's SRB list */
2087 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
2088 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
2092 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2093 srbCfgDb->cfgSentToUe = false;
2094 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
2095 macLcCfgDb = &srbCfgDb->macLcCfg;
2098 /* Update DRB configuration in local DB */
2099 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
2101 /* Search if DRB entry is already present in DB */
2102 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
2104 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
2106 drbCfgDb = &ueCb->drbList[drbIdx];
2112 /* If not, add DRB to UE CB's SRB list */
2115 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
2116 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
2120 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
2121 drbCfgDb->cfgSentToUe = false;
2122 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
2123 macLcCfgDb = &drbCfgDb->macLcCfg;
2127 /* Update RLC configuration for this RB */
2128 rlcLcCfg = rlcCfg->rlc_Config;
2129 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
2130 switch(rlcLcCfgDb->rlcMode)
2132 case RLC_Config_PR_am:
2134 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
2135 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
2136 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
2137 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
2138 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
2140 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
2141 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
2142 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
2146 case RLC_Config_PR_um_Bi_Directional:
2148 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
2150 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
2151 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
2156 /* Update MAC configuration for this LC */
2157 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
2158 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
2159 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
2160 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
2161 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
2162 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
2167 /*******************************************************************
2169 * @brief Function to decode DU to CU RRC container
2173 * Function : extractDuToCuRrcCont
2175 * Functionality: Function to decode DU to CU RRC container
2178 * RRC conatiner octect string to be decoded
2180 * @return ROK - success
2183 * ****************************************************************/
2184 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
2186 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
2187 asn_dec_rval_t rval; /* Decoder return value */
2189 /* Copy the received container to UeCb */
2190 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
2192 /* Decoding DU to CU RRC container octet string to cell group config */
2193 cellGrpCfgMsg = &cellGrpCfg;
2194 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
2196 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
2198 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2200 DU_LOG("\nERROR --> F1AP : ASN decode failed in extractDuToCuRrcCont");
2204 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
2206 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
2208 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2215 /*******************************************************************
2217 * @brief Function to build Initial UL RRC Message
2221 * Function : procInitULRRCMsg
2223 * Functionality: Function to build Initial UL RRC Message
2227 * @return ROK - success
2230 * ****************************************************************/
2232 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2234 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2236 uint16_t cellIdx=0, nrCellId = 0;
2241 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2243 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2245 SEARCH_DU_DB(duIdx, duId, duDb);
2246 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2248 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2250 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2252 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2253 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2256 case ProtocolIE_ID_id_NRCGI:
2257 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2258 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2263 case ProtocolIE_ID_id_C_RNTI:
2264 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2265 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2267 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2268 memset(ueCb, 0, sizeof(CuUeCb));
2269 ueCb->cellCb = cellCb;
2270 ueCb->crnti = crnti;
2271 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2272 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2273 ueCb->state = UE_ATTACH_IN_PROGRESS;
2276 cellCb->ueCb[cellCb->numUe] = ueCb;
2281 case ProtocolIE_ID_id_RRCContainer:
2284 case ProtocolIE_ID_id_DUtoCURRCContainer:
2286 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2287 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2289 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2290 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2291 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2292 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2294 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2295 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2296 ueCb->f1apMsgDb.duToCuContainer.size);
2298 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2300 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2306 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2313 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2322 ueCb->f1apMsgDb.dlRrcMsgCount++;
2323 rrcMsgType = setDlRRCMsgType(ueCb);
2324 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2329 /*******************************************************************
2331 * @brief Builds Nrcgi
2335 * Function : BuildNrcgi
2337 * Functionality: Building the PLMN ID and NR Cell id
2339 * @params[in] NRCGI_t *nrcgi
2340 * @return ROK - success
2343 * ****************************************************************/
2344 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2347 uint8_t unused_bits = 4;
2348 uint8_t byteSize = 5;
2350 /* Allocate Buffer Memory */
2351 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2352 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2353 if(nrcgi->pLMN_Identity.buf == NULLP)
2357 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2363 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2364 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2365 if(nrcgi->nRCellIdentity.buf == NULLP)
2369 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2373 /*******************************************************************
2375 * @brief Builds Special cell list for UE Setup Request
2379 * Function : BuildSplCellList
2381 * Functionality: Constructs the Special Cell list for UESetReq
2383 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2385 * @return ROK - success
2388 * ****************************************************************/
2389 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2395 spCellLst->list.count = cellCnt;
2396 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2397 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2398 if(spCellLst->list.array == NULLP)
2402 for(idx=0; idx<cellCnt; idx++)
2404 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2405 if(spCellLst->list.array[idx] == NULLP)
2411 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2412 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2413 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2415 /* Special Cell ID -NRCGI */
2416 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2421 /*Special Cell Index*/
2422 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2424 }/* End of BuildSplCellList*/
2426 /*******************************************************************
2428 * @brief Builds SRBS to be setup
2432 * Function : BuildSRBSetup
2434 * Functionality: Constructs the SRB's for UESetReq
2436 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2438 * @return ROK - success
2441 * ****************************************************************/
2442 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2447 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2448 srbCnt = ueCb->numSrb;
2451 srbSet->list.count = srbCnt;
2452 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2453 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2454 if(srbSet->list.array == NULLP)
2456 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2460 for(idx=0; idx<srbCnt; idx++)
2462 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2463 if(srbSet->list.array[idx] == NULLP)
2465 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2470 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2473 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2474 srbSet->list.array[idx]->criticality = Criticality_ignore;
2475 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2476 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2477 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2482 for(idx=0; idx<srbCnt; idx++)
2484 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2485 srbSet->list.array[idx]->criticality = Criticality_ignore;
2486 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2487 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2491 }/* End of BuildSRBSetup*/
2493 /*******************************************************************
2495 * @brief Builds QOS Info for DRB Setum Item
2499 * Function : BuildQOSInfo
2501 * Functionality: Constructs the QOS Info for DRB Setup Item
2503 * @params[in] QoSInformation_t *qosinfo
2504 * int16_t pduSessionID
2506 * @return ROK - success
2509 * ****************************************************************/
2510 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2512 uint8_t elementCnt = 0, qosCntIdx = 0;
2513 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2515 /* NonDynamic5QIDescriptor */
2516 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2517 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2518 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2524 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2528 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2529 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2531 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2533 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2539 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2540 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2544 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2545 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2547 /*MaxDataBurstVolume*/
2548 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2549 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2553 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2554 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2557 /*nRGRAN Allocation Retention Priority*/
2560 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2561 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2562 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2566 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2567 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2568 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2570 qosInfo->priorityLevel = PriorityLevel_lowest;
2571 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2572 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2575 /* PDU session ID */
2578 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2579 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2581 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2585 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2586 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2590 elementCnt = NUM_QOS_EXT;
2591 qosIeExt->list.count = elementCnt;
2592 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2594 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2595 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2597 if(qosIeExt->list.array == NULLP)
2599 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2603 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2605 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2606 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2608 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2611 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2612 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2613 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2614 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2615 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2616 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2617 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2618 qosInfo->pduSessionId = pduSessionID;
2623 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2628 }/*End of BuildQOSInfo*/
2630 /*******************************************************************
2632 * @brief Builds SNSSAI
2636 * Function : BuildSNSSAI
2638 * Functionality: Constructs the SNSSAI For DRB list
2640 * @params[in] SNSSAI_t *snssai
2641 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2643 * @return ROK - success
2646 * ****************************************************************/
2647 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2651 snssai->sST.size = sizeof(uint8_t);
2652 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2653 if(snssai->sST.buf == NULLP)
2658 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2660 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2663 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2664 if(snssai->sD == NULLP)
2668 snssai->sD->size = 3 * sizeof(uint8_t);
2669 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2670 if(snssai->sD->buf == NULLP)
2675 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2677 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2680 drbInfo->snssai = snssaiToCopy;
2682 }/*End of BuildSNSSAI*/
2684 /*******************************************************************
2686 * @brief Builds the flow map.
2690 * Function : BuildFlowsMap
2692 * Functionality: Constructs the flowmap For DRB list
2694 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2696 * @return ROK - success
2699 * ****************************************************************/
2700 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2702 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2703 FlowsMapped *qosFlow;
2708 flowCnt = drbInfo->numFlowMap;
2709 flowMap->list.count = flowCnt;
2710 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2711 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2712 if(flowMap->list.array == NULLP)
2714 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2717 for(idx=0; idx<flowCnt; idx++)
2719 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2720 if(flowMap->list.array[idx] == NULLP)
2722 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2728 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2729 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2731 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2733 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2735 qosFlow = &drbInfo->flowMapList[flowIdx];
2742 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2743 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2748 qosFlow = &drbInfo->flowMapList[idx];
2749 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2752 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2753 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2756 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2760 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2761 drbInfo->numFlowMap++;
2764 }/*End of BuildFlowsMap*/
2766 /*******************************************************************
2768 * @brief Builds the Uplink Tunnel Info
2772 * Function : BuildULTnlInfo
2774 * Functionality: Constructs the UL TnlInfo For DRB list
2776 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2778 * @return ROK - success
2781 * ****************************************************************/
2782 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2788 ulInfo->list.count = ulCnt;
2789 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2790 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2791 if(ulInfo->list.array == NULLP)
2793 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2796 for(idx=0; idx<ulCnt; idx++)
2798 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2799 if(ulInfo->list.array[idx] == NULLP)
2801 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2806 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2808 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2809 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2811 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2814 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2815 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2816 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2817 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2819 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2825 /* NOTE: Below IP address must be changed if running on different IP configuration */
2826 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2827 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2828 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2829 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2830 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2832 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2833 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2834 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2835 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2839 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2840 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2841 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2842 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2843 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2847 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2848 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2849 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2850 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2852 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2858 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2859 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2860 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2861 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2863 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2864 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2865 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2866 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2870 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2871 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2872 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2873 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2876 }/*End of BuildULTnlInfo*/
2878 /*******************************************************************
2880 * @brief Builds DRBS to be setup
2884 * Function : BuildDRBSetup
2886 * Functionality: Constructs the DRB's for UESetReq
2888 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2890 * @return ROK - success
2893 * ****************************************************************/
2894 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2896 uint16_t snssaiIdx=0;
2897 uint8_t idx = 0, extIeIdx = 0;
2898 uint8_t elementCnt = 0, drbCnt = 0;
2899 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2900 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2901 DRBs_ToBeSetup_Item_t *drbSetItem;
2902 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2903 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2905 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2906 drbCnt = ueCb->numDrb;
2908 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2909 drbSet->list.count = drbCnt;
2911 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2912 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2913 if(drbSet->list.array == NULLP)
2915 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2919 for(idx=0; idx<drbCnt; idx++)
2921 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2922 if(drbSet->list.array[idx] == NULLP)
2924 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2928 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2929 drbSet->list.array[idx]->criticality = Criticality_ignore;
2930 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2931 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2933 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2935 drbSetItem->dRBID = idx + 1;
2936 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2939 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2942 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2943 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2944 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2946 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2949 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2950 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2951 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2952 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2953 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2954 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2956 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2957 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2958 if(BuildQOSInforet != ROK)
2960 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2965 snssaiIdx = (idx% cuCb.numSnssaiSupported);
2966 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2967 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2968 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
2970 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2971 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
2972 if(BuildSNSSAIret != ROK)
2974 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2978 /*Flows mapped to DRB List*/
2979 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2980 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2981 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2983 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2984 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2985 if(BuildFlowsMapret != ROK)
2987 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2991 /*ULUPTNLInformation To Be Setup List*/
2992 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2993 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2996 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2998 if(BuildULTnlInforet != ROK)
3000 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
3005 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3007 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3008 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
3011 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
3013 /* DL PDCP SN Length */
3014 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
3016 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
3017 if(!drbToBeSetupExt)
3019 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
3024 drbToBeSetupExt->list.count = elementCnt;
3025 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
3027 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
3028 if(!drbToBeSetupExt->list.array)
3030 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
3034 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
3036 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
3037 if(!drbToBeSetupExt->list.array[extIeIdx])
3039 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
3045 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
3047 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
3048 drbToBeSetupExtIe->criticality = Criticality_ignore;
3049 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
3050 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
3051 drbSetItem->iE_Extensions = drbToBeSetupExt;
3054 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
3058 }/* End of BuildDRBSetup*/
3060 /*******************************************************************
3062 * @brief Deallocating memory of function BuildAndSendUESetReq
3066 * Function : FreeNrcgi
3068 * Functionality: Deallocating memory for function BuildNrcgi
3070 * @params[in] NRCGI_t *nrcgi
3074 *******************************************************************/
3075 void FreeNrcgi(NRCGI_t *nrcgi)
3077 if(nrcgi->pLMN_Identity.buf != NULLP)
3079 if(nrcgi->nRCellIdentity.buf != NULLP)
3081 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3083 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3086 /*******************************************************************
3088 * @brief Deallocating memory of function BuildAndSendUESetReq
3092 * Function : FreeSplCellList
3094 * Functionality: Deallocating memory for function BuildSplCellList
3096 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3101 * *****************************************************************/
3102 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3105 if(spCellLst->list.array != NULLP)
3107 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3109 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3111 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3113 if(spCellLst->list.array[cellidx]!=NULLP)
3115 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3118 CU_FREE(spCellLst->list.array,spCellLst->list.size);
3121 /*******************************************************************
3123 * @brief Deallocating memory of function BuildAndSendUESetReq
3127 * Function : FreeSRBSetup
3129 * Functionality: Deallocating memory for function BuildSRBSetup
3131 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3136 * ******************************************************************/
3137 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3140 if(srbSet->list.array != NULLP)
3142 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3144 if(srbSet->list.array[srbidx]!=NULLP)
3146 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3149 CU_FREE(srbSet->list.array,srbSet->list.size);
3152 /*******************************************************************
3154 * @brief Deallocating memory of function BuildAndSendUESetReq
3158 * Function : FreeQOSInfo
3160 * Functionality: Deallocating memory for function BuildQOSInfo
3162 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3166 * ****************************************************************/
3167 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3169 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3170 uint8_t qosCntIdx = 0;
3172 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3174 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3176 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3178 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3179 sizeof(MaxDataBurstVolume_t));
3181 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3182 sizeof(AveragingWindow_t));
3184 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3185 sizeof(NonDynamic5QIDescriptor_t));
3187 if(drbQos->iE_Extensions)
3189 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
3190 if(qosIeExt->list.array != NULLP)
3192 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3194 if(qosIeExt->list.array[qosCntIdx])
3196 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3199 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3202 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3205 /*******************************************************************
3207 * @brief Deallocating memory of function BuildAndSendUESetReq
3211 * Function : FreeULTnlInfo
3213 * Functionality: Deallocating memory for function BuildULTnlInfo
3215 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3220 * ****************************************************************/
3221 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3224 if(ulInfo->list.array != NULLP)
3226 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3228 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3230 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3232 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3233 transportLayerAddress.buf != NULLP)
3235 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3238 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3239 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3240 gTPTunnel->gTP_TEID.size);
3242 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3243 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3244 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3246 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3247 sizeof(GTPTunnel_t));
3250 if(ulInfo->list.array[ulidx]!=NULLP)
3252 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3255 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3258 /*******************************************************************
3260 * @brief Deallocating memory for BuildAndSendUESetReq
3264 * Function : FreeDRBSetup
3266 * Functionality: Deallocating memory for BuildDRBSetup
3268 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3272 * ****************************************************************/
3273 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3275 DRBs_ToBeSetup_Item_t *drbSetItem;
3276 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3278 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3280 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3281 if(drbSet->list.array != NULLP)
3283 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3285 if(drbSet->list.array[drbidx] != NULLP)
3287 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3288 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3290 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3291 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3293 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3294 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3296 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3297 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3299 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3301 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3303 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3305 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3306 flows_Mapped_To_DRB_List.list.array != NULLP)
3308 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3309 flows_Mapped_To_DRB_List.list.count; flowidx++)
3311 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3312 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3314 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3315 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3316 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3318 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3319 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3320 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3322 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3323 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3324 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3326 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3327 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3329 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3330 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3331 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3332 sizeof(MaxDataBurstVolume_t));
3334 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3335 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3336 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3338 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3339 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3340 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3343 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3344 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3346 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3347 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3350 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3351 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3352 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3354 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3355 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3357 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3358 sizeof(OCTET_STRING_t));
3360 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3361 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3363 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3364 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3366 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3367 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3369 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3370 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3372 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3373 iE_Extensions != NULLP)
3375 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3376 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3377 if(qosIeExt->list.array != NULLP)
3379 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3381 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3383 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3386 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3388 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3389 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3392 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3394 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3397 CU_FREE(drbSet->list.array,drbSet->list.size);
3402 /*******************************************************************
3404 * @brief Free the UE Setup Request
3408 * Function : FreeUeContextSetupReq
3410 * Functionality: Deallocate the memory of BuildUESetReq
3412 * @params[in] F1AP_PDU_t *f1apMsg
3417 * ****************************************************************/
3418 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3421 UEContextSetupRequest_t *ueSetReq = NULLP;
3423 if(f1apMsg != NULLP)
3425 if(f1apMsg->choice.initiatingMessage != NULLP)
3427 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3428 if(ueSetReq->protocolIEs.list.array != NULLP)
3430 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3432 if(ueSetReq->protocolIEs.list.array[idx])
3434 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3436 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3438 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3440 case ProtocolIE_ID_id_SpCell_ID:
3441 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3443 case ProtocolIE_ID_id_ServCellIndex:
3445 case ProtocolIE_ID_id_SpCellULConfigured:
3447 case ProtocolIE_ID_id_CUtoDURRCInformation:
3448 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3450 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3451 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3453 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3454 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3456 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3457 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3459 case ProtocolIE_ID_id_RRCContainer:
3460 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3462 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3463 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3466 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3467 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3468 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3471 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3475 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3477 for(ieId=0; ieId<idx; ieId++)
3479 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3481 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3484 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3486 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3488 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3492 /**Filling cell group info **/
3493 /*******************************************************************
3495 * @brief Build Control resource set to add/modify list
3499 * Function : BuildControlRSetToAddModList
3501 * Functionality: Build Control resource set to add/modify list
3504 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3506 * @return ROK - success
3509 * ****************************************************************/
3510 uint8_t BuildControlRSetToAddModList
3512 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3517 uint8_t numBytes, bitsUnused;
3518 struct ControlResourceSet *controlRSet;
3519 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3520 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3523 controlRSetList->list.count = elementCnt;
3524 controlRSetList->list.size = \
3525 elementCnt * sizeof(struct ControlResourceSet *);
3527 controlRSetList->list.array = NULLP;
3528 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3529 if(!controlRSetList->list.array)
3531 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3535 for(idx = 0; idx < elementCnt; idx++)
3537 controlRSetList->list.array[idx] = NULLP;
3538 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3539 if(!controlRSetList->list.array[idx])
3541 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3547 controlRSet = controlRSetList->list.array[idx];
3548 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3550 /* Values harcoded according to our design:
3553 * Bit string stored ff0000000000
3557 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3558 controlRSet->frequencyDomainResources.buf = NULLP;
3559 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3560 controlRSet->frequencyDomainResources.size);
3561 if(!controlRSet->frequencyDomainResources.buf)
3563 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3567 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3568 coreset0EndPrb = CORESET0_END_PRB;
3569 coreset1StartPrb = coreset0EndPrb + 6;
3570 coreset1NumPrb = CORESET1_NUM_PRB;
3571 /* calculate the PRBs */
3572 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3573 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3574 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3576 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3577 controlRSet->cce_REG_MappingType.present = \
3578 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3580 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3581 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3582 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3583 controlRSet->tci_PresentInDCI = NULLP;
3585 uint8_t tciStateIdx;
3587 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3588 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3589 if(!controlRset->tci_StatesPDCCH_ToAddList)
3591 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3596 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3597 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3598 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3599 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3600 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3602 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3606 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3608 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3609 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3611 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3618 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3620 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3621 if(!controlRset->tci_PresentInDCI)
3623 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3627 *(controlRset->tci_PresentInDCI);
3630 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3631 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3632 if(!controlRSet->pdcch_DMRS_ScramblingID)
3634 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3637 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3640 } /* End BuildControlRSetToAddModList */
3642 /*******************************************************************
3644 * @brief Build search space to add/modify list
3648 * Function : BuildSearchSpcToAddModList
3650 * Functionality: Build search space to add/modify list
3653 * @return ROK - success
3656 * ****************************************************************/
3657 uint8_t BuildSearchSpcToAddModList
3659 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3667 struct SearchSpace *searchSpc;
3670 searchSpcList->list.count = elementCnt;
3671 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3673 searchSpcList->list.array = NULLP;
3674 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3675 if(!searchSpcList->list.array)
3677 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3681 for(idx = 0; idx < elementCnt; idx++)
3683 searchSpcList->list.array[idx] = NULLP;
3684 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3685 if(!searchSpcList->list.array[idx])
3687 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3693 searchSpc = searchSpcList->list.array[idx];
3695 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3697 searchSpc->controlResourceSetId = NULLP;
3698 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3699 if(!searchSpc->controlResourceSetId)
3701 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3704 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3706 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3707 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3708 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3709 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3711 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3714 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3715 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3717 searchSpc->duration = NULLP;
3718 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3719 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3720 if(!searchSpc->monitoringSymbolsWithinSlot)
3722 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3726 /* Values taken from reference logs :
3729 * Bit string stores 8000
3734 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3735 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3736 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3737 searchSpc->monitoringSymbolsWithinSlot->size);
3738 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3740 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3745 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3746 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3747 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3748 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3750 searchSpc->nrofCandidates = NULLP;
3751 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3752 if(!searchSpc->nrofCandidates)
3754 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3758 searchSpc->nrofCandidates->aggregationLevel1 = \
3759 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3760 searchSpc->nrofCandidates->aggregationLevel2 = \
3761 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3762 searchSpc->nrofCandidates->aggregationLevel4 = \
3763 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3764 searchSpc->nrofCandidates->aggregationLevel8 = \
3765 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3766 searchSpc->nrofCandidates->aggregationLevel16 = \
3767 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3769 searchSpc->searchSpaceType = NULLP;
3770 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3771 if(!searchSpc->searchSpaceType)
3773 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3777 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3779 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3780 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3781 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3782 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3784 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3787 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3788 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3791 }/* End BuildSearchSpcToAddModList */
3793 /*******************************************************************
3795 * @brief Builds BWP DL dedicated PDCCH config
3799 * Function : BuildBWPDlDedPdcchCfg
3801 * Functionality: Builds BWP DL dedicated PDCCH config
3803 * @params[in] struct PDCCH_Config *pdcchCfg
3805 * @return ROK - success
3808 * ****************************************************************/
3809 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3811 pdcchCfg->controlResourceSetToAddModList = NULLP;
3812 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3813 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3814 if(!pdcchCfg->controlResourceSetToAddModList)
3816 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3820 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3825 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3827 pdcchCfg->searchSpacesToAddModList = NULLP;
3828 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3829 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3830 if(!pdcchCfg->searchSpacesToAddModList)
3832 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3836 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3841 pdcchCfg->searchSpacesToReleaseList = NULLP;
3842 pdcchCfg->downlinkPreemption = NULLP;
3843 pdcchCfg->tpc_PUSCH = NULLP;
3844 pdcchCfg->tpc_PUCCH = NULLP;
3845 pdcchCfg->tpc_SRS = NULLP;
3850 /*******************************************************************
3852 * @brief Builds DMRS DL PDSCH Mapping type A
3856 * Function : BuildDMRSDLPdschMapTypeA
3858 * Functionality: Builds DMRS DL PDSCH Mapping type A
3861 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3862 * @return ROK - success
3865 * ****************************************************************/
3866 uint8_t BuildDMRSDLPdschMapTypeA
3868 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3871 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3872 dmrsDlCfg->choice.setup = NULLP;
3873 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3874 if(!dmrsDlCfg->choice.setup)
3876 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3880 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3881 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3882 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3883 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3885 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3888 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3890 dmrsDlCfg->choice.setup->maxLength = NULLP;
3891 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3892 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3893 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3898 /*******************************************************************
3900 * @brief Builds TCI states to add/modify list
3904 * Function : BuildTCIStatesToAddModList
3906 * Functionality:Builds TCI states to add/modify list
3909 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3911 * @return ROK - success
3914 * ****************************************************************/
3915 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3920 /*******************************************************************
3922 * @brief Builds PDSCH time domain allocation list
3926 * Function : BuildPdschTimeDomAllocList
3928 * Functionality: Builds PDSCH time domain allocation list
3931 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3933 * @return ROK - success
3936 * ****************************************************************/
3937 uint8_t BuildPdschTimeDomAllocList
3939 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3944 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3946 timeDomAllocList->present = \
3947 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3949 timeDomAllocList->choice.setup = NULLP;
3950 CU_ALLOC(timeDomAllocList->choice.setup, \
3951 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3952 if(!timeDomAllocList->choice.setup)
3954 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3959 timeDomAllocList->choice.setup->list.count = elementCnt;
3960 timeDomAllocList->choice.setup->list.size = \
3961 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3963 timeDomAllocList->choice.setup->list.array = NULLP;
3964 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3965 timeDomAllocList->choice.setup->list.size);
3966 if(!timeDomAllocList->choice.setup->list.array)
3968 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3972 for(idx = 0; idx < elementCnt; idx++)
3974 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3975 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3976 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3977 if(!timeDomAllocList->choice.setup->list.array[idx])
3979 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3985 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3986 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3987 if(!timeDomAlloc->k0)
3989 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3992 *(timeDomAlloc->k0) = 0;
3993 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3994 timeDomAlloc->startSymbolAndLength = 66;
3997 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3998 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3999 if(!timeDomAlloc->k0)
4001 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4004 *(timeDomAlloc->k0) = 1;
4005 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4006 timeDomAlloc->startSymbolAndLength = 66;
4011 /*******************************************************************
4013 * @brief Builds PDSCH PRB Bundling type
4017 * Function : BuildPdschPrbBundlingType
4019 * Functionality: Builds PDSCH PRB Bundling type
4022 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4024 * @return ROK - success
4027 * ****************************************************************/
4028 uint8_t BuildPdschPrbBundlingType
4030 struct PDSCH_Config__prb_BundlingType *prbBndlType
4033 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4035 prbBndlType->choice.staticBundling = NULLP;
4036 CU_ALLOC(prbBndlType->choice.staticBundling, \
4037 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4038 if(!prbBndlType->choice.staticBundling)
4040 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4043 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4048 /*******************************************************************
4050 * @brief Builds BWP DL dedicated PDSCH config
4054 * Function : BuildBWPDlDedPdschCfg
4056 * Functionality: Builds BWP DL dedicated PDSCH config
4058 * @params[in] struct PDSCH_Config *pdschCfg
4060 * @return ROK - success
4063 * ****************************************************************/
4064 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
4066 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4068 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4069 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4070 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4071 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4073 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4077 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4082 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4083 pdschCfg->tci_StatesToAddModList = NULLP;
4084 pdschCfg->tci_StatesToReleaseList = NULLP;
4085 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4087 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4088 if(!pdschCfg->tci_StatesToAddModList)
4090 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4093 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4099 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4101 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4102 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
4103 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4104 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4106 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4109 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4113 pdschCfg->pdsch_AggregationFactor = NULLP;
4114 pdschCfg->rateMatchPatternToAddModList = NULLP;
4115 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4116 pdschCfg->rateMatchPatternGroup1 = NULLP;
4117 pdschCfg->rateMatchPatternGroup2 = NULLP;
4118 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4119 pdschCfg->mcs_Table = NULLP;
4121 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4122 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4123 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4125 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4128 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4130 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
4135 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4136 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4137 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4138 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4139 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4140 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4141 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4146 /*******************************************************************
4148 * @brief Builds intitial DL BWP
4151 * Function : BuildInitialDlBWP
4153 * Functionality: Builds intitial DL BWP in spCellCfgDed
4155 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4157 * @return ROK - success
4160 * ****************************************************************/
4161 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
4163 dlBwp->pdcch_Config = NULLP;
4164 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4165 if(!dlBwp->pdcch_Config)
4167 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4170 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4172 dlBwp->pdcch_Config->choice.setup = NULLP;
4173 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4174 if(!dlBwp->pdcch_Config->choice.setup)
4176 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4179 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
4184 dlBwp->pdsch_Config = NULLP;
4185 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4186 if(!dlBwp->pdsch_Config)
4188 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4191 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4193 dlBwp->pdsch_Config->choice.setup = NULLP;
4194 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4195 if(!dlBwp->pdsch_Config->choice.setup)
4197 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4201 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4206 dlBwp->sps_Config = NULLP;
4207 dlBwp->radioLinkMonitoringConfig = NULLP;
4211 /*******************************************************************
4213 * @brief Builds DMRS UL Pusch Mapping type A
4217 * Function : BuildDMRSULPuschMapTypeA
4219 * Functionality: Builds DMRS UL Pusch Mapping type A
4222 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4223 * @return ROK - success
4226 * ****************************************************************/
4227 uint8_t BuildDMRSULPuschMapTypeA
4229 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4232 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4233 dmrsUlCfg->choice.setup= NULLP;
4234 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4235 if(!dmrsUlCfg->choice.setup)
4237 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4241 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4242 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4243 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4244 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4246 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4249 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4251 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4252 dmrsUlCfg->choice.setup->maxLength = NULLP;
4253 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4254 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4255 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4256 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4258 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4262 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4263 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4265 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4267 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4270 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4272 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4273 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4277 /*******************************************************************
4279 * @brief Build PUSCH time domain allocation list
4283 * Function : BuildPuschTimeDomAllocList
4285 * Functionality: Build PUSCH time domain allocation list
4288 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4290 * @return ROK - success
4293 * ****************************************************************/
4294 uint8_t BuildPuschTimeDomAllocList
4296 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4301 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4303 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4304 timeDomAllocList->choice.setup = NULLP;
4305 CU_ALLOC(timeDomAllocList->choice.setup, \
4306 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4307 if(!timeDomAllocList->choice.setup)
4309 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4314 timeDomAllocList->choice.setup->list.count = elementCnt;
4315 timeDomAllocList->choice.setup->list.size = \
4316 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4317 timeDomAllocList->choice.setup->list.array = NULLP;
4318 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4319 timeDomAllocList->choice.setup->list.size);
4320 if(!timeDomAllocList->choice.setup->list.array)
4322 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4326 for(idx = 0; idx < elementCnt; idx++)
4328 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4329 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4330 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4331 if(!timeDomAllocList->choice.setup->list.array[idx])
4333 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4339 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4340 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4341 if(!timeDomAlloc->k2)
4343 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4346 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4347 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4348 timeDomAlloc->startSymbolAndLength = 66;
4351 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4352 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4353 if(!timeDomAlloc->k2)
4355 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4358 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4359 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4360 timeDomAlloc->startSymbolAndLength = 66;
4365 /*******************************************************************
4367 * @brief Builds BWP UL dedicated PUSCH Config
4371 * Function : BuildBWPUlDedPuschCfg
4374 * Builds BWP UL dedicated PUSCH Config
4376 * @params[in] : PUSCH_Config_t *puschCfg
4378 * @return ROK - success
4381 * ****************************************************************/
4382 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4384 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4385 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4386 if(!puschCfg->dataScramblingIdentityPUSCH)
4388 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4391 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4393 puschCfg->txConfig = NULLP;
4394 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4395 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4396 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4397 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4399 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4403 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4408 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4409 puschCfg->pusch_PowerControl = NULLP;
4410 puschCfg->frequencyHopping = NULLP;
4411 puschCfg->frequencyHoppingOffsetLists = NULLP;
4412 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4414 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4415 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4416 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4417 if(!puschCfg->pusch_TimeDomainAllocationList)
4419 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4423 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4428 puschCfg->pusch_AggregationFactor = NULLP;
4429 puschCfg->mcs_Table = NULLP;
4430 puschCfg->mcs_TableTransformPrecoder = NULLP;
4431 puschCfg->transformPrecoder = NULLP;
4432 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4433 if(!puschCfg->transformPrecoder)
4435 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4438 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4440 puschCfg->codebookSubset = NULLP;
4441 puschCfg->maxRank = NULLP;
4442 puschCfg->rbg_Size = NULLP;
4443 puschCfg->uci_OnPUSCH = NULLP;
4444 puschCfg->tp_pi2BPSK = NULLP;
4449 /*******************************************************************
4451 * @brief Builds BWP UL dedicated PUCCH Config
4455 * Function : BuildBWPUlDedPucchCfg
4458 * Builds BWP UL dedicated PUCCH Config
4460 * @params[in] : PUCCH_Config_t *pucchCfg
4462 * @return ROK - success
4465 * ****************************************************************/
4466 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4468 uint8_t arrIdx, elementCnt;
4469 uint8_t rsrcIdx, rsrcSetIdx;
4470 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4471 PUCCH_Resource_t *rsrc = NULLP;
4475 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4476 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4477 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4478 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4479 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4481 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4484 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4485 rsrcSet->pucch_ResourceSetId = 1;
4487 rsrcSet->resourceList.list.count = elementCnt;
4488 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4489 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4490 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4492 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4495 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4499 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4500 pucchCfg->resourceToAddModList->list.count = elementCnt;
4501 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4502 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4503 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4505 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4508 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4509 rsrc->pucch_ResourceId = 1;
4510 rsrc->startingPRB = 0;
4511 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4512 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4513 rsrc->format.choice.format1->initialCyclicShift = 0;
4514 rsrc->format.choice.format1->nrofSymbols = 4;
4515 rsrc->format.choice.format1->startingSymbolIndex = 0;
4516 rsrc->format.choice.format1->timeDomainOCC = 0;
4519 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4520 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4521 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4522 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4523 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4526 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4527 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4529 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4534 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4535 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4536 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4537 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4539 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4543 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4545 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4546 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4548 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4554 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4555 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4560 /*******************************************************************
4562 * @brief Fills SRS resource to add/modify list
4566 * Function : BuildSrsRsrcAddModList
4568 * Functionality: Fills SRS resource to add/modify list
4571 * @return ROK - success
4574 * ****************************************************************/
4575 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4581 resourceList->list.count = elementCnt;
4582 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4583 resourceList->list.array = NULLP;
4584 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4585 if(!resourceList->list.array)
4587 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4591 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4593 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4594 if(!resourceList->list.array[rsrcIdx])
4596 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4602 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4603 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4604 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4606 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4607 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4608 sizeof(struct SRS_Resource__transmissionComb__n2));
4609 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4611 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4614 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4615 = SRS_COMB_OFFSET_N2;
4616 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4617 = SRS_CYCLIC_SHIFT_N2;
4619 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4620 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4621 SRS_Resource__resourceMapping__nrofSymbols_n1;
4622 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4623 SRS_Resource__resourceMapping__repetitionFactor_n1;
4625 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4626 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4627 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4628 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4629 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4630 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4631 SRS_Resource__groupOrSequenceHopping_neither;
4633 /* Setting resource type to aperiodic for intergration purposes */
4634 resourceList->list.array[rsrcIdx]->resourceType.present = \
4635 SRS_Resource__resourceType_PR_aperiodic;
4636 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4637 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4638 sizeof(struct SRS_Resource__resourceType__aperiodic));
4639 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4641 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4644 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4649 /*******************************************************************
4651 * @brief Build SRS resource set Add/mod list
4655 * Function : BuildSrsRsrcSetAddModList
4657 * Functionality: Build SRS resource set Add/mod list
4660 * @return ROK - success
4663 * ****************************************************************/
4664 uint8_t BuildSrsRsrcSetAddModList
4666 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4672 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4675 rsrcSetList->list.count = elementCnt;
4676 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4677 rsrcSetList->list.array = NULLP;
4678 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4679 if(!rsrcSetList->list.array)
4681 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4685 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4687 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4688 if(!rsrcSetList->list.array[rSetIdx])
4690 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4696 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4698 /* Fill Resource Id list in resource set */
4699 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4700 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4701 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4702 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4704 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4709 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4710 rsrcIdList->list.count = elementCnt;
4711 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4712 rsrcIdList->list.array = NULLP;
4713 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4714 if(!rsrcIdList->list.array)
4716 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4720 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4722 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4723 if(!rsrcIdList->list.array[rsrcIdx])
4725 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4731 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4733 /* Fill resource type */
4734 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4735 SRS_ResourceSet__resourceType_PR_aperiodic;
4737 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4738 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4739 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4740 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4742 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4745 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4746 = APERIODIC_SRS_RESRC_TRIGGER;
4748 /* TODO : Fill values for below IEs as expected by Viavi */
4749 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4750 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4753 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4754 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4755 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4756 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4757 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4762 /*******************************************************************
4764 * @brief Builds BWP UL dedicated SRS Config
4768 * Function : BuildBWPUlDedSrsCfg
4770 * Functionality: Builds BWP UL dedicated SRS Config
4772 * @params[in] SRS Config
4773 * @return ROK - success
4776 * ****************************************************************/
4777 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4779 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4780 srsCfg->srs_ResourceSetToAddModList = NULLP;
4781 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4782 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4783 if(!srsCfg->srs_ResourceSetToAddModList)
4785 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4788 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4793 srsCfg->srs_ResourceToReleaseList = NULLP;
4795 /* Resource to Add/Modify list */
4796 srsCfg->srs_ResourceToAddModList = NULLP;
4797 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4798 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4799 if(!srsCfg->srs_ResourceToAddModList)
4801 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4805 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4810 srsCfg->tpc_Accumulation = NULLP;
4815 /*******************************************************************
4817 * @brief Builds inital UL BWP
4821 * Function : BuildInitialUlBWP
4823 * Functionality: Builds initial UL BWP
4825 * @params[in] BWP_UplinkDedicated_t *ulBwp
4826 * @return ROK - success
4829 * ****************************************************************/
4830 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4832 ulBwp->pucch_Config = NULLP;
4833 ulBwp->pucch_Config = NULLP;
4834 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4835 if(!ulBwp->pucch_Config)
4837 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4841 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4842 ulBwp->pucch_Config->choice.setup = NULLP;
4843 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4844 if(!ulBwp->pucch_Config->choice.setup)
4846 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4850 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4855 /* Fill BWP UL dedicated PUSCH config */
4856 ulBwp->pusch_Config = NULLP;
4857 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4858 if(!ulBwp->pusch_Config)
4860 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4864 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4865 ulBwp->pusch_Config->choice.setup = NULLP;
4866 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4867 if(!ulBwp->pusch_Config->choice.setup)
4869 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4873 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4878 ulBwp->configuredGrantConfig = NULLP;
4880 /* Fill BPW UL dedicated SRS config */
4881 ulBwp->srs_Config = NULLP;
4882 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4883 if(!ulBwp->srs_Config)
4885 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4889 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4890 ulBwp->srs_Config->choice.setup = NULLP;
4891 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4892 if(!ulBwp->srs_Config->choice.setup)
4894 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4898 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4903 ulBwp->beamFailureRecoveryConfig = NULLP;
4908 /*******************************************************************
4910 * @brief Builds Pusch Serving cell Config
4914 * Function : BuildPuschSrvCellCfg
4916 * Functionality: Builds Pusch Serving cell Config
4918 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4920 * @return ROK - success
4923 * ****************************************************************/
4924 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4926 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4927 puschCfg->choice.setup = NULLP;
4928 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4929 if(!puschCfg->choice.setup)
4931 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4935 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4936 puschCfg->choice.setup->rateMatching = NULLP;
4937 puschCfg->choice.setup->xOverhead = NULLP;
4938 puschCfg->choice.setup->ext1 = NULLP;
4939 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4940 if(!puschCfg->choice.setup->ext1)
4942 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4946 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4947 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4948 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4950 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4953 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4955 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4956 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4957 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4959 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4962 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4966 /*******************************************************************
4968 * @brief Builds UL config
4971 * Function : BuildUlCfg
4973 * Functionality: Builds UL config in spCellCfgDed
4975 * @params[in] UplinkConfig_t *ulCfg
4977 * @return ROK - success
4980 * ****************************************************************/
4981 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4983 ulCfg->initialUplinkBWP = NULLP;
4984 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4985 if(!ulCfg->initialUplinkBWP)
4987 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4991 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4996 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4997 ulCfg->uplinkBWP_ToAddModList = NULLP;
4998 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4999 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5000 if(!ulCfg->firstActiveUplinkBWP_Id)
5002 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5005 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5007 ulCfg->pusch_ServingCellConfig = NULLP;
5008 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
5009 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5010 if(!ulCfg->pusch_ServingCellConfig)
5012 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5016 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5021 ulCfg->carrierSwitching = NULLP;
5022 ulCfg->ext1 = NULLP;
5026 /*******************************************************************
5028 * @brief Builds PDSCH serving cell config
5031 * Function : BuildPdschSrvCellCfg
5033 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5035 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5037 * @return ROK - success
5040 * ****************************************************************/
5041 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5043 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5044 pdschCfg->choice.setup = NULLP;
5045 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5046 if(!pdschCfg->choice.setup)
5048 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5052 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5053 pdschCfg->choice.setup->xOverhead = NULLP;
5054 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5055 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5056 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5058 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5061 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
5062 pdschCfg->choice.setup->pucch_Cell = NULLP;
5063 pdschCfg->choice.setup->ext1 = NULLP;
5068 /*******************************************************************
5070 * @brief Builds CSI Meas config
5073 * Function : BuildCsiMeasCfg
5075 * Functionality: Builds CSI Meas config in spCellCfgDed
5077 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5079 * @return ROK - success
5082 * ****************************************************************/
5083 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5089 /*******************************************************************
5091 * @brief Builds Spcell config dedicated
5094 * Function : BuildSpCellCfgDed
5096 * Functionality: Builds sp cell config dedicated in spCellCfg
5098 * @params[in] ServingCellConfig_t srvCellCfg
5100 * @return ROK - success
5103 * ****************************************************************/
5104 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
5106 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
5108 srvCellCfg->initialDownlinkBWP = NULLP;
5109 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5110 if(!srvCellCfg->initialDownlinkBWP)
5112 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5116 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
5118 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
5121 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
5122 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
5124 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
5125 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5126 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
5128 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5131 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5133 srvCellCfg->bwp_InactivityTimer = NULLP;
5135 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
5136 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5137 if(!srvCellCfg->defaultDownlinkBWP_Id)
5139 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5142 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
5144 srvCellCfg->uplinkConfig = NULLP;
5145 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5146 if(!srvCellCfg->uplinkConfig)
5148 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5152 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
5154 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
5157 srvCellCfg->supplementaryUplink = NULLP;
5158 srvCellCfg->pdcch_ServingCellConfig = NULLP;
5160 srvCellCfg->pdsch_ServingCellConfig = NULLP;
5161 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
5162 if(!srvCellCfg->pdsch_ServingCellConfig)
5164 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5168 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
5170 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
5174 srvCellCfg->csi_MeasConfig = NULLP;
5176 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
5177 if(!srvCellCfg->csi_MeasConfig)
5179 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
5183 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
5185 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
5189 srvCellCfg->sCellDeactivationTimer = NULLP;
5190 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
5191 srvCellCfg->tag_Id = TAG_ID;
5192 srvCellCfg->dummy = NULLP;
5193 srvCellCfg->pathlossReferenceLinking = NULLP;
5194 srvCellCfg->servingCellMO = NULLP;
5195 srvCellCfg->ext1 = NULLP;
5199 /*******************************************************************
5201 * @brief Builds Spcell config
5205 * Function : BuildSpCellCfg
5207 * Functionality: Builds sp cell config in DuToCuRrcContainer
5209 * @params[in] SpCellConfig_t spCellCfg
5211 * @return ROK - success
5214 * ****************************************************************/
5215 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5218 spCellCfg->servCellIndex = NULLP;
5219 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5220 if(!spCellCfg->servCellIndex)
5222 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5225 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5227 spCellCfg->reconfigurationWithSync = NULLP;
5228 spCellCfg->rlf_TimersAndConstants = NULLP;
5229 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5230 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5231 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5233 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5236 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5238 spCellCfg->spCellConfigDedicated = NULLP;
5239 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5240 if(!spCellCfg->spCellConfigDedicated)
5242 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5245 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5247 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5252 /*******************************************************************
5254 * @brief Builds Phy cell group config
5258 * Function : BuildPhyCellGrpCfg
5260 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5262 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5264 * @return ROK - success
5267 * ****************************************************************/
5268 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5270 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5271 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5273 phyCellGrpCfg->p_NR_FR1 = NULLP;
5274 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5275 if(!phyCellGrpCfg->p_NR_FR1)
5277 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5280 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5281 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5282 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5283 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5284 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5285 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5286 phyCellGrpCfg->cs_RNTI = NULLP;
5287 phyCellGrpCfg->ext1 = NULLP;
5288 phyCellGrpCfg->ext2 = NULLP;
5293 /*******************************************************************
5295 * @brief Builds tag config
5299 * Function : BuildTagConfig
5301 * Functionality: Builds tag config in MacCellGroupConfig
5303 * @params[in] TAG_Config *tag_Config
5305 * @return ROK - success
5308 * ****************************************************************/
5309 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5311 struct TAG_Config__tag_ToAddModList *tagList;
5312 uint8_t idx, elementCnt;
5314 tagConfig->tag_ToReleaseList = NULLP;
5315 tagConfig->tag_ToAddModList = NULLP;
5316 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5317 if(!tagConfig->tag_ToAddModList)
5319 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5323 elementCnt = 1; //ODU_VALUE_ONE;
5324 tagList = tagConfig->tag_ToAddModList;
5325 tagList->list.count = elementCnt;
5326 tagList->list.size = elementCnt * sizeof(struct TAG *);
5328 tagList->list.array = NULLP;
5329 CU_ALLOC(tagList->list.array, tagList->list.size);
5330 if(!tagList->list.array)
5332 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5336 for(idx=0; idx<tagList->list.count; idx++)
5338 tagList->list.array[idx] = NULLP;
5339 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5340 if(!tagList->list.array[idx])
5342 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5348 tagList->list.array[idx]->tag_Id = TAG_ID;
5349 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5354 /*******************************************************************
5356 * @brief Builds PHR Config
5360 * Function : BuildPhrConfig
5362 * Functionality: Builds phrConfig in MacCellGroupConfig
5364 * @params[in] PHR Config *
5366 * @return ROK - success
5369 * ****************************************************************/
5370 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5373 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5374 phrConfig->choice.setup = NULLP;
5375 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5376 if(!phrConfig->choice.setup)
5378 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5382 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5383 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5384 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5385 phrConfig->choice.setup->multiplePHR = false;
5386 phrConfig->choice.setup->dummy = false;
5387 phrConfig->choice.setup->phr_Type2OtherCell = false;
5388 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5393 /*******************************************************************
5395 * @brief Builds BSR Config
5399 * Function : BuildBsrConfig
5401 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5403 * @params[in] BSR_Config *bsrConfig
5405 * @return ROK - success
5408 * ****************************************************************/
5409 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5411 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5412 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5413 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5418 /*******************************************************************
5420 * @brief Builds scheduling request config
5424 * Function : BuildSchedulingReqConfig
5426 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5428 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5430 * @return ROK - success
5433 * ****************************************************************/
5434 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5436 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5437 uint8_t idx, elementCnt;
5439 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5440 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5441 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5442 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5444 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5448 elementCnt = 1; //ODU_VALUE_ONE;
5449 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5450 schReqList->list.count = elementCnt;
5451 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5453 schReqList->list.array = NULLP;
5454 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5455 if(!schReqList->list.array)
5457 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5461 for(idx=0;idx<schReqList->list.count; idx++)
5463 schReqList->list.array[idx] = NULLP;
5464 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5465 if(!schReqList->list.array[idx])
5467 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5473 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5475 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5476 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5477 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5479 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5482 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5483 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5484 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5488 /*******************************************************************
5490 * @brief Builds Mac cell group config
5494 * Function : BuildMacCellGrpCfg
5496 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5498 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5500 * @return ROK - success
5503 * ****************************************************************/
5504 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5506 macCellGrpCfg->drx_ConfigRrc = NULLP;
5507 macCellGrpCfg->schedulingRequestConfig = NULLP;
5508 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5509 if(!macCellGrpCfg->schedulingRequestConfig)
5511 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5515 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5517 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5521 macCellGrpCfg->bsr_Config = NULLP;
5522 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5523 if(!macCellGrpCfg->bsr_Config)
5525 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5529 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5531 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5535 macCellGrpCfg->tag_Config = NULLP;
5536 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5537 if(!macCellGrpCfg->tag_Config)
5539 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5543 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5545 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5549 macCellGrpCfg->phr_Config = NULLP;
5550 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5551 if(!macCellGrpCfg->phr_Config)
5553 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5557 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5559 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5563 macCellGrpCfg->skipUplinkTxDynamic = false;
5564 macCellGrpCfg->ext1 = NULLP;
5568 /*******************************************************************
5570 * @brief Frees memeory allocated for SearchSpcToAddModList
5574 * Function : FreeSearchSpcToAddModList
5576 * Functionality: Deallocating memory of SearchSpcToAddModList
5578 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5582 4221 * ****************************************************************/
5583 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5587 struct SearchSpace *searchSpc=NULLP;
5589 if(searchSpcList->list.array)
5591 if(searchSpcList->list.array[idx2])
5593 searchSpc = searchSpcList->list.array[idx2];
5594 if(searchSpc->controlResourceSetId)
5596 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5598 if(searchSpc->monitoringSymbolsWithinSlot)
5600 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5602 if(searchSpc->nrofCandidates)
5604 if(searchSpc->searchSpaceType)
5606 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5607 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5608 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5609 SearchSpace__searchSpaceType));
5611 CU_FREE(searchSpc->nrofCandidates,
5612 sizeof(struct SearchSpace__nrofCandidates));
5614 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5615 searchSpc->monitoringSymbolsWithinSlot->size);
5617 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5618 sizeof(BIT_STRING_t));
5620 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5621 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5623 CU_FREE(searchSpc->controlResourceSetId,
5624 sizeof(ControlResourceSetId_t));
5627 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5629 CU_FREE(searchSpcList->list.array[idx1],
5630 sizeof(struct SearchSpace));
5632 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5635 /*******************************************************************
5637 * @brief Frees memory allocated for PdschTimeDomAllocList
5641 * Function : FreePdschTimeDomAllocList
5643 * Functionality: Deallocating memory of PdschTimeDomAllocList
5645 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5649 4221 * ****************************************************************/
5650 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5654 if(timeDomAllocList->choice.setup)
5656 if(timeDomAllocList->choice.setup->list.array)
5658 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5660 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5661 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5663 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5664 timeDomAllocList->choice.setup->list.size);
5666 CU_FREE(timeDomAllocList->choice.setup,\
5667 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5670 /*******************************************************************
5672 * @brief Frees memory allocated for PuschTimeDomAllocList
5676 * Function : FreePuschTimeDomAllocList
5678 * Functionality: Deallocating memory of PuschTimeDomAllocList
5680 * @params[in] PUSCH_Config_t *puschCfg
5684 ***********************************************************************/
5685 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5689 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5691 if(puschCfg->pusch_TimeDomainAllocationList)
5693 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5694 if(timeDomAllocList_t->choice.setup)
5696 if(timeDomAllocList_t->choice.setup->list.array)
5698 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5699 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5701 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5702 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5704 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5705 timeDomAllocList_t->choice.setup->list.size);
5707 CU_FREE(timeDomAllocList_t->choice.setup, \
5708 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5710 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5711 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5712 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5717 /*******************************************************************
5719 * @brief Frees memory allocated for Dedicated PUCCH config
5723 * Function : FreeBWPUlDedPucchCfg
5725 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5727 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5731 * ****************************************************************/
5732 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5734 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5735 PUCCH_Config_t *pucchCfg = NULLP;
5736 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5737 PUCCH_Resource_t *rsrc = NULLP;
5741 if(ulBwpPucchCfg->choice.setup)
5743 pucchCfg = ulBwpPucchCfg->choice.setup;
5745 //Free resource set list
5746 if(pucchCfg->resourceSetToAddModList)
5748 if(pucchCfg->resourceSetToAddModList->list.array)
5750 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5752 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5753 if(rsrcSet->resourceList.list.array)
5755 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5757 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5759 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5761 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5763 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5765 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5768 //Free resource list
5769 if(pucchCfg->resourceToAddModList)
5771 if(pucchCfg->resourceToAddModList->list.array)
5773 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5775 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5776 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5777 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5779 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5781 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5785 if(pucchCfg->format1)
5787 if(pucchCfg->format1->choice.setup)
5789 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5790 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5792 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5796 if(pucchCfg->dl_DataToUL_ACK)
5798 if(pucchCfg->dl_DataToUL_ACK->list.array)
5800 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5802 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5804 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5806 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5809 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5811 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5815 /*******************************************************************
5817 * @brief Frees memory allocated for InitialUlBWP
5821 * Function : FreeInitialUlBWP
5823 * Functionality: Deallocating memory of InitialUlBWP
5825 * @params[in] BWP_UplinkDedicated_t *ulBwp
5829 * ****************************************************************/
5830 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5832 uint8_t rSetIdx, rsrcIdx;
5833 SRS_Config_t *srsCfg = NULLP;
5834 PUSCH_Config_t *puschCfg = NULLP;
5835 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5836 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5837 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5838 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5840 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5842 if(ulBwp->pusch_Config)
5844 if(ulBwp->pusch_Config->choice.setup)
5846 puschCfg=ulBwp->pusch_Config->choice.setup;
5847 if(puschCfg->dataScramblingIdentityPUSCH)
5849 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5851 FreePuschTimeDomAllocList(puschCfg);
5852 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5853 if(dmrsUlCfg->choice.setup)
5855 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5857 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5859 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5861 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5862 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5864 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5867 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5869 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5870 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5872 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5874 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5876 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5878 /* Free SRS-Config */
5879 if(ulBwp->srs_Config)
5881 if(ulBwp->srs_Config->choice.setup)
5883 srsCfg = ulBwp->srs_Config->choice.setup;
5885 /* Free Resource Set to add/mod list */
5886 if(srsCfg->srs_ResourceSetToAddModList)
5888 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5889 if(rsrcSetList->list.array)
5893 /* Free SRS resource Id list in this SRS resource set */
5894 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5896 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5898 if(rsrcIdList->list.array)
5900 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5902 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5904 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5906 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5907 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5910 /* Free resource type info for this SRS resource set */
5911 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5912 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5914 /* Free memory for each resource set */
5915 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5917 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5919 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5921 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5922 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5925 /* Free resource to add/modd list */
5926 if(srsCfg->srs_ResourceToAddModList)
5928 resourceList = srsCfg->srs_ResourceToAddModList;
5929 if(resourceList->list.array)
5932 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5933 sizeof(struct SRS_Resource__transmissionComb__n2));
5934 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5935 sizeof(struct SRS_Resource__resourceType__aperiodic));
5937 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5939 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5941 CU_FREE(resourceList->list.array, resourceList->list.size);
5943 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5944 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5947 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5949 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5953 /*******************************************************************
5955 * @brief Frees memory allocated for initialUplinkBWP
5959 * Function : FreeinitialUplinkBWP
5961 * Functionality: Deallocating memory of initialUplinkBWP
5963 * @params[in] UplinkConfig_t *ulCfg
5968 * ****************************************************************/
5969 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5971 BWP_UplinkDedicated_t *ulBwp=NULLP;
5972 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5974 if(ulCfg->initialUplinkBWP)
5976 ulBwp=ulCfg->initialUplinkBWP;
5977 if(ulCfg->firstActiveUplinkBWP_Id)
5979 if(ulCfg->pusch_ServingCellConfig)
5981 puschCfg=ulCfg->pusch_ServingCellConfig;
5982 if(puschCfg->choice.setup)
5984 if(puschCfg->choice.setup->ext1)
5986 CU_FREE(puschCfg->choice.setup->ext1->\
5987 processingType2Enabled,sizeof(BOOLEAN_t));
5988 CU_FREE(puschCfg->choice.setup->ext1->\
5989 maxMIMO_Layers,sizeof(long));
5990 CU_FREE(puschCfg->choice.setup->ext1, \
5991 sizeof(struct PUSCH_ServingCellConfig__ext1));
5993 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5995 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5997 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5999 FreeInitialUlBWP(ulBwp);
6000 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6003 /*******************************************************************
6005 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6009 * Function : FreeBWPDlDedPdschCfg
6011 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6013 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6018 * ****************************************************************/
6019 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6021 struct PDSCH_Config *pdschCfg=NULLP;
6022 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6023 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6024 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6026 if(dlBwp->pdsch_Config->choice.setup)
6028 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6029 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6031 if(pdschCfg->pdsch_TimeDomainAllocationList)
6033 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6034 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6036 prbBndlType=&pdschCfg->prb_BundlingType;
6037 CU_FREE(prbBndlType->choice.staticBundling,\
6038 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6039 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6041 FreePdschTimeDomAllocList(timeDomAllocList);
6042 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6043 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6045 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6046 if(dmrsDlCfg->choice.setup)
6048 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6050 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6052 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6053 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6055 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6058 /*******************************************************************
6060 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6064 * Function : FreeBWPDlDedPdcchCfg
6066 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6068 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6073 * ****************************************************************/
6074 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6078 struct PDCCH_Config *pdcchCfg=NULLP;
6079 struct ControlResourceSet *controlRSet=NULLP;
6080 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6082 if(dlBwp->pdcch_Config->choice.setup)
6084 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6085 if(pdcchCfg->controlResourceSetToAddModList)
6087 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6088 if(controlRSetList->list.array)
6090 controlRSet = controlRSetList->list.array[idx2];
6093 if(controlRSet->frequencyDomainResources.buf)
6095 if(controlRSet->pdcch_DMRS_ScramblingID)
6097 if(pdcchCfg->searchSpacesToAddModList)
6099 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6100 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
6101 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6103 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6105 CU_FREE(controlRSet->frequencyDomainResources.buf, \
6106 controlRSet->frequencyDomainResources.size);
6109 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6111 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6113 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6115 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6116 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6118 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6121 /*******************************************************************
6123 * @brief Builds RLC Config
6127 * Function : BuildRlcConfig
6129 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
6131 * @params[in] RLC_Config *rlcConfig
6133 * @return ROK - success
6136 * ****************************************************************/
6137 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
6139 rlcConfig->present = rlcLcCfgDb.rlcMode;
6141 switch(rlcConfig->present)
6143 case RLC_Config_PR_am:
6145 rlcConfig->choice.am = NULLP;
6146 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6147 if(!rlcConfig->choice.am)
6149 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6154 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
6155 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6156 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
6158 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6161 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
6162 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
6163 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
6164 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
6165 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
6168 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
6169 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6170 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
6172 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6175 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
6176 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
6177 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
6182 case RLC_Config_PR_um_Bi_Directional:
6184 rlcConfig->choice.um_Bi_Directional = NULLP;
6185 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
6186 if(!rlcConfig->choice.um_Bi_Directional)
6188 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6193 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
6194 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6195 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
6197 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6200 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
6203 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
6204 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
6205 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
6207 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
6210 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6211 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6218 /*******************************************************************
6220 * @brief Builds MAC LC Config
6224 * Function : BuildMacLCConfig
6226 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6228 * @params[in] struct LogicalChannelConfig macLcConfig
6230 * @return ROK - success
6233 * ****************************************************************/
6234 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6237 macLcConfig->ul_SpecificParameters = NULLP;
6238 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6239 if(!macLcConfig->ul_SpecificParameters)
6241 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6245 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6246 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6247 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6248 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6249 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6250 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6251 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6253 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6254 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6255 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6257 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6260 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6262 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6263 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6264 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6266 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6269 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6271 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6272 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6273 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6277 /*******************************************************************
6279 * @brief Builds RLC Bearer to Add/Mod list
6283 * Function :BuildRlcBearerToAddModList
6285 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6287 * @params[in] rlc_BearerToAddModList
6289 * @return ROK - success
6292 * ****************************************************************/
6293 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6295 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6298 elementCnt = ueCb->numSrb + ueCb->numDrb;
6301 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6303 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6307 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6309 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6316 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6319 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6322 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6325 rlcBearerList->list.count = elementCnt;
6326 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6328 rlcBearerList->list.array = NULLP;
6329 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6330 if(!rlcBearerList->list.array)
6332 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6336 for(idx=0; idx<rlcBearerList->list.count; idx++)
6338 rlcBearerList->list.array[idx] = NULLP;
6339 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6340 if(!rlcBearerList->list.array[idx])
6342 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6349 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6351 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6354 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6356 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6357 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6359 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6363 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6364 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6366 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6367 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6368 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6369 if(!rlcBearerList->list.array[idx]->rlc_Config)
6371 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6375 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6377 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6381 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6382 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6383 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6385 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6389 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6391 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6397 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6399 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6402 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6404 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6405 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6407 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6411 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6412 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6414 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6415 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6416 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6417 if(!rlcBearerList->list.array[idx]->rlc_Config)
6419 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6423 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6425 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6429 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6430 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6431 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6433 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6437 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6439 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6447 /*******************************************************************
6449 * @brief Free memory allocated for CellGroupConfig
6453 * Function : FreeMemCellGrpCfg
6455 * Functionality: Deallocating memory of CellGroupConfig
6457 * @params[in] pointer to CellGroupConfigRrc_t
6459 * @return ROK - success
6462 ******************************************************************/
6463 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6466 SpCellConfig_t *spCellCfg=NULLP;
6467 ServingCellConfig_t *srvCellCfg=NULLP;
6468 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6469 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6470 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6471 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6472 struct RLC_Config *rlcConfig=NULLP;
6473 struct LogicalChannelConfig *macLcConfig=NULLP;
6474 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6475 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6476 struct TAG_Config *tagConfig=NULLP;
6477 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6478 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6479 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6481 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6484 if(rlcBearerList->list.array)
6486 for(idx=0; idx<rlcBearerList->list.count; idx++)
6488 if(rlcBearerList->list.array[idx])
6490 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6491 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6494 if(rlcConfig->choice.am)
6496 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6497 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6498 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6500 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6502 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6505 if(macLcConfig->ul_SpecificParameters)
6507 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6508 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6509 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6511 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6513 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6516 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6518 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6521 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6524 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6525 if(schedulingRequestConfig)
6527 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6530 if(schReqList->list.array)
6532 for(idx=0;idx<schReqList->list.count; idx++)
6534 if(schReqList->list.array[idx])
6536 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6537 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6540 CU_FREE(schReqList->list.array, schReqList->list.size);
6542 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6543 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6544 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6546 if(macCellGrpCfg->bsr_Config)
6548 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6550 tagConfig = macCellGrpCfg->tag_Config;
6553 tagList = tagConfig->tag_ToAddModList;
6556 if(tagList->list.array)
6558 for(idx=0; idx<tagList->list.count; idx++)
6560 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6562 CU_FREE(tagList->list.array, tagList->list.size);
6564 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6566 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6569 phrConfig = macCellGrpCfg->phr_Config;
6572 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6573 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6576 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6579 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6582 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6583 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6586 spCellCfg = cellGrpCfg->spCellConfig;
6589 if(spCellCfg->servCellIndex)
6591 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6593 if(spCellCfg->spCellConfigDedicated)
6595 srvCellCfg = spCellCfg->spCellConfigDedicated;
6596 if(srvCellCfg->initialDownlinkBWP)
6598 dlBwp = srvCellCfg->initialDownlinkBWP;
6599 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6601 if(srvCellCfg->defaultDownlinkBWP_Id)
6603 if(srvCellCfg->uplinkConfig)
6605 if(srvCellCfg->pdsch_ServingCellConfig)
6607 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6608 if(pdschCfg->choice.setup)
6610 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6611 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6613 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6614 ServingCellConfig__pdsch_ServingCellConfig));
6616 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6617 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6619 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6621 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6623 if(dlBwp->pdcch_Config)
6625 if(dlBwp->pdsch_Config)
6627 FreeBWPDlDedPdschCfg(dlBwp);
6628 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6630 FreeBWPDlDedPdcchCfg(dlBwp);
6631 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6633 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6635 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6637 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6639 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6641 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6646 /*******************************************************************
6648 * @brief Fills CellGroupConfig
6652 * Function : fillCellGrpCfg
6654 * Functionality: Fills CellGroupConfig
6656 * @params[in] pointer to CellGroupConfigRrc_t
6658 * @return ROK - success
6661 ******************************************************************/
6663 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6665 uint8_t ret = RFAILED;
6666 CellGroupConfigRrc_t cellGrpCfg;
6667 asn_enc_rval_t encRetVal;
6671 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6673 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6675 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6677 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6681 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6682 cellGrpCfg.mac_CellGroupConfig = NULLP;
6683 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6684 if(!cellGrpCfg.mac_CellGroupConfig)
6686 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6689 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6691 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6695 cellGrpCfg.physicalCellGroupConfig = NULLP;
6696 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6697 if(!cellGrpCfg.physicalCellGroupConfig)
6699 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6702 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6704 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6708 cellGrpCfg.spCellConfig = NULLP;
6709 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6710 if(!cellGrpCfg.spCellConfig)
6712 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6715 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6717 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6721 cellGrpCfg.sCellToAddModList = NULLP;
6722 cellGrpCfg.sCellToReleaseList = NULLP;
6723 cellGrpCfg.ext1 = NULLP;
6725 /* encode cellGrpCfg into duToCuRrcContainer */
6726 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6727 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6729 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6730 /* Encode results */
6731 if(encRetVal.encoded == ENCODE_FAIL)
6733 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6734 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6739 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6740 for(int i=0; i< encBufSize; i++)
6742 DU_LOG("%x",encBuf[i]);
6746 cellGrp->size = encBufSize;
6747 CU_ALLOC(cellGrp->buf, cellGrp->size);
6750 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6753 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6757 FreeMemCellGrpCfg(&cellGrpCfg);
6761 /*******************************************************************
6763 * @brief Free UE Capability RAT container
6767 * Function : freeUeCapRatCont
6770 * Free UE Capability RAT conatiner
6773 * @return ROK - success
6776 * ****************************************************************/
6777 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6780 FeatureSets_t *featureSets;
6782 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6784 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6786 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6787 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6789 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6792 if(ueNrCap->featureSets)
6794 featureSets = ueNrCap->featureSets;
6795 if(featureSets->featureSetsDownlinkPerCC)
6797 if(featureSets->featureSetsDownlinkPerCC->list.array)
6799 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6801 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6802 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6803 sizeof(ModulationOrder_t));
6804 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6806 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6808 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6811 if(featureSets->featureSetsUplinkPerCC)
6813 if(featureSets->featureSetsUplinkPerCC->list.array)
6815 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6817 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6819 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6820 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6821 sizeof(ModulationOrder_t));
6822 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6825 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6827 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6829 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6833 /*******************************************************************
6835 * @brief Free UE capability RAT container list
6839 * Function : freeUeCapRatContList
6841 * Functionality: Free UE capability RAT container list
6844 * @return ROK - success
6847 * ****************************************************************/
6848 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6851 if(ueCapablityList->list.array)
6853 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6855 if(ueCapablityList->list.array[idx])
6856 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6858 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6862 /*******************************************************************
6864 * @brief Free Handover preparation information
6868 * Function : freeHOPreparationInfo
6870 * Functionality: Free Handover preparation information
6873 * @return ROK - success
6876 * ****************************************************************/
6877 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6879 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6881 if(hoPrep->criticalExtensions.choice.c1)
6883 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6885 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6886 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6887 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6888 sizeof(HandoverPreparationInformationRrc_IEs_t));
6890 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6894 /*******************************************************************
6896 * @brief Fill feature sets
6900 * Function : fillFeatureSets
6902 * Functionality: Fill feature sets
6905 * @return ROK - success
6908 * ****************************************************************/
6909 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6911 uint8_t idx, elementCnt;
6913 featureSets->featureSetsDownlink = NULLP;
6914 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6915 if(!featureSets->featureSetsDownlinkPerCC)
6917 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6922 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6923 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6924 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6925 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6927 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6931 for(idx = 0; idx < elementCnt; idx++)
6933 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6934 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6936 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6942 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6943 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6944 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6945 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6946 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6948 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6949 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6951 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6954 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6956 featureSets->featureSetsUplink = NULLP;
6957 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6958 if(!featureSets->featureSetsUplinkPerCC)
6960 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6965 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6966 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6967 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6968 if(!featureSets->featureSetsUplinkPerCC->list.array)
6970 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6974 for(idx = 0; idx < elementCnt; idx++)
6976 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6977 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6979 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6985 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6986 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6987 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6988 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6989 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6990 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6992 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6993 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6995 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6998 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
7003 /*******************************************************************
7005 * @brief Fill UE capability RAT container
7009 * Function : fillUeCapRatCont
7011 * Functionality: Fill UE capability RAT container
7013 * @params[in] UE Capability RAT container buffer
7014 * @return ROK - success
7017 * ****************************************************************/
7018 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
7021 uint8_t idx, elementCnt;
7022 asn_enc_rval_t encRetVal;
7023 UE_NR_Capability_t ueNrCap;
7027 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
7029 /* Filling PDCP parameters */
7030 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
7031 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
7032 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
7033 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
7034 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
7035 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
7036 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
7037 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
7038 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
7039 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
7040 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
7041 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
7042 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
7043 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
7044 ueNrCap.pdcp_Parameters.shortSN = NULLP;
7045 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
7046 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
7048 ueNrCap.rlc_Parameters = NULLP;
7049 ueNrCap.mac_Parameters = NULLP;
7051 /* Filling PHY parameters */
7052 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
7053 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
7054 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
7055 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
7056 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
7058 /* Filling RF parameters */
7060 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
7061 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
7062 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
7063 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
7065 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7070 for(idx = 0; idx < elementCnt; idx++)
7072 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
7073 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
7083 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
7084 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
7085 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
7087 ueNrCap.measAndMobParameters = NULLP;
7088 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
7089 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
7090 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
7091 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
7092 ueNrCap.featureSets = NULLP;
7094 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
7095 if(!ueNrCap.featureSets)
7097 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
7102 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
7104 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
7109 ueNrCap.featureSetCombinations = NULLP;
7110 ueNrCap.lateNonCriticalExtension = NULLP;
7111 ueNrCap.nonCriticalExtension = NULLP;
7113 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7114 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
7115 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7117 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
7119 /* Encode results */
7120 if(encRetVal.encoded == ENCODE_FAIL)
7122 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7123 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7128 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7129 for(int i=0; i< encBufSize; i++)
7131 DU_LOG("%x",encBuf[i]);
7135 ueCapRatContBuf->size = encBufSize;
7136 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
7137 if(!ueCapRatContBuf->buf)
7139 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7142 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
7146 freeUeCapRatCont(&ueNrCap);
7150 /*******************************************************************
7152 * @brief Fill UE Capability RAT container list
7156 * Function : fillUeCapRatContList
7158 * Functionality: Fill UE Capability RAT container list
7161 * @params[in] UE capability RAT container list
7162 * @return ROK - success
7165 * ****************************************************************/
7166 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
7168 uint8_t ret = RFAILED;
7169 uint8_t idx, elementCnt;
7174 ueCapablityList->list.count = elementCnt;
7175 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
7177 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
7178 if(!ueCapablityList->list.array)
7180 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7185 for(idx=0; idx<elementCnt; idx++)
7187 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
7188 if(ueCapablityList->list.array[idx] == NULLP)
7190 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
7196 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
7197 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
7199 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
7210 /*******************************************************************
7212 * @brief Fill UE Capability RAT container list octet string
7216 * Function : fillUeCapRatContListBuf
7218 * Functionality: Fill UE Capability RAT container list octet string
7221 * @params[in] UE capability RAT container list buffer
7222 * @return ROK - success
7225 * ****************************************************************/
7226 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7228 uint8_t ret = RFAILED;
7229 asn_enc_rval_t encRetVal;
7230 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7234 ret = fillUeCapRatContList(&ueCapablityList);
7237 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7241 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7242 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7243 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7245 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7246 &ueCapablityList, PrepFinalEncBuf, encBuf);
7248 /* Encode results */
7249 if(encRetVal.encoded == ENCODE_FAIL)
7251 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7252 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7257 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7258 for(int i=0; i< encBufSize; i++)
7260 DU_LOG("%x",encBuf[i]);
7264 ueCapablityListBuf->size = encBufSize;
7265 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7266 if(!ueCapablityListBuf->buf)
7268 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7271 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7275 freeUeCapRatContList(&ueCapablityList);
7279 /*******************************************************************
7281 * @brief Free Measurement Timing Configuration
7285 * Function : freeMeasuementTimingConfig
7287 * Functionality: Free Measurement Timing Configuration
7289 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7292 * ****************************************************************/
7293 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7296 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7297 MeasTiming_t *measTiming = NULLP;
7299 if(measTimingConfig.criticalExtensions.choice.c1)
7301 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7303 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7304 if(measTimingCfg->measTiming)
7306 if(measTimingCfg->measTiming->list.array)
7308 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7310 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7311 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7312 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7314 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7316 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7318 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7320 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7324 /*******************************************************************
7326 * @brief Fill Measurement Timing Configuration
7330 * Function : fillMeasTimingCfg
7332 * Functionality: Fill Measurement Timing Configuration
7334 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7335 * @return ROK - success
7338 * ****************************************************************/
7339 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7341 uint8_t elementCnt = 0;
7342 uint8_t measCfgIdx = 0;
7343 MeasTiming_t *measTiming;
7346 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7347 if(!measTimingCfg->measTiming)
7349 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7354 measTimingCfg->measTiming->list.count = elementCnt;
7355 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7356 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7357 if(!measTimingCfg->measTiming->list.array)
7359 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7363 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7365 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7366 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7368 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7374 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7375 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7376 if(!measTiming->frequencyAndTiming)
7378 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7382 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7383 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7385 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7386 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7387 smtc->periodicityAndOffset.choice.sf20 = 0;
7388 smtc->duration = SSB_MTC__duration_sf1;
7392 /*******************************************************************
7394 * @brief Fill Measurement Timing Configuration Octet string
7398 * Function : fillMeasConfigBuf
7400 * Functionality: Fill Measurement Timing Configuration Octet string
7403 * @params[in] MeasConfig_t *measConfgBuf
7404 * @return ROK - success
7407 * ****************************************************************/
7408 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7410 uint8_t ret = RFAILED;
7411 asn_enc_rval_t encRetVal;
7412 MeasurementTimingConfigurationRrc_t measTimingConfig;
7416 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7417 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7418 if(!measTimingConfig.criticalExtensions.choice.c1)
7420 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7423 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7425 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7426 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7428 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7432 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7435 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7439 /* Encode measurement timing configuration into octet string */
7440 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7441 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7443 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7445 /* Encode results */
7446 if(encRetVal.encoded == ENCODE_FAIL)
7448 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7449 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7454 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7455 for(int i=0; i< encBufSize; i++)
7457 DU_LOG("%x",encBuf[i]);
7461 measTimingConfigBuf->size = encBufSize;
7462 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7463 if(!measTimingConfigBuf->buf)
7465 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7468 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7472 freeMeasuementTimingConfig(measTimingConfig);
7476 /******************************************************************
7478 * @brief Free RRC reconfiguration non-critical extension
7482 * Function : freeRrcReconfigNonCriticalExt
7484 * Functionality: Free RRC reconfiguration non-critical extension
7486 * @params[in] RRC reconfiguration IE
7489 * ****************************************************************/
7490 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7492 if(rrcRecfg->masterCellGroup)
7494 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7498 /******************************************************************
7500 * @brief Free measurement object addmod list
7504 * Function : freeMeasObjToAddModList
7506 * Functionality: Free measurement object add mod list
7508 * @params[in] Measurement object add/mod list
7511 * ****************************************************************/
7512 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7515 MeasObjectNR_t *measObject;
7517 if(measObjList->list.array)
7519 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7521 if(measObjList->list.array[objIdx])
7523 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7525 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7526 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7527 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7528 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7529 if(measObject->absThreshSS_BlocksConsolidation)
7531 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7532 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7533 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7534 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7536 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7537 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7538 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7539 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7540 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7542 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7545 CU_FREE(measObjList->list.array, measObjList->list.size);
7549 /******************************************************************
7551 * @brief Free report config add mod list
7555 * Function : freeReportCfgToAddModList
7557 * Functionality: Free report config add mod list
7559 * @params[in] Report config list
7562 * ****************************************************************/
7563 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7565 uint8_t reportCfgIdx;
7566 ReportConfigToAddMod_t *reportCfg;
7567 ReportConfigNR_t *reportCfgNr;
7568 EventTriggerConfig_t *eventTriggCfg;
7570 if(reportCfgList->list.array)
7572 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7574 if(reportCfgList->list.array[reportCfgIdx])
7576 reportCfg = reportCfgList->list.array[reportCfgIdx];
7577 if(reportCfg->reportConfig.choice.reportConfigNR)
7579 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7580 if(reportCfgNr->reportType.choice.eventTriggered)
7582 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7583 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7584 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7585 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7586 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7590 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7592 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7596 /******************************************************************
7598 * @brief Free measurement id to add mod list
7602 * Function : freeMeasIdToAddModList
7604 * Functionality: Free measurement id to add mod list
7606 * @params[in] Measurement id to add mod list
7609 * ****************************************************************/
7610 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7613 if(measIdList->list.array)
7615 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7617 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7619 CU_FREE(measIdList->list.array, measIdList->list.size);
7623 /*******************************************************************
7625 * @brief Free quantity config
7629 * Function : freeQunatityConfig
7631 * Functionality: Free quantity config
7633 * @params[in] Quantity Config
7636 * ****************************************************************/
7637 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7640 QuantityConfigNR_t *quantityCfgNr;
7642 if(quantityCfg->quantityConfigNR_List)
7644 if(quantityCfg->quantityConfigNR_List->list.array)
7646 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7648 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7650 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7651 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7652 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7653 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7654 if(quantityCfgNr->quantityConfigRS_Index)
7656 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7657 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7658 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7659 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7661 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7664 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7666 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7670 /******************************************************************
7672 * @brief Free measurement Config
7676 * Function : freeMeasConfig
7678 * Functionality: Free measurement config
7680 * @params[in] Measurement config
7683 * ****************************************************************/
7684 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7686 if(measConfig->measObjectToAddModList)
7688 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7689 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7691 if(measConfig->reportConfigToAddModList)
7693 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7694 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7696 if(measConfig->measIdToAddModList)
7698 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7699 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7701 if(measConfig->s_MeasureConfig)
7703 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7705 if(measConfig->quantityConfig)
7707 freeQuantityConfig(measConfig->quantityConfig);
7708 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7711 /******************************************************************
7713 * @brief Free DRB to AddMod List
7717 * Function : freeDrbToAddModList
7719 * Functionality: Free SRB to AddMod List
7721 * @params[in] SBR to add/mod list
7724 * ****************************************************************/
7725 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7728 if(drbToAddList->list.array)
7730 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7732 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7734 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7736 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7737 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7738 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7739 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7741 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7742 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7744 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7746 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7750 /******************************************************************
7752 * @brief Free SRB to AddMod List
7756 * Function : freeSrbToAddModList
7758 * Functionality: Free SRB to AddMod List
7760 * @params[in] SBR to add/mod list
7763 * ****************************************************************/
7764 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7767 if(srbToAddList->list.array)
7769 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7771 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7772 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7774 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7775 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7778 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7780 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7784 /******************************************************************
7786 * @brief Free Radio Bearer Config
7790 * Function : freeRadioBearerConfig
7792 * Functionality: Free Radio Bearer config
7794 * @params[in] Radio bearer config
7797 * ****************************************************************/
7798 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7800 if(radioBearerConfig->srb_ToAddModList)
7802 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7803 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7805 if(radioBearerConfig->drb_ToAddModList)
7807 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7808 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7812 /******************************************************************
7814 * @brief Free reconfiguration message
7818 * Function : freeRrcReconfig
7820 * Functionality: Free reconfiguration message
7822 * @params[in] RRC Reconfiguration message
7825 * ****************************************************************/
7826 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7828 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7830 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7832 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7833 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7835 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7837 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7838 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7840 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7842 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7843 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7845 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7849 /******************************************************************
7851 * @brief Fill SRB To Add Mod list
7855 * Function : fillSrbToAddModList
7857 * Functionality: fill SRB to Add Mod list
7859 * @params[in] UE control block
7860 * SRB to Add/Mod list
7861 * @return ROK - success
7864 * ****************************************************************/
7865 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7867 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7870 elementCnt = ueCb->numSrb;
7873 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7875 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7882 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7886 srbToAddList->list.count = elementCnt;
7887 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7889 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7890 if(!srbToAddList->list.array)
7892 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7897 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7899 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7902 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7903 if(!srbToAddList->list.array[srbIdx])
7905 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7909 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7911 /* Reestablish PDCP */
7912 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7913 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7915 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7918 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7920 /* PDCP configuration */
7921 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7922 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7924 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7928 /* Reordering timer */
7929 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7930 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7932 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7935 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7942 /******************************************************************
7944 * @biief Fill DRBeTo Add Mod list
7948 * Function : fillDrbToAddModList
7950 * Functionality: fill DRB to Add Mod list
7952 * @params[in] UE control block
7953 * DRB to Add/Mod list
7954 * @return ROK - success
7957 * ****************************************************************/
7958 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7960 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7963 elementCnt = ueCb->numDrb;
7966 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7968 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7975 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7980 drbToAddList->list.count = elementCnt;
7981 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7983 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7984 if(!drbToAddList->list.array)
7986 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7991 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7993 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7996 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7997 if(!drbToAddList->list.array[drbIdx])
7999 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
8004 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
8007 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
8008 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
8010 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
8014 /* PDCP Config -> DRB */
8015 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
8016 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
8018 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
8022 /* DRB -> Discard Timer */
8023 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
8024 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
8026 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
8029 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
8031 /* UL PDCP SN length */
8032 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
8033 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
8035 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
8038 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
8040 /* DL PDCP SN length */
8041 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
8042 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
8044 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
8047 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
8049 /* Header Compression */
8050 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
8051 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
8053 /* Reordering timer */
8054 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
8055 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
8057 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
8060 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
8068 /******************************************************************
8070 * @brief Fill Radio bearer configuration
8074 * Function : fillRadioBearerConfig
8076 * Functionality: Fill Radio bearer configuration
8078 * @params[in] UE control block
8079 * Radio bearer config pointer
8080 * @return ROK - success
8083 * ****************************************************************/
8084 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
8086 /* SRB To Add/Mod List */
8087 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
8088 if(!radioBearerConfig->srb_ToAddModList)
8090 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
8093 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
8095 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
8099 /* DRB To Add/Mod List */
8100 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
8101 if(!radioBearerConfig->drb_ToAddModList)
8103 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
8106 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
8108 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
8115 /*******************************************************************
8117 * @brief Fill measurement object to add/mod list
8121 * Function : fillMeasObjToAddModList
8123 * Functionality: Fill measurement object to add/mod list
8125 * @params[in] Measurement object to add/mod list
8126 * @return ROK - success
8129 * ****************************************************************/
8130 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
8132 uint8_t elementCnt, objIdx;
8133 MeasObjectNR_t *measObject;
8136 measObjList->list.count = elementCnt;
8137 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
8139 CU_ALLOC(measObjList->list.array, measObjList->list.size);
8140 if(!measObjList->list.array)
8142 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
8146 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
8148 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
8149 if(!measObjList->list.array[objIdx])
8151 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
8157 measObjList->list.array[objIdx]->measObjectId = 1;
8158 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
8159 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
8160 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
8162 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
8166 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
8169 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
8170 if(!measObject->ssbFrequency)
8172 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
8175 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
8177 /* Subcarrier spacing */
8178 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
8179 if(!measObject->ssbSubcarrierSpacing)
8181 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
8184 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
8187 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
8188 if(!measObject->smtc1)
8190 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
8193 measObject->smtc1->duration = SSB_MTC__duration_sf1;
8194 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
8195 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
8197 /* Absoulute threshold SSB consolidation */
8198 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
8199 if(!measObject->absThreshSS_BlocksConsolidation)
8201 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
8205 /* RSRP threshold */
8206 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
8207 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
8209 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8212 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8214 /* RSRQ threshold */
8215 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8216 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8218 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8221 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8223 /* SINR threshold */
8224 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8225 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8227 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8230 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8232 /* Number of SSBs to average */
8233 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8234 if(!measObject->nrofSS_BlocksToAverage)
8236 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8239 *(measObject->nrofSS_BlocksToAverage) = 2;
8241 /* Quantity Config index */
8242 measObject->quantityConfigIndex = 1;
8245 /* RSRP offset for SSB */
8246 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8247 if(!measObject->offsetMO.rsrpOffsetSSB)
8249 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8252 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8254 /* RSRQ offset for SSB */
8255 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8256 if(!measObject->offsetMO.rsrpOffsetSSB)
8258 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8261 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8263 /* SINR offset for SSB */
8264 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8265 if(!measObject->offsetMO.sinrOffsetSSB)
8267 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8270 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8275 /*******************************************************************
8277 * @brief Fill Report configuration to Add/mod list
8281 * Function : fillReportCfgToAddModList
8283 * Functionality: Fill Report configuration to Add/mod list
8285 * @params[in] Report Config To Add/Mod List
8286 * @return ROK - success
8289 * ****************************************************************/
8290 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8293 uint8_t reportCfgIdx;
8294 ReportConfigToAddMod_t *reportCfg;
8295 ReportConfigNR_t *reportCfgNr;
8296 EventTriggerConfig_t *eventTriggCfg;
8299 reportCfgList->list.count = elementCnt;
8300 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8302 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8303 if(!reportCfgList->list.array)
8305 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8309 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8311 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8312 if(!reportCfgList->list.array[reportCfgIdx])
8314 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8320 reportCfg = reportCfgList->list.array[reportCfgIdx];
8321 reportCfg->reportConfigId = 1;
8322 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8324 /* Report Configuration for NR */
8325 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8326 if(!reportCfg->reportConfig.choice.reportConfigNR)
8328 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8331 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8334 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8335 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8336 if(!reportCfgNr->reportType.choice.eventTriggered)
8338 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8341 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8344 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8345 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8346 if(!eventTriggCfg->eventId.choice.eventA3)
8348 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8352 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8353 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8354 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8355 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8356 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8357 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8359 /* Reference Signal Type */
8360 eventTriggCfg->rsType = NR_RS_Type_ssb;
8362 /* Report Interval */
8363 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8366 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8368 /* Report Quantity cell */
8369 eventTriggCfg->reportQuantityCell.rsrp = true;
8370 eventTriggCfg->reportQuantityCell.rsrq = false;
8371 eventTriggCfg->reportQuantityCell.sinr = false;
8373 /* Maximum reported cells */
8374 eventTriggCfg->maxReportCells = 3;
8376 /* Report qunatity RS Indexes */
8377 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8378 if(!eventTriggCfg->reportQuantityRS_Indexes)
8380 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8383 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8384 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8385 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8387 /* Maximum number of RS indexes to report */
8388 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8389 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8391 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8394 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8396 /* Include Beam measurement */
8397 eventTriggCfg->includeBeamMeasurements = false;
8402 /*******************************************************************
8404 * @brief Fill measurement Id to add/mod list
8408 * Function : fillMeasIdToAddModList
8410 * Functionality: Fill measurement Id to add/mod list
8412 * @params[in] Measurement Id to add/mod list
8413 * @return ROK - success
8416 * ****************************************************************/
8417 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8423 measIdList->list.count = elementCnt;
8424 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8426 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8427 if(!measIdList->list.array)
8432 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8434 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8435 if(!measIdList->list.array[measIdIdx])
8441 measIdList->list.array[measIdIdx]->measId = 1;
8442 measIdList->list.array[measIdIdx]->measObjectId = 1;
8443 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8448 /*******************************************************************
8450 * @brief Fill s-measurement configuration
8454 * Function : fillSMeasConfig
8456 * Functionality: Fill s-measurement configuration
8458 * @params[in] s-Measurement config
8459 * @return ROK - success
8462 * ****************************************************************/
8463 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8465 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8466 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8471 /*******************************************************************
8473 * @brief Fill quantity config
8477 * Function : fillQunatityConfig
8479 * Functionality: Fill quantity config
8481 * @params[in] Quantity Config
8482 * @return ROK - success
8485 * ****************************************************************/
8486 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8488 uint8_t elementCnt = 0;
8489 uint8_t quanCfgIdx = 0;
8490 QuantityConfigNR_t *quantityCfgNr;
8492 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8493 if(!quantityCfg->quantityConfigNR_List)
8499 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8500 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8502 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8503 if(!quantityCfg->quantityConfigNR_List->list.array)
8508 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8510 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8511 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8518 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8520 /* Quantity Config of Reference signal */
8521 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8522 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8526 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8528 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8529 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8533 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8535 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8536 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8540 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8542 /* Quantity Config RS index */
8543 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8544 if(!quantityCfgNr->quantityConfigRS_Index)
8549 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8550 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8554 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8556 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8557 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8561 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8563 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8564 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8568 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8573 /*******************************************************************
8575 * @brief Fill measurement configuration
8579 * Function : fillMeasConfig
8581 * Functionality: Fill measurement configuration
8583 * @params[in] Measurement config
8584 * @return ROK - success
8587 * ****************************************************************/
8588 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8590 /* Measurement object to add/mod list */
8591 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8592 if(!measConfig->measObjectToAddModList)
8594 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8597 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8599 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8603 /* Report Config To add/mod list */
8604 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8605 if(!measConfig->reportConfigToAddModList)
8607 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8610 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8612 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8616 /* Measurement Id to add/mod list */
8617 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8618 if(!measConfig->measIdToAddModList)
8620 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8623 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8625 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8629 /* S-Measurement config */
8630 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8631 if(!measConfig->s_MeasureConfig)
8633 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8636 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8638 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8642 /* Qunatity Config */
8643 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8644 if(!measConfig->quantityConfig)
8646 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8649 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8651 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8658 /*******************************************************************
8660 * @brief Fill RRC reconfiguration non-critical extension IE
8664 * Function : fillRrcReconfigNonCriticalExt
8666 * Functionality: Fill RRC reconfiguration non-critical extension
8668 * @params[in] RRC Reconfig Non-critical extension
8669 * @return ROK - success
8672 * ****************************************************************/
8673 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8675 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8676 if(!rrcRecfg->masterCellGroup)
8678 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8682 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8683 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8684 if(!rrcRecfg->masterCellGroup->buf)
8686 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8689 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8692 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8693 * received from DU */
8694 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8696 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8704 /*******************************************************************
8706 * @brief Fill RRC reconfiguration structure
8710 * Function : fillRrcReconfig
8712 * Functionality: Fill RRC reconfiguration
8716 * RRC reconfiguration structure
8717 * @return ROK - success
8720 * ****************************************************************/
8721 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8723 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8725 rrcReconfig->rrc_TransactionIdentifier = 1;
8726 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8728 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8729 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8731 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8735 /* Radio Bearer Configuration */
8736 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8737 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8739 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8742 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8744 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8748 /* Measurement Configuration */
8749 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8750 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8752 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8755 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8757 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8761 /* Non Critical extension */
8762 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8763 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8765 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8768 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8770 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8776 /*******************************************************************
8778 * @brief Fill RRC reconfiguration Octet string
8782 * Function : fillRrcReconfigBuf
8784 * Functionality: Fill RRC reconfiguration octet string
8787 * @params[in] OCTET_STRING_t buffer
8788 * @return ROK - success
8791 * ****************************************************************/
8792 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8794 uint8_t ret = RFAILED;
8795 asn_enc_rval_t encRetVal;
8796 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8797 rrcReconfig = &rrcRecfg;
8801 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8803 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8807 /* Encode RRC Reconfiguration */
8808 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8809 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8811 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8813 /* Encode results */
8814 if(encRetVal.encoded == ENCODE_FAIL)
8816 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8817 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8822 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8823 for(int i=0; i< encBufSize; i++)
8825 DU_LOG("%x",encBuf[i]);
8829 rrcReconfigBuf->size = encBufSize;
8830 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8831 if(!rrcReconfigBuf->buf)
8833 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8836 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8841 freeRrcReconfig(rrcReconfig);
8845 /*******************************************************************
8847 * @brief Fill HO preparation information Octet string
8851 * Function : fillHOPreparationInfoBuf
8853 * Functionality: Fill HO preparation information Octet string
8856 * @params[in] HandoverPreparationInformation_t buffer
8857 * @return ROK - success
8860 * ****************************************************************/
8861 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8863 uint8_t ret = RFAILED;
8864 asn_enc_rval_t encRetVal;
8865 HandoverPreparationInformationRrc_t hoPrepInfo;
8866 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8871 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8872 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8873 if(!hoPrepInfo.criticalExtensions.choice.c1)
8875 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8878 hoPrepInfo.criticalExtensions.choice.c1->present = \
8879 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8881 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8882 sizeof(HandoverPreparationInformationRrc_IEs_t));
8883 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8885 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8888 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8890 /* Fill UE Capability RAT container list */
8891 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8894 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8898 /* Fill Source config */
8899 hoPrepInfoIe->sourceConfig = NULLP;
8900 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8901 if(!hoPrepInfoIe->sourceConfig)
8903 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8906 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8910 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8914 hoPrepInfoIe->rrm_Config = NULLP;
8915 hoPrepInfoIe->as_Context = NULLP;
8916 hoPrepInfoIe->nonCriticalExtension = NULLP;
8918 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8919 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8920 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8922 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8923 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8925 /* Encode results */
8926 if(encRetVal.encoded == ENCODE_FAIL)
8928 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8929 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8934 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8935 for(int i=0; i< encBufSize; i++)
8937 DU_LOG("%x",encBuf[i]);
8941 hoPrepInfoBuf->size = encBufSize;
8942 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8943 if(!hoPrepInfoBuf->buf)
8945 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8948 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8952 freeHOPreparationInfo(&hoPrepInfo);
8956 /*******************************************************************
8958 * @brief Fills CuToDuContainer
8962 * Function : fillCuToDuContainer
8964 * Functionality: Fills CuToDuContainer
8966 * @params[in] pointer to CUtoDURRCInformation_t
8968 * @return ROK - success
8971 ******************************************************************/
8973 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8975 uint8_t elementCnt = 0;
8979 /* UE Capabulity RAT Container List */
8980 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8981 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8983 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8986 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8988 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8989 if(!rrcMsg->measConfig)
8991 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8994 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8996 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8999 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9000 if(rrcMsg->iE_Extensions)
9003 rrcMsg->iE_Extensions->list.count = elementCnt;
9004 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
9006 /* Initialize the CUtoDURRCInformation_ExtIEs */
9007 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9009 if(rrcMsg->iE_Extensions->list.array == NULLP)
9011 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
9015 for(idx=0; idx<elementCnt; idx++)
9017 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
9018 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
9020 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
9027 /* Cell Group Configuration */
9028 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
9029 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9030 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
9031 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
9032 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
9035 /* Handover Preparation Information */
9036 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
9037 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
9038 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
9039 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
9040 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
9045 /*******************************************************************
9047 * @brief Build the drx cycle
9051 * Function : BuildDrxCycle
9053 * Functionality: Build drx cycle IE
9055 * @params[in] pointer to DRXCycle_t
9057 * @return ROK - success
9060 ******************************************************************/
9061 uint8_t BuildDrxCycle(DRXCycle_t *drxCycle)
9063 drxCycle->longDRXCycleLength = LongDRXCycleLength_ms40;
9064 CU_ALLOC(drxCycle->shortDRXCycleLength, sizeof(ShortDRXCycleLength_t));
9065 if(!drxCycle->shortDRXCycleLength)
9067 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleLength");
9070 *(drxCycle->shortDRXCycleLength) = ShortDRXCycleLength_ms4;
9072 CU_ALLOC(drxCycle->shortDRXCycleTimer, sizeof(ShortDRXCycleTimer_t));
9073 if(!drxCycle->shortDRXCycleTimer)
9075 DU_LOG("\nERROR --> F1AP : Memory allocation failed for shortDRXCycleTimer");
9078 *(drxCycle->shortDRXCycleTimer) = 4;
9081 /*******************************************************************
9083 * @brief Free CuToDuContainer
9087 * Function : FreeCuToDuInfo
9089 * Functionality: Free CuToDuContainer
9091 * @params[in] pointer to CUtoDURRCInformation_t
9093 * @return ROK - success
9096 ******************************************************************/
9098 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9102 if(rrcMsg->uE_CapabilityRAT_ContainerList)
9104 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9105 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
9106 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
9108 if(rrcMsg->iE_Extensions)
9110 if(rrcMsg->iE_Extensions->list.array)
9112 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
9114 if(rrcMsg->iE_Extensions->list.array[idx])
9116 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
9118 case ProtocolIE_ID_id_CellGroupConfig:
9119 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9121 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
9122 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
9127 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9128 rrcMsg->iE_Extensions->list.array[idx]->id);
9134 for(idx2 = 0; idx2 < idx; idx2++)
9136 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
9138 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
9142 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
9145 /*******************************************************************
9147 * @brief Builds and sends the UE Setup Request
9151 * Function : BuildAndSendUeContextSetupReq
9153 * Functionality: Constructs the UE Setup Request and sends
9154 * it to the CU through SCTP.
9158 * @return ROK - success
9161 * ****************************************************************/
9162 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
9164 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
9165 uint8_t ret= RFAILED, ret1;
9167 uint8_t idx, idx1, bufLen, duIdx;
9169 DuDb *targetDuDb = NULLP;
9170 F1AP_PDU_t *f1apMsg = NULLP;
9171 UEContextSetupRequest_t *ueSetReq = NULLP;
9172 asn_enc_rval_t encRetVal; /* Encoder return value */
9173 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
9177 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
9179 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9180 if(f1apMsg == NULLP)
9182 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9186 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
9187 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
9188 if(f1apMsg->choice.initiatingMessage == NULLP)
9190 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9194 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
9195 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
9196 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
9198 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9200 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9210 ueSetReq->protocolIEs.list.count = elementCnt;
9211 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
9213 /* Initialize the UESetup members */
9214 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
9216 if(ueSetReq->protocolIEs.list.array == NULLP)
9218 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
9222 for(idx1=0; idx1<elementCnt; idx1++)
9224 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
9225 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
9233 /*GNB CU UE F1AP ID*/
9234 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9235 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9236 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
9237 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
9239 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9241 /*GNB DU UE F1AP ID*/
9243 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9244 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9245 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
9246 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
9251 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9252 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9253 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9254 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9256 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9257 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
9258 /* Since we are supporting only one cell per DU, accessing 0th index to
9259 * get target cell info */
9260 spCellId = targetDuDb->cellCb[0].nrCellId;
9263 spCellId = ueCb->cellCb->nrCellId;
9264 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9270 /*Served Cell Index*/
9272 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9273 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9274 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9275 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9277 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9279 /*CellULConfigured*/
9281 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9282 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9283 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9284 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9287 /*CUtoDURRCContainer*/
9289 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9290 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9291 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9292 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9297 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9302 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRXCycle;
9303 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9304 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRXCycle;
9305 if(BuildDrxCycle(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRXCycle) != ROK)
9307 DU_LOG("\nERROR --> F1AP : Failed to build drx cycle");
9311 /*Special Cells to be SetupList*/
9313 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9314 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9315 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9316 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9317 if(SplCellListret != ROK)
9323 /*SRBs To Be Setup List*/
9325 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9326 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9327 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9328 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9329 if(SrbSetupret != ROK)
9334 /*DRBs to Be Setup List*/
9336 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9337 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9338 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9339 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9345 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9347 /* RRC delivery status request */
9349 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9350 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9351 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9352 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9355 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9357 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9358 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9359 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9361 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9363 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9364 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9365 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9366 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9368 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9371 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9372 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9374 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9376 /* Encode the F1SetupRequest type as APER */
9377 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9379 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9381 /* Encode results */
9382 if(encRetVal.encoded == ENCODE_FAIL)
9384 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9385 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9390 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9391 for(int i=0; i< encBufSize; i++)
9393 DU_LOG("%x",encBuf[i]);
9398 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9400 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9406 FreeUeContextSetupReq(f1apMsg);
9409 }/* End of BuildAndSendUeContextSetupReq*/
9411 /**********************************************************************
9412 * @brief Function to extractTeId received in UE context setup Response
9416 * Function : extractTeId
9419 * - Function to extract TeId
9422 * @return ROK - success
9425 **********************************************************************/
9426 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9430 GTPTunnel_t *gtpDl = NULLP;
9432 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9434 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9436 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9438 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9439 if(gtpDl->gTP_TEID.size > 0)
9441 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9444 DU_LOG("\nERROR --> EGTP: No TeId received");
9452 /****************************************************************
9453 * @brief Function to add Drb tunnels
9457 * Function : addDrbTunnels
9460 * - Function to add Drb tunnels
9463 * @return ROK - success
9466 * ****************************************************************/
9467 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9472 if(teId > MAX_TEID || teId < MIN_TEID)
9474 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9476 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9477 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9478 tnlEvt.lclTeid = teId;
9479 tnlEvt.remTeid = teId;
9480 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9483 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9488 /****************************************************************
9489 * @brief Function to process Drb Setup List
9493 * Function : procDrbSetupList
9496 * - Function to process DRB Setup List
9499 * @return ROK - success
9502 * ****************************************************************/
9503 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9505 uint8_t arrIdx = 0, drbIdx = 0;
9507 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9509 if(drbSetupList != NULLP)
9511 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9513 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9514 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9516 /* extracting teId */
9517 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9520 if(addDrbTunnels(duId, teId)== ROK)
9522 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9524 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9525 * are sent to CU for setting up of Tunnels in DL direction.
9526 * Search for DRB ID in CU databse */
9527 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9529 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9531 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9544 /****************************************************************
9545 * @brief Function to process Ue Context Setup Response
9549 * Function : procUeContextSetupResponse
9552 * - Function to process Ue Context Setup Response
9555 * @return ROK - success
9558 * ****************************************************************/
9559 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9561 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9562 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9564 CuUeCb *ueCb = NULLP;
9565 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9566 OCTET_STRING_t *duToCuRrcContainer;
9568 SEARCH_DU_DB(duIdx, duId, duDb);
9569 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9571 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9573 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9575 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9577 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9580 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9582 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9583 ueCb = &duDb->ueCb[duUeF1apId-1];
9584 /* If ue context is not present in du db, then create UE context
9585 * here. This flow is hit in case of UE handover where UE
9586 * context is created before UE performs RACH on target DU */
9587 if(ueCb->gnbDuUeF1apId == 0)
9589 /* Creating UE context in target DU */
9590 memset(ueCb, 0, sizeof(CuUeCb));
9591 ueCb->cellCb = &duDb->cellCb[0];
9592 ueCb->gnbDuUeF1apId = duUeF1apId;
9593 ueCb->gnbCuUeF1apId = cuUeF1apId;
9594 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9595 ueCb->hoInfo.targetDuId = duId;
9598 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9599 ueCb->cellCb->numUe++;
9603 case ProtocolIE_ID_id_C_RNTI:
9605 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9608 case ProtocolIE_ID_id_DRBs_Setup_List:
9610 /* Adding Tunnels for successful DRB */
9611 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9614 case ProtocolIE_ID_id_DUtoCURRCInformation:
9616 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9617 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9618 DUtoCURRCInformation.cellGroupConfig;
9619 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9620 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9622 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9630 /* If the UE is in handover, UE context modification request is to be sent to
9631 * source DU once UE context setup response is received from target DU */
9632 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9634 DuDb *srcDuDb = NULLP;
9635 CuUeCb *ueCbInSrcDu = NULLP;
9637 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9638 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9639 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9641 /* UE context setup response is received from target DU. Search all
9642 * DUs to find source DU except this target DU Id.*/
9643 if(cuCb.duInfo[duIdx].duId != duId)
9645 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9648 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9649 * received in UE context setup response since CU UE F1AP ID does not
9650 * change for UE in handover.
9651 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9653 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9654 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9656 srcDuDb = &cuCb.duInfo[duIdx];
9657 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9659 /* Store source DU info in the new UE context created in
9661 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9663 /* Copy the received container to UeCb */
9664 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9666 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9668 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9675 if(srcDuDb && ueCbInSrcDu)
9681 ueCb->f1apMsgDb.dlRrcMsgCount++;
9682 rrcMsgType = setDlRRCMsgType(ueCb);
9684 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9685 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9687 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9695 /****************************************************************
9696 * @brief Function to process Ul Rrc Msg received from DU
9700 * Function : procUlRrcMsg
9703 * - Function to process Ul Rrc Msg received from DU
9706 * @return ROK - success
9709 * ****************************************************************/
9711 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9713 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9714 uint8_t *rrcContainer = NULLP;
9715 uint16_t rrcContLen = 0;
9716 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9718 CuUeCb *ueCb = NULLP;
9719 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9722 SEARCH_DU_DB(duIdx, duId, duDb);
9723 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9725 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9727 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9729 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9731 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9734 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9736 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9739 case ProtocolIE_ID_id_SRBID:
9740 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9743 case ProtocolIE_ID_id_RRCContainer:
9745 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9746 CU_ALLOC(rrcContainer, rrcContLen);
9749 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9752 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9754 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9757 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
9758 DuDb *srcDuDb = NULLP;
9760 /* In target DU DB, mark UE as active and delete HO info */
9761 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9762 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9764 /* Release UE context in source DU because the UE is now
9765 * attached to target DU */
9766 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9767 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9769 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9771 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9774 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9785 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9792 ueCb = &duDb->ueCb[duUeF1apId-1];
9793 ueCb->f1apMsgDb.dlRrcMsgCount++;
9794 rrcMsgType = setDlRRCMsgType(ueCb);
9795 if(rrcMsgType == RRC_SETUP_COMPLETE)
9797 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for NAS Security Mode Command");
9798 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9800 if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
9802 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Security Mode Command");
9803 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9805 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
9807 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9808 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9810 else if(rrcMsgType == REGISTRATION_COMPLETE)
9812 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9813 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9815 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9817 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9818 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9824 /****************************************************************
9825 * @brief Build And Send F1ResetAck
9829 * Function : FreeF1ResetAck
9832 * - Build And Send F1ResetRSP
9835 * @return ROK - success
9838 * ****************************************************************/
9839 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9842 ResetAcknowledge_t *f1ResetAck;
9846 if(f1apMsg->choice.successfulOutcome)
9848 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9850 if(f1ResetAck->protocolIEs.list.array)
9852 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9854 if(f1ResetAck->protocolIEs.list.array[idx])
9856 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9859 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9861 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9863 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9867 /****************************************************************
9868 * @brief Build And Send F1ResetAck
9872 * Function : BuildAndSendF1ResetAck
9875 * - Build And Send F1ResetRSP
9878 * @return ROK - success
9881 * ****************************************************************/
9883 uint8_t BuildAndSendF1ResetAck()
9886 uint8_t elementCnt = 0;
9887 uint8_t ret = RFAILED;
9888 F1AP_PDU_t *f1apMsg = NULL;
9889 ResetAcknowledge_t *f1ResetAck = NULLP;
9890 asn_enc_rval_t encRetVal;
9891 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9894 /* Allocate the memory for F1ResetRequest_t */
9895 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9896 if(f1apMsg == NULLP)
9898 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9902 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9904 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9905 if(f1apMsg->choice.successfulOutcome == NULLP)
9907 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9911 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9912 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9913 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9914 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9918 f1ResetAck->protocolIEs.list.count = elementCnt;
9919 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9921 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9922 if(f1ResetAck->protocolIEs.list.array == NULLP)
9924 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9928 for(idx=0; idx<elementCnt; idx++)
9930 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9931 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9938 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9939 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9940 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9941 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9943 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9945 /* Encode the F1SetupRequest type as UPER */
9946 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9948 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9950 /* Check encode results */
9951 if(encRetVal.encoded == ENCODE_FAIL)
9953 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9954 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9959 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9960 for(int i=0; i< encBufSize; i++)
9962 DU_LOG("%x",encBuf[i]);
9967 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9968 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9970 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9978 FreeF1ResetAck(f1apMsg);
9982 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9986 if(ulInfo->list.array)
9988 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9990 if(ulInfo->list.array[arrIdx])
9992 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9994 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9996 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9998 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9999 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10000 gTPTunnel->gTP_TEID.size);
10002 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10003 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10004 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10006 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10007 sizeof(GTPTunnel_t));
10009 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10012 CU_FREE(ulInfo->list.array,ulInfo->list.size);
10016 /*******************************************************************
10018 * @brief Deletes the EGTP tunnel
10022 * Function : deleteEgtpTunnel
10024 * Functionality: Deletes the EGTP tunnel
10026 * @params[in] uint8_t *buf
10028 * @return ROK - success
10029 * RFAILED - failure
10031 * ****************************************************************/
10032 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
10037 teIdStringToInt(buf, &teId);
10038 if(teId > MAX_TEID || teId < MIN_TEID)
10040 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
10043 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
10044 tnlEvt.action = EGTP_TNL_MGMT_DEL;
10045 tnlEvt.lclTeid = teId;
10046 tnlEvt.remTeid = teId;
10047 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
10049 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
10054 /*******************************************************************
10056 * @brief Builds the Uplink Tunnel Info
10060 * Function : BuildUlTnlInfoforSetupMod
10062 * Functionality: Constructs the UL TnlInfo For DRB list
10064 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10066 * @return ROK - success
10067 * RFAILED - failure
10069 * ****************************************************************/
10070 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
10076 ulInfo->list.count = ulCnt;
10077 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
10078 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
10079 if(ulInfo->list.array == NULLP)
10081 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10084 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
10086 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
10087 if(ulInfo->list.array[arrIdx] == NULLP)
10089 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10095 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
10096 UPTransportLayerInformation_PR_gTPTunnel;
10099 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
10100 sizeof(GTPTunnel_t));
10101 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
10103 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10106 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10107 transportLayerAddress.size = 4*sizeof(uint8_t);
10108 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10109 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
10110 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10111 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10112 transportLayerAddress.buf == NULLP)
10114 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10118 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10119 transportLayerAddress.buf[0] = 192;
10120 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10121 transportLayerAddress.buf[1] = 168;
10122 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10123 transportLayerAddress.buf[2] = 130;
10124 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10125 transportLayerAddress.buf[3] = 82;
10126 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10127 transportLayerAddress.bits_unused = 0;
10129 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
10130 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
10131 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
10132 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
10135 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
10136 = 4 * sizeof(uint8_t);
10137 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10138 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
10139 gTPTunnel->gTP_TEID.size);
10140 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10143 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
10146 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10147 gTP_TEID.buf[0] = 0;
10148 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10149 gTP_TEID.buf[1] = 0;
10150 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10151 gTP_TEID.buf[2] = 0;
10152 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
10154 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
10155 * fetched based on the Drb Id */
10157 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
10158 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
10159 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
10163 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10164 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
10167 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
10168 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
10169 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
10170 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
10172 }/*End of BuildULTnlInfo*/
10174 /*******************************************************************
10176 * @brief freeing the DRB item
10180 * Function : FreeDrbItem
10182 * Functionality: freeing the DRB item
10184 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10186 * @return ROK - success
10187 * RFAILED - failure
10189 * ****************************************************************/
10191 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
10194 SNSSAI_t *snssai =NULLP;
10195 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10197 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10198 switch(drbItem->qoSInformation.present)
10200 case QoSInformation_PR_NOTHING:
10202 case QoSInformation_PR_eUTRANQoS:
10204 if(drbItem->qoSInformation.choice.eUTRANQoS)
10206 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10210 case QoSInformation_PR_choice_extension:
10212 if(drbItem->qoSInformation.choice.choice_extension)
10214 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10216 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10217 if(snssai->sST.buf)
10219 CU_FREE(snssai->sST.buf,snssai->sST.size);
10223 if(snssai->sD->buf)
10225 CU_FREE(snssai->sD->buf,snssai->sD->size);
10227 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10230 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10231 if(flowMap->list.array)
10233 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10235 if(flowMap->list.array[arrIdx] )
10237 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10238 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10241 CU_FREE(flowMap->list.array,flowMap->list.size);
10244 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10250 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10251 if(drbItem->uLConfiguration)
10253 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10257 /*******************************************************************
10259 * @brief filling the DRB setup Mod item
10263 * Function : FillDrbItemToSetupMod
10265 * Functionality: filling the DRB setup Mod item
10268 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10270 * @return ROK - success
10271 * RFAILED - failure
10273 * ****************************************************************/
10275 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10280 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10281 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10284 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10286 switch(drbItem->qoSInformation.present)
10288 case QoSInformation_PR_NOTHING:
10292 case QoSInformation_PR_eUTRANQoS:
10295 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10296 if(drbItem->qoSInformation.choice.eUTRANQoS)
10298 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10301 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10302 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10303 PriorityLevel_no_priority;
10305 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10306 Pre_emptionCapability_may_trigger_pre_emption;
10308 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10309 Pre_emptionVulnerability_pre_emptable;
10313 case QoSInformation_PR_choice_extension:
10315 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10316 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10318 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10322 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10323 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10324 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10325 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10326 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10329 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10334 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10335 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10338 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10342 /*Flows mapped to DRB List*/
10343 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10344 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10345 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10348 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10354 /*ULUPTNLInformation To Be Setup List*/
10355 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10356 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10359 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10364 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10365 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10371 /*******************************************************************
10373 * @brief Builds the DRB to be Setup Mod ItemIes
10377 * Function : FillDrbItemList
10379 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10381 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10383 * @return ROK - success
10384 * RFAILED - failure
10386 * ****************************************************************/
10388 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10390 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10391 drbItemIe->criticality = Criticality_reject;
10392 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10394 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10396 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10401 /*******************************************************************
10403 * @brief free the DRB to be Setup Mod list
10407 * Function : FreeDrbToBeSetupModList
10409 * Functionality: free the DRB to be Setup Mod list
10411 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10413 * @return ROK - success
10414 * RFAILED - failure
10416 * ****************************************************************/
10417 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10420 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10422 if(drbSet->list.array)
10424 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10426 if(drbSet->list.array[arrIdx] != NULLP)
10430 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10431 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10433 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10436 CU_FREE(drbSet->list.array, drbSet->list.size);
10441 /*******************************************************************
10443 * @brief Builds the DRB to be Setup Mod list
10447 * Function : BuildDrbToBeSetupList
10449 * Functionality: Constructs the DRB to be Setup Mod list
10451 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10453 * @return ROK - success
10454 * RFAILED - failure
10456 * ****************************************************************/
10458 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10464 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10465 drbSet->list.count = drbCnt;
10466 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10467 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10468 if(drbSet->list.array == NULLP)
10470 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10474 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10476 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10477 if(drbSet->list.array[arrIdx] == NULLP)
10479 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10483 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10486 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10493 /*******************************************************************
10495 * @brief Filling the DRB to be modified item
10499 * Function : FillDrbToBeModItem
10501 * Functionality: filling the DRB to be modified item
10503 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10505 * @return ROK - success
10506 * RFAILED - failure
10508 * ****************************************************************/
10510 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10514 DrbInfo *drbToBeMod;
10517 drbItem->dRBID = DRB2 + arrIdx;
10519 /* Search for DRB ID in CU databse */
10520 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10522 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10524 drbToBeMod = &ueCb->drbList[drbIdx];
10530 drbItem->qoSInformation = NULLP;
10531 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10532 if(drbItem->qoSInformation != NULLP)
10534 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10536 switch(drbItem->qoSInformation->present)
10538 case QoSInformation_PR_NOTHING:
10542 case QoSInformation_PR_eUTRANQoS:
10545 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10546 if(drbItem->qoSInformation->choice.eUTRANQoS)
10548 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10551 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10552 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10553 PriorityLevel_no_priority;
10555 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10556 Pre_emptionCapability_may_trigger_pre_emption;
10558 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10559 Pre_emptionVulnerability_pre_emptable;
10563 case QoSInformation_PR_choice_extension:
10565 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10566 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10568 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10572 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10573 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10574 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10575 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10576 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10579 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10584 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10585 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10588 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10592 /*Flows mapped to DRB List*/
10593 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10594 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10595 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10598 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10605 /*ULUPTNLInformation To Be Setup List*/
10606 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10607 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10610 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10616 /*******************************************************************
10618 * @brief Builds the DRB to be modified Item IE
10622 * Function : FillDrbToBeModItemList
10624 * Functionality: Constructs the DRB to be modified Mod Item Ies
10626 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10628 * @return ROK - success
10629 * RFAILED - failure
10631 * ****************************************************************/
10633 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10635 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10636 drbItemIe->criticality = Criticality_reject;
10637 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10638 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10640 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10647 /*******************************************************************
10649 * @brief Builds the DRB to be modified list
10653 * Function : BuildDrbToBeModList
10655 * Functionality: Constructs the DRB to be modified list
10657 * @params[in] DRBs_ToBeModified_List_t *drbSet
10659 * @return ROK - success
10660 * RFAILED - failure
10662 * ****************************************************************/
10664 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10670 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10671 drbSet->list.count = drbCnt;
10672 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10673 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10674 if(drbSet->list.array == NULLP)
10676 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10679 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10681 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10682 if(drbSet->list.array[arrIdx] == NULLP)
10684 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10688 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10691 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10698 /*******************************************************************
10700 * @brief freeing the DRB item
10704 * Function : FreeModifiedDrbItem
10706 * Functionality: freeing the DRB 2 item
10708 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10710 * @return ROK - success
10711 * RFAILED - failure
10713 * ****************************************************************/
10715 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10718 SNSSAI_t *snssai =NULLP;
10719 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10721 if(drbItem->qoSInformation != NULLP)
10723 switch(drbItem->qoSInformation->present)
10725 case QoSInformation_PR_NOTHING:
10727 case QoSInformation_PR_eUTRANQoS:
10729 if(drbItem->qoSInformation->choice.eUTRANQoS)
10731 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10735 case QoSInformation_PR_choice_extension:
10737 if(drbItem->qoSInformation->choice.choice_extension)
10739 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10741 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10742 if(snssai->sST.buf)
10744 CU_FREE(snssai->sST.buf,snssai->sST.size);
10748 if(snssai->sD->buf)
10750 CU_FREE(snssai->sD->buf,snssai->sD->size);
10752 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10755 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10756 if(flowMap->list.array)
10758 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10760 if(flowMap->list.array[arrIdx] )
10762 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10763 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10766 CU_FREE(flowMap->list.array,flowMap->list.size);
10769 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10775 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10776 if(drbItem->uLConfiguration)
10778 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10782 /*******************************************************************
10784 * @brief free the DRB to be modfified list
10788 * Function : FreeDrbToBeModifiedList
10790 * Functionality: free the DRB to be Setup Mod list
10792 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10794 * @return ROK - success
10795 * RFAILED - failure
10797 * ****************************************************************/
10798 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10801 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10803 if(drbSet->list.array)
10805 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10807 if(drbSet->list.array[arrIdx] != NULLP)
10809 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10810 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10811 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10814 CU_FREE(drbSet->list.array, drbSet->list.size);
10819 /*******************************************************************
10821 * @brief free the UeContextModification Request
10825 * Function : FreeUeContextModicationRequest
10827 * Functionality : deallocation of memory allocated in UeContextModiification
10830 * @params[in] F1AP_PDU_t *f1apMsg
10834 * ****************************************************************/
10835 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10837 uint8_t arrIdx =0 , ieId=0;
10838 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10842 if(f1apMsg->choice.initiatingMessage)
10844 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10845 if(ueContextModifyReq->protocolIEs.list.array)
10847 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10849 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10851 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10854 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10856 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10858 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10860 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10861 choice.DRBs_ToBeSetupMod_List);
10864 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10866 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10867 choice.DRBs_ToBeModified_List);
10870 case ProtocolIE_ID_id_TransmissionActionIndicator:
10872 case ProtocolIE_ID_id_RRCContainer:
10874 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10875 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10879 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10882 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10884 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10886 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10890 /*******************************************************************
10892 * @brief Builds the Ue Context Modification Req
10896 * Function : BuildAndSendUeContextModificationReq
10898 * Functionality: Constructs the Ue Context Modification Req
10902 * @return ROK - success
10903 * RFAILED - failure
10905 * ****************************************************************/
10906 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10909 uint8_t elementCnt = 0;
10910 uint8_t ret = RFAILED;
10911 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10912 F1AP_PDU_t *f1apMsg = NULLP;
10913 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10914 asn_enc_rval_t encRetVal;
10915 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10918 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10919 if(f1apMsg == NULLP)
10921 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10925 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10927 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10928 if(f1apMsg->choice.initiatingMessage == NULLP)
10930 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10933 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10934 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10935 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10937 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10939 if(action == MODIFY_UE)
10941 else if(action == QUERY_CONFIG)
10943 else if(action == RRC_RECONFIG_COMPLETE_IND)
10945 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10948 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10949 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10951 /* Initialize the UE context modification members */
10952 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10953 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10955 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10959 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10961 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10962 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10964 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10970 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10971 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10972 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10973 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10974 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10977 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10978 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10979 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10980 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10981 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10983 if(action == MODIFY_UE)
10985 /* DRB to be setup list */
10987 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10988 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10989 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10990 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10991 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10992 value.choice.DRBs_ToBeSetupMod_List));
10994 /* DRB to be modified list */
10996 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
10997 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10998 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10999 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
11000 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
11001 value.choice.DRBs_ToBeModified_List));
11003 /* TODO: DRB to be release list */
11007 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
11011 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
11013 else if(action == QUERY_CONFIG)
11016 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
11017 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11018 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11019 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
11020 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
11022 else if(action == RRC_RECONFIG_COMPLETE_IND)
11025 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
11026 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11027 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11028 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
11029 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
11030 RRCReconfigurationCompleteIndicator_true;
11032 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
11035 if(action == STOP_DATA_TX)
11037 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11038 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11039 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11040 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11041 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11042 TransmissionActionIndicator_stop;
11044 else if (action == RESTART_DATA_TX)
11046 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
11047 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11048 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11049 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
11050 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
11051 TransmissionActionIndicator_restart;
11055 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11056 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11057 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
11058 UEContextModificationRequestIEs__value_PR_RRCContainer;
11059 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
11061 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
11065 /* RRC delivery status request */
11067 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
11068 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11069 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
11070 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
11073 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11075 /* Encode the F1SetupRequest type as APER */
11076 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11078 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11080 /* Encode results */
11081 if(encRetVal.encoded == ENCODE_FAIL)
11083 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
11084 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11089 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
11091 /* This for loop was going into an infinite loop even though encBufSize
11092 * has a small value. Hence commented this
11094 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11096 DU_LOG("%x",encBuf[ieIdx]);
11101 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11102 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11104 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
11112 FreeUeContextModicationRequest(f1apMsg);
11116 /*****************************************************************i
11118 * @brief Free memory allocated for UE Context Release Command
11122 * Function : FreeUeContextReleaseCommand
11125 * - Free memory allocated for UE Context Release Command
11127 * @params[in] F1AP_PDU_t *f1apMsg
11130 * *************************************************************/
11131 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
11134 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
11138 if(f1apMsg->choice.initiatingMessage)
11140 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11141 if(ueReleaseCommand->protocolIEs.list.array)
11143 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
11145 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11147 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
11149 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11151 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11154 /*******************************************************************
11156 * @brief Builds the Ue Context Release Command
11160 * Function : BuildAndSendUeContextReleaseCommand
11162 * Functionality: Constructs the Ue Context Release Command
11166 * @return ROK - success
11167 * RFAILED - failure
11169 * ****************************************************************/
11170 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
11172 bool memAllocFailed = false;
11173 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
11176 F1AP_PDU_t *f1apMsg = NULLP;
11177 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
11179 asn_enc_rval_t encRetVal;
11180 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
11184 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11185 if(f1apMsg == NULLP)
11187 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
11191 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11193 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11194 if(f1apMsg->choice.initiatingMessage == NULLP)
11196 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
11199 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
11200 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11201 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
11203 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
11205 SEARCH_DU_DB(duIdx, duId, duDb);
11206 ueCb = &duDb->ueCb[duUeF1apId-1];
11207 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11212 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
11213 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
11215 /* Initialize the UE context modification members */
11216 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
11217 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
11219 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
11223 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11225 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
11226 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
11228 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
11229 memAllocFailed = true;
11234 if(memAllocFailed == true)
11240 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11241 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11242 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11243 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
11244 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
11247 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11248 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11249 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11250 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
11251 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
11253 /* Cause of UE context release */
11255 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
11256 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11257 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
11258 UEContextReleaseCommandIEs__value_PR_Cause;
11259 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11260 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
11261 CauseRadioNetwork_normal_release;
11262 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11264 /* RRC Container for RRC release */
11266 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11267 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11268 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11269 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11270 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11272 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11273 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11274 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11275 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11277 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11280 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11281 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11283 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11285 /* Encode the UE Context Release Command type as APER */
11286 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11288 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11291 /* Encode results */
11292 if(encRetVal.encoded == ENCODE_FAIL)
11294 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11295 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11300 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11301 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11303 DU_LOG("%x",encBuf[ieIdx]);
11307 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11308 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11310 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11318 FreeUeContextReleaseCommand(f1apMsg);
11321 /*******************************************************************
11323 * @brief process Ue context release request
11327 * Function : procUeContextReleaseReq
11330 * - process Ue context release request
11332 * @params[in] F1AP_PDU_t *f1apMsg
11333 * @return ROK - success
11334 * RFAILED - failure
11336 * ****************************************************************/
11337 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11339 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11341 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11342 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11344 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11346 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11348 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11350 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11353 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11355 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11363 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11365 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11370 /*******************************************************************
11372 * @brief processing of Gnb-DU config update
11376 * Function : procGnbDuUpdate
11379 * - processing of Gnb-DU config update
11381 * @params[in] F1AP_PDU_t *f1apMsg
11382 * @return ROK - success
11383 * RFAILED - failure
11385 * ****************************************************************/
11386 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11388 bool cellToBeDelete = false;
11389 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11393 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11395 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11396 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11398 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11400 case ProtocolIE_ID_id_TransactionID:
11402 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11404 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11406 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11407 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11408 Served_Cells_To_Delete_List.list.array[0];
11409 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11410 cellToBeDelete = true;
11413 case ProtocolIE_ID_id_gNB_DU_ID:
11417 if(BuildAndSendDUUpdateAck(duId) != ROK)
11419 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11423 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11424 * commented this trigger for now */
11426 if(cellToBeDelete == false)
11428 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11429 if(BuildAndSendF1ResetReq() != ROK)
11431 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11436 if(cellToBeDelete == true)
11438 SEARCH_DU_DB(duIdx, duId, duDb);
11439 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11440 if(cellCb->numUe == 0)
11442 memset(cellCb, 0, sizeof(CuCellCb));
11446 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11451 /*******************************************************************
11453 * @brief storing slice list in CU database
11457 * Function : buildSliceList
11460 * - storing slice list in CU database
11462 * @params[in] SliceSupportList_t *sliceSupportList
11463 * @return ROK - success
11464 * RFAILED - failure
11466 * ****************************************************************/
11467 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11469 uint8_t sliceListIdx = 0;
11471 if(sliceSupportList)
11473 if(sliceSupportList->list.array)
11475 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11476 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11478 if(sliceSupportList->list.array[sliceListIdx])
11480 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11481 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11483 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11486 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11488 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11489 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11491 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11493 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11494 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11495 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11504 /****************************************************************
11505 * @brief Function to process Srb Setup Mod List
11509 * Function : procSrbSetupModList
11512 * - Function to process SRB Setup Mod List
11515 * @return ROK - success
11516 * RFAILED - failure
11518 * ****************************************************************/
11519 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11521 uint8_t arrIdx = 0, srbIdx;
11522 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11524 if(srbSetupList != NULLP)
11526 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11528 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11529 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11531 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11533 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11535 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11547 /****************************************************************
11548 * @brief Function to process Drb Setup Mod List
11552 * Function : procDrbSetupModList
11555 * - Function to process DRB Setup Mod List
11558 * @return ROK - success
11559 * RFAILED - failure
11561 * ****************************************************************/
11562 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11564 uint8_t arrIdx = 0, drbIdx;
11566 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11568 if(drbSetupList != NULLP)
11570 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11572 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11573 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11575 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11577 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11579 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11580 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11585 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11587 /* extracting teId */
11588 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11591 if(addDrbTunnels(duId, teId)== ROK)
11593 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11605 /*******************************************************************
11607 * @brief processing of GNB_DU_Served_Cells Plmn list information
11611 * Function : procServedCellPlmnList
11614 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11617 * @params[in] F1AP_PDU_t *f1apMsg
11618 * @return ROK - success
11619 * RFAILED - failure
11621 * ****************************************************************/
11622 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11624 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11625 ProtocolExtensionContainer_4624P3_t **ieExtend;
11627 if(srvPlmn->list.array)
11629 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11631 if(srvPlmn->list.array[srvPlmnIdx])
11633 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11636 if((*ieExtend)->list.array)
11638 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11640 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11642 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11644 case ProtocolIE_ID_id_TAISliceSupportList:
11646 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11647 extensionValue.choice.SliceSupportList) != ROK)
11649 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11664 /****************************************************************
11665 * @brief Function to process Ue Context Modification Response
11669 * Function : procUeContextModificationResponse
11672 * - Function to process Ue Context Modification Response
11675 * @return ROK - success
11676 * RFAILED - failure
11678 * ****************************************************************/
11679 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11681 uint8_t idx=0, duIdx=0;
11682 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11683 DuDb *duDb = NULLP;
11684 CuUeCb *ueCb = NULLP;
11685 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11687 SEARCH_DU_DB(duIdx, duId, duDb);
11688 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11690 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11692 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11694 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11696 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11699 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11701 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11702 ueCb = &duDb->ueCb[duUeF1apId-1];
11705 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11707 /* Adding Tunnels for successful DRB */
11708 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11712 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11714 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11717 case ProtocolIE_ID_id_DUtoCURRCInformation:
11719 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11720 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11721 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11723 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11732 /* If UE is in handover and UE context is not yet created at target DU, then send
11733 * UE context setup request to target DU */
11734 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11737 DuDb *tgtDuDb = NULLP;
11738 CuUeCb *ueCbInTgtDu = NULLP;
11740 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11743 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11744 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11746 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11748 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11750 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11755 /* If UE context is not found in Target DU DU, send UE context setup
11757 if(ueCbInTgtDu == NULLP)
11759 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
11761 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11771 /*******************************************************************
11773 * @brief processing of F1 setup request
11777 * Function : procF1SetupReq
11780 * - processing of F1 setup request
11782 * @params[in] F1AP_PDU_t *f1apMsg
11783 * @return ROK - success
11784 * RFAILED - failure
11786 * ****************************************************************/
11787 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11789 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11791 uint64_t nrCellId = 0;
11792 DuDb *duDb = NULLP;
11793 CuCellCb *cellCb = NULLP;
11794 BIT_STRING_t nrcellIdentity;
11795 F1SetupRequest_t *f1SetupReq = NULLP;
11796 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11797 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11799 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11800 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11802 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11804 case ProtocolIE_ID_id_gNB_DU_ID:
11806 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11807 SEARCH_DU_DB(duIdx, duId, duDb);
11810 duDb = &cuCb.duInfo[cuCb.numDu];
11813 memset(duDb, 0, sizeof(DuDb));
11818 case ProtocolIE_ID_id_gNB_DU_Name:
11820 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11823 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11825 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11826 if(duServedCell->list.array)
11828 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11830 if(duServedCell->list.array[plmnidx])
11832 switch(duServedCell->list.array[plmnidx]->id)
11834 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11836 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11837 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11838 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11840 bitStringToInt(&nrcellIdentity, &nrCellId);
11841 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11842 if(cellCb == NULLP)
11844 cellCb = &duDb->cellCb[duDb->numCells];
11845 memset(cellCb, 0, sizeof(CuCellCb));
11846 cellCb->nrCellId = nrCellId;
11847 cellCb->cellStatus = CELL_ACTIVE;
11860 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11864 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11868 /****************************************************************
11870 * @brief processing of UE Context Release Complete
11874 * Function : procUeContextReleaseComplete
11877 * - processing of UE Context Release Complete
11879 * @params[in] F1AP_PDU_t *f1apMsg
11880 * @return ROK - success
11881 * RFAILED - failure
11883 * ****************************************************************/
11884 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11886 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
11887 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11888 DuDb *duDb = NULLP;
11889 CuUeCb *ueCb = NULLP;
11890 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11892 SEARCH_DU_DB(duIdx, duId, duDb);
11895 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11899 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11900 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11902 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11904 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11906 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11909 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11911 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11912 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11913 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11915 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11917 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11918 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11920 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11922 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
11924 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11925 ueCb->cellCb->numUe--;
11926 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
11928 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11935 memset(ueCb, 0, sizeof(CuUeCb));
11943 /*******************************************************************
11945 * @brief Builds the Paging cell list
11949 * Function : BuildPagingCellList
11951 * Functionality: Build the paging cell list
11953 * @params[in] PagingCell_list_t *pagingCelllist,
11955 * @return ROK - success
11956 * RFAILED - failure
11958 * ****************************************************************/
11959 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11961 uint8_t cellIdx =0;
11962 PagingCell_ItemIEs_t *pagingCellItemIes;
11963 PagingCell_Item_t *pagingCellItem;
11965 pagingCelllist->list.count = numCells;
11966 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11967 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11968 if(pagingCelllist->list.array == NULLP)
11970 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11974 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11976 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11977 if(pagingCelllist->list.array[cellIdx] == NULLP)
11979 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11984 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11986 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11987 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
11988 pagingCellItemIes->criticality = Criticality_ignore;
11989 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
11990 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11992 /* Fill NrCgi Information */
11993 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
11999 /*******************************************************************
12001 * @brief Deallocation of memory allocated in paging msg
12005 * Function :FreePagingMsg
12007 * Functionality: Deallocation of memory allocated in paging msg
12009 * @params[in] F1AP_PDU_t *f1apMsg
12013 * ****************************************************************/
12014 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
12016 uint8_t ieIdx, cellIdx;
12018 PagingCell_ItemIEs_t *pagingCellItemIes;
12019 PagingCell_Item_t *pagingCellItem;
12020 PagingCell_list_t *pagingCelllist;
12024 if(f1apMsg->choice.initiatingMessage)
12026 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12027 if(paging->protocolIEs.list.array)
12029 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
12031 if(paging->protocolIEs.list.array[ieIdx])
12033 switch(paging->protocolIEs.list.array[ieIdx]->id)
12035 case ProtocolIE_ID_id_UEIdentityIndexValue:
12037 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12038 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12042 case ProtocolIE_ID_id_PagingIdentity:
12044 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
12046 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12048 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
12050 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12051 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12053 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
12054 sizeof(struct CNUEPagingIdentity));
12060 case ProtocolIE_ID_id_PagingCell_List:
12062 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
12063 if(pagingCelllist->list.array)
12065 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
12067 if(pagingCelllist->list.array[cellIdx])
12069 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
12070 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
12072 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
12073 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
12074 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
12076 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
12079 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
12084 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12087 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12089 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12091 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12094 /*******************************************************************
12096 * @brief Builds and sends the paging message if UE is in idle mode
12100 * Function : BuildAndSendPagingMsg
12102 * Functionality: Builds and sends the paging message
12104 * @params[in] uint32_t duId, uint8_t gsTmsi
12106 * @return ROK - success
12107 * RFAILED - failure
12109 * ****************************************************************/
12110 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
12112 bool memAllocFailed = false;
12113 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
12114 uint16_t ueId = 0, duIdx = 0;
12116 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
12117 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
12118 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
12119 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
12121 F1AP_PDU_t *f1apMsg = NULLP;
12122 Paging_t *paging = NULLP;
12124 asn_enc_rval_t encRetVal;
12126 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
12128 SEARCH_DU_DB(duIdx, duId, duDb);
12131 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
12137 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12138 if(f1apMsg == NULLP)
12140 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
12144 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12146 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12147 if(f1apMsg->choice.initiatingMessage == NULLP)
12149 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
12152 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
12153 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12154 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
12156 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
12159 paging->protocolIEs.list.count = elementCnt;
12160 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
12162 /* Initialize the Paging Message members */
12163 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
12164 if(paging->protocolIEs.list.array == NULLP)
12166 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
12170 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12172 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
12173 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
12175 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12176 memAllocFailed = true;
12181 if(memAllocFailed == true)
12186 /* UE Identity Index Value */
12188 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
12189 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12190 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
12191 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
12192 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
12193 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
12194 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
12195 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
12197 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12201 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
12202 ueId = gsTmsi % 1024;
12203 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
12205 /* Paging Identity */
12207 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
12208 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12209 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
12210 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
12211 PagingIdentity_PR_cNUEPagingIdentity;
12212 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
12213 sizeof(struct CNUEPagingIdentity));
12214 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
12216 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12220 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
12221 CNUEPagingIdentity_PR_fiveG_S_TMSI;
12223 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
12224 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
12225 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
12226 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
12228 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
12232 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
12233 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
12237 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
12238 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12239 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
12240 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
12242 /* Paging Priority */
12244 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
12245 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12246 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
12247 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
12249 /* Paging Cell List */
12251 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
12252 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
12253 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
12254 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
12256 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
12260 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12262 /* Encode the UE Context Release Command type as APER */
12263 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12265 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12268 /* Encode results */
12269 if(encRetVal.encoded == ENCODE_FAIL)
12271 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12272 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12277 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12278 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12280 DU_LOG("%x",encBuf[ieIdx]);
12284 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12286 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12295 FreePagingMsg(f1apMsg);
12299 /*******************************************************************
12301 * @brief Handles received F1AP message and sends back response
12305 * Function : F1APMsgHdlr
12308 * - Decodes received F1AP control message
12309 * - Prepares response message, encodes and sends to SCTP
12312 * @return ROK - success
12313 * RFAILED - failure
12315 * ****************************************************************/
12316 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12322 F1AP_PDU_t *f1apMsg = NULLP;
12323 asn_dec_rval_t rval; /* Decoder return value */
12324 F1AP_PDU_t f1apasnmsg ;
12326 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12327 ODU_PRINT_MSG(mBuf, 0,0);
12329 /* Copy mBuf into char array to decode it */
12330 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12331 CU_ALLOC(recvBuf, (Size)recvBufLen);
12333 if(recvBuf == NULLP)
12335 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12338 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12340 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12344 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12345 for(i=0; i< recvBufLen; i++)
12347 DU_LOG("%x",recvBuf[i]);
12350 /* Decoding flat buffer into F1AP messsage */
12351 f1apMsg = &f1apasnmsg;
12352 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12354 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12355 CU_FREE(recvBuf, (Size)recvBufLen);
12357 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12359 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12363 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12365 switch(f1apMsg->present)
12367 case F1AP_PDU_PR_initiatingMessage:
12369 switch(f1apMsg->choice.initiatingMessage->value.present)
12371 case InitiatingMessage__value_PR_Reset:
12373 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12374 BuildAndSendF1ResetAck();
12378 case InitiatingMessage__value_PR_F1SetupRequest:
12380 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12381 procF1SetupReq(duId, f1apMsg);
12385 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12387 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12388 procGnbDuUpdate(*duId, f1apMsg);
12391 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12393 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12394 procInitULRRCMsg(*duId, f1apMsg);
12397 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12399 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12400 procUlRrcMsg(*duId, f1apMsg);
12404 case InitiatingMessage__value_PR_RRCDeliveryReport:
12406 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12409 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12411 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12412 procUeContextReleaseReq(*duId, f1apMsg);
12417 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12418 f1apMsg->choice.initiatingMessage->value.present);
12421 }/* End of switch(initiatingMessage) */
12425 case F1AP_PDU_PR_successfulOutcome:
12427 switch(f1apMsg->choice.successfulOutcome->value.present)
12429 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12431 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12434 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12436 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12437 procUeContextSetupResponse(*duId, f1apMsg);
12440 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12442 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12443 procUeContextModificationResponse(*duId, f1apMsg);
12446 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12448 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12449 procUeContextReleaseComplete(*duId, f1apMsg);
12454 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12455 f1apMsg->choice.successfulOutcome->value.present);
12458 }/* End of switch(successfulOutcome) */
12463 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12466 }/* End of switch(f1apMsg->present) */
12468 } /* End of F1APMsgHdlr */
12470 /**********************************************************************
12472 **********************************************************************/