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"
133 #include "cu_stub_sctp.h"
134 #include "cu_stub_egtp.h"
135 #include "cu_f1ap_msg_hdl.h"
138 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
139 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
141 /*******************************************************************
143 * @brief Sends F1 msg over SCTP
147 * Function : SendF1APMsg
149 * Functionality: Sends F1 msg over SCTP
151 * @params[in] Region region
153 * @return ROK - success
156 * ****************************************************************/
157 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
159 Buffer *mBuf = NULLP;
161 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
163 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
165 ODU_PRINT_MSG(mBuf, 0,0);
167 if(sctpSend(duId, mBuf) != ROK)
169 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
170 ODU_PUT_MSG_BUF(mBuf);
176 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
177 ODU_PUT_MSG_BUF(mBuf);
180 ODU_PUT_MSG_BUF(mBuf);
184 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
191 /*******************************************************************
193 * @brief Builds NRCell ID
197 * Function : BuildNrCellId
199 * Functionality: Building the NR Cell ID
201 * @params[in] BIT_STRING_t *nrcell
202 * @return ROK - success
205 * ****************************************************************/
207 S16 BuildNrCellId(BIT_STRING_t *nrcell)
209 memset(nrcell->buf, 0, nrcell->size);
211 nrcell->bits_unused = 4;
212 nrcell->size = 5 * sizeof(uint8_t);
216 /********************************************************************
218 * @brief Builds and sends the F1SetupResponse
222 * Function : BuildAndSendF1SetupRsp
224 * Functionality: Constructs the F1SetupResponse message and sends
225 * it back to the DU through SCTP.
227 * @params[in] void **buf,Buffer to which encoded pattern is written into
228 * @params[in] int *size,size of buffer
230 * @return ROK - success
233 * ****************************************************************/
234 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
237 uint8_t elementCnt,cellCnt;
238 F1AP_PDU_t *f1apMsg = NULL;
239 F1SetupResponse_t *f1SetupRsp;
240 GNB_CU_Name_t *cuName;
241 Cells_to_be_Activated_List_t *cellToActivate;
242 RRC_Version_t *rrcVer;
243 asn_enc_rval_t encRetVal;
244 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
246 /* Allocate the memory for F1SetupRequest_t */
247 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
250 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
253 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
255 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
256 if(f1apMsg->choice.successfulOutcome == NULLP)
258 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
259 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
263 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
264 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
265 f1apMsg->choice.successfulOutcome->value.present = \
266 SuccessfulOutcome__value_PR_F1SetupResponse;
267 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
270 f1SetupRsp->protocolIEs.list.count = elementCnt;
271 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
273 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
274 elementCnt * sizeof(F1SetupResponseIEs_t *));
275 if(f1SetupRsp->protocolIEs.list.array == NULLP)
277 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
278 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
279 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
283 for(idx=0; idx<elementCnt; idx++)
285 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
286 sizeof(F1SetupResponseIEs_t));
287 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
289 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
290 elementCnt * sizeof(F1SetupResponseIEs_t *));
291 CU_FREE(f1apMsg->choice.successfulOutcome, \
292 sizeof(SuccessfulOutcome_t));
293 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
300 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
301 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
302 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
303 F1SetupResponseIEs__value_PR_TransactionID;
304 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
309 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
310 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
311 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
312 F1SetupResponseIEs__value_PR_GNB_CU_Name;
313 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
314 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
316 CU_ALLOC(cuName->buf, sizeof(cuName->size));
317 if(cuName->buf == NULLP)
319 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
321 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
322 sizeof(F1SetupResponseIEs_t));
324 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
325 elementCnt * sizeof(F1SetupResponseIEs_t *));
326 CU_FREE(f1apMsg->choice.successfulOutcome,\
327 sizeof(SuccessfulOutcome_t));
328 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
331 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
333 /*Cells to be activated list*/
335 f1SetupRsp->protocolIEs.list.array[idx]->id = \
336 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
337 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
338 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
339 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
340 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
341 Cells_to_be_Activated_List;
343 cellToActivate->list.count = cellCnt;
344 cellToActivate->list.size = \
345 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
346 CU_ALLOC(cellToActivate->list.array,\
347 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
348 if(cellToActivate->list.array == NULLP)
350 CU_FREE(cuName->buf, sizeof(cuName->size));
351 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
353 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
354 sizeof(F1SetupResponseIEs_t));
356 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
357 elementCnt * sizeof(F1SetupResponseIEs_t *));
358 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
359 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
362 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
364 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
365 if(cellToActivate->list.array[ieIdx] == NULLP)
367 CU_FREE(cellToActivate->list.array,\
368 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
369 CU_FREE(cuName->buf, sizeof(cuName->size));
370 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
372 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
373 sizeof(F1SetupResponseIEs_t));
375 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
376 elementCnt * sizeof(F1SetupResponseIEs_t *));
377 CU_FREE(f1apMsg->choice.successfulOutcome, \
378 sizeof(SuccessfulOutcome_t));
379 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
383 cellToActivate->list.array[0]->id = \
384 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
385 cellToActivate->list.array[0]->criticality = Criticality_ignore;
386 cellToActivate->list.array[0]->value.present = \
387 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
388 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
389 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
390 CU_ALLOC(cellToActivate->list.array[0]->\
391 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
393 if(cellToActivate->list.array[0]->value.choice.\
394 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
397 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
399 CU_FREE(cellToActivate->list.array[ieIdx],\
400 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
403 CU_FREE(cellToActivate->list.array,\
404 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
405 CU_FREE(cuName->buf, sizeof(cuName->size));
406 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
408 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
409 sizeof(F1SetupResponseIEs_t));
411 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
412 elementCnt * sizeof(F1SetupResponseIEs_t *));
413 CU_FREE(f1apMsg->choice.successfulOutcome, \
414 sizeof(SuccessfulOutcome_t));
415 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
418 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
419 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
420 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
421 nRCGI.nRCellIdentity.size = 5;
422 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
423 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
425 if(cellToActivate->list.array[0]->value.choice.\
426 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
428 CU_FREE(cellToActivate->list.array[0]->\
429 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
431 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
433 CU_FREE(cellToActivate->list.array[ieIdx],\
434 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
437 CU_FREE(cellToActivate->list.array,\
438 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
439 CU_FREE(cuName->buf, sizeof(cuName->size));
440 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
442 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
443 sizeof(F1SetupResponseIEs_t));
445 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
446 elementCnt * sizeof(F1SetupResponseIEs_t *));
447 CU_FREE(f1apMsg->choice.successfulOutcome, \
448 sizeof(SuccessfulOutcome_t));
449 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
452 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
455 f1SetupRsp->protocolIEs.list.array[idx]->id = \
456 ProtocolIE_ID_id_GNB_CU_RRC_Version;
457 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
458 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
459 F1SetupResponseIEs__value_PR_RRC_Version;
460 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
461 rrcVer->latest_RRC_Version.size = RRC_SIZE;
463 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
464 if(rrcVer->latest_RRC_Version.buf == NULLP)
466 CU_FREE(cuName->buf, sizeof(cuName->size));
467 for(ieIdx=0; ieIdx<elementCnt; idx++)
469 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
470 sizeof(F1SetupResponseIEs_t));
472 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
473 elementCnt * sizeof(F1SetupResponseIEs_t *));
474 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
475 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
479 /* Need to check RRC Version */
480 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
481 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
482 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
483 if(rrcVer->iE_Extensions == NULLP)
485 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
486 CU_FREE(cuName->buf, sizeof(cuName->size));
487 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
489 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
490 sizeof(F1SetupResponseIEs_t));
492 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
493 elementCnt * sizeof(F1SetupResponseIEs_t *));
494 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
495 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
498 rrcVer->iE_Extensions->list.count = 1;
499 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
500 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
501 sizeof(struct RRC_Version_ExtIEs *));
502 if(rrcVer->iE_Extensions->list.array == NULLP)
504 CU_FREE(rrcVer->iE_Extensions,\
505 sizeof(ProtocolExtensionContainer_4624P81_t));
506 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
507 CU_FREE(cuName->buf, sizeof(cuName->size));
508 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
510 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
511 sizeof(F1SetupResponseIEs_t));
513 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
514 elementCnt * sizeof(F1SetupResponseIEs_t *));
515 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
516 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
519 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
520 sizeof(struct RRC_Version_ExtIEs));
521 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
523 CU_FREE(rrcVer->iE_Extensions->list.array,\
524 sizeof(struct RRC_Version_ExtIEs *));
525 CU_FREE(rrcVer->iE_Extensions,\
526 sizeof(ProtocolExtensionContainer_4624P81_t));
527 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
528 CU_FREE(cuName->buf, sizeof(cuName->size));
529 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
531 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
532 sizeof(F1SetupResponseIEs_t));
534 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
535 elementCnt * sizeof(F1SetupResponseIEs_t *));
536 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
537 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
540 rrcVer->iE_Extensions->list.array[0]->id = \
541 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
542 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
543 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
544 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
545 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
546 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
547 CU_ALLOC(rrcVer->iE_Extensions->list.\
548 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
550 if(rrcVer->iE_Extensions->list.\
551 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
553 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
554 sizeof(struct RRC_Version_ExtIEs));
555 CU_FREE(rrcVer->iE_Extensions->list.array,\
556 sizeof(struct RRC_Version_ExtIEs *));
557 CU_FREE(rrcVer->iE_Extensions,\
558 sizeof(ProtocolExtensionContainer_4624P81_t));
559 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
560 CU_FREE(cuName->buf, sizeof(cuName->size));
561 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
563 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
564 sizeof(F1SetupResponseIEs_t));
566 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
567 elementCnt * sizeof(F1SetupResponseIEs_t *));
568 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
569 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
572 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
573 Latest_RRC_Version_Enhanced.buf[0] = 0;
574 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
575 Latest_RRC_Version_Enhanced.buf[1] = 5;
576 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
577 Latest_RRC_Version_Enhanced.buf[2] = 15;
579 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
581 /* Encode the F1SetupRequest type as UPER */
582 memset(encBuf, 0, ENC_BUF_MAX_LEN);
584 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
587 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
588 CU_FREE(cuName->buf, sizeof(cuName->size));
589 for(idx=0; idx<elementCnt; idx++)
591 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
593 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
594 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
595 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
597 /* Check encode results */
598 if(encRetVal.encoded == ENCODE_FAIL)
600 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
601 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
606 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
607 for(int i=0; i< encBufSize; i++)
609 DU_LOG("%x",encBuf[i]);
614 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
616 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
621 }/* End of BuildAndSendF1SetupRsp */
623 /*******************************************************************
625 * @brief Builds and sends the DUUpdateAcknowledge
629 * Function : BuildAndSendDUUpdateAck
631 * Functionality: Constructs the DU Update Acknowledge message and sends
632 * it to the DU through SCTP.
636 * @return ROK - success
639 * ****************************************************************/
641 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
645 F1AP_PDU_t *f1apMsg = NULL;
646 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
647 asn_enc_rval_t enRetVal; /* Encoder return value */
649 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
651 /* Allocate the memory for F1SetupRequest_t */
652 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
655 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
659 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
661 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
662 if(f1apMsg->choice.successfulOutcome == NULLP)
664 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
665 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
669 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
670 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
671 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
672 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
675 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
676 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
678 /* Initialize the F1Setup members */
679 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
680 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
682 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
683 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
684 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
688 for(idx=0; idx<elementCnt; idx++)
690 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
691 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
693 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
694 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
695 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
702 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
703 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
704 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
705 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
706 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
708 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
710 /* Encode the F1SetupRequest type as UPER */
711 memset(encBuf, 0, ENC_BUF_MAX_LEN);
713 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
716 for(idx=0; idx<elementCnt; idx++)
718 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
720 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
721 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
722 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
724 /* Checking encode results */
725 if(enRetVal.encoded == ENCODE_FAIL)
727 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
728 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
733 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
734 for(int i=0; i< encBufSize; i++)
736 DU_LOG("%x",encBuf[i]);
741 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
742 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
744 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
750 }/* End of BuildAndSendDUUpdateAck*/
752 /*******************************************************************
754 * @brief deallocating the memory of F1reset msg
758 * Function : FreeF1ResetReq
761 * - freeing memory of F1reset request msg
767 * ****************************************************************/
768 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
771 Reset_t *f1ResetMsg = NULLP;
775 if(f1apMsg->choice.initiatingMessage)
777 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
778 if(f1ResetMsg->protocolIEs.list.array)
780 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
782 if(f1ResetMsg->protocolIEs.list.array[idx])
784 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
787 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
789 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
791 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
794 /*******************************************************************
796 * @brief build ansld ans send f1reset msg
800 * Function : BuildAndSendF1ResetReq
802 * Functionality: build and send f1reset msg
804 * @return ROK - success
807 * ****************************************************************/
808 uint8_t BuildAndSendF1ResetReq()
810 uint8_t elementCnt=0;
812 uint8_t ret= RFAILED;
813 Reset_t *f1ResetMsg = NULLP;
814 F1AP_PDU_t *f1apMsg = NULLP;
815 asn_enc_rval_t encRetVal;
816 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
819 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
822 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
825 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
826 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
827 if(f1apMsg->choice.initiatingMessage == NULLP)
829 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
832 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
833 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
834 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
836 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
839 f1ResetMsg->protocolIEs.list.count = elementCnt;
840 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
842 /* Initialize the F1Reset members */
843 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
844 if(f1ResetMsg->protocolIEs.list.array == NULLP)
846 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
849 for(idx=0; idx<elementCnt; idx++)
851 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
852 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
854 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
861 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
862 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
863 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
864 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
868 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
869 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
870 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
871 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
872 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
876 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
877 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
878 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
879 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
880 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
882 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
884 /* Encode the F1SetupRequest type as APER */
885 memset(encBuf, 0, ENC_BUF_MAX_LEN);
887 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
891 if(encRetVal.encoded == ENCODE_FAIL)
893 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
894 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
899 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
900 for(idx=0; idx< encBufSize; idx++)
902 DU_LOG("%x",encBuf[idx]);
906 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
907 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
909 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
917 FreeF1ResetReq(f1apMsg);
921 /*******************************************************************
923 * @brief Fills Radio Bearer Config
927 * Function : fillSrbCfg
929 * Functionality: Fills Radio Bearer Config
931 * @params[in] SRB_ToAddModList *
933 * @return ROK - success
936 * ****************************************************************/
937 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
939 uint8_t elementCnt = 0;
940 uint8_t idx, ieId, srbIdx = 0;
942 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
944 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
948 if(bearerCfg != NULLP)
950 bearerCfg->list.count = elementCnt;
951 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
952 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
953 if(bearerCfg->list.array != NULLP)
955 for(idx = 0; idx < elementCnt; idx++)
957 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
958 if(bearerCfg->list.array[idx] == NULLP)
960 for(ieId = 0; ieId < idx; ieId++)
962 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
964 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
971 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
976 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
978 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
979 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
985 /*******************************************************************
987 * @brief Fills Master CellGroup Info
991 * Function : fillMasterCellGroup
993 * Functionality: Fills Master Cell Group IE
995 * @params[in] RRCSetup_IEs_t *
997 * @return ROK - success
1000 * ****************************************************************/
1002 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
1005 masterCellGroup->buf = NULLP;
1006 if(ueCb->f1apMsgDb.duToCuContainer.buf)
1008 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
1009 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1010 if(masterCellGroup->buf != NULLP)
1012 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1016 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1027 /*******************************************************************
1029 * @brief Fills RRC setup IE
1033 * Function : fillRRCSetupIE
1035 * Functionality: Fills RRC Setup IE
1037 * @params[in] RRCSetup_IEs_t *
1039 * @return ROK - success
1042 * ****************************************************************/
1044 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1046 uint8_t ret = ROK, srbIdx = 0;
1049 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1050 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1052 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1056 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1060 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1064 /* If SRB configuration are filled successfully in RRC Setup, mark these
1065 * configurartion as sent to UE */
1066 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1068 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1069 ueCb->srbList[srbIdx].cfgSentToUe = true;
1074 /*******************************************************************
1076 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1080 * Function : fillDlCcchRrcMsg
1082 * Functionality: Fills DL DCCCH Message required for
1083 * DLRRCMessageTransfer
1085 * @params[in] RRCContainer_t *rrcContainer
1087 * @return ROK - success
1090 * ****************************************************************/
1092 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1096 DL_CCCH_Message_t dl_CCCH_Msg;
1097 asn_enc_rval_t encRetVal;
1099 if(rrcContainer != NULLP)
1101 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1103 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1104 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1106 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1107 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1108 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1110 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1111 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1112 RRCSetup__criticalExtensions_PR_rrcSetup;
1114 /* Fill RRC Setup IE */
1115 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1116 sizeof(RRCSetup_IEs_t));
1117 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1119 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1123 /* encode DL-CCCH message into RRC Container */
1124 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1125 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1127 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1128 /* Encode results */
1129 if(encRetVal.encoded == ENCODE_FAIL)
1131 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1132 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1137 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1138 for(int i = 0; i< encBufSize; i++)
1140 DU_LOG("%x",encBuf[i]);
1142 rrcContainer->size = encBufSize;
1143 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1144 if(rrcContainer->buf != NULLP)
1146 memset(rrcContainer->buf, 0, encBufSize);
1147 for(idx2 = 0; idx2 < encBufSize; idx2++)
1149 rrcContainer->buf[idx2] = encBuf[idx2];
1161 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1167 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1173 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1179 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1184 /*******************************************************************
1186 * @brief Fills QOS flow configuration
1190 * Function : fillQosFlowsToAdd
1192 * Functionality: Fills QOS flow configuration
1194 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1196 * @return ROK - success
1199 * ****************************************************************/
1200 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1202 uint8_t idx, ied, elementCnt;
1205 qosFlow->list.count = elementCnt;
1206 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1207 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1208 if(qosFlow->list.array != NULLP)
1210 for(idx = 0; idx < elementCnt; idx++)
1212 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1213 if(qosFlow->list.array[idx] == NULLP)
1215 for(ied = 0; ied < idx; ied++)
1217 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1219 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1225 *qosFlow->list.array[idx] = 9;
1229 /*******************************************************************
1231 * @brief Fills CN Assoc for Drb to Add/Mod List
1235 * Function : fillCnAssoc
1237 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1239 * @params[in] struct DRB_ToAddMod__cnAssociation *
1241 * @return ROK - success
1244 * ****************************************************************/
1246 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1250 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1251 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1253 cnAssoc->choice.eps_BearerIdentity = 5;
1255 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1257 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1258 if(cnAssoc->choice.sdap_Config)
1260 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1261 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1262 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1263 cnAssoc->choice.sdap_Config->defaultDRB = true;
1264 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1265 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1266 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1267 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1268 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1270 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1274 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1275 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1281 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1288 /*******************************************************************
1290 * @brief Fills Radio Bearer Config for Drb
1294 * Function : fillDrbCfg
1296 * Functionality: Fills Radio Bearer Config for Drb
1298 * @params[in] drbId, DRB_ToAddModList *
1300 * @return ROK - success
1303 * ****************************************************************/
1304 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1306 uint8_t idx, ied, ret, elementCnt;
1312 drbCfg->list.count = elementCnt;
1313 drbCfg->list.size =\
1314 elementCnt * sizeof(DRB_ToAddMod_t *);
1315 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1316 if(drbCfg->list.array != NULLP)
1318 for(idx = 0; idx < elementCnt; idx++)
1320 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1321 if(drbCfg->list.array[idx] == NULLP)
1323 for(ied = 0; ied < idx; ied++)
1325 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1327 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1337 /* CN ASSOCIATION */
1338 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1339 if(drbCfg->list.array[idx]->cnAssociation)
1341 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1344 drbCfg->list.array[idx]->drb_Identity = drbId;
1349 /*******************************************************************
1351 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1355 * Function : fillRrcReconfigIE
1357 * Functionality: Fills RRC Reconfig Message required for
1358 * DLRRCMessageTransfer
1360 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1362 * @return ROK - success
1365 * ****************************************************************/
1367 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1370 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1371 if(rrcReconfigMsg->radioBearerConfig)
1373 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1374 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1376 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1381 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1382 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1384 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1387 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1388 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1389 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1395 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1396 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1402 /*******************************************************************
1404 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1408 * Function : fillDlDcchRrcMsg
1410 * Functionality: Fills DL DCCH Message required for
1411 * DLRRCMessageTransfer
1413 * @params[in] RRCContainer_t *rrcContainer
1415 * @return ROK - success
1418 * ****************************************************************/
1420 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1423 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1424 DL_DCCH_Message_t dl_DCCH_Msg;
1425 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1426 asn_enc_rval_t encRetVal;
1428 if(rrcContainer != NULLP)
1430 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1432 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1433 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1435 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1436 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1437 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1439 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1440 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1443 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1444 * configurartion as sent to UE */
1445 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1447 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1448 ueCb->srbList[srbIdx].cfgSentToUe = true;
1450 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1452 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1453 ueCb->drbList[drbIdx].cfgSentToUe = true;
1456 /* encode DL-DCCH message into RRC Container */
1457 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1458 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1460 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1461 /* Encode results */
1462 if(encRetVal.encoded == ENCODE_FAIL)
1464 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1465 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1470 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1471 for(int i = 0; i< encBufSize; i++)
1473 DU_LOG("%x",encBuf[i]);
1475 rrcContainer->size = encBufSize;
1476 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1477 if(rrcContainer->buf != NULLP)
1479 memset(rrcContainer->buf, 0, encBufSize);
1480 for(idx2 = 0; idx2 < encBufSize; idx2++)
1482 rrcContainer->buf[idx2] = encBuf[idx2];
1490 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1496 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1502 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1508 /*******************************************************************
1510 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1514 * Function : BuildDLRRCContainer
1516 * Functionality: Builds RRC Container IE required for
1517 * DLRRCMessageTransfer
1521 * @return ROK - success
1524 * ****************************************************************/
1526 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1528 uint8_t ret, bufLen;
1531 if(rrcMsgType == RRC_SETUP)
1533 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1535 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1537 else if(rrcMsgType == REGISTRATION_ACCEPT)
1539 /*Hardcoded RRC Container from reference logs*/
1540 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1542 rrcContainer->size = bufLen;
1543 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1544 if(rrcContainer->buf != NULLP)
1546 memset(rrcContainer->buf, 0, bufLen);
1547 memcpy(rrcContainer->buf, buf, bufLen);
1551 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1555 else if(rrcMsgType == RRC_RECONFIG)
1557 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Message ");
1558 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1560 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1566 /*******************************************************************
1568 * @brief Frees the DLRRCMessageTransfer
1572 * Function : freeDlRrcMessageTransfer
1574 * Functionality: Frees the DLRRCMessageTransfer
1578 * @return ROK - success
1581 * ****************************************************************/
1582 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1585 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1589 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1590 if(dlRRCMsg->protocolIEs.list.array)
1593 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1594 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1595 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1597 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1599 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1601 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1605 /*******************************************************************
1607 * @brief Builds and sends the DLRRCMessageTransfer
1611 * Function : BuildAndSendDLRRCMessageTransfer
1613 * Functionality: Constructs the DL RRC Message Transfer and sends
1614 * it to the CU through SCTP.
1618 * @return ROK - success
1621 * ****************************************************************/
1622 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1624 uint8_t elementCnt = 0;
1627 F1AP_PDU_t *f1apMsg = NULLP;
1628 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1629 asn_enc_rval_t encRetVal; /* Encoder return value */
1631 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1633 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1634 if(f1apMsg == NULLP)
1636 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1640 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1641 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1642 if(f1apMsg->choice.initiatingMessage == NULLP)
1644 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1645 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1649 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1650 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1651 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1652 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1655 dlRRCMsg->protocolIEs.list.count = elementCnt;
1656 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1658 /* Initialize the F1Setup members */
1659 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1660 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1662 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1663 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1664 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1668 for(idx=0; idx<elementCnt; idx++)
1670 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1671 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1673 for(ieId=0; ieId<idx; ieId++)
1675 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1677 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1678 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1679 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1684 /* GNB CU UE F1AP ID */
1686 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1687 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1688 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1689 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1691 /* GNB DU UE F1AP ID */
1693 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1694 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1695 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1696 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1700 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1701 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1702 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1703 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1707 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1708 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1709 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1710 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1712 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1714 /* Encode the F1SetupRequest type as APER */
1715 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1717 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1719 /* Encode results */
1720 if(encRetVal.encoded == ENCODE_FAIL)
1722 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1723 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1728 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1729 for(int i=0; i< encBufSize; i++)
1731 DU_LOG("%x",encBuf[i]);
1736 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1738 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1741 freeDlRrcMessageTransfer(f1apMsg);
1743 }/* End of BuildAndSendDLRRCMessageTransfer */
1745 /*******************************************************************
1747 * @brief Function to set the Dl RRC Msg Type
1751 * Function : setDlRRCMsgType
1753 * Functionality: Constructs the UE Setup Response and sends
1754 * it to the DU through SCTP.
1758 * @return ROK - success
1761 * ****************************************************************/
1763 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1765 uint8_t rrcMsgType = 0;
1766 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1769 rrcMsgType = RRC_SETUP;
1771 case REGISTRATION_ACCEPT:
1772 rrcMsgType = REGISTRATION_ACCEPT;
1774 case UE_CONTEXT_SETUP_REQ:
1775 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1777 case SECURITY_MODE_COMPLETE:
1778 rrcMsgType = SECURITY_MODE_COMPLETE;
1781 rrcMsgType = RRC_RECONFIG;
1783 case RRC_RECONFIG_COMPLETE:
1784 rrcMsgType = RRC_RECONFIG_COMPLETE;
1786 case UE_CONTEXT_MOD_REQ:
1787 rrcMsgType = UE_CONTEXT_MOD_REQ;
1795 /*******************************************************************
1797 * @brief Extract configuration from CellGroupConfig
1801 * Function : extractCellGroupConfig
1803 * Functionality: Extract configuration from CellGroupConfig
1804 * and store in local database
1806 * @params[in] UE control block
1809 * @return ROK - success
1812 * ****************************************************************/
1813 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
1815 uint8_t rbIdx, srbIdx, drbIdx;
1816 bool srbFound, drbFound;
1817 SrbInfo *srbCfgDb = NULLP;
1818 DrbInfo *drbCfgDb = NULLP;
1819 RlcLcCfg *rlcLcCfgDb = NULLP;
1820 MacLcCfg *macLcCfgDb = NULLP;
1821 RLC_BearerConfig_t *rlcCfg = NULLP;
1822 RLC_Config_t *rlcLcCfg = NULLP;
1823 LogicalChannelConfig_t *macLcCfg = NULLP;
1827 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
1831 if(cellGrpCfg == NULLP)
1833 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
1837 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
1842 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
1844 /* Update SRB configuration in local DB */
1845 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
1847 /* Search if SRB entry is already present in DB */
1848 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
1850 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
1852 srbCfgDb = &ueCb->srbList[srbIdx];
1858 /* If not, add SRB to UE CB's SRB list */
1861 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
1862 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
1866 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1867 srbCfgDb->cfgSentToUe = false;
1868 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
1869 macLcCfgDb = &srbCfgDb->macLcCfg;
1872 /* Update DRB configuration in local DB */
1873 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
1875 /* Search if DRB entry is already present in DB */
1876 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
1878 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
1880 drbCfgDb = &ueCb->drbList[drbIdx];
1886 /* If not, add DRB to UE CB's SRB list */
1889 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
1890 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
1894 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1895 drbCfgDb->cfgSentToUe = false;
1896 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
1897 macLcCfgDb = &drbCfgDb->macLcCfg;
1901 /* Update RLC configuration for this RB */
1902 rlcLcCfg = rlcCfg->rlc_Config;
1903 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
1904 switch(rlcLcCfgDb->rlcMode)
1906 case RLC_Config_PR_am:
1908 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
1909 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
1910 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
1911 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
1912 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
1914 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
1915 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
1916 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
1920 case RLC_Config_PR_um_Bi_Directional:
1922 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
1924 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
1925 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
1930 /* Update MAC configuration for this LC */
1931 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
1932 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
1933 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
1934 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
1935 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
1936 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
1941 /*******************************************************************
1943 * @brief Function to decode DU to CU RRC container
1947 * Function : extractDuToCuRrcCont
1949 * Functionality: Function to decode DU to CU RRC container
1952 * RRC conatiner octect string to be decoded
1954 * @return ROK - success
1957 * ****************************************************************/
1958 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
1960 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
1961 asn_dec_rval_t rval; /* Decoder return value */
1963 /* Decoding DU to CU RRC container octet string to cell group config */
1964 cellGrpCfgMsg = &cellGrpCfg;
1965 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
1967 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
1969 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1971 DU_LOG("\nERROR --> F1AP : ASN decode failed");
1975 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
1977 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
1979 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
1986 /*******************************************************************
1988 * @brief Function to build Initial UL RRC Message
1992 * Function : procInitULRRCMsg
1994 * Functionality: Function to build Initial UL RRC Message
1998 * @return ROK - success
2001 * ****************************************************************/
2003 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2005 uint8_t idx,cellIdx=0, duIdx=0, rrcMsgType, gnbDuUeF1apId;
2007 uint32_t nrCellId, crnti;
2011 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2013 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2015 SEARCH_DU_DB(duIdx, duId, duDb);
2016 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2018 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2020 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2022 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2023 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2026 case ProtocolIE_ID_id_NRCGI:
2027 nrCellId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.buf[4] >>
2028 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.bits_unused;
2029 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2034 case ProtocolIE_ID_id_C_RNTI:
2035 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2036 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2038 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2039 memset(ueCb, 0, sizeof(CuUeCb));
2040 ueCb->cellCb = cellCb;
2041 ueCb->crnti = crnti;
2042 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2043 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2044 ueCb->state = UE_ATTACH_IN_PROGRESS;
2047 cellCb->ueCb[cellCb->numUe] = ueCb;
2052 case ProtocolIE_ID_id_RRCContainer:
2055 case ProtocolIE_ID_id_DUtoCURRCContainer:
2057 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2058 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2060 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2061 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2062 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2063 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2065 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2066 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2067 ueCb->f1apMsgDb.duToCuContainer.size);
2069 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2071 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2077 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2084 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2093 ueCb->f1apMsgDb.dlRrcMsgCount++;
2094 rrcMsgType = setDlRRCMsgType(ueCb);
2095 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2100 /*******************************************************************
2102 * @brief Builds Nrcgi
2106 * Function : BuildNrcgi
2108 * Functionality: Building the PLMN ID and NR Cell id
2110 * @params[in] NRCGI_t *nrcgi
2111 * @return ROK - success
2114 * ****************************************************************/
2115 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2118 uint8_t unused_bits = 4;
2119 uint8_t byteSize = 5;
2121 /* Allocate Buffer Memory */
2122 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2123 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2124 if(nrcgi->pLMN_Identity.buf == NULLP)
2128 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2134 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2135 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2136 if(nrcgi->nRCellIdentity.buf == NULLP)
2140 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2144 /*******************************************************************
2146 * @brief Builds Special cell list for UE Setup Request
2150 * Function : BuildSplCellList
2152 * Functionality: Constructs the Special Cell list for UESetReq
2154 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2156 * @return ROK - success
2159 * ****************************************************************/
2160 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2166 spCellLst->list.count = cellCnt;
2167 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2168 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2169 if(spCellLst->list.array == NULLP)
2173 for(idx=0; idx<cellCnt; idx++)
2175 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2176 if(spCellLst->list.array[idx] == NULLP)
2182 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2183 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2184 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2186 /* Special Cell ID -NRCGI */
2187 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2192 /*Special Cell Index*/
2193 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2195 }/* End of BuildSplCellList*/
2197 /*******************************************************************
2199 * @brief Builds SRBS to be setup
2203 * Function : BuildSRBSetup
2205 * Functionality: Constructs the SRB's for UESetReq
2207 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2209 * @return ROK - success
2212 * ****************************************************************/
2213 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2218 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2219 srbCnt = ueCb->numSrb;
2222 srbSet->list.count = srbCnt;
2223 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2224 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2225 if(srbSet->list.array == NULLP)
2227 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2231 for(idx=0; idx<srbCnt; idx++)
2233 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2234 if(srbSet->list.array[idx] == NULLP)
2236 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2241 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2244 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2245 srbSet->list.array[idx]->criticality = Criticality_ignore;
2246 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2247 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2248 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2253 for(idx=0; idx<srbCnt; idx++)
2255 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2256 srbSet->list.array[idx]->criticality = Criticality_ignore;
2257 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2258 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2262 }/* End of BuildSRBSetup*/
2264 /*******************************************************************
2266 * @brief Builds QOS Info for DRB Setum Item
2270 * Function : BuildQOSInfo
2272 * Functionality: Constructs the QOS Info for DRB Setup Item
2274 * @params[in] QoSInformation_t *qosinfo
2275 * int16_t pduSessionID
2277 * @return ROK - success
2280 * ****************************************************************/
2281 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2283 uint8_t elementCnt = 0, qosCntIdx = 0;
2284 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2286 /* NonDynamic5QIDescriptor */
2287 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2288 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2289 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2295 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2299 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2300 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2302 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2304 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2310 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2311 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2315 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2316 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2318 /*MaxDataBurstVolume*/
2319 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2320 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2324 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2325 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2328 /*nRGRAN Allocation Retention Priority*/
2331 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2332 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2333 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2337 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2338 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2339 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2341 qosInfo->priorityLevel = PriorityLevel_lowest;
2342 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2343 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2346 /* PDU session ID */
2349 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2350 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2352 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2356 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2357 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2361 elementCnt = NUM_QOS_EXT;
2362 qosIeExt->list.count = elementCnt;
2363 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2365 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2366 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2368 if(qosIeExt->list.array == NULLP)
2370 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2374 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2376 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2377 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2379 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2382 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2383 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2384 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2385 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2386 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2387 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2388 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2389 qosInfo->pduSessionId = pduSessionID;
2394 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2399 }/*End of BuildQOSInfo*/
2401 /*******************************************************************
2403 * @brief Builds SNSSAI
2407 * Function : BuildSNSSAI
2409 * Functionality: Constructs the SNSSAI For DRB list
2411 * @params[in] SNSSAI_t *snssai
2412 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2414 * @return ROK - success
2417 * ****************************************************************/
2418 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2422 snssai->sST.size = sizeof(uint8_t);
2423 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2424 if(snssai->sST.buf == NULLP)
2429 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2431 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2434 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2435 if(snssai->sD == NULLP)
2439 snssai->sD->size = 3 * sizeof(uint8_t);
2440 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2441 if(snssai->sD->buf == NULLP)
2446 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2448 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2451 drbInfo->snssai = snssaiToCopy;
2453 }/*End of BuildSNSSAI*/
2455 /*******************************************************************
2457 * @brief Builds the flow map.
2461 * Function : BuildFlowsMap
2463 * Functionality: Constructs the flowmap For DRB list
2465 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2467 * @return ROK - success
2470 * ****************************************************************/
2471 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2473 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2474 FlowsMapped *qosFlow;
2479 flowCnt = drbInfo->numFlowMap;
2480 flowMap->list.count = flowCnt;
2481 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2482 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2483 if(flowMap->list.array == NULLP)
2485 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2488 for(idx=0; idx<flowCnt; idx++)
2490 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2491 if(flowMap->list.array[idx] == NULLP)
2493 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2499 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2500 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2502 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2504 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2506 qosFlow = &drbInfo->flowMapList[flowIdx];
2513 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2514 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2519 qosFlow = &drbInfo->flowMapList[idx];
2520 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2523 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2524 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2527 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2531 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2532 drbInfo->numFlowMap++;
2535 }/*End of BuildFlowsMap*/
2537 /*******************************************************************
2539 * @brief Builds the Uplink Tunnel Info
2543 * Function : BuildULTnlInfo
2545 * Functionality: Constructs the UL TnlInfo For DRB list
2547 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2549 * @return ROK - success
2552 * ****************************************************************/
2553 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2559 ulInfo->list.count = ulCnt;
2560 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2561 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2562 if(ulInfo->list.array == NULLP)
2564 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2567 for(idx=0; idx<ulCnt; idx++)
2569 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2570 if(ulInfo->list.array[idx] == NULLP)
2572 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2577 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2579 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2580 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2582 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2585 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2586 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2587 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2588 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2590 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2596 /* NOTE: Below IP address must be changed if running on different IP configuration */
2597 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2598 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2599 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2600 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2601 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2603 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2604 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2605 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2606 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2610 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2611 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2612 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2613 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2614 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2618 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2619 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2620 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2621 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2623 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2629 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2630 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2631 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2632 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2634 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2635 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2636 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2637 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2641 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2642 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2643 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2644 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2647 }/*End of BuildULTnlInfo*/
2649 /*******************************************************************
2651 * @brief Builds DRBS to be setup
2655 * Function : BuildDRBSetup
2657 * Functionality: Constructs the DRB's for UESetReq
2659 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2661 * @return ROK - success
2664 * ****************************************************************/
2665 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2667 uint8_t idx = 0, extIeIdx = 0;
2668 uint8_t elementCnt = 0, drbCnt = 0;
2669 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2670 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2671 DRBs_ToBeSetup_Item_t *drbSetItem;
2672 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2673 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2675 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2676 drbCnt = ueCb->numDrb;
2678 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2679 drbSet->list.count = drbCnt;
2681 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2682 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2683 if(drbSet->list.array == NULLP)
2685 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2689 for(idx=0; idx<drbCnt; idx++)
2691 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2692 if(drbSet->list.array[idx] == NULLP)
2694 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2698 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2699 drbSet->list.array[idx]->criticality = Criticality_ignore;
2700 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2701 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2703 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2705 drbSetItem->dRBID = idx + 1;
2706 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2709 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2712 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2713 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2714 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2716 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2719 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2720 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2721 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2722 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2723 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2724 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2726 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2727 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2728 if(BuildQOSInforet != ROK)
2730 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2735 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2736 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2737 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
2739 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2740 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], TRUE);
2741 if(BuildSNSSAIret != ROK)
2743 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2747 /*Flows mapped to DRB List*/
2748 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2749 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2750 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2752 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2753 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2754 if(BuildFlowsMapret != ROK)
2756 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2760 /*ULUPTNLInformation To Be Setup List*/
2761 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2762 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2765 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2767 if(BuildULTnlInforet != ROK)
2769 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2774 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2776 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2777 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
2780 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
2782 /* DL PDCP SN Length */
2783 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2785 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
2786 if(!drbToBeSetupExt)
2788 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
2793 drbToBeSetupExt->list.count = elementCnt;
2794 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
2796 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
2797 if(!drbToBeSetupExt->list.array)
2799 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
2803 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
2805 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
2806 if(!drbToBeSetupExt->list.array[extIeIdx])
2808 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
2814 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
2816 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
2817 drbToBeSetupExtIe->criticality = Criticality_ignore;
2818 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
2819 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
2820 drbSetItem->iE_Extensions = drbToBeSetupExt;
2823 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2827 }/* End of BuildDRBSetup*/
2829 /*******************************************************************
2831 * @brief Deallocating memory of function BuildAndSendUESetReq
2835 * Function : FreeNrcgi
2837 * Functionality: Deallocating memory for function BuildNrcgi
2839 * @params[in] NRCGI_t *nrcgi
2843 *******************************************************************/
2844 void FreeNrcgi(NRCGI_t *nrcgi)
2846 if(nrcgi->pLMN_Identity.buf != NULLP)
2848 if(nrcgi->nRCellIdentity.buf != NULLP)
2850 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2852 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2855 /*******************************************************************
2857 * @brief Deallocating memory of function BuildAndSendUESetReq
2861 * Function : FreeSplCellList
2863 * Functionality: Deallocating memory for function BuildSplCellList
2865 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2870 * *****************************************************************/
2871 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2874 if(spCellLst->list.array != NULLP)
2876 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2878 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2880 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2882 if(spCellLst->list.array[cellidx]!=NULLP)
2884 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2887 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2890 /*******************************************************************
2892 * @brief Deallocating memory of function BuildAndSendUESetReq
2896 * Function : FreeSRBSetup
2898 * Functionality: Deallocating memory for function BuildSRBSetup
2900 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2905 * ******************************************************************/
2906 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2909 if(srbSet->list.array != NULLP)
2911 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2913 if(srbSet->list.array[srbidx]!=NULLP)
2915 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2918 CU_FREE(srbSet->list.array,srbSet->list.size);
2921 /*******************************************************************
2923 * @brief Deallocating memory of function BuildAndSendUESetReq
2927 * Function : FreeQOSInfo
2929 * Functionality: Deallocating memory for function BuildQOSInfo
2931 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2935 * ****************************************************************/
2936 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2938 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2939 uint8_t qosCntIdx = 0;
2941 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2943 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2945 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2947 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2948 sizeof(MaxDataBurstVolume_t));
2950 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2951 sizeof(AveragingWindow_t));
2953 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2954 sizeof(NonDynamic5QIDescriptor_t));
2956 if(drbQos->iE_Extensions)
2958 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2959 if(qosIeExt->list.array != NULLP)
2961 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2963 if(qosIeExt->list.array[qosCntIdx])
2965 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2968 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2971 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2974 /*******************************************************************
2976 * @brief Deallocating memory of function BuildAndSendUESetReq
2980 * Function : FreeULTnlInfo
2982 * Functionality: Deallocating memory for function BuildULTnlInfo
2984 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2989 * ****************************************************************/
2990 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2993 if(ulInfo->list.array != NULLP)
2995 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2997 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2999 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3001 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3002 transportLayerAddress.buf != NULLP)
3004 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3007 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3008 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3009 gTPTunnel->gTP_TEID.size);
3011 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3012 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3013 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3015 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3016 sizeof(GTPTunnel_t));
3019 if(ulInfo->list.array[ulidx]!=NULLP)
3021 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3024 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3027 /*******************************************************************
3029 * @brief Deallocating memory for BuildAndSendUESetReq
3033 * Function : FreeDRBSetup
3035 * Functionality: Deallocating memory for BuildDRBSetup
3037 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3041 * ****************************************************************/
3042 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3044 DRBs_ToBeSetup_Item_t *drbSetItem;
3045 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3047 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3049 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3050 if(drbSet->list.array != NULLP)
3052 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3054 if(drbSet->list.array[drbidx] != NULLP)
3056 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3057 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3059 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3060 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3062 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3063 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3065 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3066 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3068 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3070 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3072 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3074 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3075 flows_Mapped_To_DRB_List.list.array != NULLP)
3077 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3078 flows_Mapped_To_DRB_List.list.count; flowidx++)
3080 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3081 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3083 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3084 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3085 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3087 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3088 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3089 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3091 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3092 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3093 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3095 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3096 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3098 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3099 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3100 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3101 sizeof(MaxDataBurstVolume_t));
3103 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3104 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3105 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3107 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3108 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3109 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3112 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3113 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3115 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3116 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3119 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3120 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3121 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3123 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3124 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3126 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3127 sizeof(OCTET_STRING_t));
3129 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3130 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3132 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3133 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3135 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3136 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3138 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3139 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3141 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3142 iE_Extensions != NULLP)
3144 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3145 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3146 if(qosIeExt->list.array != NULLP)
3148 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3150 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3152 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3155 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3157 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3158 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3161 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3163 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3166 CU_FREE(drbSet->list.array,drbSet->list.size);
3171 /*******************************************************************
3173 * @brief Free the UE Setup Request
3177 * Function : FreeUeContextSetupReq
3179 * Functionality: Deallocate the memory of BuildUESetReq
3181 * @params[in] F1AP_PDU_t *f1apMsg
3186 * ****************************************************************/
3187 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3190 UEContextSetupRequest_t *ueSetReq = NULLP;
3192 if(f1apMsg != NULLP)
3194 if(f1apMsg->choice.initiatingMessage != NULLP)
3196 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3197 if(ueSetReq->protocolIEs.list.array != NULLP)
3199 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3201 if(ueSetReq->protocolIEs.list.array[idx])
3203 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3205 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3207 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3209 case ProtocolIE_ID_id_SpCell_ID:
3210 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3212 case ProtocolIE_ID_id_ServCellIndex:
3214 case ProtocolIE_ID_id_SpCellULConfigured:
3216 case ProtocolIE_ID_id_CUtoDURRCInformation:
3217 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3219 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3220 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3222 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3223 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3225 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3226 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3228 case ProtocolIE_ID_id_RRCContainer:
3229 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3231 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3232 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3235 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3236 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3237 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3240 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3244 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3246 for(ieId=0; ieId<idx; ieId++)
3248 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3250 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3253 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3255 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3257 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3261 /**Filling cell group info **/
3262 /*******************************************************************
3264 * @brief Build Control resource set to add/modify list
3268 * Function : BuildControlRSetToAddModList
3270 * Functionality: Build Control resource set to add/modify list
3273 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3275 * @return ROK - success
3278 * ****************************************************************/
3279 uint8_t BuildControlRSetToAddModList
3281 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3286 uint8_t numBytes, bitsUnused;
3287 struct ControlResourceSet *controlRSet;
3288 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3289 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3292 controlRSetList->list.count = elementCnt;
3293 controlRSetList->list.size = \
3294 elementCnt * sizeof(struct ControlResourceSet *);
3296 controlRSetList->list.array = NULLP;
3297 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3298 if(!controlRSetList->list.array)
3300 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3304 for(idx = 0; idx < elementCnt; idx++)
3306 controlRSetList->list.array[idx] = NULLP;
3307 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3308 if(!controlRSetList->list.array[idx])
3310 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3316 controlRSet = controlRSetList->list.array[idx];
3317 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3319 /* Values harcoded according to our design:
3322 * Bit string stored ff0000000000
3326 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3327 controlRSet->frequencyDomainResources.buf = NULLP;
3328 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3329 controlRSet->frequencyDomainResources.size);
3330 if(!controlRSet->frequencyDomainResources.buf)
3332 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3336 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3337 coreset0EndPrb = CORESET0_END_PRB;
3338 coreset1StartPrb = coreset0EndPrb + 6;
3339 coreset1NumPrb = CORESET1_NUM_PRB;
3340 /* calculate the PRBs */
3341 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3342 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3343 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3345 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3346 controlRSet->cce_REG_MappingType.present = \
3347 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3349 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3350 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3351 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3352 controlRSet->tci_PresentInDCI = NULLP;
3354 uint8_t tciStateIdx;
3356 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3357 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3358 if(!controlRset->tci_StatesPDCCH_ToAddList)
3360 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3365 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3366 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3367 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3368 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3369 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3371 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3375 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3377 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3378 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3380 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3387 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3389 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3390 if(!controlRset->tci_PresentInDCI)
3392 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3396 *(controlRset->tci_PresentInDCI);
3399 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3400 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3401 if(!controlRSet->pdcch_DMRS_ScramblingID)
3403 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3406 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3409 } /* End BuildControlRSetToAddModList */
3411 /*******************************************************************
3413 * @brief Build search space to add/modify list
3417 * Function : BuildSearchSpcToAddModList
3419 * Functionality: Build search space to add/modify list
3422 * @return ROK - success
3425 * ****************************************************************/
3426 uint8_t BuildSearchSpcToAddModList
3428 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3436 struct SearchSpace *searchSpc;
3439 searchSpcList->list.count = elementCnt;
3440 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3442 searchSpcList->list.array = NULLP;
3443 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3444 if(!searchSpcList->list.array)
3446 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3450 for(idx = 0; idx < elementCnt; idx++)
3452 searchSpcList->list.array[idx] = NULLP;
3453 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3454 if(!searchSpcList->list.array[idx])
3456 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3462 searchSpc = searchSpcList->list.array[idx];
3464 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3466 searchSpc->controlResourceSetId = NULLP;
3467 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3468 if(!searchSpc->controlResourceSetId)
3470 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3473 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3475 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3476 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3477 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3478 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3480 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3483 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3484 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3486 searchSpc->duration = NULLP;
3487 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3488 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3489 if(!searchSpc->monitoringSymbolsWithinSlot)
3491 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3495 /* Values taken from reference logs :
3498 * Bit string stores 8000
3503 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3504 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3505 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3506 searchSpc->monitoringSymbolsWithinSlot->size);
3507 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3509 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3514 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3515 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3516 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3517 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3519 searchSpc->nrofCandidates = NULLP;
3520 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3521 if(!searchSpc->nrofCandidates)
3523 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3527 searchSpc->nrofCandidates->aggregationLevel1 = \
3528 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3529 searchSpc->nrofCandidates->aggregationLevel2 = \
3530 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3531 searchSpc->nrofCandidates->aggregationLevel4 = \
3532 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3533 searchSpc->nrofCandidates->aggregationLevel8 = \
3534 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3535 searchSpc->nrofCandidates->aggregationLevel16 = \
3536 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3538 searchSpc->searchSpaceType = NULLP;
3539 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3540 if(!searchSpc->searchSpaceType)
3542 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3546 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3548 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3549 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3550 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3551 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3553 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3556 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3557 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3560 }/* End BuildSearchSpcToAddModList */
3562 /*******************************************************************
3564 * @brief Builds BWP DL dedicated PDCCH config
3568 * Function : BuildBWPDlDedPdcchCfg
3570 * Functionality: Builds BWP DL dedicated PDCCH config
3572 * @params[in] struct PDCCH_Config *pdcchCfg
3574 * @return ROK - success
3577 * ****************************************************************/
3578 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3580 pdcchCfg->controlResourceSetToAddModList = NULLP;
3581 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3582 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3583 if(!pdcchCfg->controlResourceSetToAddModList)
3585 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3589 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3594 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3596 pdcchCfg->searchSpacesToAddModList = NULLP;
3597 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3598 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3599 if(!pdcchCfg->searchSpacesToAddModList)
3601 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3605 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3610 pdcchCfg->searchSpacesToReleaseList = NULLP;
3611 pdcchCfg->downlinkPreemption = NULLP;
3612 pdcchCfg->tpc_PUSCH = NULLP;
3613 pdcchCfg->tpc_PUCCH = NULLP;
3614 pdcchCfg->tpc_SRS = NULLP;
3619 /*******************************************************************
3621 * @brief Builds DMRS DL PDSCH Mapping type A
3625 * Function : BuildDMRSDLPdschMapTypeA
3627 * Functionality: Builds DMRS DL PDSCH Mapping type A
3630 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3631 * @return ROK - success
3634 * ****************************************************************/
3635 uint8_t BuildDMRSDLPdschMapTypeA
3637 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3640 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3641 dmrsDlCfg->choice.setup = NULLP;
3642 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3643 if(!dmrsDlCfg->choice.setup)
3645 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3649 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3650 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3651 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3652 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3654 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3657 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3659 dmrsDlCfg->choice.setup->maxLength = NULLP;
3660 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3661 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3662 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3667 /*******************************************************************
3669 * @brief Builds TCI states to add/modify list
3673 * Function : BuildTCIStatesToAddModList
3675 * Functionality:Builds TCI states to add/modify list
3678 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3680 * @return ROK - success
3683 * ****************************************************************/
3684 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3689 /*******************************************************************
3691 * @brief Builds PDSCH time domain allocation list
3695 * Function : BuildPdschTimeDomAllocList
3697 * Functionality: Builds PDSCH time domain allocation list
3700 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3702 * @return ROK - success
3705 * ****************************************************************/
3706 uint8_t BuildPdschTimeDomAllocList
3708 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3713 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3715 timeDomAllocList->present = \
3716 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3718 timeDomAllocList->choice.setup = NULLP;
3719 CU_ALLOC(timeDomAllocList->choice.setup, \
3720 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3721 if(!timeDomAllocList->choice.setup)
3723 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3728 timeDomAllocList->choice.setup->list.count = elementCnt;
3729 timeDomAllocList->choice.setup->list.size = \
3730 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3732 timeDomAllocList->choice.setup->list.array = NULLP;
3733 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3734 timeDomAllocList->choice.setup->list.size);
3735 if(!timeDomAllocList->choice.setup->list.array)
3737 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3741 for(idx = 0; idx < elementCnt; idx++)
3743 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3744 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3745 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3746 if(!timeDomAllocList->choice.setup->list.array[idx])
3748 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3754 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3755 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3756 if(!timeDomAlloc->k0)
3758 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3761 *(timeDomAlloc->k0) = 0;
3762 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3763 timeDomAlloc->startSymbolAndLength = 66;
3766 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3767 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3768 if(!timeDomAlloc->k0)
3770 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3773 *(timeDomAlloc->k0) = 1;
3774 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3775 timeDomAlloc->startSymbolAndLength = 66;
3780 /*******************************************************************
3782 * @brief Builds PDSCH PRB Bundling type
3786 * Function : BuildPdschPrbBundlingType
3788 * Functionality: Builds PDSCH PRB Bundling type
3791 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3793 * @return ROK - success
3796 * ****************************************************************/
3797 uint8_t BuildPdschPrbBundlingType
3799 struct PDSCH_Config__prb_BundlingType *prbBndlType
3802 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3804 prbBndlType->choice.staticBundling = NULLP;
3805 CU_ALLOC(prbBndlType->choice.staticBundling, \
3806 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3807 if(!prbBndlType->choice.staticBundling)
3809 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3812 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3817 /*******************************************************************
3819 * @brief Builds BWP DL dedicated PDSCH config
3823 * Function : BuildBWPDlDedPdschCfg
3825 * Functionality: Builds BWP DL dedicated PDSCH config
3827 * @params[in] struct PDSCH_Config *pdschCfg
3829 * @return ROK - success
3832 * ****************************************************************/
3833 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3835 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3837 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3838 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3839 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3840 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3842 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3846 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3851 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3852 pdschCfg->tci_StatesToAddModList = NULLP;
3853 pdschCfg->tci_StatesToReleaseList = NULLP;
3854 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3856 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3857 if(!pdschCfg->tci_StatesToAddModList)
3859 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3862 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3868 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3870 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3871 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3872 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3873 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3875 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3878 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3882 pdschCfg->pdsch_AggregationFactor = NULLP;
3883 pdschCfg->rateMatchPatternToAddModList = NULLP;
3884 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3885 pdschCfg->rateMatchPatternGroup1 = NULLP;
3886 pdschCfg->rateMatchPatternGroup2 = NULLP;
3887 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3888 pdschCfg->mcs_Table = NULLP;
3890 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3891 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3892 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3894 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3897 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3899 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3904 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3905 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3906 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3907 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3908 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3909 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3910 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3915 /*******************************************************************
3917 * @brief Builds intitial DL BWP
3920 * Function : BuildInitialDlBWP
3922 * Functionality: Builds intitial DL BWP in spCellCfgDed
3924 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3926 * @return ROK - success
3929 * ****************************************************************/
3930 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3932 dlBwp->pdcch_Config = NULLP;
3933 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3934 if(!dlBwp->pdcch_Config)
3936 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3939 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3941 dlBwp->pdcch_Config->choice.setup = NULLP;
3942 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3943 if(!dlBwp->pdcch_Config->choice.setup)
3945 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3948 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3953 dlBwp->pdsch_Config = NULLP;
3954 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3955 if(!dlBwp->pdsch_Config)
3957 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3960 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3962 dlBwp->pdsch_Config->choice.setup = NULLP;
3963 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3964 if(!dlBwp->pdsch_Config->choice.setup)
3966 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3970 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3975 dlBwp->sps_Config = NULLP;
3976 dlBwp->radioLinkMonitoringConfig = NULLP;
3980 /*******************************************************************
3982 * @brief Builds DMRS UL Pusch Mapping type A
3986 * Function : BuildDMRSULPuschMapTypeA
3988 * Functionality: Builds DMRS UL Pusch Mapping type A
3991 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3992 * @return ROK - success
3995 * ****************************************************************/
3996 uint8_t BuildDMRSULPuschMapTypeA
3998 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4001 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4002 dmrsUlCfg->choice.setup= NULLP;
4003 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4004 if(!dmrsUlCfg->choice.setup)
4006 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4010 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4011 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4012 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4013 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4015 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4018 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4020 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4021 dmrsUlCfg->choice.setup->maxLength = NULLP;
4022 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4023 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4024 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4025 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4027 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4031 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4032 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4034 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4036 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4039 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4041 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4042 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4046 /*******************************************************************
4048 * @brief Build PUSCH time domain allocation list
4052 * Function : BuildPuschTimeDomAllocList
4054 * Functionality: Build PUSCH time domain allocation list
4057 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4059 * @return ROK - success
4062 * ****************************************************************/
4063 uint8_t BuildPuschTimeDomAllocList
4065 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4070 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4072 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4073 timeDomAllocList->choice.setup = NULLP;
4074 CU_ALLOC(timeDomAllocList->choice.setup, \
4075 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4076 if(!timeDomAllocList->choice.setup)
4078 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4083 timeDomAllocList->choice.setup->list.count = elementCnt;
4084 timeDomAllocList->choice.setup->list.size = \
4085 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4086 timeDomAllocList->choice.setup->list.array = NULLP;
4087 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4088 timeDomAllocList->choice.setup->list.size);
4089 if(!timeDomAllocList->choice.setup->list.array)
4091 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4095 for(idx = 0; idx < elementCnt; idx++)
4097 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4098 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4099 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4100 if(!timeDomAllocList->choice.setup->list.array[idx])
4102 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4108 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4109 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4110 if(!timeDomAlloc->k2)
4112 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4115 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4116 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4117 timeDomAlloc->startSymbolAndLength = 66;
4120 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4121 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4122 if(!timeDomAlloc->k2)
4124 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4127 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4128 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4129 timeDomAlloc->startSymbolAndLength = 66;
4134 /*******************************************************************
4136 * @brief Builds BWP UL dedicated PUSCH Config
4140 * Function : BuildBWPUlDedPuschCfg
4143 * Builds BWP UL dedicated PUSCH Config
4145 * @params[in] : PUSCH_Config_t *puschCfg
4147 * @return ROK - success
4150 * ****************************************************************/
4151 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4153 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4154 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4155 if(!puschCfg->dataScramblingIdentityPUSCH)
4157 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4160 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4162 puschCfg->txConfig = NULLP;
4163 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4164 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4165 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4166 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4168 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4172 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4177 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4178 puschCfg->pusch_PowerControl = NULLP;
4179 puschCfg->frequencyHopping = NULLP;
4180 puschCfg->frequencyHoppingOffsetLists = NULLP;
4181 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4183 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4184 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4185 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4186 if(!puschCfg->pusch_TimeDomainAllocationList)
4188 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4192 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4197 puschCfg->pusch_AggregationFactor = NULLP;
4198 puschCfg->mcs_Table = NULLP;
4199 puschCfg->mcs_TableTransformPrecoder = NULLP;
4200 puschCfg->transformPrecoder = NULLP;
4201 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4202 if(!puschCfg->transformPrecoder)
4204 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4207 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4209 puschCfg->codebookSubset = NULLP;
4210 puschCfg->maxRank = NULLP;
4211 puschCfg->rbg_Size = NULLP;
4212 puschCfg->uci_OnPUSCH = NULLP;
4213 puschCfg->tp_pi2BPSK = NULLP;
4218 /*******************************************************************
4220 * @brief Builds BWP UL dedicated PUCCH Config
4224 * Function : BuildBWPUlDedPucchCfg
4227 * Builds BWP UL dedicated PUCCH Config
4229 * @params[in] : PUCCH_Config_t *pucchCfg
4231 * @return ROK - success
4234 * ****************************************************************/
4235 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4237 uint8_t arrIdx, elementCnt;
4238 uint8_t rsrcIdx, rsrcSetIdx;
4239 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4240 PUCCH_Resource_t *rsrc = NULLP;
4244 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4245 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4246 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4247 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4248 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4250 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4253 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4254 rsrcSet->pucch_ResourceSetId = 1;
4256 rsrcSet->resourceList.list.count = elementCnt;
4257 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4258 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4259 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4261 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4264 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4268 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4269 pucchCfg->resourceToAddModList->list.count = elementCnt;
4270 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4271 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4272 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4274 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4277 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4278 rsrc->pucch_ResourceId = 1;
4279 rsrc->startingPRB = 0;
4280 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4281 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4282 rsrc->format.choice.format1->initialCyclicShift = 0;
4283 rsrc->format.choice.format1->nrofSymbols = 4;
4284 rsrc->format.choice.format1->startingSymbolIndex = 0;
4285 rsrc->format.choice.format1->timeDomainOCC = 0;
4288 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4289 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4290 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4291 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4292 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4295 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4296 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4298 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4303 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4304 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4305 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4306 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4308 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4312 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4314 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4315 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4317 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4323 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4324 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4329 /*******************************************************************
4331 * @brief Fills SRS resource to add/modify list
4335 * Function : BuildSrsRsrcAddModList
4337 * Functionality: Fills SRS resource to add/modify list
4340 * @return ROK - success
4343 * ****************************************************************/
4344 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4350 resourceList->list.count = elementCnt;
4351 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4352 resourceList->list.array = NULLP;
4353 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4354 if(!resourceList->list.array)
4356 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4360 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4362 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4363 if(!resourceList->list.array[rsrcIdx])
4365 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4371 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4372 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4373 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4375 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4376 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4377 sizeof(struct SRS_Resource__transmissionComb__n2));
4378 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4380 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4383 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4384 = SRS_COMB_OFFSET_N2;
4385 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4386 = SRS_CYCLIC_SHIFT_N2;
4388 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4389 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4390 SRS_Resource__resourceMapping__nrofSymbols_n1;
4391 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4392 SRS_Resource__resourceMapping__repetitionFactor_n1;
4394 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4395 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4396 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4397 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4398 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4399 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4400 SRS_Resource__groupOrSequenceHopping_neither;
4402 /* Setting resource type to aperiodic for intergration purposes */
4403 resourceList->list.array[rsrcIdx]->resourceType.present = \
4404 SRS_Resource__resourceType_PR_aperiodic;
4405 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4406 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4407 sizeof(struct SRS_Resource__resourceType__aperiodic));
4408 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4410 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4413 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4418 /*******************************************************************
4420 * @brief Build SRS resource set Add/mod list
4424 * Function : BuildSrsRsrcSetAddModList
4426 * Functionality: Build SRS resource set Add/mod list
4429 * @return ROK - success
4432 * ****************************************************************/
4433 uint8_t BuildSrsRsrcSetAddModList
4435 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4441 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4444 rsrcSetList->list.count = elementCnt;
4445 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4446 rsrcSetList->list.array = NULLP;
4447 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4448 if(!rsrcSetList->list.array)
4450 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4454 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4456 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4457 if(!rsrcSetList->list.array[rSetIdx])
4459 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4465 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4467 /* Fill Resource Id list in resource set */
4468 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4469 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4470 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4471 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4473 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4478 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4479 rsrcIdList->list.count = elementCnt;
4480 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4481 rsrcIdList->list.array = NULLP;
4482 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4483 if(!rsrcIdList->list.array)
4485 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4489 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4491 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4492 if(!rsrcIdList->list.array[rsrcIdx])
4494 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4500 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4502 /* Fill resource type */
4503 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4504 SRS_ResourceSet__resourceType_PR_aperiodic;
4506 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4507 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4508 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4509 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4511 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4514 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4515 = APERIODIC_SRS_RESRC_TRIGGER;
4517 /* TODO : Fill values for below IEs as expected by Viavi */
4518 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4519 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4522 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4523 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4524 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4525 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4526 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4531 /*******************************************************************
4533 * @brief Builds BWP UL dedicated SRS Config
4537 * Function : BuildBWPUlDedSrsCfg
4539 * Functionality: Builds BWP UL dedicated SRS Config
4541 * @params[in] SRS Config
4542 * @return ROK - success
4545 * ****************************************************************/
4546 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4548 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4549 srsCfg->srs_ResourceSetToAddModList = NULLP;
4550 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4551 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4552 if(!srsCfg->srs_ResourceSetToAddModList)
4554 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4557 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4562 srsCfg->srs_ResourceToReleaseList = NULLP;
4564 /* Resource to Add/Modify list */
4565 srsCfg->srs_ResourceToAddModList = NULLP;
4566 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4567 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4568 if(!srsCfg->srs_ResourceToAddModList)
4570 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4574 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4579 srsCfg->tpc_Accumulation = NULLP;
4584 /*******************************************************************
4586 * @brief Builds inital UL BWP
4590 * Function : BuildInitialUlBWP
4592 * Functionality: Builds initial UL BWP
4594 * @params[in] BWP_UplinkDedicated_t *ulBwp
4595 * @return ROK - success
4598 * ****************************************************************/
4599 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4601 ulBwp->pucch_Config = NULLP;
4602 ulBwp->pucch_Config = NULLP;
4603 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4604 if(!ulBwp->pucch_Config)
4606 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4610 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4611 ulBwp->pucch_Config->choice.setup = NULLP;
4612 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4613 if(!ulBwp->pucch_Config->choice.setup)
4615 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4619 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4624 /* Fill BWP UL dedicated PUSCH config */
4625 ulBwp->pusch_Config = NULLP;
4626 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4627 if(!ulBwp->pusch_Config)
4629 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4633 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4634 ulBwp->pusch_Config->choice.setup = NULLP;
4635 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4636 if(!ulBwp->pusch_Config->choice.setup)
4638 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4642 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4647 ulBwp->configuredGrantConfig = NULLP;
4649 /* Fill BPW UL dedicated SRS config */
4650 ulBwp->srs_Config = NULLP;
4651 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4652 if(!ulBwp->srs_Config)
4654 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4658 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4659 ulBwp->srs_Config->choice.setup = NULLP;
4660 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4661 if(!ulBwp->srs_Config->choice.setup)
4663 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4667 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4672 ulBwp->beamFailureRecoveryConfig = NULLP;
4677 /*******************************************************************
4679 * @brief Builds Pusch Serving cell Config
4683 * Function : BuildPuschSrvCellCfg
4685 * Functionality: Builds Pusch Serving cell Config
4687 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4689 * @return ROK - success
4692 * ****************************************************************/
4693 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4695 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4696 puschCfg->choice.setup = NULLP;
4697 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4698 if(!puschCfg->choice.setup)
4700 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4704 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4705 puschCfg->choice.setup->rateMatching = NULLP;
4706 puschCfg->choice.setup->xOverhead = NULLP;
4707 puschCfg->choice.setup->ext1 = NULLP;
4708 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4709 if(!puschCfg->choice.setup->ext1)
4711 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4715 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4716 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4717 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4719 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4722 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4724 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4725 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4726 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4728 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4731 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4735 /*******************************************************************
4737 * @brief Builds UL config
4740 * Function : BuildUlCfg
4742 * Functionality: Builds UL config in spCellCfgDed
4744 * @params[in] UplinkConfig_t *ulCfg
4746 * @return ROK - success
4749 * ****************************************************************/
4750 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4752 ulCfg->initialUplinkBWP = NULLP;
4753 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4754 if(!ulCfg->initialUplinkBWP)
4756 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4760 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4765 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4766 ulCfg->uplinkBWP_ToAddModList = NULLP;
4767 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4768 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4769 if(!ulCfg->firstActiveUplinkBWP_Id)
4771 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4774 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4776 ulCfg->pusch_ServingCellConfig = NULLP;
4777 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4778 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4779 if(!ulCfg->pusch_ServingCellConfig)
4781 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4785 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4790 ulCfg->carrierSwitching = NULLP;
4791 ulCfg->ext1 = NULLP;
4795 /*******************************************************************
4797 * @brief Builds PDSCH serving cell config
4800 * Function : BuildPdschSrvCellCfg
4802 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4804 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4806 * @return ROK - success
4809 * ****************************************************************/
4810 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4812 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4813 pdschCfg->choice.setup = NULLP;
4814 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4815 if(!pdschCfg->choice.setup)
4817 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4821 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4822 pdschCfg->choice.setup->xOverhead = NULLP;
4823 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4824 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4825 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4827 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4830 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4831 pdschCfg->choice.setup->pucch_Cell = NULLP;
4832 pdschCfg->choice.setup->ext1 = NULLP;
4837 /*******************************************************************
4839 * @brief Builds CSI Meas config
4842 * Function : BuildCsiMeasCfg
4844 * Functionality: Builds CSI Meas config in spCellCfgDed
4846 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4848 * @return ROK - success
4851 * ****************************************************************/
4852 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4858 /*******************************************************************
4860 * @brief Builds Spcell config dedicated
4863 * Function : BuildSpCellCfgDed
4865 * Functionality: Builds sp cell config dedicated in spCellCfg
4867 * @params[in] ServingCellConfig_t srvCellCfg
4869 * @return ROK - success
4872 * ****************************************************************/
4873 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4875 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4877 srvCellCfg->initialDownlinkBWP = NULLP;
4878 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4879 if(!srvCellCfg->initialDownlinkBWP)
4881 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4885 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4887 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4890 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4891 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4893 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4894 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4895 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4897 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4900 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4902 srvCellCfg->bwp_InactivityTimer = NULLP;
4904 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4905 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4906 if(!srvCellCfg->defaultDownlinkBWP_Id)
4908 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4911 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4913 srvCellCfg->uplinkConfig = NULLP;
4914 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4915 if(!srvCellCfg->uplinkConfig)
4917 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4921 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4923 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4926 srvCellCfg->supplementaryUplink = NULLP;
4927 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4929 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4930 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4931 if(!srvCellCfg->pdsch_ServingCellConfig)
4933 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4937 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4939 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4943 srvCellCfg->csi_MeasConfig = NULLP;
4945 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4946 if(!srvCellCfg->csi_MeasConfig)
4948 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4952 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4954 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4958 srvCellCfg->sCellDeactivationTimer = NULLP;
4959 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4960 srvCellCfg->tag_Id = TAG_ID;
4961 srvCellCfg->dummy = NULLP;
4962 srvCellCfg->pathlossReferenceLinking = NULLP;
4963 srvCellCfg->servingCellMO = NULLP;
4964 srvCellCfg->ext1 = NULLP;
4968 /*******************************************************************
4970 * @brief Builds Spcell config
4974 * Function : BuildSpCellCfg
4976 * Functionality: Builds sp cell config in DuToCuRrcContainer
4978 * @params[in] SpCellConfig_t spCellCfg
4980 * @return ROK - success
4983 * ****************************************************************/
4984 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4987 spCellCfg->servCellIndex = NULLP;
4988 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4989 if(!spCellCfg->servCellIndex)
4991 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4994 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4996 spCellCfg->reconfigurationWithSync = NULLP;
4997 spCellCfg->rlf_TimersAndConstants = NULLP;
4998 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4999 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5000 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5002 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5005 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5007 spCellCfg->spCellConfigDedicated = NULLP;
5008 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5009 if(!spCellCfg->spCellConfigDedicated)
5011 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5014 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5016 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5021 /*******************************************************************
5023 * @brief Builds Phy cell group config
5027 * Function : BuildPhyCellGrpCfg
5029 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5031 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5033 * @return ROK - success
5036 * ****************************************************************/
5037 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5039 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5040 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5042 phyCellGrpCfg->p_NR_FR1 = NULLP;
5043 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5044 if(!phyCellGrpCfg->p_NR_FR1)
5046 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5049 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5050 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5051 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5052 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5053 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5054 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5055 phyCellGrpCfg->cs_RNTI = NULLP;
5056 phyCellGrpCfg->ext1 = NULLP;
5057 phyCellGrpCfg->ext2 = NULLP;
5062 /*******************************************************************
5064 * @brief Builds tag config
5068 * Function : BuildTagConfig
5070 * Functionality: Builds tag config in MacCellGroupConfig
5072 * @params[in] TAG_Config *tag_Config
5074 * @return ROK - success
5077 * ****************************************************************/
5078 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5080 struct TAG_Config__tag_ToAddModList *tagList;
5081 uint8_t idx, elementCnt;
5083 tagConfig->tag_ToReleaseList = NULLP;
5084 tagConfig->tag_ToAddModList = NULLP;
5085 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5086 if(!tagConfig->tag_ToAddModList)
5088 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5092 elementCnt = 1; //ODU_VALUE_ONE;
5093 tagList = tagConfig->tag_ToAddModList;
5094 tagList->list.count = elementCnt;
5095 tagList->list.size = elementCnt * sizeof(struct TAG *);
5097 tagList->list.array = NULLP;
5098 CU_ALLOC(tagList->list.array, tagList->list.size);
5099 if(!tagList->list.array)
5101 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5105 for(idx=0; idx<tagList->list.count; idx++)
5107 tagList->list.array[idx] = NULLP;
5108 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5109 if(!tagList->list.array[idx])
5111 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5117 tagList->list.array[idx]->tag_Id = TAG_ID;
5118 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5123 /*******************************************************************
5125 * @brief Builds PHR Config
5129 * Function : BuildPhrConfig
5131 * Functionality: Builds phrConfig in MacCellGroupConfig
5133 * @params[in] PHR Config *
5135 * @return ROK - success
5138 * ****************************************************************/
5139 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5142 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5143 phrConfig->choice.setup = NULLP;
5144 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5145 if(!phrConfig->choice.setup)
5147 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5151 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5152 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5153 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5154 phrConfig->choice.setup->multiplePHR = false;
5155 phrConfig->choice.setup->dummy = false;
5156 phrConfig->choice.setup->phr_Type2OtherCell = false;
5157 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5162 /*******************************************************************
5164 * @brief Builds BSR Config
5168 * Function : BuildBsrConfig
5170 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5172 * @params[in] BSR_Config *bsrConfig
5174 * @return ROK - success
5177 * ****************************************************************/
5178 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5180 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5181 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5182 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5187 /*******************************************************************
5189 * @brief Builds scheduling request config
5193 * Function : BuildSchedulingReqConfig
5195 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5197 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5199 * @return ROK - success
5202 * ****************************************************************/
5203 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5205 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5206 uint8_t idx, elementCnt;
5208 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5209 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5210 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5211 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5213 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5217 elementCnt = 1; //ODU_VALUE_ONE;
5218 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5219 schReqList->list.count = elementCnt;
5220 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5222 schReqList->list.array = NULLP;
5223 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5224 if(!schReqList->list.array)
5226 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5230 for(idx=0;idx<schReqList->list.count; idx++)
5232 schReqList->list.array[idx] = NULLP;
5233 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5234 if(!schReqList->list.array[idx])
5236 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5242 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5244 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5245 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5246 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5248 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5251 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5252 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5253 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5257 /*******************************************************************
5259 * @brief Builds Mac cell group config
5263 * Function : BuildMacCellGrpCfg
5265 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5267 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5269 * @return ROK - success
5272 * ****************************************************************/
5273 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5275 macCellGrpCfg->drx_Config = NULLP;
5276 macCellGrpCfg->schedulingRequestConfig = NULLP;
5277 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5278 if(!macCellGrpCfg->schedulingRequestConfig)
5280 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5284 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5286 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5290 macCellGrpCfg->bsr_Config = NULLP;
5291 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5292 if(!macCellGrpCfg->bsr_Config)
5294 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5298 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5300 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5304 macCellGrpCfg->tag_Config = NULLP;
5305 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5306 if(!macCellGrpCfg->tag_Config)
5308 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5312 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5314 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5318 macCellGrpCfg->phr_Config = NULLP;
5319 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5320 if(!macCellGrpCfg->phr_Config)
5322 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5326 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5328 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5332 macCellGrpCfg->skipUplinkTxDynamic = false;
5333 macCellGrpCfg->ext1 = NULLP;
5337 /*******************************************************************
5339 * @brief Frees memeory allocated for SearchSpcToAddModList
5343 * Function : FreeSearchSpcToAddModList
5345 * Functionality: Deallocating memory of SearchSpcToAddModList
5347 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5351 4221 * ****************************************************************/
5352 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5356 struct SearchSpace *searchSpc=NULLP;
5358 if(searchSpcList->list.array)
5360 if(searchSpcList->list.array[idx2])
5362 searchSpc = searchSpcList->list.array[idx2];
5363 if(searchSpc->controlResourceSetId)
5365 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5367 if(searchSpc->monitoringSymbolsWithinSlot)
5369 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5371 if(searchSpc->nrofCandidates)
5373 if(searchSpc->searchSpaceType)
5375 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5376 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5377 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5378 SearchSpace__searchSpaceType));
5380 CU_FREE(searchSpc->nrofCandidates,
5381 sizeof(struct SearchSpace__nrofCandidates));
5383 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5384 searchSpc->monitoringSymbolsWithinSlot->size);
5386 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5387 sizeof(BIT_STRING_t));
5389 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5390 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5392 CU_FREE(searchSpc->controlResourceSetId,
5393 sizeof(ControlResourceSetId_t));
5396 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5398 CU_FREE(searchSpcList->list.array[idx1],
5399 sizeof(struct SearchSpace));
5401 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5404 /*******************************************************************
5406 * @brief Frees memory allocated for PdschTimeDomAllocList
5410 * Function : FreePdschTimeDomAllocList
5412 * Functionality: Deallocating memory of PdschTimeDomAllocList
5414 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5418 4221 * ****************************************************************/
5419 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5423 if(timeDomAllocList->choice.setup)
5425 if(timeDomAllocList->choice.setup->list.array)
5427 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5429 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5430 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5432 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5433 timeDomAllocList->choice.setup->list.size);
5435 CU_FREE(timeDomAllocList->choice.setup,\
5436 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5439 /*******************************************************************
5441 * @brief Frees memory allocated for PuschTimeDomAllocList
5445 * Function : FreePuschTimeDomAllocList
5447 * Functionality: Deallocating memory of PuschTimeDomAllocList
5449 * @params[in] PUSCH_Config_t *puschCfg
5453 ***********************************************************************/
5454 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5458 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5460 if(puschCfg->pusch_TimeDomainAllocationList)
5462 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5463 if(timeDomAllocList_t->choice.setup)
5465 if(timeDomAllocList_t->choice.setup->list.array)
5467 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5468 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5470 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5471 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5473 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5474 timeDomAllocList_t->choice.setup->list.size);
5476 CU_FREE(timeDomAllocList_t->choice.setup, \
5477 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5479 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5480 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5481 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5486 /*******************************************************************
5488 * @brief Frees memory allocated for Dedicated PUCCH config
5492 * Function : FreeBWPUlDedPucchCfg
5494 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5496 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5500 * ****************************************************************/
5501 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5503 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5504 PUCCH_Config_t *pucchCfg = NULLP;
5505 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5506 PUCCH_Resource_t *rsrc = NULLP;
5510 if(ulBwpPucchCfg->choice.setup)
5512 pucchCfg = ulBwpPucchCfg->choice.setup;
5514 //Free resource set list
5515 if(pucchCfg->resourceSetToAddModList)
5517 if(pucchCfg->resourceSetToAddModList->list.array)
5519 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5521 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5522 if(rsrcSet->resourceList.list.array)
5524 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5526 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5528 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5530 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5532 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5534 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5537 //Free resource list
5538 if(pucchCfg->resourceToAddModList)
5540 if(pucchCfg->resourceToAddModList->list.array)
5542 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5544 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5545 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5546 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5548 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5550 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5554 if(pucchCfg->format1)
5556 if(pucchCfg->format1->choice.setup)
5558 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5559 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5561 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5565 if(pucchCfg->dl_DataToUL_ACK)
5567 if(pucchCfg->dl_DataToUL_ACK->list.array)
5569 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5571 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5573 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5575 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5578 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5580 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5584 /*******************************************************************
5586 * @brief Frees memory allocated for InitialUlBWP
5590 * Function : FreeInitialUlBWP
5592 * Functionality: Deallocating memory of InitialUlBWP
5594 * @params[in] BWP_UplinkDedicated_t *ulBwp
5598 * ****************************************************************/
5599 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5601 uint8_t rSetIdx, rsrcIdx;
5602 SRS_Config_t *srsCfg = NULLP;
5603 PUSCH_Config_t *puschCfg = NULLP;
5604 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5605 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5606 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5607 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5609 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5611 if(ulBwp->pusch_Config)
5613 if(ulBwp->pusch_Config->choice.setup)
5615 puschCfg=ulBwp->pusch_Config->choice.setup;
5616 if(puschCfg->dataScramblingIdentityPUSCH)
5618 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5620 FreePuschTimeDomAllocList(puschCfg);
5621 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5622 if(dmrsUlCfg->choice.setup)
5624 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5626 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5628 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5630 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5631 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5633 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5636 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5638 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5639 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5641 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5643 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5645 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5647 /* Free SRS-Config */
5648 if(ulBwp->srs_Config)
5650 if(ulBwp->srs_Config->choice.setup)
5652 srsCfg = ulBwp->srs_Config->choice.setup;
5654 /* Free Resource Set to add/mod list */
5655 if(srsCfg->srs_ResourceSetToAddModList)
5657 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5658 if(rsrcSetList->list.array)
5662 /* Free SRS resource Id list in this SRS resource set */
5663 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5665 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5667 if(rsrcIdList->list.array)
5669 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5671 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5673 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5675 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5676 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5679 /* Free resource type info for this SRS resource set */
5680 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5681 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5683 /* Free memory for each resource set */
5684 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5686 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5688 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5690 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5691 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5694 /* Free resource to add/modd list */
5695 if(srsCfg->srs_ResourceToAddModList)
5697 resourceList = srsCfg->srs_ResourceToAddModList;
5698 if(resourceList->list.array)
5701 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5702 sizeof(struct SRS_Resource__transmissionComb__n2));
5703 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5704 sizeof(struct SRS_Resource__resourceType__aperiodic));
5706 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5708 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5710 CU_FREE(resourceList->list.array, resourceList->list.size);
5712 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5713 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5716 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5718 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5722 /*******************************************************************
5724 * @brief Frees memory allocated for initialUplinkBWP
5728 * Function : FreeinitialUplinkBWP
5730 * Functionality: Deallocating memory of initialUplinkBWP
5732 * @params[in] UplinkConfig_t *ulCfg
5737 * ****************************************************************/
5738 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5740 BWP_UplinkDedicated_t *ulBwp=NULLP;
5741 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5743 if(ulCfg->initialUplinkBWP)
5745 ulBwp=ulCfg->initialUplinkBWP;
5746 if(ulCfg->firstActiveUplinkBWP_Id)
5748 if(ulCfg->pusch_ServingCellConfig)
5750 puschCfg=ulCfg->pusch_ServingCellConfig;
5751 if(puschCfg->choice.setup)
5753 if(puschCfg->choice.setup->ext1)
5755 CU_FREE(puschCfg->choice.setup->ext1->\
5756 processingType2Enabled,sizeof(BOOLEAN_t));
5757 CU_FREE(puschCfg->choice.setup->ext1->\
5758 maxMIMO_Layers,sizeof(long));
5759 CU_FREE(puschCfg->choice.setup->ext1, \
5760 sizeof(struct PUSCH_ServingCellConfig__ext1));
5762 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5764 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5766 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5768 FreeInitialUlBWP(ulBwp);
5769 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5772 /*******************************************************************
5774 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5778 * Function : FreeBWPDlDedPdschCfg
5780 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5782 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5787 * ****************************************************************/
5788 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5790 struct PDSCH_Config *pdschCfg=NULLP;
5791 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5792 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5793 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5795 if(dlBwp->pdsch_Config->choice.setup)
5797 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5798 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5800 if(pdschCfg->pdsch_TimeDomainAllocationList)
5802 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5803 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5805 prbBndlType=&pdschCfg->prb_BundlingType;
5806 CU_FREE(prbBndlType->choice.staticBundling,\
5807 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5808 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5810 FreePdschTimeDomAllocList(timeDomAllocList);
5811 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5812 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5814 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5815 if(dmrsDlCfg->choice.setup)
5817 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5819 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5821 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5822 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5824 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5827 /*******************************************************************
5829 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5833 * Function : FreeBWPDlDedPdcchCfg
5835 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5837 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5842 * ****************************************************************/
5843 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5847 struct PDCCH_Config *pdcchCfg=NULLP;
5848 struct ControlResourceSet *controlRSet=NULLP;
5849 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5851 if(dlBwp->pdcch_Config->choice.setup)
5853 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5854 if(pdcchCfg->controlResourceSetToAddModList)
5856 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5857 if(controlRSetList->list.array)
5859 controlRSet = controlRSetList->list.array[idx2];
5862 if(controlRSet->frequencyDomainResources.buf)
5864 if(controlRSet->pdcch_DMRS_ScramblingID)
5866 if(pdcchCfg->searchSpacesToAddModList)
5868 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5869 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5870 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5872 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5874 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5875 controlRSet->frequencyDomainResources.size);
5878 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5880 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5882 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5884 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5885 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5887 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5890 /*******************************************************************
5892 * @brief Builds RLC Config
5896 * Function : BuildRlcConfig
5898 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5900 * @params[in] RLC_Config *rlcConfig
5902 * @return ROK - success
5905 * ****************************************************************/
5906 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
5908 rlcConfig->present = rlcLcCfgDb.rlcMode;
5910 switch(rlcConfig->present)
5912 case RLC_Config_PR_am:
5914 rlcConfig->choice.am = NULLP;
5915 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5916 if(!rlcConfig->choice.am)
5918 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5923 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5924 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5925 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5927 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5930 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
5931 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
5932 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
5933 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
5934 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
5937 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5938 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5939 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5941 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5944 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
5945 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
5946 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
5951 case RLC_Config_PR_um_Bi_Directional:
5953 rlcConfig->choice.um_Bi_Directional = NULLP;
5954 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
5955 if(!rlcConfig->choice.um_Bi_Directional)
5957 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5962 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
5963 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5964 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
5966 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5969 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
5972 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
5973 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5974 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
5976 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5979 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
5980 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
5987 /*******************************************************************
5989 * @brief Builds MAC LC Config
5993 * Function : BuildMacLCConfig
5995 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5997 * @params[in] struct LogicalChannelConfig macLcConfig
5999 * @return ROK - success
6002 * ****************************************************************/
6003 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6006 macLcConfig->ul_SpecificParameters = NULLP;
6007 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6008 if(!macLcConfig->ul_SpecificParameters)
6010 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6014 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6015 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6016 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6017 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6018 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6019 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6020 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6022 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6023 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6024 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6026 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6029 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6031 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6032 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6033 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6035 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6038 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6040 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6041 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6042 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6046 /*******************************************************************
6048 * @brief Builds RLC Bearer to Add/Mod list
6052 * Function :BuildRlcBearerToAddModList
6054 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6056 * @params[in] rlc_BearerToAddModList
6058 * @return ROK - success
6061 * ****************************************************************/
6062 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6064 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6067 elementCnt = ueCb->numSrb + ueCb->numDrb;
6070 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6072 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6076 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6078 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6085 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6088 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6091 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6094 rlcBearerList->list.count = elementCnt;
6095 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6097 rlcBearerList->list.array = NULLP;
6098 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6099 if(!rlcBearerList->list.array)
6101 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6105 for(idx=0; idx<rlcBearerList->list.count; idx++)
6107 rlcBearerList->list.array[idx] = NULLP;
6108 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6109 if(!rlcBearerList->list.array[idx])
6111 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6118 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6120 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6123 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6125 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6126 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6128 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6132 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6133 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6135 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6136 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6137 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6138 if(!rlcBearerList->list.array[idx]->rlc_Config)
6140 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6144 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6146 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6150 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6151 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6152 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6154 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6158 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6160 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6166 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6168 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6171 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6173 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6174 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6176 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6180 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6181 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6183 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6184 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6185 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6186 if(!rlcBearerList->list.array[idx]->rlc_Config)
6188 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6192 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6194 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6198 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6199 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6200 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6202 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6206 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6208 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6216 /*******************************************************************
6218 * @brief Free memory allocated for CellGroupConfig
6222 * Function : FreeMemCellGrpCfg
6224 * Functionality: Deallocating memory of CellGroupConfig
6226 * @params[in] pointer to CellGroupConfigRrc_t
6228 * @return ROK - success
6231 ******************************************************************/
6232 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6235 SpCellConfig_t *spCellCfg=NULLP;
6236 ServingCellConfig_t *srvCellCfg=NULLP;
6237 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6238 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6239 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6240 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6241 struct RLC_Config *rlcConfig=NULLP;
6242 struct LogicalChannelConfig *macLcConfig=NULLP;
6243 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6244 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6245 struct TAG_Config *tagConfig=NULLP;
6246 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6247 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6248 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6250 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6253 if(rlcBearerList->list.array)
6255 for(idx=0; idx<rlcBearerList->list.count; idx++)
6257 if(rlcBearerList->list.array[idx])
6259 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6260 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6263 if(rlcConfig->choice.am)
6265 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6266 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6267 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6269 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6271 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6274 if(macLcConfig->ul_SpecificParameters)
6276 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6277 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6278 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6280 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6282 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6285 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6287 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6290 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6293 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6294 if(schedulingRequestConfig)
6296 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6299 if(schReqList->list.array)
6301 for(idx=0;idx<schReqList->list.count; idx++)
6303 if(schReqList->list.array[idx])
6305 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6306 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6309 CU_FREE(schReqList->list.array, schReqList->list.size);
6311 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6312 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6313 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6315 if(macCellGrpCfg->bsr_Config)
6317 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6319 tagConfig = macCellGrpCfg->tag_Config;
6322 tagList = tagConfig->tag_ToAddModList;
6325 if(tagList->list.array)
6327 for(idx=0; idx<tagList->list.count; idx++)
6329 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6331 CU_FREE(tagList->list.array, tagList->list.size);
6333 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6335 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6338 phrConfig = macCellGrpCfg->phr_Config;
6341 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6342 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6345 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6348 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6351 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6352 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6355 spCellCfg = cellGrpCfg->spCellConfig;
6358 if(spCellCfg->servCellIndex)
6360 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6362 if(spCellCfg->spCellConfigDedicated)
6364 srvCellCfg = spCellCfg->spCellConfigDedicated;
6365 if(srvCellCfg->initialDownlinkBWP)
6367 dlBwp = srvCellCfg->initialDownlinkBWP;
6368 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6370 if(srvCellCfg->defaultDownlinkBWP_Id)
6372 if(srvCellCfg->uplinkConfig)
6374 if(srvCellCfg->pdsch_ServingCellConfig)
6376 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6377 if(pdschCfg->choice.setup)
6379 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6380 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6382 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6383 ServingCellConfig__pdsch_ServingCellConfig));
6385 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6386 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6388 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6390 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6392 if(dlBwp->pdcch_Config)
6394 if(dlBwp->pdsch_Config)
6396 FreeBWPDlDedPdschCfg(dlBwp);
6397 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6399 FreeBWPDlDedPdcchCfg(dlBwp);
6400 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6402 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6404 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6406 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6408 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6410 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6415 /*******************************************************************
6417 * @brief Fills CellGroupConfig
6421 * Function : fillCellGrpCfg
6423 * Functionality: Fills CellGroupConfig
6425 * @params[in] pointer to CellGroupConfigRrc_t
6427 * @return ROK - success
6430 ******************************************************************/
6432 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6434 uint8_t ret = RFAILED;
6435 CellGroupConfigRrc_t cellGrpCfg;
6436 asn_enc_rval_t encRetVal;
6440 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6442 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6444 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6446 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6450 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6451 cellGrpCfg.mac_CellGroupConfig = NULLP;
6452 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6453 if(!cellGrpCfg.mac_CellGroupConfig)
6455 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6458 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6460 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6464 cellGrpCfg.physicalCellGroupConfig = NULLP;
6465 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6466 if(!cellGrpCfg.physicalCellGroupConfig)
6468 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6471 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6473 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6477 cellGrpCfg.spCellConfig = NULLP;
6478 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6479 if(!cellGrpCfg.spCellConfig)
6481 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6484 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6486 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6490 cellGrpCfg.sCellToAddModList = NULLP;
6491 cellGrpCfg.sCellToReleaseList = NULLP;
6492 cellGrpCfg.ext1 = NULLP;
6494 /* encode cellGrpCfg into duToCuRrcContainer */
6495 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6496 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6498 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6499 /* Encode results */
6500 if(encRetVal.encoded == ENCODE_FAIL)
6502 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6503 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6508 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6509 for(int i=0; i< encBufSize; i++)
6511 DU_LOG("%x",encBuf[i]);
6515 cellGrp->size = encBufSize;
6516 CU_ALLOC(cellGrp->buf, cellGrp->size);
6519 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6522 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6526 FreeMemCellGrpCfg(&cellGrpCfg);
6530 /*******************************************************************
6532 * @brief Free UE Capability RAT container
6536 * Function : freeUeCapRatCont
6539 * Free UE Capability RAT conatiner
6542 * @return ROK - success
6545 * ****************************************************************/
6546 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6549 FeatureSets_t *featureSets;
6551 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6553 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6555 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6556 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6558 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6561 if(ueNrCap->featureSets)
6563 featureSets = ueNrCap->featureSets;
6564 if(featureSets->featureSetsDownlinkPerCC)
6566 if(featureSets->featureSetsDownlinkPerCC->list.array)
6568 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6570 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6571 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6572 sizeof(ModulationOrder_t));
6573 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6575 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6577 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6580 if(featureSets->featureSetsUplinkPerCC)
6582 if(featureSets->featureSetsUplinkPerCC->list.array)
6584 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6586 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6588 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6589 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6590 sizeof(ModulationOrder_t));
6591 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6594 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6596 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6598 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6602 /*******************************************************************
6604 * @brief Free UE capability RAT container list
6608 * Function : freeUeCapRatContList
6610 * Functionality: Free UE capability RAT container list
6613 * @return ROK - success
6616 * ****************************************************************/
6617 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6620 if(ueCapablityList->list.array)
6622 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6624 if(ueCapablityList->list.array[idx])
6625 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6627 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6631 /*******************************************************************
6633 * @brief Free Handover preparation information
6637 * Function : freeHOPreparationInfo
6639 * Functionality: Free Handover preparation information
6642 * @return ROK - success
6645 * ****************************************************************/
6646 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6648 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6650 if(hoPrep->criticalExtensions.choice.c1)
6652 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6654 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6655 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6656 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6657 sizeof(HandoverPreparationInformationRrc_IEs_t));
6659 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6663 /*******************************************************************
6665 * @brief Fill feature sets
6669 * Function : fillFeatureSets
6671 * Functionality: Fill feature sets
6674 * @return ROK - success
6677 * ****************************************************************/
6678 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6680 uint8_t idx, elementCnt;
6682 featureSets->featureSetsDownlink = NULLP;
6683 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6684 if(!featureSets->featureSetsDownlinkPerCC)
6686 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6691 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6692 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6693 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6694 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6696 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6700 for(idx = 0; idx < elementCnt; idx++)
6702 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6703 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6705 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6711 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6712 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6713 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6714 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6715 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6717 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6718 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6720 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6723 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6725 featureSets->featureSetsUplink = NULLP;
6726 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6727 if(!featureSets->featureSetsUplinkPerCC)
6729 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6734 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6735 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6736 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6737 if(!featureSets->featureSetsUplinkPerCC->list.array)
6739 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6743 for(idx = 0; idx < elementCnt; idx++)
6745 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6746 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6748 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6754 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6755 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6756 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6757 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6758 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6759 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6761 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6762 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6764 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6767 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6772 /*******************************************************************
6774 * @brief Fill UE capability RAT container
6778 * Function : fillUeCapRatCont
6780 * Functionality: Fill UE capability RAT container
6782 * @params[in] UE Capability RAT container buffer
6783 * @return ROK - success
6786 * ****************************************************************/
6787 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6790 uint8_t idx, elementCnt;
6791 asn_enc_rval_t encRetVal;
6792 UE_NR_Capability_t ueNrCap;
6796 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6798 /* Filling PDCP parameters */
6799 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6800 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6801 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6802 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6803 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6804 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6805 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6806 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6807 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6808 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6809 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6810 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6811 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6812 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6813 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6814 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6815 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6817 ueNrCap.rlc_Parameters = NULLP;
6818 ueNrCap.mac_Parameters = NULLP;
6820 /* Filling PHY parameters */
6821 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6822 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6823 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6824 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6825 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6827 /* Filling RF parameters */
6829 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6830 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6831 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6832 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6834 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6839 for(idx = 0; idx < elementCnt; idx++)
6841 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6842 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6852 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6853 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6854 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6856 ueNrCap.measAndMobParameters = NULLP;
6857 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6858 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6859 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6860 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6861 ueNrCap.featureSets = NULLP;
6863 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6864 if(!ueNrCap.featureSets)
6866 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6871 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6873 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6878 ueNrCap.featureSetCombinations = NULLP;
6879 ueNrCap.lateNonCriticalExtension = NULLP;
6880 ueNrCap.nonCriticalExtension = NULLP;
6882 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6883 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6884 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6886 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6888 /* Encode results */
6889 if(encRetVal.encoded == ENCODE_FAIL)
6891 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6892 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6897 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6898 for(int i=0; i< encBufSize; i++)
6900 DU_LOG("%x",encBuf[i]);
6904 ueCapRatContBuf->size = encBufSize;
6905 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6906 if(!ueCapRatContBuf->buf)
6908 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6911 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6915 freeUeCapRatCont(&ueNrCap);
6919 /*******************************************************************
6921 * @brief Fill UE Capability RAT container list
6925 * Function : fillUeCapRatContList
6927 * Functionality: Fill UE Capability RAT container list
6930 * @params[in] UE capability RAT container list
6931 * @return ROK - success
6934 * ****************************************************************/
6935 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6937 uint8_t ret = RFAILED;
6938 uint8_t idx, elementCnt;
6943 ueCapablityList->list.count = elementCnt;
6944 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6946 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
6947 if(!ueCapablityList->list.array)
6949 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6954 for(idx=0; idx<elementCnt; idx++)
6956 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6957 if(ueCapablityList->list.array[idx] == NULLP)
6959 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6965 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
6966 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
6968 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
6979 /*******************************************************************
6981 * @brief Fill UE Capability RAT container list octet string
6985 * Function : fillUeCapRatContListBuf
6987 * Functionality: Fill UE Capability RAT container list octet string
6990 * @params[in] UE capability RAT container list buffer
6991 * @return ROK - success
6994 * ****************************************************************/
6995 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6997 uint8_t ret = RFAILED;
6998 asn_enc_rval_t encRetVal;
6999 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7003 ret = fillUeCapRatContList(&ueCapablityList);
7006 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7010 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7011 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7012 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7014 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7015 &ueCapablityList, PrepFinalEncBuf, encBuf);
7017 /* Encode results */
7018 if(encRetVal.encoded == ENCODE_FAIL)
7020 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7021 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7026 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7027 for(int i=0; i< encBufSize; i++)
7029 DU_LOG("%x",encBuf[i]);
7033 ueCapablityListBuf->size = encBufSize;
7034 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7035 if(!ueCapablityListBuf->buf)
7037 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7040 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7044 freeUeCapRatContList(&ueCapablityList);
7048 /*******************************************************************
7050 * @brief Free Measurement Timing Configuration
7054 * Function : freeMeasuementTimingConfig
7056 * Functionality: Free Measurement Timing Configuration
7058 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7061 * ****************************************************************/
7062 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7065 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7066 MeasTiming_t *measTiming = NULLP;
7068 if(measTimingConfig.criticalExtensions.choice.c1)
7070 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7072 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7073 if(measTimingCfg->measTiming)
7075 if(measTimingCfg->measTiming->list.array)
7077 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7079 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7080 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7081 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7083 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7085 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7087 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7089 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7093 /*******************************************************************
7095 * @brief Fill Measurement Timing Configuration
7099 * Function : fillMeasTimingCfg
7101 * Functionality: Fill Measurement Timing Configuration
7103 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7104 * @return ROK - success
7107 * ****************************************************************/
7108 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7110 uint8_t elementCnt = 0;
7111 uint8_t measCfgIdx = 0;
7112 MeasTiming_t *measTiming;
7115 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7116 if(!measTimingCfg->measTiming)
7118 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7123 measTimingCfg->measTiming->list.count = elementCnt;
7124 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7125 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7126 if(!measTimingCfg->measTiming->list.array)
7128 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7132 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7134 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7135 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7137 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7143 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7144 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7145 if(!measTiming->frequencyAndTiming)
7147 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7151 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7152 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7154 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7155 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7156 smtc->periodicityAndOffset.choice.sf20 = 0;
7157 smtc->duration = SSB_MTC__duration_sf1;
7161 /*******************************************************************
7163 * @brief Fill Measurement Timing Configuration Octet string
7167 * Function : fillMeasConfigBuf
7169 * Functionality: Fill Measurement Timing Configuration Octet string
7172 * @params[in] MeasConfig_t *measConfgBuf
7173 * @return ROK - success
7176 * ****************************************************************/
7177 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7179 uint8_t ret = RFAILED;
7180 asn_enc_rval_t encRetVal;
7181 MeasurementTimingConfigurationRrc_t measTimingConfig;
7185 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7186 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7187 if(!measTimingConfig.criticalExtensions.choice.c1)
7189 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7192 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7194 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7195 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7197 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7201 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7204 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7208 /* Encode measurement timing configuration into octet string */
7209 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7210 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7212 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7214 /* Encode results */
7215 if(encRetVal.encoded == ENCODE_FAIL)
7217 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7218 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7223 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7224 for(int i=0; i< encBufSize; i++)
7226 DU_LOG("%x",encBuf[i]);
7230 measTimingConfigBuf->size = encBufSize;
7231 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7232 if(!measTimingConfigBuf->buf)
7234 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7237 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7241 freeMeasuementTimingConfig(measTimingConfig);
7245 /******************************************************************
7247 * @brief Free RRC reconfiguration non-critical extension
7251 * Function : freeRrcReconfigNonCriticalExt
7253 * Functionality: Free RRC reconfiguration non-critical extension
7255 * @params[in] RRC reconfiguration IE
7258 * ****************************************************************/
7259 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7261 if(rrcRecfg->masterCellGroup)
7263 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7267 /******************************************************************
7269 * @brief Free measurement object addmod list
7273 * Function : freeMeasObjToAddModList
7275 * Functionality: Free measurement object add mod list
7277 * @params[in] Measurement object add/mod list
7280 * ****************************************************************/
7281 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7284 MeasObjectNR_t *measObject;
7286 if(measObjList->list.array)
7288 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7290 if(measObjList->list.array[objIdx])
7292 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7294 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7295 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7296 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7297 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7298 if(measObject->absThreshSS_BlocksConsolidation)
7300 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7301 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7302 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7303 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7305 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7306 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7307 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7308 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7309 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7311 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7314 CU_FREE(measObjList->list.array, measObjList->list.size);
7318 /******************************************************************
7320 * @brief Free report config add mod list
7324 * Function : freeReportCfgToAddModList
7326 * Functionality: Free report config add mod list
7328 * @params[in] Report config list
7331 * ****************************************************************/
7332 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7334 uint8_t reportCfgIdx;
7335 ReportConfigToAddMod_t *reportCfg;
7336 ReportConfigNR_t *reportCfgNr;
7337 EventTriggerConfig_t *eventTriggCfg;
7339 if(reportCfgList->list.array)
7341 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7343 if(reportCfgList->list.array[reportCfgIdx])
7345 reportCfg = reportCfgList->list.array[reportCfgIdx];
7346 if(reportCfg->reportConfig.choice.reportConfigNR)
7348 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7349 if(reportCfgNr->reportType.choice.eventTriggered)
7351 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7352 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7353 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7354 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7355 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7359 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7361 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7365 /******************************************************************
7367 * @brief Free measurement id to add mod list
7371 * Function : freeMeasIdToAddModList
7373 * Functionality: Free measurement id to add mod list
7375 * @params[in] Measurement id to add mod list
7378 * ****************************************************************/
7379 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7382 if(measIdList->list.array)
7384 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7386 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7388 CU_FREE(measIdList->list.array, measIdList->list.size);
7392 /*******************************************************************
7394 * @brief Free quantity config
7398 * Function : freeQunatityConfig
7400 * Functionality: Free quantity config
7402 * @params[in] Quantity Config
7405 * ****************************************************************/
7406 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7409 QuantityConfigNR_t *quantityCfgNr;
7411 if(quantityCfg->quantityConfigNR_List)
7413 if(quantityCfg->quantityConfigNR_List->list.array)
7415 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7417 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7419 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7420 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7421 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7422 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7423 if(quantityCfgNr->quantityConfigRS_Index)
7425 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7426 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7427 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7428 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7430 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7433 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7435 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7439 /******************************************************************
7441 * @brief Free measurement Config
7445 * Function : freeMeasConfig
7447 * Functionality: Free measurement config
7449 * @params[in] Measurement config
7452 * ****************************************************************/
7453 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7455 if(measConfig->measObjectToAddModList)
7457 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7458 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7460 if(measConfig->reportConfigToAddModList)
7462 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7463 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7465 if(measConfig->measIdToAddModList)
7467 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7468 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7470 if(measConfig->s_MeasureConfig)
7472 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7474 if(measConfig->quantityConfig)
7476 freeQuantityConfig(measConfig->quantityConfig);
7477 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7480 /******************************************************************
7482 * @brief Free DRB to AddMod List
7486 * Function : freeDrbToAddModList
7488 * Functionality: Free SRB to AddMod List
7490 * @params[in] SBR to add/mod list
7493 * ****************************************************************/
7494 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7497 if(drbToAddList->list.array)
7499 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7501 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7503 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7505 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7506 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7507 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7508 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7510 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7511 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7513 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7515 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7519 /******************************************************************
7521 * @brief Free SRB to AddMod List
7525 * Function : freeSrbToAddModList
7527 * Functionality: Free SRB to AddMod List
7529 * @params[in] SBR to add/mod list
7532 * ****************************************************************/
7533 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7536 if(srbToAddList->list.array)
7538 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7540 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7541 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7543 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7544 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7547 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7549 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7553 /******************************************************************
7555 * @brief Free Radio Bearer Config
7559 * Function : fillRadioBearerConfig
7561 * Functionality: Free Radio Bearer config
7563 * @params[in] Radio bearer config
7566 * ****************************************************************/
7567 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7569 if(radioBearerConfig->srb_ToAddModList)
7571 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7572 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7574 if(radioBearerConfig->drb_ToAddModList)
7576 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7577 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7581 /******************************************************************
7583 * @brief Free reconfiguration message
7587 * Function : freeRrcReconfig
7589 * Functionality: Free reconfiguration message
7591 * @params[in] RRC Reconfiguration message
7594 * ****************************************************************/
7595 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7597 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7599 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7601 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7602 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7604 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7606 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7607 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7609 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7611 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7612 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7614 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7618 /******************************************************************
7620 * @brief Fill SRB To Add Mod list
7624 * Function : fillSrbToAddModList
7626 * Functionality: fill SRB to Add Mod list
7628 * @params[in] UE control block
7629 * SRB to Add/Mod list
7630 * @return ROK - success
7633 * ****************************************************************/
7634 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7636 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7639 elementCnt = ueCb->numSrb;
7642 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7644 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7651 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7655 CU_ALLOC(srbToAddList, sizeof(SRB_ToAddModList_t));
7658 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
7661 srbToAddList->list.count = elementCnt;
7662 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7664 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7665 if(!srbToAddList->list.array)
7667 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7672 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7674 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7677 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7678 if(!srbToAddList->list.array[srbIdx])
7680 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7684 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7686 /* Reestablish PDCP */
7687 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7688 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7690 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7693 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7695 /* PDCP configuration */
7696 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7697 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7699 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7703 /* Reordering timer */
7704 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7705 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7707 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7710 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7717 /******************************************************************
7719 * @biief Fill DRBeTo Add Mod list
7723 * Function : fillDrbToAddModList
7725 * Functionality: fill DRB to Add Mod list
7727 * @params[in] UE control block
7728 * DRB to Add/Mod list
7729 * @return ROK - success
7732 * ****************************************************************/
7733 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7735 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7738 elementCnt = ueCb->numDrb;
7741 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7743 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7750 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7754 /* DRB To Add/Mod List */
7755 CU_ALLOC(drbToAddList, sizeof(DRB_ToAddModList_t));
7758 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
7762 drbToAddList->list.count = elementCnt;
7763 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7765 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7766 if(!drbToAddList->list.array)
7768 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7773 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7775 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7778 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7779 if(!drbToAddList->list.array[drbIdx])
7781 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
7786 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
7789 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7790 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
7792 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
7796 /* PDCP Config -> DRB */
7797 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7798 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7800 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
7804 /* DRB -> Discard Timer */
7805 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7806 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
7808 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
7811 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
7813 /* UL PDCP SN length */
7814 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7815 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
7817 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
7820 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
7822 /* DL PDCP SN length */
7823 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7824 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
7826 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
7829 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
7831 /* Header Compression */
7832 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
7833 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
7835 /* Reordering timer */
7836 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7837 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
7839 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
7842 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7850 /******************************************************************
7852 * @brief Fill Radio bearer configuration
7856 * Function : fillRadioBearerConfig
7858 * Functionality: Fill Radio bearer configuration
7860 * @params[in] UE control block
7861 * Radio bearer config pointer
7862 * @return ROK - success
7865 * ****************************************************************/
7866 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
7868 /* SRB To Add/Mod List */
7869 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
7874 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
7882 /*******************************************************************
7884 * @brief Fill measurement object to add/mod list
7888 * Function : fillMeasObjToAddModList
7890 * Functionality: Fill measurement object to add/mod list
7892 * @params[in] Measurement object to add/mod list
7893 * @return ROK - success
7896 * ****************************************************************/
7897 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7899 uint8_t elementCnt, objIdx;
7900 MeasObjectNR_t *measObject;
7903 measObjList->list.count = elementCnt;
7904 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
7906 CU_ALLOC(measObjList->list.array, measObjList->list.size);
7907 if(!measObjList->list.array)
7909 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
7913 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7915 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7916 if(!measObjList->list.array[objIdx])
7918 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
7924 measObjList->list.array[objIdx]->measObjectId = 1;
7925 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
7926 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7927 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7929 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
7933 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7936 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7937 if(!measObject->ssbFrequency)
7939 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
7942 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
7944 /* Subcarrier spacing */
7945 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7946 if(!measObject->ssbSubcarrierSpacing)
7948 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
7951 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
7954 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
7955 if(!measObject->smtc1)
7957 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
7960 measObject->smtc1->duration = SSB_MTC__duration_sf1;
7961 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7962 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
7964 /* Absoulute threshold SSB consolidation */
7965 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7966 if(!measObject->absThreshSS_BlocksConsolidation)
7968 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
7972 /* RSRP threshold */
7973 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7974 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
7976 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
7979 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
7981 /* RSRQ threshold */
7982 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7983 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
7985 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
7988 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
7990 /* SINR threshold */
7991 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7992 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
7994 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
7997 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
7999 /* Number of SSBs to average */
8000 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8001 if(!measObject->nrofSS_BlocksToAverage)
8003 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8006 *(measObject->nrofSS_BlocksToAverage) = 2;
8008 /* Quantity Config index */
8009 measObject->quantityConfigIndex = 1;
8012 /* RSRP offset for SSB */
8013 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8014 if(!measObject->offsetMO.rsrpOffsetSSB)
8016 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8019 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8021 /* RSRQ offset for SSB */
8022 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8023 if(!measObject->offsetMO.rsrpOffsetSSB)
8025 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8028 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8030 /* SINR offset for SSB */
8031 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8032 if(!measObject->offsetMO.sinrOffsetSSB)
8034 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8037 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8042 /*******************************************************************
8044 * @brief Fill Report configuration to Add/mod list
8048 * Function : fillReportCfgToAddModList
8050 * Functionality: Fill Report configuration to Add/mod list
8052 * @params[in] Report Config To Add/Mod List
8053 * @return ROK - success
8056 * ****************************************************************/
8057 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8060 uint8_t reportCfgIdx;
8061 ReportConfigToAddMod_t *reportCfg;
8062 ReportConfigNR_t *reportCfgNr;
8063 EventTriggerConfig_t *eventTriggCfg;
8066 reportCfgList->list.count = elementCnt;
8067 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8069 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8070 if(!reportCfgList->list.array)
8072 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8076 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8078 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8079 if(!reportCfgList->list.array[reportCfgIdx])
8081 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8087 reportCfg = reportCfgList->list.array[reportCfgIdx];
8088 reportCfg->reportConfigId = 1;
8089 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8091 /* Report Configuration for NR */
8092 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8093 if(!reportCfg->reportConfig.choice.reportConfigNR)
8095 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8098 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8101 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8102 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8103 if(!reportCfgNr->reportType.choice.eventTriggered)
8105 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8108 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8111 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8112 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8113 if(!eventTriggCfg->eventId.choice.eventA3)
8115 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8119 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8120 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8121 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8122 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8123 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8124 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8126 /* Reference Signal Type */
8127 eventTriggCfg->rsType = NR_RS_Type_ssb;
8129 /* Report Interval */
8130 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8133 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8135 /* Report Quantity cell */
8136 eventTriggCfg->reportQuantityCell.rsrp = true;
8137 eventTriggCfg->reportQuantityCell.rsrq = false;
8138 eventTriggCfg->reportQuantityCell.sinr = false;
8140 /* Maximum reported cells */
8141 eventTriggCfg->maxReportCells = 3;
8143 /* Report qunatity RS Indexes */
8144 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8145 if(!eventTriggCfg->reportQuantityRS_Indexes)
8147 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8150 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8151 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8152 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8154 /* Maximum number of RS indexes to report */
8155 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8156 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8158 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8161 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8163 /* Include Beam measurement */
8164 eventTriggCfg->includeBeamMeasurements = false;
8169 /*******************************************************************
8171 * @brief Fill measurement Id to add/mod list
8175 * Function : fillMeasIdToAddModList
8177 * Functionality: Fill measurement Id to add/mod list
8179 * @params[in] Measurement Id to add/mod list
8180 * @return ROK - success
8183 * ****************************************************************/
8184 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8190 measIdList->list.count = elementCnt;
8191 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8193 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8194 if(!measIdList->list.array)
8199 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8201 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8202 if(!measIdList->list.array[measIdIdx])
8208 measIdList->list.array[measIdIdx]->measId = 1;
8209 measIdList->list.array[measIdIdx]->measObjectId = 1;
8210 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8215 /*******************************************************************
8217 * @brief Fill s-measurement configuration
8221 * Function : fillSMeasConfig
8223 * Functionality: Fill s-measurement configuration
8225 * @params[in] s-Measurement config
8226 * @return ROK - success
8229 * ****************************************************************/
8230 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8232 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8233 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8238 /*******************************************************************
8240 * @brief Fill quantity config
8244 * Function : fillQunatityConfig
8246 * Functionality: Fill quantity config
8248 * @params[in] Quantity Config
8249 * @return ROK - success
8252 * ****************************************************************/
8253 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8255 uint8_t elementCnt = 0;
8256 uint8_t quanCfgIdx = 0;
8257 QuantityConfigNR_t *quantityCfgNr;
8259 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8260 if(!quantityCfg->quantityConfigNR_List)
8266 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8267 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8269 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8270 if(!quantityCfg->quantityConfigNR_List->list.array)
8275 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8277 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8278 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8285 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8287 /* Quantity Config of Reference signal */
8288 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8289 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8293 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8295 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8296 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8300 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8302 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8303 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8307 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8309 /* Quantity Config RS index */
8310 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8311 if(!quantityCfgNr->quantityConfigRS_Index)
8316 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8317 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8321 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8323 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8324 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8328 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8330 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8331 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8335 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8340 /*******************************************************************
8342 * @brief Fill measurement configuration
8346 * Function : fillMeasConfig
8348 * Functionality: Fill measurement configuration
8350 * @params[in] Measurement config
8351 * @return ROK - success
8354 * ****************************************************************/
8355 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8357 /* Measurement object to add/mod list */
8358 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8359 if(!measConfig->measObjectToAddModList)
8361 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8364 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8366 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8370 /* Report Config To add/mod list */
8371 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8372 if(!measConfig->reportConfigToAddModList)
8374 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8377 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8379 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8383 /* Measurement Id to add/mod list */
8384 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8385 if(!measConfig->measIdToAddModList)
8387 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8390 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8392 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8396 /* S-Measurement config */
8397 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8398 if(!measConfig->s_MeasureConfig)
8400 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8403 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8405 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8409 /* Qunatity Config */
8410 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8411 if(!measConfig->quantityConfig)
8413 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8416 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8418 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8425 /*******************************************************************
8427 * @brief Fill RRC reconfiguration non-critical extension IE
8431 * Function : fillRrcReconfigNonCriticalExt
8433 * Functionality: Fill RRC reconfiguration non-critical extension
8435 * @params[in] RRC Reconfig Non-critical extension
8436 * @return ROK - success
8439 * ****************************************************************/
8440 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8442 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8443 if(!rrcRecfg->masterCellGroup)
8448 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8456 /*******************************************************************
8458 * @brief Fill RRC reconfiguration structure
8462 * Function : fillRrcReconfig
8464 * Functionality: Fill RRC reconfiguration
8468 * RRC reconfiguration structure
8469 * @return ROK - success
8472 * ****************************************************************/
8473 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8475 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8477 rrcReconfig->rrc_TransactionIdentifier = 1;
8478 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8480 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8481 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8483 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8487 /* Radio Bearer Configuration */
8488 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8489 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8491 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8494 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8496 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8500 /* Measurement Configuration */
8501 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8502 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8504 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8507 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8509 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8513 /* Non Critical extension */
8514 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8515 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8517 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8520 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8522 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8528 /*******************************************************************
8530 * @brief Fill RRC reconfiguration Octet string
8534 * Function : fillRrcReconfigBuf
8536 * Functionality: Fill RRC reconfiguration octet string
8539 * @params[in] OCTET_STRING_t buffer
8540 * @return ROK - success
8543 * ****************************************************************/
8544 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8546 uint8_t ret = RFAILED;
8547 asn_enc_rval_t encRetVal;
8548 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8549 rrcReconfig = &rrcRecfg;
8553 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8555 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8559 /* Encode RRC Reconfiguration */
8560 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8561 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8563 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8565 /* Encode results */
8566 if(encRetVal.encoded == ENCODE_FAIL)
8568 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8569 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8574 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8575 for(int i=0; i< encBufSize; i++)
8577 DU_LOG("%x",encBuf[i]);
8581 rrcReconfigBuf->size = encBufSize;
8582 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8583 if(!rrcReconfigBuf->buf)
8585 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8588 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8593 freeRrcReconfig(rrcReconfig);
8597 /*******************************************************************
8599 * @brief Fill HO preparation information Octet string
8603 * Function : fillHOPreparationInfoBuf
8605 * Functionality: Fill HO preparation information Octet string
8608 * @params[in] HandoverPreparationInformation_t buffer
8609 * @return ROK - success
8612 * ****************************************************************/
8613 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8615 uint8_t ret = RFAILED;
8616 asn_enc_rval_t encRetVal;
8617 HandoverPreparationInformationRrc_t hoPrepInfo;
8618 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8623 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8624 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8625 if(!hoPrepInfo.criticalExtensions.choice.c1)
8627 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8630 hoPrepInfo.criticalExtensions.choice.c1->present = \
8631 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8633 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8634 sizeof(HandoverPreparationInformationRrc_IEs_t));
8635 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8637 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8640 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8642 /* Fill UE Capability RAT container list */
8643 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8646 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8650 /* Fill Source config */
8651 hoPrepInfoIe->sourceConfig = NULLP;
8652 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8653 if(!hoPrepInfoIe->sourceConfig)
8655 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8658 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8662 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8666 hoPrepInfoIe->rrm_Config = NULLP;
8667 hoPrepInfoIe->as_Context = NULLP;
8668 hoPrepInfoIe->nonCriticalExtension = NULLP;
8670 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8671 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8672 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8674 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8675 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8677 /* Encode results */
8678 if(encRetVal.encoded == ENCODE_FAIL)
8680 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8681 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8686 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8687 for(int i=0; i< encBufSize; i++)
8689 DU_LOG("%x",encBuf[i]);
8693 hoPrepInfoBuf->size = encBufSize;
8694 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8695 if(!hoPrepInfoBuf->buf)
8697 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8700 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8704 freeHOPreparationInfo(&hoPrepInfo);
8708 /*******************************************************************
8710 * @brief Fills CuToDuContainer
8714 * Function : fillCuToDuContainer
8716 * Functionality: Fills CuToDuContainer
8718 * @params[in] pointer to CUtoDURRCInformation_t
8720 * @return ROK - success
8723 ******************************************************************/
8725 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8727 uint8_t elementCnt = 0;
8729 uint8_t idx, idx2, rrcBufLen;
8731 /* UE Capabulity RAT Container List */
8732 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8733 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8735 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8738 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8740 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8741 if(!rrcMsg->measConfig)
8743 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8746 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8748 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8751 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8752 if(rrcMsg->iE_Extensions)
8755 rrcMsg->iE_Extensions->list.count = elementCnt;
8756 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
8758 /* Initialize the CUtoDURRCInformation_ExtIEs */
8759 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8761 if(rrcMsg->iE_Extensions->list.array == NULLP)
8763 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
8767 for(idx=0; idx<elementCnt; idx++)
8769 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
8770 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
8772 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
8779 /* Cell Group Configuration */
8780 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
8781 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8782 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
8783 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
8784 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
8787 /* Handover Preparation Information */
8788 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
8789 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8790 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
8791 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
8792 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
8798 /*******************************************************************
8800 * @brief Free CuToDuContainer
8804 * Function : FreeCuToDuInfo
8806 * Functionality: Free CuToDuContainer
8808 * @params[in] pointer to CUtoDURRCInformation_t
8810 * @return ROK - success
8813 ******************************************************************/
8815 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8819 if(rrcMsg->uE_CapabilityRAT_ContainerList)
8821 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8822 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
8823 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8825 if(rrcMsg->iE_Extensions)
8827 if(rrcMsg->iE_Extensions->list.array)
8829 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
8831 if(rrcMsg->iE_Extensions->list.array[idx])
8833 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
8835 case ProtocolIE_ID_id_CellGroupConfig:
8836 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8838 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
8839 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
8844 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8845 rrcMsg->iE_Extensions->list.array[idx]->id);
8851 for(idx2 = 0; idx2 < idx; idx2++)
8853 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
8855 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8859 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8862 /*******************************************************************
8864 * @brief Builds and sends the UE Setup Request
8868 * Function : BuildAndSendUeContextSetupReq
8870 * Functionality: Constructs the UE Setup Request and sends
8871 * it to the CU through SCTP.
8875 * @return ROK - success
8878 * ****************************************************************/
8879 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcContLen, uint8_t *rrcContainer)
8881 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
8882 uint8_t ret= RFAILED, ret1;
8884 uint8_t idx, idx1, bufLen, duIdx;
8886 DuDb *targetDuDb = NULLP;
8887 F1AP_PDU_t *f1apMsg = NULLP;
8888 UEContextSetupRequest_t *ueSetReq = NULLP;
8889 asn_enc_rval_t encRetVal; /* Encoder return value */
8890 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
8894 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
8896 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8897 if(f1apMsg == NULLP)
8899 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8903 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8904 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8905 if(f1apMsg->choice.initiatingMessage == NULLP)
8907 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8911 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
8912 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8913 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
8915 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
8917 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8921 ueSetReq->protocolIEs.list.count = elementCnt;
8922 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
8924 /* Initialize the UESetup members */
8925 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
8927 if(ueSetReq->protocolIEs.list.array == NULLP)
8929 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
8933 for(idx1=0; idx1<elementCnt; idx1++)
8935 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
8936 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
8944 /*GNB CU UE F1AP ID*/
8945 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8946 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8947 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8948 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
8950 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
8952 /*GNB DU UE F1AP ID*/
8954 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8955 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8956 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8957 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
8962 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
8963 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8964 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
8965 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8967 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
8968 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
8969 /* Since we are supporting only one cell per DU, accessing 0th index to
8970 * get target cell info */
8971 spCellId = targetDuDb->cellCb[0].nrCellId;
8974 spCellId = ueCb->cellCb->nrCellId;
8975 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
8981 /*Served Cell Index*/
8983 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
8984 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8985 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
8986 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
8988 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
8990 /*CellULConfigured*/
8992 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
8993 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8994 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
8995 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
8998 /*CUtoDURRCContainer*/
9000 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9001 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9002 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9003 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9008 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9010 /*Special Cells to be SetupList*/
9012 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9013 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9014 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9015 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9016 if(SplCellListret != ROK)
9022 /*SRBs To Be Setup List*/
9024 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9025 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9026 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9027 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9028 if(SrbSetupret != ROK)
9033 /*DRBs to Be Setup List*/
9035 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9036 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9037 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9038 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9044 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9046 /* RRC Container for security mode */
9048 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
9049 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9050 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCContainer;
9052 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
9054 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
9055 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
9056 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
9057 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
9059 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
9062 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
9063 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
9065 /* RRC delivery status request */
9067 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9068 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9069 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9070 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9073 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9075 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9076 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9077 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9079 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9081 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9082 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9083 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9084 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9086 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9089 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9090 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9092 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9094 /* Encode the F1SetupRequest type as APER */
9095 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9097 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9099 /* Encode results */
9100 if(encRetVal.encoded == ENCODE_FAIL)
9102 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9103 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9108 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9109 for(int i=0; i< encBufSize; i++)
9111 DU_LOG("%x",encBuf[i]);
9116 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9118 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9124 FreeUeContextSetupReq(f1apMsg);
9127 }/* End of BuildAndSendUeContextSetupReq*/
9129 /**********************************************************************
9130 * @brief Function to extractTeId received in UE context setup Response
9134 * Function : extractTeId
9137 * - Function to extract TeId
9140 * @return ROK - success
9143 **********************************************************************/
9144 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9148 GTPTunnel_t *gtpDl = NULLP;
9150 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9152 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9154 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9156 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9157 if(gtpDl->gTP_TEID.size > 0)
9159 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9162 DU_LOG("\nERROR --> EGTP: No TeId received");
9170 /****************************************************************
9171 * @brief Function to add Drb tunnels
9175 * Function : addDrbTunnels
9178 * - Function to add Drb tunnels
9181 * @return ROK - success
9184 * ****************************************************************/
9185 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9190 if(teId > MAX_TEID || teId < MIN_TEID)
9192 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9194 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9195 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9196 tnlEvt.lclTeid = teId;
9197 tnlEvt.remTeid = teId;
9198 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9201 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9206 /****************************************************************
9207 * @brief Function to process Drb Setup List
9211 * Function : procDrbSetupList
9214 * - Function to process DRB Setup List
9217 * @return ROK - success
9220 * ****************************************************************/
9221 uint8_t procDrbSetupList(uint32_t duId, DRBs_Setup_List_t *drbSetupList)
9225 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9227 if(drbSetupList != NULLP)
9229 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9231 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9232 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9234 /* extracting teId */
9235 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9238 if(addDrbTunnels(duId, teId)== ROK)
9240 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9251 /****************************************************************
9252 * @brief Function to process Ue Context Setup Response
9256 * Function : procUeContextSetupResponse
9259 * - Function to process Ue Context Setup Response
9262 * @return ROK - success
9265 * ****************************************************************/
9266 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9268 uint8_t duIdx = 0, idx = 0, ueIdx = 0;
9269 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9271 CuUeCb *ueCb = NULLP;
9272 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9274 SEARCH_DU_DB(duIdx, duId, duDb);
9275 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9277 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9279 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9281 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9283 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9286 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9288 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9289 ueCb = &duDb->ueCb[duUeF1apId-1];
9290 /* If ue context is not present in du db, then create UE context
9291 * here. This flow is hit in case of UE handover where UE
9292 * context is created before UE performs RACH on target DU */
9293 if(ueCb->gnbDuUeF1apId == 0)
9295 /* Creating UE context in target DU */
9296 memset(ueCb, 0, sizeof(CuUeCb));
9297 ueCb->cellCb = &duDb->cellCb[0];
9298 ueCb->gnbDuUeF1apId = duUeF1apId;
9299 ueCb->gnbCuUeF1apId = cuUeF1apId;
9300 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9301 ueCb->hoInfo.targetDuId = duId;
9304 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9305 ueCb->cellCb->numUe++;
9309 case ProtocolIE_ID_id_C_RNTI:
9311 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9314 case ProtocolIE_ID_id_DRBs_Setup_List:
9316 /* Adding Tunnels for successful DRB */
9317 procDrbSetupList(duId, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9320 case ProtocolIE_ID_id_DUtoCURRCInformation:
9322 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9323 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9324 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9326 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9334 ueCb->f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
9336 /* If the UE is in handover, UE context modification request is to be sent to
9337 * source DU once UE context setup response is received from target DU */
9338 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9340 DuDb *srcDuDb = NULLP;
9341 CuUeCb *ueCbInSrcDu = NULLP;
9343 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9344 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9345 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9347 /* UE context setup response is received from target DU. Search all
9348 * DUs to find source DU except this target DU Id.*/
9349 if(cuCb.duInfo[duIdx].duId != duId)
9351 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9354 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9355 * received in UE context setup response since CU UE F1AP ID does not
9356 * change for UE in handover.
9357 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9359 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9360 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9362 srcDuDb = &cuCb.duInfo[duIdx];
9363 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9365 /* Store source DU info in the new UE context created in
9367 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9368 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9370 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9377 if(srcDuDb && ueCbInSrcDu)
9384 /****************************************************************
9385 * @brief Function to process Ul Rrc Msg received from DU
9389 * Function : procUlRrcMsg
9392 * - Function to process Ul Rrc Msg received from DU
9395 * @return ROK - success
9398 * ****************************************************************/
9400 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9402 uint8_t idx, ret, srbId, rrcMsgType, duIdx=0;
9403 uint8_t cuUeF1apId, duUeF1apId;
9404 uint8_t *rrcContainer = NULLP;
9405 uint16_t rrcContLen;
9408 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9411 SEARCH_DU_DB(duIdx, duId, duDb);
9412 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9414 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9416 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9418 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9420 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9423 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9425 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9428 case ProtocolIE_ID_id_SRBID:
9429 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9432 case ProtocolIE_ID_id_RRCContainer:
9434 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9435 CU_ALLOC(rrcContainer, rrcContLen);
9438 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9441 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9446 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9453 ueCb = &duDb->ueCb[duUeF1apId-1];
9454 ueCb->f1apMsgDb.dlRrcMsgCount++;
9455 rrcMsgType = setDlRRCMsgType(ueCb);
9456 if(rrcMsgType == REGISTRATION_ACCEPT)
9458 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9459 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9461 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
9463 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
9464 ret = BuildAndSendUeContextSetupReq(duId, ueCb, rrcContLen, rrcContainer);
9466 if(rrcMsgType == SECURITY_MODE_COMPLETE)
9468 /* To trigger the DL RRC Msg for RRC Reconfig */
9469 ueCb->f1apMsgDb.dlRrcMsgCount++;
9470 rrcMsgType = setDlRRCMsgType(ueCb);
9471 if(rrcMsgType == RRC_RECONFIG)
9473 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
9474 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9477 if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9479 ueCb->state = UE_ACTIVE;
9480 ueCb->f1apMsgDb.dlRrcMsgCount++;
9481 rrcMsgType = setDlRRCMsgType(ueCb);
9482 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
9484 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9485 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9492 /****************************************************************
9493 * @brief Build And Send F1ResetAck
9497 * Function : FreeF1ResetAck
9500 * - Build And Send F1ResetRSP
9503 * @return ROK - success
9506 * ****************************************************************/
9507 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9510 ResetAcknowledge_t *f1ResetAck;
9514 if(f1apMsg->choice.successfulOutcome)
9516 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9518 if(f1ResetAck->protocolIEs.list.array)
9520 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9522 if(f1ResetAck->protocolIEs.list.array[idx])
9524 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9527 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9529 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9531 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9535 /****************************************************************
9536 * @brief Build And Send F1ResetAck
9540 * Function : BuildAndSendF1ResetAck
9543 * - Build And Send F1ResetRSP
9546 * @return ROK - success
9549 * ****************************************************************/
9551 uint8_t BuildAndSendF1ResetAck()
9554 uint8_t elementCnt = 0;
9555 uint8_t ret = RFAILED;
9556 F1AP_PDU_t *f1apMsg = NULL;
9557 ResetAcknowledge_t *f1ResetAck = NULLP;
9558 asn_enc_rval_t encRetVal;
9559 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9562 /* Allocate the memory for F1ResetRequest_t */
9563 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9564 if(f1apMsg == NULLP)
9566 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9570 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9572 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9573 if(f1apMsg->choice.successfulOutcome == NULLP)
9575 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9579 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9580 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9581 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9582 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9586 f1ResetAck->protocolIEs.list.count = elementCnt;
9587 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9589 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9590 if(f1ResetAck->protocolIEs.list.array == NULLP)
9592 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9596 for(idx=0; idx<elementCnt; idx++)
9598 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9599 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9606 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9607 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9608 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9609 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9611 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9613 /* Encode the F1SetupRequest type as UPER */
9614 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9616 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9618 /* Check encode results */
9619 if(encRetVal.encoded == ENCODE_FAIL)
9621 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9622 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9627 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9628 for(int i=0; i< encBufSize; i++)
9630 DU_LOG("%x",encBuf[i]);
9635 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9636 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9638 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9646 FreeF1ResetAck(f1apMsg);
9650 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9654 if(ulInfo->list.array)
9656 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9658 if(ulInfo->list.array[arrIdx])
9660 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9662 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9664 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9666 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9667 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9668 gTPTunnel->gTP_TEID.size);
9670 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9671 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9672 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9674 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9675 sizeof(GTPTunnel_t));
9677 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9680 CU_FREE(ulInfo->list.array,ulInfo->list.size);
9684 /*******************************************************************
9686 * @brief Deletes the EGTP tunnel
9690 * Function : deleteEgtpTunnel
9692 * Functionality: Deletes the EGTP tunnel
9694 * @params[in] uint8_t *buf
9696 * @return ROK - success
9699 * ****************************************************************/
9700 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
9705 teIdStringToInt(buf, &teId);
9706 if(teId > MAX_TEID || teId < MIN_TEID)
9708 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
9711 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9712 tnlEvt.action = EGTP_TNL_MGMT_DEL;
9713 tnlEvt.lclTeid = teId;
9714 tnlEvt.remTeid = teId;
9715 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
9717 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
9722 /*******************************************************************
9724 * @brief Builds the Uplink Tunnel Info
9728 * Function : BuildUlTnlInfoforSetupMod
9730 * Functionality: Constructs the UL TnlInfo For DRB list
9732 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
9734 * @return ROK - success
9737 * ****************************************************************/
9738 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
9744 ulInfo->list.count = ulCnt;
9745 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
9746 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
9747 if(ulInfo->list.array == NULLP)
9749 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9752 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
9754 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9755 if(ulInfo->list.array[arrIdx] == NULLP)
9757 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9763 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
9764 UPTransportLayerInformation_PR_gTPTunnel;
9767 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9768 sizeof(GTPTunnel_t));
9769 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
9771 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9774 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9775 transportLayerAddress.size = 4*sizeof(uint8_t);
9776 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9777 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9778 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9779 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9780 transportLayerAddress.buf == NULLP)
9782 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9786 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9787 transportLayerAddress.buf[0] = 192;
9788 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9789 transportLayerAddress.buf[1] = 168;
9790 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9791 transportLayerAddress.buf[2] = 130;
9792 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9793 transportLayerAddress.buf[3] = 82;
9794 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9795 transportLayerAddress.bits_unused = 0;
9797 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
9798 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
9799 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
9800 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
9803 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
9804 = 4 * sizeof(uint8_t);
9805 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9806 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9807 gTPTunnel->gTP_TEID.size);
9808 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
9811 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9814 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9815 gTP_TEID.buf[0] = 0;
9816 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9817 gTP_TEID.buf[1] = 0;
9818 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9819 gTP_TEID.buf[2] = 0;
9820 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
9822 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
9823 * fetched based on the Drb Id */
9825 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
9826 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
9827 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
9831 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9832 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
9835 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
9836 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
9837 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
9838 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
9840 }/*End of BuildULTnlInfo*/
9842 /*******************************************************************
9844 * @brief freeing the DRB item
9848 * Function : FreeDrbItem
9850 * Functionality: freeing the DRB item
9852 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9854 * @return ROK - success
9857 * ****************************************************************/
9859 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
9862 SNSSAI_t *snssai =NULLP;
9863 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
9865 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9866 switch(drbItem->qoSInformation.present)
9868 case QoSInformation_PR_NOTHING:
9870 case QoSInformation_PR_eUTRANQoS:
9872 if(drbItem->qoSInformation.choice.eUTRANQoS)
9874 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9878 case QoSInformation_PR_choice_extension:
9880 if(drbItem->qoSInformation.choice.choice_extension)
9882 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
9884 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
9887 CU_FREE(snssai->sST.buf,snssai->sST.size);
9893 CU_FREE(snssai->sD->buf,snssai->sD->size);
9895 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
9898 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
9899 if(flowMap->list.array)
9901 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
9903 if(flowMap->list.array[arrIdx] )
9905 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
9906 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
9909 CU_FREE(flowMap->list.array,flowMap->list.size);
9912 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
9918 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
9919 if(drbItem->uLConfiguration)
9921 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
9925 /*******************************************************************
9927 * @brief filling the DRB setup Mod item
9931 * Function : FillDrbItemToSetupMod
9933 * Functionality: filling the DRB setup Mod item
9936 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9938 * @return ROK - success
9941 * ****************************************************************/
9943 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
9948 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
9949 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
9952 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9954 switch(drbItem->qoSInformation.present)
9956 case QoSInformation_PR_NOTHING:
9960 case QoSInformation_PR_eUTRANQoS:
9963 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9964 if(drbItem->qoSInformation.choice.eUTRANQoS)
9966 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
9969 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
9970 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
9971 PriorityLevel_no_priority;
9973 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
9974 Pre_emptionCapability_may_trigger_pre_emption;
9976 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
9977 Pre_emptionVulnerability_pre_emptable;
9981 case QoSInformation_PR_choice_extension:
9983 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
9984 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
9986 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
9990 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
9991 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
9992 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
9993 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
9994 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
9997 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10002 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10003 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10006 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10010 /*Flows mapped to DRB List*/
10011 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10012 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10013 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10016 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10022 /*ULUPTNLInformation To Be Setup List*/
10023 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10024 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10027 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10032 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10033 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10039 /*******************************************************************
10041 * @brief Builds the DRB to be Setup Mod ItemIes
10045 * Function : FillDrbItemList
10047 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10049 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10051 * @return ROK - success
10052 * RFAILED - failure
10054 * ****************************************************************/
10056 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10058 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10059 drbItemIe->criticality = Criticality_reject;
10060 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10062 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10064 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10069 /*******************************************************************
10071 * @brief free the DRB to be Setup Mod list
10075 * Function : FreeDrbToBeSetupModList
10077 * Functionality: free the DRB to be Setup Mod list
10079 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10081 * @return ROK - success
10082 * RFAILED - failure
10084 * ****************************************************************/
10085 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10088 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10090 if(drbSet->list.array)
10092 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10094 if(drbSet->list.array[arrIdx] != NULLP)
10098 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10099 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10101 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10104 CU_FREE(drbSet->list.array, drbSet->list.size);
10109 /*******************************************************************
10111 * @brief Builds the DRB to be Setup Mod list
10115 * Function : BuildDrbToBeSetupList
10117 * Functionality: Constructs the DRB to be Setup Mod list
10119 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10121 * @return ROK - success
10122 * RFAILED - failure
10124 * ****************************************************************/
10126 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10132 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10133 drbSet->list.count = drbCnt;
10134 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10135 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10136 if(drbSet->list.array == NULLP)
10138 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10142 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10144 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10145 if(drbSet->list.array[arrIdx] == NULLP)
10147 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10151 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10154 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10161 /*******************************************************************
10163 * @brief Filling the DRB to be modified item
10167 * Function : FillDrbToBeModItem
10169 * Functionality: filling the DRB to be modified item
10171 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10173 * @return ROK - success
10174 * RFAILED - failure
10176 * ****************************************************************/
10178 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10182 DrbInfo *drbToBeMod;
10185 drbItem->dRBID = DRB2 + arrIdx;
10187 /* Search for DRB ID in CU databse */
10188 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10190 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10192 drbToBeMod = &ueCb->drbList[drbIdx];
10198 drbItem->qoSInformation = NULLP;
10199 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10200 if(drbItem->qoSInformation != NULLP)
10202 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10204 switch(drbItem->qoSInformation->present)
10206 case QoSInformation_PR_NOTHING:
10210 case QoSInformation_PR_eUTRANQoS:
10213 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10214 if(drbItem->qoSInformation->choice.eUTRANQoS)
10216 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10219 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10220 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10221 PriorityLevel_no_priority;
10223 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10224 Pre_emptionCapability_may_trigger_pre_emption;
10226 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10227 Pre_emptionVulnerability_pre_emptable;
10231 case QoSInformation_PR_choice_extension:
10233 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10234 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10236 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10240 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10241 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10242 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10243 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10244 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10247 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10252 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10253 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10256 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10260 /*Flows mapped to DRB List*/
10261 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10262 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10263 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10266 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10273 /*ULUPTNLInformation To Be Setup List*/
10274 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10275 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10278 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10284 /*******************************************************************
10286 * @brief Builds the DRB to be modified Item IE
10290 * Function : FillDrbToBeModItemList
10292 * Functionality: Constructs the DRB to be modified Mod Item Ies
10294 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10296 * @return ROK - success
10297 * RFAILED - failure
10299 * ****************************************************************/
10301 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10303 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10304 drbItemIe->criticality = Criticality_reject;
10305 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10306 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10308 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10315 /*******************************************************************
10317 * @brief Builds the DRB to be modified list
10321 * Function : BuildDrbToBeModList
10323 * Functionality: Constructs the DRB to be modified list
10325 * @params[in] DRBs_ToBeModified_List_t *drbSet
10327 * @return ROK - success
10328 * RFAILED - failure
10330 * ****************************************************************/
10332 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10338 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10339 drbSet->list.count = drbCnt;
10340 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10341 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10342 if(drbSet->list.array == NULLP)
10344 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10347 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10349 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10350 if(drbSet->list.array[arrIdx] == NULLP)
10352 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10356 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10359 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10366 /*******************************************************************
10368 * @brief freeing the DRB item
10372 * Function : FreeModifiedDrbItem
10374 * Functionality: freeing the DRB 2 item
10376 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10378 * @return ROK - success
10379 * RFAILED - failure
10381 * ****************************************************************/
10383 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10386 SNSSAI_t *snssai =NULLP;
10387 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10389 if(drbItem->qoSInformation != NULLP)
10391 switch(drbItem->qoSInformation->present)
10393 case QoSInformation_PR_NOTHING:
10395 case QoSInformation_PR_eUTRANQoS:
10397 if(drbItem->qoSInformation->choice.eUTRANQoS)
10399 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10403 case QoSInformation_PR_choice_extension:
10405 if(drbItem->qoSInformation->choice.choice_extension)
10407 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10409 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10410 if(snssai->sST.buf)
10412 CU_FREE(snssai->sST.buf,snssai->sST.size);
10416 if(snssai->sD->buf)
10418 CU_FREE(snssai->sD->buf,snssai->sD->size);
10420 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10423 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10424 if(flowMap->list.array)
10426 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10428 if(flowMap->list.array[arrIdx] )
10430 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10431 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10434 CU_FREE(flowMap->list.array,flowMap->list.size);
10437 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10443 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10444 if(drbItem->uLConfiguration)
10446 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10450 /*******************************************************************
10452 * @brief free the DRB to be modfified list
10456 * Function : FreeDrbToBeModifiedList
10458 * Functionality: free the DRB to be Setup Mod list
10460 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10462 * @return ROK - success
10463 * RFAILED - failure
10465 * ****************************************************************/
10466 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10469 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10471 if(drbSet->list.array)
10473 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10475 if(drbSet->list.array[arrIdx] != NULLP)
10477 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10478 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10479 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10482 CU_FREE(drbSet->list.array, drbSet->list.size);
10487 /*******************************************************************
10489 * @brief free the UeContextModification Request
10493 * Function : FreeUeContextModicationRequest
10495 * Functionality : deallocation of memory allocated in UeContextModiification
10498 * @params[in] F1AP_PDU_t *f1apMsg
10502 * ****************************************************************/
10503 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10505 uint8_t arrIdx =0 , ieId=0;
10506 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10510 if(f1apMsg->choice.initiatingMessage)
10512 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10513 if(ueContextModifyReq->protocolIEs.list.array)
10515 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10517 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10519 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10522 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10524 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10526 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10528 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10529 choice.DRBs_ToBeSetupMod_List);
10532 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10534 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10535 choice.DRBs_ToBeModified_List);
10538 case ProtocolIE_ID_id_TransmissionActionIndicator:
10540 case ProtocolIE_ID_id_RRCContainer:
10542 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10543 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10547 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10550 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10552 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10554 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10558 /*******************************************************************
10560 * @brief Builds the Ue Context Modification Req
10564 * Function : BuildAndSendUeContextModificationReq
10566 * Functionality: Constructs the Ue Context Modification Req
10570 * @return ROK - success
10571 * RFAILED - failure
10573 * ****************************************************************/
10574 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10577 uint8_t elementCnt = 0;
10578 uint8_t ret = RFAILED;
10579 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10580 F1AP_PDU_t *f1apMsg = NULLP;
10581 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10582 asn_enc_rval_t encRetVal;
10583 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10586 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10587 if(f1apMsg == NULLP)
10589 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10593 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10595 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10596 if(f1apMsg->choice.initiatingMessage == NULLP)
10598 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10601 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10602 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10603 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10605 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10607 if(action == MODIFY_UE)
10609 else if(action == QUERY_CONFIG)
10611 else if(action == RRC_RECONFIG_COMPLETE_IND)
10613 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10616 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10617 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10619 /* Initialize the UE context modification members */
10620 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10621 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10623 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10627 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10629 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10630 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10632 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10638 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10639 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10640 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10641 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10642 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10645 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10646 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10647 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10648 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10649 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10651 if(action == MODIFY_UE)
10653 /* DRB to be setup list */
10655 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10656 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10657 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10658 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10659 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10660 value.choice.DRBs_ToBeSetupMod_List));
10662 /* DRB to be modified list */
10664 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
10665 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10666 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10667 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
10668 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10669 value.choice.DRBs_ToBeModified_List));
10671 /* TODO: DRB to be release list */
10675 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
10679 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
10681 else if(action == QUERY_CONFIG)
10684 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
10685 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10686 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10687 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
10688 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
10690 else if(action == RRC_RECONFIG_COMPLETE_IND)
10693 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
10694 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10695 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10696 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
10697 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
10698 RRCReconfigurationCompleteIndicator_true;
10700 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10703 if(action == STOP_DATA_TX)
10705 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10706 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10707 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10708 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10709 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10710 TransmissionActionIndicator_stop;
10712 else if (action == RESTART_DATA_TX)
10714 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10715 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10716 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10717 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10718 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10719 TransmissionActionIndicator_restart;
10722 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10723 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10724 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10725 UEContextModificationRequestIEs__value_PR_RRCContainer;
10726 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
10728 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
10732 /* RRC delivery status request */
10734 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
10735 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10736 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
10737 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
10740 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10742 /* Encode the F1SetupRequest type as APER */
10743 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10745 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10747 /* Encode results */
10748 if(encRetVal.encoded == ENCODE_FAIL)
10750 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
10751 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10756 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
10757 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
10759 DU_LOG("%x",encBuf[ieIdx]);
10763 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10764 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
10766 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
10774 FreeUeContextModicationRequest(f1apMsg);
10778 /*****************************************************************i
10780 * @brief Free memory allocated for UE Context Release Command
10784 * Function : FreeUeContextReleaseCommand
10787 * - Free memory allocated for UE Context Release Command
10789 * @params[in] F1AP_PDU_t *f1apMsg
10792 * *************************************************************/
10793 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
10796 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
10800 if(f1apMsg->choice.initiatingMessage)
10802 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10803 if(ueReleaseCommand->protocolIEs.list.array)
10805 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
10807 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10809 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
10811 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10813 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10816 /*******************************************************************
10818 * @brief Builds the Ue Context Release Command
10822 * Function : BuildAndSendUeContextReleaseCommand
10824 * Functionality: Constructs the Ue Context Release Command
10828 * @return ROK - success
10829 * RFAILED - failure
10831 * ****************************************************************/
10832 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
10834 bool memAllocFailed = false;
10835 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
10838 F1AP_PDU_t *f1apMsg = NULLP;
10839 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
10841 asn_enc_rval_t encRetVal;
10842 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
10846 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10847 if(f1apMsg == NULLP)
10849 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
10853 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10855 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10856 if(f1apMsg->choice.initiatingMessage == NULLP)
10858 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
10861 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
10862 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10863 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
10865 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10867 SEARCH_DU_DB(duIdx, duId, duDb);
10868 ueCb = &duDb->ueCb[duUeF1apId-1];
10869 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
10874 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
10875 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
10877 /* Initialize the UE context modification members */
10878 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
10879 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
10881 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
10885 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10887 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10888 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
10890 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
10891 memAllocFailed = true;
10896 if(memAllocFailed == true)
10902 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10903 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10904 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10905 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
10906 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
10909 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10910 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10911 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10912 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
10913 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
10915 /* Cause of UE context release */
10917 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
10918 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10919 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10920 UEContextReleaseCommandIEs__value_PR_Cause;
10921 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10922 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
10923 CauseRadioNetwork_normal_release;
10924 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
10926 /* RRC Container for RRC release */
10928 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10929 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10930 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10931 UEContextReleaseCommandIEs__value_PR_RRCContainer;
10932 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
10934 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
10935 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
10936 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
10937 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
10939 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
10942 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
10943 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
10945 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10947 /* Encode the UE Context Release Command type as APER */
10948 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10950 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10953 /* Encode results */
10954 if(encRetVal.encoded == ENCODE_FAIL)
10956 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
10957 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10962 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
10963 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
10965 DU_LOG("%x",encBuf[ieIdx]);
10969 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10970 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
10972 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
10980 FreeUeContextReleaseCommand(f1apMsg);
10983 /*******************************************************************
10985 * @brief process Ue context release request
10989 * Function : procUeContextReleaseReq
10992 * - process Ue context release request
10994 * @params[in] F1AP_PDU_t *f1apMsg
10995 * @return ROK - success
10996 * RFAILED - failure
10998 * ****************************************************************/
10999 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11001 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11003 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11004 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11006 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11008 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11010 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11012 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11015 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11017 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11025 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11027 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11032 /*******************************************************************
11034 * @brief processing of Gnb-DU config update
11038 * Function : procGnbDuUpdate
11041 * - processing of Gnb-DU config update
11043 * @params[in] F1AP_PDU_t *f1apMsg
11044 * @return ROK - success
11045 * RFAILED - failure
11047 * ****************************************************************/
11048 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11050 bool cellToBeDelete = false;
11051 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11055 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11057 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11058 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11060 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11062 case ProtocolIE_ID_id_TransactionID:
11064 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11066 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11068 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11069 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11070 Served_Cells_To_Delete_List.list.array[0];
11071 nrCellId = deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.buf[4] >>\
11072 deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.bits_unused;
11073 cellToBeDelete = true;
11076 case ProtocolIE_ID_id_gNB_DU_ID:
11080 if(BuildAndSendDUUpdateAck(duId) != ROK)
11082 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11086 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11087 * commented this trigger for now */
11089 if(cellToBeDelete == false)
11091 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11092 if(BuildAndSendF1ResetReq() != ROK)
11094 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11099 if(cellToBeDelete == true)
11101 SEARCH_DU_DB(duIdx, duId, duDb);
11102 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11103 if(cellCb->numUe == 0)
11105 memset(cellCb, 0, sizeof(CuCellCb));
11109 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11114 /*******************************************************************
11116 * @brief storing slice list in CU database
11120 * Function : buildSliceList
11123 * - storing slice list in CU database
11125 * @params[in] SliceSupportList_t *sliceSupportList
11126 * @return ROK - success
11127 * RFAILED - failure
11129 * ****************************************************************/
11130 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11132 uint8_t sliceListIdx = 0;
11134 if(sliceSupportList)
11136 if(sliceSupportList->list.array)
11138 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11139 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11141 if(sliceSupportList->list.array[sliceListIdx])
11143 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11144 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11146 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11149 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11151 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11152 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11154 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11156 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11157 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11158 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11167 /****************************************************************
11168 * @brief Function to process Srb Setup Mod List
11172 * Function : procSrbSetupModList
11175 * - Function to process SRB Setup Mod List
11178 * @return ROK - success
11179 * RFAILED - failure
11181 * ****************************************************************/
11182 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11184 uint8_t arrIdx = 0, srbIdx;
11185 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11187 if(srbSetupList != NULLP)
11189 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11191 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11192 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11194 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11196 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11198 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11210 /****************************************************************
11211 * @brief Function to process Drb Setup Mod List
11215 * Function : procDrbSetupModList
11218 * - Function to process DRB Setup Mod List
11221 * @return ROK - success
11222 * RFAILED - failure
11224 * ****************************************************************/
11225 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11227 uint8_t arrIdx = 0, drbIdx;
11229 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11231 if(drbSetupList != NULLP)
11233 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11235 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11236 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11238 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11240 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11242 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11243 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11248 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11250 /* extracting teId */
11251 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11254 if(addDrbTunnels(duId, teId)== ROK)
11256 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11268 /*******************************************************************
11270 * @brief processing of GNB_DU_Served_Cells Plmn list information
11274 * Function : procServedCellPlmnList
11277 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11280 * @params[in] F1AP_PDU_t *f1apMsg
11281 * @return ROK - success
11282 * RFAILED - failure
11284 * ****************************************************************/
11285 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11287 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11288 ProtocolExtensionContainer_4624P3_t **ieExtend;
11290 if(srvPlmn->list.array)
11292 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11294 if(srvPlmn->list.array[srvPlmnIdx])
11296 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11299 if((*ieExtend)->list.array)
11301 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11303 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11305 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11307 case ProtocolIE_ID_id_TAISliceSupportList:
11309 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11310 extensionValue.choice.SliceSupportList) != ROK)
11312 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11327 /****************************************************************
11328 * @brief Function to process Ue Context Modification Response
11332 * Function : procUeContextModificationResponse
11335 * - Function to process Ue Context Modification Response
11338 * @return ROK - success
11339 * RFAILED - failure
11341 * ****************************************************************/
11342 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11344 uint8_t idx=0, duIdx=0;
11345 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11346 DuDb *duDb = NULLP;
11347 CuUeCb *ueCb = NULLP;
11348 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11350 SEARCH_DU_DB(duIdx, duId, duDb);
11351 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11353 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11355 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11357 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11359 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11362 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11364 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11365 ueCb = &duDb->ueCb[duUeF1apId-1];
11368 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11370 /* Adding Tunnels for successful DRB */
11371 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11375 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11377 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11380 case ProtocolIE_ID_id_DUtoCURRCInformation:
11382 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11383 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11384 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11386 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11395 /* If UE is in handover and UE context is not yet created at target DU, then send
11396 * UE context setup request to target DU */
11397 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11400 DuDb *tgtDuDb = NULLP;
11401 CuUeCb *ueCbInTgtDu = NULLP;
11403 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11406 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11407 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11409 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11411 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11413 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11418 /* If UE context is not found in Target DU DU, send UE context setup
11420 if(ueCbInTgtDu == NULLP)
11422 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb, 0, NULLP)) != ROK)
11424 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11434 /*******************************************************************
11436 * @brief processing of F1 setup request
11440 * Function : procF1SetupReq
11443 * - processing of F1 setup request
11445 * @params[in] F1AP_PDU_t *f1apMsg
11446 * @return ROK - success
11447 * RFAILED - failure
11449 * ****************************************************************/
11450 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11452 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11453 uint32_t duId = 0, nrCellId = 0;
11454 DuDb *duDb = NULLP;
11455 CuCellCb *cellCb = NULLP;
11456 BIT_STRING_t nrcellIdentity;
11457 F1SetupRequest_t *f1SetupReq = NULLP;
11458 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11459 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11461 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11462 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11464 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11466 case ProtocolIE_ID_id_gNB_DU_ID:
11468 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11469 SEARCH_DU_DB(duIdx, duId, duDb);
11472 duDb = &cuCb.duInfo[cuCb.numDu];
11473 memset(duDb, 0, sizeof(DuDb));
11482 case ProtocolIE_ID_id_gNB_DU_Name:
11484 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11487 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11489 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11490 if(duServedCell->list.array)
11492 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11494 if(duServedCell->list.array[plmnidx])
11496 switch(duServedCell->list.array[plmnidx]->id)
11498 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11500 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11501 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11502 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11504 nrCellId = nrcellIdentity.buf[4] >> nrcellIdentity.bits_unused;
11505 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11506 if(cellCb == NULLP)
11508 cellCb = &duDb->cellCb[duDb->numCells];
11509 memset(cellCb, 0, sizeof(CuCellCb));
11510 cellCb->nrCellId = nrCellId;
11511 cellCb->cellStatus = CELL_ACTIVE;
11524 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11528 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11532 /****************************************************************
11534 * @brief processing of UE Context Release Complete
11538 * Function : procUeContextReleaseComplete
11541 * - processing of UE Context Release Complete
11543 * @params[in] F1AP_PDU_t *f1apMsg
11544 * @return ROK - success
11545 * RFAILED - failure
11547 * ****************************************************************/
11548 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11550 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0;
11551 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11552 DuDb *duDb = NULLP;
11553 CuUeCb *ueCb = NULLP;
11554 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11556 SEARCH_DU_DB(duIdx, duId, duDb);
11559 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11563 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11564 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11566 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11568 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11570 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11573 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11575 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11576 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11577 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11579 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11581 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11582 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11584 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11585 ueCb->cellCb->numUe--;
11586 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus = CELL_DELETION_IN_PROGRESS))
11588 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11595 memset(ueCb, 0, sizeof(CuUeCb));
11603 /*******************************************************************
11605 * @brief Builds the Paging cell list
11609 * Function : BuildPagingCellList
11611 * Functionality: Build the paging cell list
11613 * @params[in] PagingCell_list_t *pagingCelllist,
11615 * @return ROK - success
11616 * RFAILED - failure
11618 * ****************************************************************/
11619 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11621 uint8_t cellIdx =0;
11622 PagingCell_ItemIEs_t *pagingCellItemIes;
11623 PagingCell_Item_t *pagingCellItem;
11625 pagingCelllist->list.count = numCells;
11626 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11627 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11628 if(pagingCelllist->list.array == NULLP)
11630 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11634 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11636 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11637 if(pagingCelllist->list.array[cellIdx] == NULLP)
11639 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11644 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11646 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11647 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
11648 pagingCellItemIes->criticality = Criticality_ignore;
11649 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
11650 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11652 /* Fill NrCgi Information */
11653 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
11659 /*******************************************************************
11661 * @brief Deallocation of memory allocated in paging msg
11665 * Function :FreePagingMsg
11667 * Functionality: Deallocation of memory allocated in paging msg
11669 * @params[in] F1AP_PDU_t *f1apMsg
11673 * ****************************************************************/
11674 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
11676 uint8_t ieIdx, cellIdx;
11678 PagingCell_ItemIEs_t *pagingCellItemIes;
11679 PagingCell_Item_t *pagingCellItem;
11680 PagingCell_list_t *pagingCelllist;
11684 if(f1apMsg->choice.initiatingMessage)
11686 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11687 if(paging->protocolIEs.list.array)
11689 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
11691 if(paging->protocolIEs.list.array[ieIdx])
11693 switch(paging->protocolIEs.list.array[ieIdx]->id)
11695 case ProtocolIE_ID_id_UEIdentityIndexValue:
11697 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11698 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11702 case ProtocolIE_ID_id_PagingIdentity:
11704 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
11706 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11708 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
11710 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11711 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11713 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
11714 sizeof(struct CNUEPagingIdentity));
11720 case ProtocolIE_ID_id_PagingCell_List:
11722 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
11723 if(pagingCelllist->list.array)
11725 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11727 if(pagingCelllist->list.array[cellIdx])
11729 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11730 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
11732 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11733 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
11734 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
11736 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11739 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
11744 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11747 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11749 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11751 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11754 /*******************************************************************
11756 * @brief Builds and sends the paging message if UE is in idle mode
11760 * Function : BuildAndSendPagingMsg
11762 * Functionality: Builds and sends the paging message
11764 * @params[in] uint32_t duId, uint8_t gsTmsi
11766 * @return ROK - success
11767 * RFAILED - failure
11769 * ****************************************************************/
11770 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
11772 bool memAllocFailed = false;
11773 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
11774 uint16_t ueId = 0, duIdx = 0;
11776 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
11777 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
11778 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
11779 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
11781 F1AP_PDU_t *f1apMsg = NULLP;
11782 Paging_t *paging = NULLP;
11784 asn_enc_rval_t encRetVal;
11786 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
11788 SEARCH_DU_DB(duIdx, duId, duDb);
11791 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
11797 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11798 if(f1apMsg == NULLP)
11800 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
11804 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11806 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11807 if(f1apMsg->choice.initiatingMessage == NULLP)
11809 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
11812 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
11813 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11814 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
11816 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11819 paging->protocolIEs.list.count = elementCnt;
11820 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
11822 /* Initialize the Paging Message members */
11823 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11824 if(paging->protocolIEs.list.array == NULLP)
11826 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
11830 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11832 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11833 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
11835 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11836 memAllocFailed = true;
11841 if(memAllocFailed == true)
11846 /* UE Identity Index Value */
11848 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
11849 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11850 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
11851 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
11852 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
11853 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11854 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11855 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
11857 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11861 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
11862 ueId = gsTmsi % 1024;
11863 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
11865 /* Paging Identity */
11867 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
11868 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11869 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
11870 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
11871 PagingIdentity_PR_cNUEPagingIdentity;
11872 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
11873 sizeof(struct CNUEPagingIdentity));
11874 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11876 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11880 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
11881 CNUEPagingIdentity_PR_fiveG_S_TMSI;
11883 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
11884 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11885 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11886 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
11888 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11892 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
11893 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
11897 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
11898 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11899 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
11900 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
11902 /* Paging Priority */
11904 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
11905 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11906 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
11907 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
11909 /* Paging Cell List */
11911 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
11912 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11913 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
11914 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
11916 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
11920 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11922 /* Encode the UE Context Release Command type as APER */
11923 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11925 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11928 /* Encode results */
11929 if(encRetVal.encoded == ENCODE_FAIL)
11931 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11932 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11937 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
11938 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11940 DU_LOG("%x",encBuf[ieIdx]);
11944 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11946 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11955 FreePagingMsg(f1apMsg);
11959 /*******************************************************************
11961 * @brief Handles received F1AP message and sends back response
11965 * Function : F1APMsgHdlr
11968 * - Decodes received F1AP control message
11969 * - Prepares response message, encodes and sends to SCTP
11972 * @return ROK - success
11973 * RFAILED - failure
11975 * ****************************************************************/
11976 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
11982 F1AP_PDU_t *f1apMsg = NULLP;
11983 asn_dec_rval_t rval; /* Decoder return value */
11984 F1AP_PDU_t f1apasnmsg ;
11986 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
11987 ODU_PRINT_MSG(mBuf, 0,0);
11989 /* Copy mBuf into char array to decode it */
11990 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
11991 CU_ALLOC(recvBuf, (Size)recvBufLen);
11993 if(recvBuf == NULLP)
11995 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
11998 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12000 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12004 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12005 for(i=0; i< recvBufLen; i++)
12007 DU_LOG("%x",recvBuf[i]);
12010 /* Decoding flat buffer into F1AP messsage */
12011 f1apMsg = &f1apasnmsg;
12012 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12014 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12015 CU_FREE(recvBuf, (Size)recvBufLen);
12017 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12019 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12023 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12025 switch(f1apMsg->present)
12027 case F1AP_PDU_PR_initiatingMessage:
12029 switch(f1apMsg->choice.initiatingMessage->value.present)
12031 case InitiatingMessage__value_PR_Reset:
12033 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12034 BuildAndSendF1ResetAck();
12038 case InitiatingMessage__value_PR_F1SetupRequest:
12040 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12041 procF1SetupReq(duId, f1apMsg);
12045 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12047 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12048 procGnbDuUpdate(*duId, f1apMsg);
12051 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12053 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12054 procInitULRRCMsg(*duId, f1apMsg);
12057 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12059 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12060 procUlRrcMsg(*duId, f1apMsg);
12064 case InitiatingMessage__value_PR_RRCDeliveryReport:
12066 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12069 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12071 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12072 procUeContextReleaseReq(*duId, f1apMsg);
12077 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12078 f1apMsg->choice.initiatingMessage->value.present);
12081 }/* End of switch(initiatingMessage) */
12085 case F1AP_PDU_PR_successfulOutcome:
12087 switch(f1apMsg->choice.successfulOutcome->value.present)
12089 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12091 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12094 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12096 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12097 procUeContextSetupResponse(*duId, f1apMsg);
12100 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12102 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12103 procUeContextModificationResponse(*duId, f1apMsg);
12106 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12108 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12109 procUeContextReleaseComplete(*duId, f1apMsg);
12114 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12115 f1apMsg->choice.successfulOutcome->value.present);
12118 }/* End of switch(successfulOutcome) */
12123 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12126 }/* End of switch(f1apMsg->present) */
12128 } /* End of F1APMsgHdlr */
12130 /**********************************************************************
12132 **********************************************************************/