1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ProtocolIE-Field.h"
25 #include "ProtocolExtensionField.h"
26 #include "ProtocolIE-SingleContainer.h"
28 #include "ModulationOrder.h"
30 #include "UE-CapabilityRAT-Container.h"
31 #include "UE-CapabilityRAT-ContainerList.h"
32 #include "UE-CapabilityRAT-ContainerListRRC.h"
33 #include "HandoverPreparationInformationRrc-IEs.h"
34 #include "HandoverPreparationInformationRrc.h"
35 #include "SupportedBandwidth.h"
36 #include "FeatureSetUplinkPerCC.h"
37 #include "FeatureSetDownlinkPerCC.h"
38 #include "FeatureSets.h"
39 #include "RF-Parameters.h"
40 #include "UE-NR-Capability.h"
41 #include "ProtocolExtensionContainer.h"
42 #include "CellGroupConfigRrc.h"
43 #include "MAC-CellGroupConfig.h"
44 #include "SchedulingRequestConfig.h"
45 #include "SchedulingRequestToAddMod.h"
46 #include "BSR-Config.h"
47 #include "TAG-Config.h"
49 #include "PHR-Config.h"
50 #include "RLC-Config.h"
51 #include "UL-AM-RLC.h"
52 #include "DL-AM-RLC.h"
53 #include "LogicalChannelConfig.h"
54 #include "RLC-BearerConfig.h"
55 #include "PhysicalCellGroupConfig.h"
56 #include "SpCellConfig.h"
57 #include "ServingCellConfig.h"
58 #include "ControlResourceSet.h"
59 #include "SearchSpace.h"
60 #include "PDCCH-Config.h"
61 #include "PDSCH-TimeDomainResourceAllocation.h"
62 #include "PDSCH-TimeDomainResourceAllocationList.h"
63 #include "DMRS-DownlinkConfig.h"
64 #include "PDSCH-Config.h"
65 #include "BWP-DownlinkDedicated.h"
66 #include "PUSCH-TimeDomainResourceAllocation.h"
67 #include "PUSCH-TimeDomainResourceAllocationList.h"
68 #include "DMRS-UplinkConfig.h"
69 #include "PUSCH-Config.h"
70 #include "SRS-ResourceId.h"
71 #include "SRS-Resource.h"
72 #include "SRS-ResourceSet.h"
73 #include "SRS-Config.h"
74 #include "PUCCH-Config.h"
75 #include "PUCCH-ResourceSet.h"
76 #include "PUCCH-Resource.h"
77 #include "PUCCH-format1.h"
78 #include "PUCCH-FormatConfig.h"
79 #include "BWP-UplinkDedicated.h"
80 #include "PUSCH-ServingCellConfig.h"
81 #include "UplinkConfig.h"
82 #include "PDSCH-ServingCellConfig.h"
83 #include "EUTRANQoS.h"
84 #include "GBR-QosInformation.h"
85 #include "DRBs-ToBeSetupMod-List.h"
86 #include "DRBs-ToBeSetupMod-Item.h"
87 #include "DRBs-Setup-Item.h"
88 #include "DLUPTNLInformation-ToBeSetup-List.h"
89 #include "DLUPTNLInformation-ToBeSetup-Item.h"
90 #include "UPTransportLayerInformation.h"
91 #include "GTPTunnel.h"
92 #include "QoSInformation.h"
93 #include "Cells-to-be-Activated-List.h"
94 #include "DL-CCCH-Message.h"
95 #include "SRB-ToAddModList.h"
96 #include "SRB-ToAddMod.h"
97 #include "RRCSetup-IEs.h"
99 #include "DL-DCCH-Message.h"
100 #include "RRCReconfiguration-IEs.h"
101 #include "RRCReconfiguration.h"
102 #include "DRB-ToAddModList.h"
103 #include "DRB-ToAddMod.h"
104 #include "SDAP-Config.h"
106 #include "MeasTiming.h"
107 #include "MeasTimingList.h"
108 #include "MeasurementTimingConfigurationRrc-IEs.h"
109 #include "MeasurementTimingConfigurationRrc.h"
110 #include "PDCP-Config.h"
111 #include "RSRP-Range.h"
112 #include "RSRQ-Range.h"
113 #include "SINR-Range.h"
114 #include "ThresholdNR.h"
115 #include "MeasObjectToAddMod.h"
116 #include "MeasObjectNR.h"
117 #include "MeasObjectToAddModList.h"
118 #include "EventTriggerConfig.h"
119 #include "ReportConfigNR.h"
120 #include "ReportConfigToAddMod.h"
121 #include "ReportConfigToAddModList.h"
122 #include "MeasIdToAddMod.h"
123 #include "MeasIdToAddModList.h"
124 #include "FilterCoefficient.h"
125 #include "QuantityConfigNR.h"
126 #include "QuantityConfig.h"
127 #include "MeasConfigRrc.h"
128 #include "AS-Config.h"
129 #include "RRCReconfiguration-v1530-IEs.h"
130 #include "CNUEPagingIdentity.h"
131 #include "PagingCell-Item.h"
132 #include "UL-DCCH-Message.h"
134 #include "cu_stub_sctp.h"
135 #include "cu_stub_egtp.h"
136 #include "cu_f1ap_msg_hdl.h"
139 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
140 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
142 /*******************************************************************
144 * @brief Sends F1 msg over SCTP
148 * Function : SendF1APMsg
150 * Functionality: Sends F1 msg over SCTP
152 * @params[in] Region region
154 * @return ROK - success
157 * ****************************************************************/
158 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
160 Buffer *mBuf = NULLP;
162 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
164 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
166 ODU_PRINT_MSG(mBuf, 0,0);
168 if(sctpSend(duId, mBuf) != ROK)
170 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
171 ODU_PUT_MSG_BUF(mBuf);
177 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
178 ODU_PUT_MSG_BUF(mBuf);
181 ODU_PUT_MSG_BUF(mBuf);
185 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
192 /********************************************************************
194 * @brief Builds and sends the F1SetupResponse
198 * Function : BuildAndSendF1SetupRsp
200 * Functionality: Constructs the F1SetupResponse message and sends
201 * it back to the DU through SCTP.
203 * @params[in] void **buf,Buffer to which encoded pattern is written into
204 * @params[in] int *size,size of buffer
206 * @return ROK - success
209 * ****************************************************************/
210 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
213 uint8_t elementCnt,cellCnt;
214 F1AP_PDU_t *f1apMsg = NULL;
215 F1SetupResponse_t *f1SetupRsp;
216 GNB_CU_Name_t *cuName;
217 Cells_to_be_Activated_List_t *cellToActivate;
218 RRC_Version_t *rrcVer;
219 asn_enc_rval_t encRetVal;
220 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
222 /* Allocate the memory for F1SetupRequest_t */
223 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
226 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
229 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
231 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
232 if(f1apMsg->choice.successfulOutcome == NULLP)
234 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
235 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
239 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
240 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
241 f1apMsg->choice.successfulOutcome->value.present = \
242 SuccessfulOutcome__value_PR_F1SetupResponse;
243 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
246 f1SetupRsp->protocolIEs.list.count = elementCnt;
247 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
249 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
250 elementCnt * sizeof(F1SetupResponseIEs_t *));
251 if(f1SetupRsp->protocolIEs.list.array == NULLP)
253 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
254 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
255 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
259 for(idx=0; idx<elementCnt; idx++)
261 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
262 sizeof(F1SetupResponseIEs_t));
263 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
265 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
266 elementCnt * sizeof(F1SetupResponseIEs_t *));
267 CU_FREE(f1apMsg->choice.successfulOutcome, \
268 sizeof(SuccessfulOutcome_t));
269 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
276 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
277 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
278 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
279 F1SetupResponseIEs__value_PR_TransactionID;
280 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
285 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
286 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
287 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
288 F1SetupResponseIEs__value_PR_GNB_CU_Name;
289 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
290 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
292 CU_ALLOC(cuName->buf, sizeof(cuName->size));
293 if(cuName->buf == NULLP)
295 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
297 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
298 sizeof(F1SetupResponseIEs_t));
300 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
301 elementCnt * sizeof(F1SetupResponseIEs_t *));
302 CU_FREE(f1apMsg->choice.successfulOutcome,\
303 sizeof(SuccessfulOutcome_t));
304 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
307 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
309 /*Cells to be activated list*/
311 f1SetupRsp->protocolIEs.list.array[idx]->id = \
312 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
313 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
314 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
315 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
316 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
317 Cells_to_be_Activated_List;
319 cellToActivate->list.count = cellCnt;
320 cellToActivate->list.size = \
321 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
322 CU_ALLOC(cellToActivate->list.array,\
323 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
324 if(cellToActivate->list.array == NULLP)
326 CU_FREE(cuName->buf, sizeof(cuName->size));
327 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
329 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
330 sizeof(F1SetupResponseIEs_t));
332 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
333 elementCnt * sizeof(F1SetupResponseIEs_t *));
334 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
335 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
338 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
340 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
341 if(cellToActivate->list.array[ieIdx] == NULLP)
343 CU_FREE(cellToActivate->list.array,\
344 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
345 CU_FREE(cuName->buf, sizeof(cuName->size));
346 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
348 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
349 sizeof(F1SetupResponseIEs_t));
351 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
352 elementCnt * sizeof(F1SetupResponseIEs_t *));
353 CU_FREE(f1apMsg->choice.successfulOutcome, \
354 sizeof(SuccessfulOutcome_t));
355 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
359 cellToActivate->list.array[0]->id = \
360 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
361 cellToActivate->list.array[0]->criticality = Criticality_ignore;
362 cellToActivate->list.array[0]->value.present = \
363 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
364 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
365 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
366 CU_ALLOC(cellToActivate->list.array[0]->\
367 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
369 if(cellToActivate->list.array[0]->value.choice.\
370 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
373 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
375 CU_FREE(cellToActivate->list.array[ieIdx],\
376 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
379 CU_FREE(cellToActivate->list.array,\
380 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
381 CU_FREE(cuName->buf, sizeof(cuName->size));
382 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
384 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
385 sizeof(F1SetupResponseIEs_t));
387 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
388 elementCnt * sizeof(F1SetupResponseIEs_t *));
389 CU_FREE(f1apMsg->choice.successfulOutcome, \
390 sizeof(SuccessfulOutcome_t));
391 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
394 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
395 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
396 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
397 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
398 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
399 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
400 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
401 nRCGI.nRCellIdentity.size);
402 if(cellToActivate->list.array[0]->value.choice.\
403 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
405 CU_FREE(cellToActivate->list.array[0]->\
406 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
408 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
410 CU_FREE(cellToActivate->list.array[ieIdx],\
411 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
414 CU_FREE(cellToActivate->list.array,\
415 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
416 CU_FREE(cuName->buf, sizeof(cuName->size));
417 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
419 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
420 sizeof(F1SetupResponseIEs_t));
422 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
423 elementCnt * sizeof(F1SetupResponseIEs_t *));
424 CU_FREE(f1apMsg->choice.successfulOutcome, \
425 sizeof(SuccessfulOutcome_t));
426 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
429 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
432 f1SetupRsp->protocolIEs.list.array[idx]->id = \
433 ProtocolIE_ID_id_GNB_CU_RRC_Version;
434 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
435 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
436 F1SetupResponseIEs__value_PR_RRC_Version;
437 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
438 rrcVer->latest_RRC_Version.size = RRC_SIZE;
440 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
441 if(rrcVer->latest_RRC_Version.buf == NULLP)
443 CU_FREE(cuName->buf, sizeof(cuName->size));
444 for(ieIdx=0; ieIdx<elementCnt; idx++)
446 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
447 sizeof(F1SetupResponseIEs_t));
449 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
450 elementCnt * sizeof(F1SetupResponseIEs_t *));
451 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
452 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
456 /* Need to check RRC Version */
457 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
458 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
459 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
460 if(rrcVer->iE_Extensions == NULLP)
462 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
463 CU_FREE(cuName->buf, sizeof(cuName->size));
464 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
466 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
467 sizeof(F1SetupResponseIEs_t));
469 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
470 elementCnt * sizeof(F1SetupResponseIEs_t *));
471 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
472 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
475 rrcVer->iE_Extensions->list.count = 1;
476 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
477 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
478 sizeof(struct RRC_Version_ExtIEs *));
479 if(rrcVer->iE_Extensions->list.array == NULLP)
481 CU_FREE(rrcVer->iE_Extensions,\
482 sizeof(ProtocolExtensionContainer_4624P81_t));
483 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
484 CU_FREE(cuName->buf, sizeof(cuName->size));
485 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
487 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
488 sizeof(F1SetupResponseIEs_t));
490 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
491 elementCnt * sizeof(F1SetupResponseIEs_t *));
492 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
493 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
496 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
497 sizeof(struct RRC_Version_ExtIEs));
498 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
500 CU_FREE(rrcVer->iE_Extensions->list.array,\
501 sizeof(struct RRC_Version_ExtIEs *));
502 CU_FREE(rrcVer->iE_Extensions,\
503 sizeof(ProtocolExtensionContainer_4624P81_t));
504 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
505 CU_FREE(cuName->buf, sizeof(cuName->size));
506 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
508 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
509 sizeof(F1SetupResponseIEs_t));
511 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
512 elementCnt * sizeof(F1SetupResponseIEs_t *));
513 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
514 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
517 rrcVer->iE_Extensions->list.array[0]->id = \
518 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
519 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
520 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
521 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
522 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
523 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
524 CU_ALLOC(rrcVer->iE_Extensions->list.\
525 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
527 if(rrcVer->iE_Extensions->list.\
528 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
530 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
531 sizeof(struct RRC_Version_ExtIEs));
532 CU_FREE(rrcVer->iE_Extensions->list.array,\
533 sizeof(struct RRC_Version_ExtIEs *));
534 CU_FREE(rrcVer->iE_Extensions,\
535 sizeof(ProtocolExtensionContainer_4624P81_t));
536 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
537 CU_FREE(cuName->buf, sizeof(cuName->size));
538 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
540 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
541 sizeof(F1SetupResponseIEs_t));
543 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
544 elementCnt * sizeof(F1SetupResponseIEs_t *));
545 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
546 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
549 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
550 Latest_RRC_Version_Enhanced.buf[0] = 0;
551 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
552 Latest_RRC_Version_Enhanced.buf[1] = 5;
553 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
554 Latest_RRC_Version_Enhanced.buf[2] = 15;
556 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
558 /* Encode the F1SetupRequest type as UPER */
559 memset(encBuf, 0, ENC_BUF_MAX_LEN);
561 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
564 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
565 CU_FREE(cuName->buf, sizeof(cuName->size));
566 for(idx=0; idx<elementCnt; idx++)
568 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
570 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
571 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
572 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
574 /* Check encode results */
575 if(encRetVal.encoded == ENCODE_FAIL)
577 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
578 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
583 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
584 for(int i=0; i< encBufSize; i++)
586 DU_LOG("%x",encBuf[i]);
591 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
593 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
598 }/* End of BuildAndSendF1SetupRsp */
600 /*******************************************************************
602 * @brief Builds and sends the DUUpdateAcknowledge
606 * Function : BuildAndSendDUUpdateAck
608 * Functionality: Constructs the DU Update Acknowledge message and sends
609 * it to the DU through SCTP.
613 * @return ROK - success
616 * ****************************************************************/
618 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
622 F1AP_PDU_t *f1apMsg = NULL;
623 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
624 asn_enc_rval_t enRetVal; /* Encoder return value */
626 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
628 /* Allocate the memory for F1SetupRequest_t */
629 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
632 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
636 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
638 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
639 if(f1apMsg->choice.successfulOutcome == NULLP)
641 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
642 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
646 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
647 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
648 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
649 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
652 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
653 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
655 /* Initialize the F1Setup members */
656 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
657 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
659 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
660 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
661 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
665 for(idx=0; idx<elementCnt; idx++)
667 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
668 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
670 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
671 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
672 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
679 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
680 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
681 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
682 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
683 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
685 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
687 /* Encode the F1SetupRequest type as UPER */
688 memset(encBuf, 0, ENC_BUF_MAX_LEN);
690 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
693 for(idx=0; idx<elementCnt; idx++)
695 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
697 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
698 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
699 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
701 /* Checking encode results */
702 if(enRetVal.encoded == ENCODE_FAIL)
704 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
705 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
710 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
711 for(int i=0; i< encBufSize; i++)
713 DU_LOG("%x",encBuf[i]);
718 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
719 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
721 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
727 }/* End of BuildAndSendDUUpdateAck*/
729 /*******************************************************************
731 * @brief deallocating the memory of F1reset msg
735 * Function : FreeF1ResetReq
738 * - freeing memory of F1reset request msg
744 * ****************************************************************/
745 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
748 Reset_t *f1ResetMsg = NULLP;
752 if(f1apMsg->choice.initiatingMessage)
754 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
755 if(f1ResetMsg->protocolIEs.list.array)
757 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
759 if(f1ResetMsg->protocolIEs.list.array[idx])
761 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
764 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
766 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
768 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
771 /*******************************************************************
773 * @brief build ansld ans send f1reset msg
777 * Function : BuildAndSendF1ResetReq
779 * Functionality: build and send f1reset msg
781 * @return ROK - success
784 * ****************************************************************/
785 uint8_t BuildAndSendF1ResetReq()
787 uint8_t elementCnt=0;
789 uint8_t ret= RFAILED;
790 Reset_t *f1ResetMsg = NULLP;
791 F1AP_PDU_t *f1apMsg = NULLP;
792 asn_enc_rval_t encRetVal;
793 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
796 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
799 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
802 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
803 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
804 if(f1apMsg->choice.initiatingMessage == NULLP)
806 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
809 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
810 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
811 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
813 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
816 f1ResetMsg->protocolIEs.list.count = elementCnt;
817 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
819 /* Initialize the F1Reset members */
820 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
821 if(f1ResetMsg->protocolIEs.list.array == NULLP)
823 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
826 for(idx=0; idx<elementCnt; idx++)
828 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
829 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
831 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
838 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
839 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
840 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
841 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
845 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
846 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
847 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
848 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
849 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
853 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
854 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
855 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
856 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
857 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
859 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
861 /* Encode the F1SetupRequest type as APER */
862 memset(encBuf, 0, ENC_BUF_MAX_LEN);
864 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
868 if(encRetVal.encoded == ENCODE_FAIL)
870 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
871 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
876 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
877 for(idx=0; idx< encBufSize; idx++)
879 DU_LOG("%x",encBuf[idx]);
883 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
884 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
886 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
894 FreeF1ResetReq(f1apMsg);
898 /*******************************************************************
900 * @brief Fills Radio Bearer Config
904 * Function : fillSrbCfg
906 * Functionality: Fills Radio Bearer Config
908 * @params[in] SRB_ToAddModList *
910 * @return ROK - success
913 * ****************************************************************/
914 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
916 uint8_t elementCnt = 0;
917 uint8_t idx, ieId, srbIdx = 0;
919 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
921 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
925 if(bearerCfg != NULLP)
927 bearerCfg->list.count = elementCnt;
928 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
929 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
930 if(bearerCfg->list.array != NULLP)
932 for(idx = 0; idx < elementCnt; idx++)
934 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
935 if(bearerCfg->list.array[idx] == NULLP)
937 for(ieId = 0; ieId < idx; ieId++)
939 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
941 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
948 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
953 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
955 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
956 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
962 /*******************************************************************
964 * @brief Fills Master CellGroup Info
968 * Function : fillMasterCellGroup
970 * Functionality: Fills Master Cell Group IE
972 * @params[in] RRCSetup_IEs_t *
974 * @return ROK - success
977 * ****************************************************************/
979 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
982 masterCellGroup->buf = NULLP;
983 if(ueCb->f1apMsgDb.duToCuContainer.buf)
985 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
986 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
987 if(masterCellGroup->buf != NULLP)
989 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
993 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1004 /*******************************************************************
1006 * @brief Fills RRC setup IE
1010 * Function : fillRRCSetupIE
1012 * Functionality: Fills RRC Setup IE
1014 * @params[in] RRCSetup_IEs_t *
1016 * @return ROK - success
1019 * ****************************************************************/
1021 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1023 uint8_t ret = ROK, srbIdx = 0;
1026 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1027 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1029 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1033 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1037 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1041 /* If SRB configuration are filled successfully in RRC Setup, mark these
1042 * configurartion as sent to UE */
1043 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1045 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1046 ueCb->srbList[srbIdx].cfgSentToUe = true;
1051 /*******************************************************************
1053 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1057 * Function : fillDlCcchRrcMsg
1059 * Functionality: Fills DL DCCCH Message required for
1060 * DLRRCMessageTransfer
1062 * @params[in] RRCContainer_t *rrcContainer
1064 * @return ROK - success
1067 * ****************************************************************/
1069 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1073 DL_CCCH_Message_t dl_CCCH_Msg;
1074 asn_enc_rval_t encRetVal;
1076 if(rrcContainer != NULLP)
1078 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1080 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1081 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1083 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1084 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1085 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1087 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1088 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1089 RRCSetup__criticalExtensions_PR_rrcSetup;
1091 /* Fill RRC Setup IE */
1092 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1093 sizeof(RRCSetup_IEs_t));
1094 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1096 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1100 /* encode DL-CCCH message into RRC Container */
1101 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1102 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1104 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1105 /* Encode results */
1106 if(encRetVal.encoded == ENCODE_FAIL)
1108 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1109 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1114 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1115 for(int i = 0; i< encBufSize; i++)
1117 DU_LOG("%x",encBuf[i]);
1119 rrcContainer->size = encBufSize;
1120 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1121 if(rrcContainer->buf != NULLP)
1123 memset(rrcContainer->buf, 0, encBufSize);
1124 for(idx2 = 0; idx2 < encBufSize; idx2++)
1126 rrcContainer->buf[idx2] = encBuf[idx2];
1138 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1144 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1150 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1156 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1161 /*******************************************************************
1163 * @brief Fills QOS flow configuration
1167 * Function : fillQosFlowsToAdd
1169 * Functionality: Fills QOS flow configuration
1171 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1173 * @return ROK - success
1176 * ****************************************************************/
1177 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1179 uint8_t idx, ied, elementCnt;
1182 qosFlow->list.count = elementCnt;
1183 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1184 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1185 if(qosFlow->list.array != NULLP)
1187 for(idx = 0; idx < elementCnt; idx++)
1189 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1190 if(qosFlow->list.array[idx] == NULLP)
1192 for(ied = 0; ied < idx; ied++)
1194 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1196 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1202 *qosFlow->list.array[idx] = 9;
1206 /*******************************************************************
1208 * @brief Fills CN Assoc for Drb to Add/Mod List
1212 * Function : fillCnAssoc
1214 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1216 * @params[in] struct DRB_ToAddMod__cnAssociation *
1218 * @return ROK - success
1221 * ****************************************************************/
1223 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1227 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1228 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1230 cnAssoc->choice.eps_BearerIdentity = 5;
1232 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1234 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1235 if(cnAssoc->choice.sdap_Config)
1237 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1238 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1239 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1240 cnAssoc->choice.sdap_Config->defaultDRB = true;
1241 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1242 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1243 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1244 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1245 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1247 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1251 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1252 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1258 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1265 /*******************************************************************
1267 * @brief Fills Radio Bearer Config for Drb
1271 * Function : fillDrbCfg
1273 * Functionality: Fills Radio Bearer Config for Drb
1275 * @params[in] drbId, DRB_ToAddModList *
1277 * @return ROK - success
1280 * ****************************************************************/
1281 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1283 uint8_t idx, ied, ret, elementCnt;
1289 drbCfg->list.count = elementCnt;
1290 drbCfg->list.size =\
1291 elementCnt * sizeof(DRB_ToAddMod_t *);
1292 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1293 if(drbCfg->list.array != NULLP)
1295 for(idx = 0; idx < elementCnt; idx++)
1297 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1298 if(drbCfg->list.array[idx] == NULLP)
1300 for(ied = 0; ied < idx; ied++)
1302 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1304 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1314 /* CN ASSOCIATION */
1315 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1316 if(drbCfg->list.array[idx]->cnAssociation)
1318 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1321 drbCfg->list.array[idx]->drb_Identity = drbId;
1326 /*******************************************************************
1328 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1332 * Function : fillRrcReconfigIE
1334 * Functionality: Fills RRC Reconfig Message required for
1335 * DLRRCMessageTransfer
1337 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1339 * @return ROK - success
1342 * ****************************************************************/
1344 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1347 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1348 if(rrcReconfigMsg->radioBearerConfig)
1350 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1351 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1353 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1358 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1359 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1361 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1364 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1365 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1366 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1372 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1373 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1379 /*******************************************************************
1381 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1385 * Function : fillDlDcchRrcMsg
1387 * Functionality: Fills DL DCCH Message required for
1388 * DLRRCMessageTransfer
1390 * @params[in] RRCContainer_t *rrcContainer
1392 * @return ROK - success
1395 * ****************************************************************/
1397 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1400 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1401 DL_DCCH_Message_t dl_DCCH_Msg;
1402 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1403 asn_enc_rval_t encRetVal;
1405 if(rrcContainer != NULLP)
1407 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1409 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1410 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1412 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1413 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1414 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1416 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1417 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1420 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1421 * configurartion as sent to UE */
1422 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1424 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1425 ueCb->srbList[srbIdx].cfgSentToUe = true;
1427 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1429 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1430 ueCb->drbList[drbIdx].cfgSentToUe = true;
1433 /* encode DL-DCCH message into RRC Container */
1434 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1435 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1437 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1438 /* Encode results */
1439 if(encRetVal.encoded == ENCODE_FAIL)
1441 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1442 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1447 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1448 for(int i = 0; i< encBufSize; i++)
1450 DU_LOG("%x",encBuf[i]);
1452 rrcContainer->size = encBufSize;
1453 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1454 if(rrcContainer->buf != NULLP)
1456 memset(rrcContainer->buf, 0, encBufSize);
1457 for(idx2 = 0; idx2 < encBufSize; idx2++)
1459 rrcContainer->buf[idx2] = encBuf[idx2];
1467 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1473 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1479 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1485 /*******************************************************************
1487 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1491 * Function : BuildDLRRCContainer
1493 * Functionality: Builds RRC Container IE required for
1494 * DLRRCMessageTransfer
1498 * @return ROK - success
1501 * ****************************************************************/
1503 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1505 uint8_t ret, bufLen;
1508 if(rrcMsgType == RRC_SETUP)
1510 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1512 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1514 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1516 DU_LOG("\nINFO --> F1AP : Sending Security mode command");
1517 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1519 rrcContainer->size = bufLen;
1520 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1521 if(rrcContainer->buf != NULLP)
1523 memset(rrcContainer->buf, 0, bufLen);
1524 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1528 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1532 else if(rrcMsgType == SECURITY_MODE_COMPLETE)
1534 /*Hardcoded RRC Container from reference logs*/
1535 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1536 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1538 rrcContainer->size = bufLen;
1539 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1540 if(rrcContainer->buf != NULLP)
1542 memset(rrcContainer->buf, 0, bufLen);
1543 memcpy(rrcContainer->buf, buf, bufLen);
1547 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1551 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1553 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1554 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1556 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1562 /*******************************************************************
1564 * @brief Frees the DLRRCMessageTransfer
1568 * Function : freeDlRrcMessageTransfer
1570 * Functionality: Frees the DLRRCMessageTransfer
1574 * @return ROK - success
1577 * ****************************************************************/
1578 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1581 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1585 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1586 if(dlRRCMsg->protocolIEs.list.array)
1589 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1590 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1591 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1593 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1595 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1597 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1601 /*******************************************************************
1603 * @brief Builds and sends the DLRRCMessageTransfer
1607 * Function : BuildAndSendDLRRCMessageTransfer
1609 * Functionality: Constructs the DL RRC Message Transfer and sends
1610 * it to the CU through SCTP.
1614 * @return ROK - success
1617 * ****************************************************************/
1618 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1620 uint8_t elementCnt = 0;
1623 F1AP_PDU_t *f1apMsg = NULLP;
1624 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1625 asn_enc_rval_t encRetVal; /* Encoder return value */
1627 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1629 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1630 if(f1apMsg == NULLP)
1632 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1636 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1637 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1638 if(f1apMsg->choice.initiatingMessage == NULLP)
1640 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1641 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1645 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1646 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1647 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1648 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1651 dlRRCMsg->protocolIEs.list.count = elementCnt;
1652 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1654 /* Initialize the F1Setup members */
1655 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1656 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1658 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1659 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1660 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1664 for(idx=0; idx<elementCnt; idx++)
1666 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1667 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1669 for(ieId=0; ieId<idx; ieId++)
1671 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1673 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1674 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1675 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1680 /* GNB CU UE F1AP ID */
1682 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1683 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1684 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1685 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1687 /* GNB DU UE F1AP ID */
1689 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1690 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1691 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1692 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1696 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1697 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1698 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1699 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1703 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1704 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1705 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1706 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1708 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1710 /* Encode the F1SetupRequest type as APER */
1711 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1713 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1715 /* Encode results */
1716 if(encRetVal.encoded == ENCODE_FAIL)
1718 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1719 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1724 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1725 for(int i=0; i< encBufSize; i++)
1727 DU_LOG("%x",encBuf[i]);
1732 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1734 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1737 freeDlRrcMessageTransfer(f1apMsg);
1739 }/* End of BuildAndSendDLRRCMessageTransfer */
1741 /*******************************************************************
1743 * @brief Function to set the Dl RRC Msg Type
1747 * Function : setDlRRCMsgType
1749 * Functionality: Constructs the UE Setup Response and sends
1750 * it to the DU through SCTP.
1754 * @return ROK - success
1757 * ****************************************************************/
1759 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1761 uint8_t rrcMsgType = 0;
1762 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1765 rrcMsgType = RRC_SETUP;
1767 case RRC_SETUP_COMPLETE:
1768 rrcMsgType = RRC_SETUP_COMPLETE;
1770 case SECURITY_MODE_COMPLETE:
1771 rrcMsgType = SECURITY_MODE_COMPLETE;
1773 case REGISTRATION_COMPLETE:
1774 rrcMsgType = REGISTRATION_COMPLETE;
1776 case UE_CONTEXT_SETUP_RSP:
1777 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1779 case RRC_RECONFIG_COMPLETE:
1780 rrcMsgType = RRC_RECONFIG_COMPLETE;
1788 /*******************************************************************
1790 * @brief Extract configuration from CellGroupConfig
1794 * Function : extractCellGroupConfig
1796 * Functionality: Extract configuration from CellGroupConfig
1797 * and store in local database
1799 * @params[in] UE control block
1802 * @return ROK - success
1805 * ****************************************************************/
1806 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
1808 uint8_t rbIdx, srbIdx, drbIdx;
1809 bool srbFound, drbFound;
1810 SrbInfo *srbCfgDb = NULLP;
1811 DrbInfo *drbCfgDb = NULLP;
1812 RlcLcCfg *rlcLcCfgDb = NULLP;
1813 MacLcCfg *macLcCfgDb = NULLP;
1814 RLC_BearerConfig_t *rlcCfg = NULLP;
1815 RLC_Config_t *rlcLcCfg = NULLP;
1816 LogicalChannelConfig_t *macLcCfg = NULLP;
1820 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
1824 if(cellGrpCfg == NULLP)
1826 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
1830 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
1835 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
1837 /* Update SRB configuration in local DB */
1838 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
1840 /* Search if SRB entry is already present in DB */
1841 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
1843 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
1845 srbCfgDb = &ueCb->srbList[srbIdx];
1851 /* If not, add SRB to UE CB's SRB list */
1854 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
1855 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
1859 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1860 srbCfgDb->cfgSentToUe = false;
1861 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
1862 macLcCfgDb = &srbCfgDb->macLcCfg;
1865 /* Update DRB configuration in local DB */
1866 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
1868 /* Search if DRB entry is already present in DB */
1869 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
1871 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
1873 drbCfgDb = &ueCb->drbList[drbIdx];
1879 /* If not, add DRB to UE CB's SRB list */
1882 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
1883 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
1887 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1888 drbCfgDb->cfgSentToUe = false;
1889 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
1890 macLcCfgDb = &drbCfgDb->macLcCfg;
1894 /* Update RLC configuration for this RB */
1895 rlcLcCfg = rlcCfg->rlc_Config;
1896 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
1897 switch(rlcLcCfgDb->rlcMode)
1899 case RLC_Config_PR_am:
1901 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
1902 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
1903 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
1904 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
1905 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
1907 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
1908 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
1909 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
1913 case RLC_Config_PR_um_Bi_Directional:
1915 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
1917 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
1918 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
1923 /* Update MAC configuration for this LC */
1924 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
1925 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
1926 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
1927 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
1928 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
1929 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
1934 /*******************************************************************
1936 * @brief Function to decode DU to CU RRC container
1940 * Function : extractDuToCuRrcCont
1942 * Functionality: Function to decode DU to CU RRC container
1945 * RRC conatiner octect string to be decoded
1947 * @return ROK - success
1950 * ****************************************************************/
1951 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
1953 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
1954 asn_dec_rval_t rval; /* Decoder return value */
1956 /* Copy the received container to UeCb */
1957 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
1959 /* Decoding DU to CU RRC container octet string to cell group config */
1960 cellGrpCfgMsg = &cellGrpCfg;
1961 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
1963 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
1965 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1967 DU_LOG("\nERROR --> F1AP : ASN decode failed");
1971 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
1973 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
1975 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
1982 /*******************************************************************
1984 * @brief Function to build Initial UL RRC Message
1988 * Function : procInitULRRCMsg
1990 * Functionality: Function to build Initial UL RRC Message
1994 * @return ROK - success
1997 * ****************************************************************/
1999 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2001 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2003 uint16_t cellIdx=0, nrCellId = 0;
2008 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2010 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2012 SEARCH_DU_DB(duIdx, duId, duDb);
2013 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2015 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2017 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2019 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2020 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2023 case ProtocolIE_ID_id_NRCGI:
2024 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2025 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2030 case ProtocolIE_ID_id_C_RNTI:
2031 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2032 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2034 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2035 memset(ueCb, 0, sizeof(CuUeCb));
2036 ueCb->cellCb = cellCb;
2037 ueCb->crnti = crnti;
2038 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2039 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2040 ueCb->state = UE_ATTACH_IN_PROGRESS;
2043 cellCb->ueCb[cellCb->numUe] = ueCb;
2048 case ProtocolIE_ID_id_RRCContainer:
2051 case ProtocolIE_ID_id_DUtoCURRCContainer:
2053 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2054 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2056 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2057 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2058 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2059 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2061 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2062 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2063 ueCb->f1apMsgDb.duToCuContainer.size);
2065 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2067 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2073 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2080 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2089 ueCb->f1apMsgDb.dlRrcMsgCount++;
2090 rrcMsgType = setDlRRCMsgType(ueCb);
2091 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2096 /*******************************************************************
2098 * @brief Builds Nrcgi
2102 * Function : BuildNrcgi
2104 * Functionality: Building the PLMN ID and NR Cell id
2106 * @params[in] NRCGI_t *nrcgi
2107 * @return ROK - success
2110 * ****************************************************************/
2111 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2114 uint8_t unused_bits = 4;
2115 uint8_t byteSize = 5;
2117 /* Allocate Buffer Memory */
2118 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2119 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2120 if(nrcgi->pLMN_Identity.buf == NULLP)
2124 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2130 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2131 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2132 if(nrcgi->nRCellIdentity.buf == NULLP)
2136 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2140 /*******************************************************************
2142 * @brief Builds Special cell list for UE Setup Request
2146 * Function : BuildSplCellList
2148 * Functionality: Constructs the Special Cell list for UESetReq
2150 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2152 * @return ROK - success
2155 * ****************************************************************/
2156 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2162 spCellLst->list.count = cellCnt;
2163 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2164 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2165 if(spCellLst->list.array == NULLP)
2169 for(idx=0; idx<cellCnt; idx++)
2171 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2172 if(spCellLst->list.array[idx] == NULLP)
2178 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2179 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2180 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2182 /* Special Cell ID -NRCGI */
2183 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2188 /*Special Cell Index*/
2189 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2191 }/* End of BuildSplCellList*/
2193 /*******************************************************************
2195 * @brief Builds SRBS to be setup
2199 * Function : BuildSRBSetup
2201 * Functionality: Constructs the SRB's for UESetReq
2203 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2205 * @return ROK - success
2208 * ****************************************************************/
2209 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2214 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2215 srbCnt = ueCb->numSrb;
2218 srbSet->list.count = srbCnt;
2219 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2220 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2221 if(srbSet->list.array == NULLP)
2223 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2227 for(idx=0; idx<srbCnt; idx++)
2229 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2230 if(srbSet->list.array[idx] == NULLP)
2232 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2237 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2240 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2241 srbSet->list.array[idx]->criticality = Criticality_ignore;
2242 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2243 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2244 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2249 for(idx=0; idx<srbCnt; idx++)
2251 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2252 srbSet->list.array[idx]->criticality = Criticality_ignore;
2253 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2254 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2258 }/* End of BuildSRBSetup*/
2260 /*******************************************************************
2262 * @brief Builds QOS Info for DRB Setum Item
2266 * Function : BuildQOSInfo
2268 * Functionality: Constructs the QOS Info for DRB Setup Item
2270 * @params[in] QoSInformation_t *qosinfo
2271 * int16_t pduSessionID
2273 * @return ROK - success
2276 * ****************************************************************/
2277 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2279 uint8_t elementCnt = 0, qosCntIdx = 0;
2280 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2282 /* NonDynamic5QIDescriptor */
2283 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2284 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2285 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2291 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2295 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2296 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2298 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2300 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2306 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2307 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2311 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2312 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2314 /*MaxDataBurstVolume*/
2315 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2316 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2320 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2321 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2324 /*nRGRAN Allocation Retention Priority*/
2327 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2328 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2329 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2333 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2334 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2335 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2337 qosInfo->priorityLevel = PriorityLevel_lowest;
2338 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2339 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2342 /* PDU session ID */
2345 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2346 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2348 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2352 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2353 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2357 elementCnt = NUM_QOS_EXT;
2358 qosIeExt->list.count = elementCnt;
2359 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2361 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2362 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2364 if(qosIeExt->list.array == NULLP)
2366 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2370 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2372 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2373 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2375 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2378 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2379 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2380 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2381 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2382 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2383 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2384 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2385 qosInfo->pduSessionId = pduSessionID;
2390 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2395 }/*End of BuildQOSInfo*/
2397 /*******************************************************************
2399 * @brief Builds SNSSAI
2403 * Function : BuildSNSSAI
2405 * Functionality: Constructs the SNSSAI For DRB list
2407 * @params[in] SNSSAI_t *snssai
2408 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2410 * @return ROK - success
2413 * ****************************************************************/
2414 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2418 snssai->sST.size = sizeof(uint8_t);
2419 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2420 if(snssai->sST.buf == NULLP)
2425 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2427 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2430 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2431 if(snssai->sD == NULLP)
2435 snssai->sD->size = 3 * sizeof(uint8_t);
2436 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2437 if(snssai->sD->buf == NULLP)
2442 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2444 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2447 drbInfo->snssai = snssaiToCopy;
2449 }/*End of BuildSNSSAI*/
2451 /*******************************************************************
2453 * @brief Builds the flow map.
2457 * Function : BuildFlowsMap
2459 * Functionality: Constructs the flowmap For DRB list
2461 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2463 * @return ROK - success
2466 * ****************************************************************/
2467 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2469 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2470 FlowsMapped *qosFlow;
2475 flowCnt = drbInfo->numFlowMap;
2476 flowMap->list.count = flowCnt;
2477 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2478 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2479 if(flowMap->list.array == NULLP)
2481 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2484 for(idx=0; idx<flowCnt; idx++)
2486 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2487 if(flowMap->list.array[idx] == NULLP)
2489 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2495 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2496 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2498 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2500 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2502 qosFlow = &drbInfo->flowMapList[flowIdx];
2509 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2510 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2515 qosFlow = &drbInfo->flowMapList[idx];
2516 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2519 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2520 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2523 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2527 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2528 drbInfo->numFlowMap++;
2531 }/*End of BuildFlowsMap*/
2533 /*******************************************************************
2535 * @brief Builds the Uplink Tunnel Info
2539 * Function : BuildULTnlInfo
2541 * Functionality: Constructs the UL TnlInfo For DRB list
2543 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2545 * @return ROK - success
2548 * ****************************************************************/
2549 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2555 ulInfo->list.count = ulCnt;
2556 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2557 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2558 if(ulInfo->list.array == NULLP)
2560 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2563 for(idx=0; idx<ulCnt; idx++)
2565 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2566 if(ulInfo->list.array[idx] == NULLP)
2568 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2573 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2575 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2576 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2578 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2581 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2582 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2583 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2584 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2586 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2592 /* NOTE: Below IP address must be changed if running on different IP configuration */
2593 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2594 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2595 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2596 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2597 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2599 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2600 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2601 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2602 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2606 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2607 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2608 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2609 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2610 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2614 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2615 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2616 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2617 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2619 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2625 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2626 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2627 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2628 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2630 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2631 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2632 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2633 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2637 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2638 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2639 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2640 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2643 }/*End of BuildULTnlInfo*/
2645 /*******************************************************************
2647 * @brief Builds DRBS to be setup
2651 * Function : BuildDRBSetup
2653 * Functionality: Constructs the DRB's for UESetReq
2655 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2657 * @return ROK - success
2660 * ****************************************************************/
2661 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2663 uint16_t snssaiIdx=0;
2664 uint8_t idx = 0, extIeIdx = 0;
2665 uint8_t elementCnt = 0, drbCnt = 0;
2666 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2667 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2668 DRBs_ToBeSetup_Item_t *drbSetItem;
2669 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2670 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2672 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2673 drbCnt = ueCb->numDrb;
2675 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2676 drbSet->list.count = drbCnt;
2678 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2679 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2680 if(drbSet->list.array == NULLP)
2682 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2686 for(idx=0; idx<drbCnt; idx++)
2688 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2689 if(drbSet->list.array[idx] == NULLP)
2691 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2695 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2696 drbSet->list.array[idx]->criticality = Criticality_ignore;
2697 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2698 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2700 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2702 drbSetItem->dRBID = idx + 1;
2703 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2706 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2709 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2710 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2711 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2713 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2716 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2717 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2718 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2719 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2720 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2721 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2723 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2724 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2725 if(BuildQOSInforet != ROK)
2727 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2732 snssaiIdx = (idx% cuCb.numSnssaiSupported);
2733 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2734 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2735 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
2737 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2738 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
2739 if(BuildSNSSAIret != ROK)
2741 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2745 /*Flows mapped to DRB List*/
2746 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2747 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2748 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2750 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2751 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2752 if(BuildFlowsMapret != ROK)
2754 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2758 /*ULUPTNLInformation To Be Setup List*/
2759 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2760 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2763 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2765 if(BuildULTnlInforet != ROK)
2767 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2772 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2774 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2775 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
2778 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
2780 /* DL PDCP SN Length */
2781 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2783 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
2784 if(!drbToBeSetupExt)
2786 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
2791 drbToBeSetupExt->list.count = elementCnt;
2792 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
2794 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
2795 if(!drbToBeSetupExt->list.array)
2797 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
2801 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
2803 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
2804 if(!drbToBeSetupExt->list.array[extIeIdx])
2806 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
2812 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
2814 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
2815 drbToBeSetupExtIe->criticality = Criticality_ignore;
2816 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
2817 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
2818 drbSetItem->iE_Extensions = drbToBeSetupExt;
2821 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2825 }/* End of BuildDRBSetup*/
2827 /*******************************************************************
2829 * @brief Deallocating memory of function BuildAndSendUESetReq
2833 * Function : FreeNrcgi
2835 * Functionality: Deallocating memory for function BuildNrcgi
2837 * @params[in] NRCGI_t *nrcgi
2841 *******************************************************************/
2842 void FreeNrcgi(NRCGI_t *nrcgi)
2844 if(nrcgi->pLMN_Identity.buf != NULLP)
2846 if(nrcgi->nRCellIdentity.buf != NULLP)
2848 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2850 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2853 /*******************************************************************
2855 * @brief Deallocating memory of function BuildAndSendUESetReq
2859 * Function : FreeSplCellList
2861 * Functionality: Deallocating memory for function BuildSplCellList
2863 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2868 * *****************************************************************/
2869 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2872 if(spCellLst->list.array != NULLP)
2874 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2876 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2878 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2880 if(spCellLst->list.array[cellidx]!=NULLP)
2882 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2885 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2888 /*******************************************************************
2890 * @brief Deallocating memory of function BuildAndSendUESetReq
2894 * Function : FreeSRBSetup
2896 * Functionality: Deallocating memory for function BuildSRBSetup
2898 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2903 * ******************************************************************/
2904 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2907 if(srbSet->list.array != NULLP)
2909 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2911 if(srbSet->list.array[srbidx]!=NULLP)
2913 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2916 CU_FREE(srbSet->list.array,srbSet->list.size);
2919 /*******************************************************************
2921 * @brief Deallocating memory of function BuildAndSendUESetReq
2925 * Function : FreeQOSInfo
2927 * Functionality: Deallocating memory for function BuildQOSInfo
2929 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2933 * ****************************************************************/
2934 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2936 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2937 uint8_t qosCntIdx = 0;
2939 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2941 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2943 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2945 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2946 sizeof(MaxDataBurstVolume_t));
2948 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2949 sizeof(AveragingWindow_t));
2951 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2952 sizeof(NonDynamic5QIDescriptor_t));
2954 if(drbQos->iE_Extensions)
2956 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2957 if(qosIeExt->list.array != NULLP)
2959 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2961 if(qosIeExt->list.array[qosCntIdx])
2963 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2966 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2969 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2972 /*******************************************************************
2974 * @brief Deallocating memory of function BuildAndSendUESetReq
2978 * Function : FreeULTnlInfo
2980 * Functionality: Deallocating memory for function BuildULTnlInfo
2982 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2987 * ****************************************************************/
2988 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2991 if(ulInfo->list.array != NULLP)
2993 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2995 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2997 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2999 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3000 transportLayerAddress.buf != NULLP)
3002 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3005 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3006 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3007 gTPTunnel->gTP_TEID.size);
3009 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3010 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3011 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3013 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3014 sizeof(GTPTunnel_t));
3017 if(ulInfo->list.array[ulidx]!=NULLP)
3019 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3022 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3025 /*******************************************************************
3027 * @brief Deallocating memory for BuildAndSendUESetReq
3031 * Function : FreeDRBSetup
3033 * Functionality: Deallocating memory for BuildDRBSetup
3035 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3039 * ****************************************************************/
3040 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3042 DRBs_ToBeSetup_Item_t *drbSetItem;
3043 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3045 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3047 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3048 if(drbSet->list.array != NULLP)
3050 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3052 if(drbSet->list.array[drbidx] != NULLP)
3054 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3055 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3057 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3058 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3060 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3061 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3063 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3064 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3066 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3068 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3070 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3072 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3073 flows_Mapped_To_DRB_List.list.array != NULLP)
3075 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3076 flows_Mapped_To_DRB_List.list.count; flowidx++)
3078 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3079 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3081 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3082 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3083 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3085 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3086 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3087 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3089 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3090 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3091 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3093 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3094 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3096 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3097 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3098 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3099 sizeof(MaxDataBurstVolume_t));
3101 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3102 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3103 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3105 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3106 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3107 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3110 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3111 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3113 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3114 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3117 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3118 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3119 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3121 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3122 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3124 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3125 sizeof(OCTET_STRING_t));
3127 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3128 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3130 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3131 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3133 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3134 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3136 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3137 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3139 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3140 iE_Extensions != NULLP)
3142 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3143 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3144 if(qosIeExt->list.array != NULLP)
3146 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3148 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3150 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3153 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3155 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3156 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3159 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3161 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3164 CU_FREE(drbSet->list.array,drbSet->list.size);
3169 /*******************************************************************
3171 * @brief Free the UE Setup Request
3175 * Function : FreeUeContextSetupReq
3177 * Functionality: Deallocate the memory of BuildUESetReq
3179 * @params[in] F1AP_PDU_t *f1apMsg
3184 * ****************************************************************/
3185 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3188 UEContextSetupRequest_t *ueSetReq = NULLP;
3190 if(f1apMsg != NULLP)
3192 if(f1apMsg->choice.initiatingMessage != NULLP)
3194 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3195 if(ueSetReq->protocolIEs.list.array != NULLP)
3197 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3199 if(ueSetReq->protocolIEs.list.array[idx])
3201 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3203 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3205 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3207 case ProtocolIE_ID_id_SpCell_ID:
3208 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3210 case ProtocolIE_ID_id_ServCellIndex:
3212 case ProtocolIE_ID_id_SpCellULConfigured:
3214 case ProtocolIE_ID_id_CUtoDURRCInformation:
3215 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3217 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3218 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3220 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3221 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3223 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3224 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3226 case ProtocolIE_ID_id_RRCContainer:
3227 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3229 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3230 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3233 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3234 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3235 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3238 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3242 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3244 for(ieId=0; ieId<idx; ieId++)
3246 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3248 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3251 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3253 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3255 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3259 /**Filling cell group info **/
3260 /*******************************************************************
3262 * @brief Build Control resource set to add/modify list
3266 * Function : BuildControlRSetToAddModList
3268 * Functionality: Build Control resource set to add/modify list
3271 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3273 * @return ROK - success
3276 * ****************************************************************/
3277 uint8_t BuildControlRSetToAddModList
3279 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3284 uint8_t numBytes, bitsUnused;
3285 struct ControlResourceSet *controlRSet;
3286 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3287 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3290 controlRSetList->list.count = elementCnt;
3291 controlRSetList->list.size = \
3292 elementCnt * sizeof(struct ControlResourceSet *);
3294 controlRSetList->list.array = NULLP;
3295 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3296 if(!controlRSetList->list.array)
3298 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3302 for(idx = 0; idx < elementCnt; idx++)
3304 controlRSetList->list.array[idx] = NULLP;
3305 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3306 if(!controlRSetList->list.array[idx])
3308 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3314 controlRSet = controlRSetList->list.array[idx];
3315 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3317 /* Values harcoded according to our design:
3320 * Bit string stored ff0000000000
3324 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3325 controlRSet->frequencyDomainResources.buf = NULLP;
3326 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3327 controlRSet->frequencyDomainResources.size);
3328 if(!controlRSet->frequencyDomainResources.buf)
3330 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3334 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3335 coreset0EndPrb = CORESET0_END_PRB;
3336 coreset1StartPrb = coreset0EndPrb + 6;
3337 coreset1NumPrb = CORESET1_NUM_PRB;
3338 /* calculate the PRBs */
3339 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3340 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3341 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3343 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3344 controlRSet->cce_REG_MappingType.present = \
3345 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3347 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3348 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3349 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3350 controlRSet->tci_PresentInDCI = NULLP;
3352 uint8_t tciStateIdx;
3354 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3355 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3356 if(!controlRset->tci_StatesPDCCH_ToAddList)
3358 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3363 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3364 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3365 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3366 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3367 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3369 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3373 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3375 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3376 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3378 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3385 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3387 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3388 if(!controlRset->tci_PresentInDCI)
3390 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3394 *(controlRset->tci_PresentInDCI);
3397 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3398 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3399 if(!controlRSet->pdcch_DMRS_ScramblingID)
3401 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3404 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3407 } /* End BuildControlRSetToAddModList */
3409 /*******************************************************************
3411 * @brief Build search space to add/modify list
3415 * Function : BuildSearchSpcToAddModList
3417 * Functionality: Build search space to add/modify list
3420 * @return ROK - success
3423 * ****************************************************************/
3424 uint8_t BuildSearchSpcToAddModList
3426 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3434 struct SearchSpace *searchSpc;
3437 searchSpcList->list.count = elementCnt;
3438 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3440 searchSpcList->list.array = NULLP;
3441 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3442 if(!searchSpcList->list.array)
3444 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3448 for(idx = 0; idx < elementCnt; idx++)
3450 searchSpcList->list.array[idx] = NULLP;
3451 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3452 if(!searchSpcList->list.array[idx])
3454 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3460 searchSpc = searchSpcList->list.array[idx];
3462 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3464 searchSpc->controlResourceSetId = NULLP;
3465 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3466 if(!searchSpc->controlResourceSetId)
3468 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3471 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3473 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3474 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3475 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3476 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3478 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3481 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3482 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3484 searchSpc->duration = NULLP;
3485 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3486 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3487 if(!searchSpc->monitoringSymbolsWithinSlot)
3489 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3493 /* Values taken from reference logs :
3496 * Bit string stores 8000
3501 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3502 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3503 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3504 searchSpc->monitoringSymbolsWithinSlot->size);
3505 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3507 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3512 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3513 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3514 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3515 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3517 searchSpc->nrofCandidates = NULLP;
3518 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3519 if(!searchSpc->nrofCandidates)
3521 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3525 searchSpc->nrofCandidates->aggregationLevel1 = \
3526 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3527 searchSpc->nrofCandidates->aggregationLevel2 = \
3528 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3529 searchSpc->nrofCandidates->aggregationLevel4 = \
3530 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3531 searchSpc->nrofCandidates->aggregationLevel8 = \
3532 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3533 searchSpc->nrofCandidates->aggregationLevel16 = \
3534 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3536 searchSpc->searchSpaceType = NULLP;
3537 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3538 if(!searchSpc->searchSpaceType)
3540 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3544 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3546 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3547 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3548 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3549 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3551 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3554 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3555 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3558 }/* End BuildSearchSpcToAddModList */
3560 /*******************************************************************
3562 * @brief Builds BWP DL dedicated PDCCH config
3566 * Function : BuildBWPDlDedPdcchCfg
3568 * Functionality: Builds BWP DL dedicated PDCCH config
3570 * @params[in] struct PDCCH_Config *pdcchCfg
3572 * @return ROK - success
3575 * ****************************************************************/
3576 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3578 pdcchCfg->controlResourceSetToAddModList = NULLP;
3579 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3580 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3581 if(!pdcchCfg->controlResourceSetToAddModList)
3583 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3587 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3592 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3594 pdcchCfg->searchSpacesToAddModList = NULLP;
3595 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3596 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3597 if(!pdcchCfg->searchSpacesToAddModList)
3599 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3603 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3608 pdcchCfg->searchSpacesToReleaseList = NULLP;
3609 pdcchCfg->downlinkPreemption = NULLP;
3610 pdcchCfg->tpc_PUSCH = NULLP;
3611 pdcchCfg->tpc_PUCCH = NULLP;
3612 pdcchCfg->tpc_SRS = NULLP;
3617 /*******************************************************************
3619 * @brief Builds DMRS DL PDSCH Mapping type A
3623 * Function : BuildDMRSDLPdschMapTypeA
3625 * Functionality: Builds DMRS DL PDSCH Mapping type A
3628 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3629 * @return ROK - success
3632 * ****************************************************************/
3633 uint8_t BuildDMRSDLPdschMapTypeA
3635 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3638 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3639 dmrsDlCfg->choice.setup = NULLP;
3640 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3641 if(!dmrsDlCfg->choice.setup)
3643 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3647 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3648 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3649 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3650 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3652 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3655 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3657 dmrsDlCfg->choice.setup->maxLength = NULLP;
3658 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3659 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3660 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3665 /*******************************************************************
3667 * @brief Builds TCI states to add/modify list
3671 * Function : BuildTCIStatesToAddModList
3673 * Functionality:Builds TCI states to add/modify list
3676 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3678 * @return ROK - success
3681 * ****************************************************************/
3682 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3687 /*******************************************************************
3689 * @brief Builds PDSCH time domain allocation list
3693 * Function : BuildPdschTimeDomAllocList
3695 * Functionality: Builds PDSCH time domain allocation list
3698 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3700 * @return ROK - success
3703 * ****************************************************************/
3704 uint8_t BuildPdschTimeDomAllocList
3706 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3711 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3713 timeDomAllocList->present = \
3714 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3716 timeDomAllocList->choice.setup = NULLP;
3717 CU_ALLOC(timeDomAllocList->choice.setup, \
3718 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3719 if(!timeDomAllocList->choice.setup)
3721 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3726 timeDomAllocList->choice.setup->list.count = elementCnt;
3727 timeDomAllocList->choice.setup->list.size = \
3728 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3730 timeDomAllocList->choice.setup->list.array = NULLP;
3731 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3732 timeDomAllocList->choice.setup->list.size);
3733 if(!timeDomAllocList->choice.setup->list.array)
3735 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3739 for(idx = 0; idx < elementCnt; idx++)
3741 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3742 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3743 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3744 if(!timeDomAllocList->choice.setup->list.array[idx])
3746 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3752 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3753 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3754 if(!timeDomAlloc->k0)
3756 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3759 *(timeDomAlloc->k0) = 0;
3760 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3761 timeDomAlloc->startSymbolAndLength = 66;
3764 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3765 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3766 if(!timeDomAlloc->k0)
3768 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3771 *(timeDomAlloc->k0) = 1;
3772 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3773 timeDomAlloc->startSymbolAndLength = 66;
3778 /*******************************************************************
3780 * @brief Builds PDSCH PRB Bundling type
3784 * Function : BuildPdschPrbBundlingType
3786 * Functionality: Builds PDSCH PRB Bundling type
3789 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3791 * @return ROK - success
3794 * ****************************************************************/
3795 uint8_t BuildPdschPrbBundlingType
3797 struct PDSCH_Config__prb_BundlingType *prbBndlType
3800 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3802 prbBndlType->choice.staticBundling = NULLP;
3803 CU_ALLOC(prbBndlType->choice.staticBundling, \
3804 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3805 if(!prbBndlType->choice.staticBundling)
3807 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3810 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3815 /*******************************************************************
3817 * @brief Builds BWP DL dedicated PDSCH config
3821 * Function : BuildBWPDlDedPdschCfg
3823 * Functionality: Builds BWP DL dedicated PDSCH config
3825 * @params[in] struct PDSCH_Config *pdschCfg
3827 * @return ROK - success
3830 * ****************************************************************/
3831 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3833 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3835 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3836 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3837 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3838 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3840 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3844 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3849 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3850 pdschCfg->tci_StatesToAddModList = NULLP;
3851 pdschCfg->tci_StatesToReleaseList = NULLP;
3852 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3854 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3855 if(!pdschCfg->tci_StatesToAddModList)
3857 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3860 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3866 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3868 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3869 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3870 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3871 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3873 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3876 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3880 pdschCfg->pdsch_AggregationFactor = NULLP;
3881 pdschCfg->rateMatchPatternToAddModList = NULLP;
3882 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3883 pdschCfg->rateMatchPatternGroup1 = NULLP;
3884 pdschCfg->rateMatchPatternGroup2 = NULLP;
3885 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3886 pdschCfg->mcs_Table = NULLP;
3888 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3889 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3890 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3892 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3895 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3897 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3902 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3903 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3904 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3905 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3906 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3907 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3908 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3913 /*******************************************************************
3915 * @brief Builds intitial DL BWP
3918 * Function : BuildInitialDlBWP
3920 * Functionality: Builds intitial DL BWP in spCellCfgDed
3922 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3924 * @return ROK - success
3927 * ****************************************************************/
3928 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3930 dlBwp->pdcch_Config = NULLP;
3931 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3932 if(!dlBwp->pdcch_Config)
3934 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3937 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3939 dlBwp->pdcch_Config->choice.setup = NULLP;
3940 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3941 if(!dlBwp->pdcch_Config->choice.setup)
3943 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3946 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3951 dlBwp->pdsch_Config = NULLP;
3952 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3953 if(!dlBwp->pdsch_Config)
3955 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3958 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3960 dlBwp->pdsch_Config->choice.setup = NULLP;
3961 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3962 if(!dlBwp->pdsch_Config->choice.setup)
3964 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3968 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3973 dlBwp->sps_Config = NULLP;
3974 dlBwp->radioLinkMonitoringConfig = NULLP;
3978 /*******************************************************************
3980 * @brief Builds DMRS UL Pusch Mapping type A
3984 * Function : BuildDMRSULPuschMapTypeA
3986 * Functionality: Builds DMRS UL Pusch Mapping type A
3989 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3990 * @return ROK - success
3993 * ****************************************************************/
3994 uint8_t BuildDMRSULPuschMapTypeA
3996 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3999 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4000 dmrsUlCfg->choice.setup= NULLP;
4001 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4002 if(!dmrsUlCfg->choice.setup)
4004 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4008 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4009 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4010 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4011 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4013 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4016 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4018 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4019 dmrsUlCfg->choice.setup->maxLength = NULLP;
4020 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4021 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4022 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4023 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4025 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4029 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4030 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4032 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4034 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4037 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4039 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4040 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4044 /*******************************************************************
4046 * @brief Build PUSCH time domain allocation list
4050 * Function : BuildPuschTimeDomAllocList
4052 * Functionality: Build PUSCH time domain allocation list
4055 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4057 * @return ROK - success
4060 * ****************************************************************/
4061 uint8_t BuildPuschTimeDomAllocList
4063 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4068 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4070 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4071 timeDomAllocList->choice.setup = NULLP;
4072 CU_ALLOC(timeDomAllocList->choice.setup, \
4073 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4074 if(!timeDomAllocList->choice.setup)
4076 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4081 timeDomAllocList->choice.setup->list.count = elementCnt;
4082 timeDomAllocList->choice.setup->list.size = \
4083 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4084 timeDomAllocList->choice.setup->list.array = NULLP;
4085 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4086 timeDomAllocList->choice.setup->list.size);
4087 if(!timeDomAllocList->choice.setup->list.array)
4089 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4093 for(idx = 0; idx < elementCnt; idx++)
4095 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4096 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4097 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4098 if(!timeDomAllocList->choice.setup->list.array[idx])
4100 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4106 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4107 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4108 if(!timeDomAlloc->k2)
4110 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4113 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4114 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4115 timeDomAlloc->startSymbolAndLength = 66;
4118 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4119 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4120 if(!timeDomAlloc->k2)
4122 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4125 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4126 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4127 timeDomAlloc->startSymbolAndLength = 66;
4132 /*******************************************************************
4134 * @brief Builds BWP UL dedicated PUSCH Config
4138 * Function : BuildBWPUlDedPuschCfg
4141 * Builds BWP UL dedicated PUSCH Config
4143 * @params[in] : PUSCH_Config_t *puschCfg
4145 * @return ROK - success
4148 * ****************************************************************/
4149 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4151 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4152 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4153 if(!puschCfg->dataScramblingIdentityPUSCH)
4155 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4158 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4160 puschCfg->txConfig = NULLP;
4161 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4162 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4163 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4164 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4166 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4170 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4175 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4176 puschCfg->pusch_PowerControl = NULLP;
4177 puschCfg->frequencyHopping = NULLP;
4178 puschCfg->frequencyHoppingOffsetLists = NULLP;
4179 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4181 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4182 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4183 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4184 if(!puschCfg->pusch_TimeDomainAllocationList)
4186 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4190 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4195 puschCfg->pusch_AggregationFactor = NULLP;
4196 puschCfg->mcs_Table = NULLP;
4197 puschCfg->mcs_TableTransformPrecoder = NULLP;
4198 puschCfg->transformPrecoder = NULLP;
4199 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4200 if(!puschCfg->transformPrecoder)
4202 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4205 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4207 puschCfg->codebookSubset = NULLP;
4208 puschCfg->maxRank = NULLP;
4209 puschCfg->rbg_Size = NULLP;
4210 puschCfg->uci_OnPUSCH = NULLP;
4211 puschCfg->tp_pi2BPSK = NULLP;
4216 /*******************************************************************
4218 * @brief Builds BWP UL dedicated PUCCH Config
4222 * Function : BuildBWPUlDedPucchCfg
4225 * Builds BWP UL dedicated PUCCH Config
4227 * @params[in] : PUCCH_Config_t *pucchCfg
4229 * @return ROK - success
4232 * ****************************************************************/
4233 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4235 uint8_t arrIdx, elementCnt;
4236 uint8_t rsrcIdx, rsrcSetIdx;
4237 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4238 PUCCH_Resource_t *rsrc = NULLP;
4242 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4243 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4244 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4245 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4246 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4248 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4251 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4252 rsrcSet->pucch_ResourceSetId = 1;
4254 rsrcSet->resourceList.list.count = elementCnt;
4255 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4256 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4257 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4259 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4262 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4266 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4267 pucchCfg->resourceToAddModList->list.count = elementCnt;
4268 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4269 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4270 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4272 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4275 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4276 rsrc->pucch_ResourceId = 1;
4277 rsrc->startingPRB = 0;
4278 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4279 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4280 rsrc->format.choice.format1->initialCyclicShift = 0;
4281 rsrc->format.choice.format1->nrofSymbols = 4;
4282 rsrc->format.choice.format1->startingSymbolIndex = 0;
4283 rsrc->format.choice.format1->timeDomainOCC = 0;
4286 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4287 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4288 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4289 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4290 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4293 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4294 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4296 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4301 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4302 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4303 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4304 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4306 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4310 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4312 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4313 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4315 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4321 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4322 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4327 /*******************************************************************
4329 * @brief Fills SRS resource to add/modify list
4333 * Function : BuildSrsRsrcAddModList
4335 * Functionality: Fills SRS resource to add/modify list
4338 * @return ROK - success
4341 * ****************************************************************/
4342 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4348 resourceList->list.count = elementCnt;
4349 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4350 resourceList->list.array = NULLP;
4351 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4352 if(!resourceList->list.array)
4354 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4358 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4360 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4361 if(!resourceList->list.array[rsrcIdx])
4363 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4369 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4370 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4371 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4373 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4374 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4375 sizeof(struct SRS_Resource__transmissionComb__n2));
4376 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4378 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4381 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4382 = SRS_COMB_OFFSET_N2;
4383 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4384 = SRS_CYCLIC_SHIFT_N2;
4386 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4387 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4388 SRS_Resource__resourceMapping__nrofSymbols_n1;
4389 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4390 SRS_Resource__resourceMapping__repetitionFactor_n1;
4392 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4393 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4394 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4395 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4396 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4397 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4398 SRS_Resource__groupOrSequenceHopping_neither;
4400 /* Setting resource type to aperiodic for intergration purposes */
4401 resourceList->list.array[rsrcIdx]->resourceType.present = \
4402 SRS_Resource__resourceType_PR_aperiodic;
4403 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4404 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4405 sizeof(struct SRS_Resource__resourceType__aperiodic));
4406 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4408 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4411 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4416 /*******************************************************************
4418 * @brief Build SRS resource set Add/mod list
4422 * Function : BuildSrsRsrcSetAddModList
4424 * Functionality: Build SRS resource set Add/mod list
4427 * @return ROK - success
4430 * ****************************************************************/
4431 uint8_t BuildSrsRsrcSetAddModList
4433 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4439 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4442 rsrcSetList->list.count = elementCnt;
4443 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4444 rsrcSetList->list.array = NULLP;
4445 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4446 if(!rsrcSetList->list.array)
4448 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4452 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4454 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4455 if(!rsrcSetList->list.array[rSetIdx])
4457 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4463 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4465 /* Fill Resource Id list in resource set */
4466 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4467 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4468 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4469 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4471 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4476 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4477 rsrcIdList->list.count = elementCnt;
4478 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4479 rsrcIdList->list.array = NULLP;
4480 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4481 if(!rsrcIdList->list.array)
4483 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4487 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4489 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4490 if(!rsrcIdList->list.array[rsrcIdx])
4492 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4498 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4500 /* Fill resource type */
4501 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4502 SRS_ResourceSet__resourceType_PR_aperiodic;
4504 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4505 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4506 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4507 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4509 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4512 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4513 = APERIODIC_SRS_RESRC_TRIGGER;
4515 /* TODO : Fill values for below IEs as expected by Viavi */
4516 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4517 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4520 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4521 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4522 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4523 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4524 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4529 /*******************************************************************
4531 * @brief Builds BWP UL dedicated SRS Config
4535 * Function : BuildBWPUlDedSrsCfg
4537 * Functionality: Builds BWP UL dedicated SRS Config
4539 * @params[in] SRS Config
4540 * @return ROK - success
4543 * ****************************************************************/
4544 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4546 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4547 srsCfg->srs_ResourceSetToAddModList = NULLP;
4548 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4549 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4550 if(!srsCfg->srs_ResourceSetToAddModList)
4552 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4555 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4560 srsCfg->srs_ResourceToReleaseList = NULLP;
4562 /* Resource to Add/Modify list */
4563 srsCfg->srs_ResourceToAddModList = NULLP;
4564 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4565 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4566 if(!srsCfg->srs_ResourceToAddModList)
4568 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4572 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4577 srsCfg->tpc_Accumulation = NULLP;
4582 /*******************************************************************
4584 * @brief Builds inital UL BWP
4588 * Function : BuildInitialUlBWP
4590 * Functionality: Builds initial UL BWP
4592 * @params[in] BWP_UplinkDedicated_t *ulBwp
4593 * @return ROK - success
4596 * ****************************************************************/
4597 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4599 ulBwp->pucch_Config = NULLP;
4600 ulBwp->pucch_Config = NULLP;
4601 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4602 if(!ulBwp->pucch_Config)
4604 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4608 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4609 ulBwp->pucch_Config->choice.setup = NULLP;
4610 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4611 if(!ulBwp->pucch_Config->choice.setup)
4613 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4617 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4622 /* Fill BWP UL dedicated PUSCH config */
4623 ulBwp->pusch_Config = NULLP;
4624 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4625 if(!ulBwp->pusch_Config)
4627 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4631 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4632 ulBwp->pusch_Config->choice.setup = NULLP;
4633 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4634 if(!ulBwp->pusch_Config->choice.setup)
4636 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4640 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4645 ulBwp->configuredGrantConfig = NULLP;
4647 /* Fill BPW UL dedicated SRS config */
4648 ulBwp->srs_Config = NULLP;
4649 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4650 if(!ulBwp->srs_Config)
4652 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4656 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4657 ulBwp->srs_Config->choice.setup = NULLP;
4658 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4659 if(!ulBwp->srs_Config->choice.setup)
4661 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4665 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4670 ulBwp->beamFailureRecoveryConfig = NULLP;
4675 /*******************************************************************
4677 * @brief Builds Pusch Serving cell Config
4681 * Function : BuildPuschSrvCellCfg
4683 * Functionality: Builds Pusch Serving cell Config
4685 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4687 * @return ROK - success
4690 * ****************************************************************/
4691 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4693 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4694 puschCfg->choice.setup = NULLP;
4695 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4696 if(!puschCfg->choice.setup)
4698 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4702 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4703 puschCfg->choice.setup->rateMatching = NULLP;
4704 puschCfg->choice.setup->xOverhead = NULLP;
4705 puschCfg->choice.setup->ext1 = NULLP;
4706 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4707 if(!puschCfg->choice.setup->ext1)
4709 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4713 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4714 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4715 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4717 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4720 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4722 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4723 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4724 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4726 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4729 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4733 /*******************************************************************
4735 * @brief Builds UL config
4738 * Function : BuildUlCfg
4740 * Functionality: Builds UL config in spCellCfgDed
4742 * @params[in] UplinkConfig_t *ulCfg
4744 * @return ROK - success
4747 * ****************************************************************/
4748 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4750 ulCfg->initialUplinkBWP = NULLP;
4751 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4752 if(!ulCfg->initialUplinkBWP)
4754 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4758 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4763 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4764 ulCfg->uplinkBWP_ToAddModList = NULLP;
4765 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4766 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4767 if(!ulCfg->firstActiveUplinkBWP_Id)
4769 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4772 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4774 ulCfg->pusch_ServingCellConfig = NULLP;
4775 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4776 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4777 if(!ulCfg->pusch_ServingCellConfig)
4779 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4783 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4788 ulCfg->carrierSwitching = NULLP;
4789 ulCfg->ext1 = NULLP;
4793 /*******************************************************************
4795 * @brief Builds PDSCH serving cell config
4798 * Function : BuildPdschSrvCellCfg
4800 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4802 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4804 * @return ROK - success
4807 * ****************************************************************/
4808 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4810 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4811 pdschCfg->choice.setup = NULLP;
4812 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4813 if(!pdschCfg->choice.setup)
4815 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4819 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4820 pdschCfg->choice.setup->xOverhead = NULLP;
4821 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4822 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4823 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4825 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4828 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4829 pdschCfg->choice.setup->pucch_Cell = NULLP;
4830 pdschCfg->choice.setup->ext1 = NULLP;
4835 /*******************************************************************
4837 * @brief Builds CSI Meas config
4840 * Function : BuildCsiMeasCfg
4842 * Functionality: Builds CSI Meas config in spCellCfgDed
4844 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4846 * @return ROK - success
4849 * ****************************************************************/
4850 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4856 /*******************************************************************
4858 * @brief Builds Spcell config dedicated
4861 * Function : BuildSpCellCfgDed
4863 * Functionality: Builds sp cell config dedicated in spCellCfg
4865 * @params[in] ServingCellConfig_t srvCellCfg
4867 * @return ROK - success
4870 * ****************************************************************/
4871 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4873 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4875 srvCellCfg->initialDownlinkBWP = NULLP;
4876 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4877 if(!srvCellCfg->initialDownlinkBWP)
4879 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4883 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4885 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4888 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4889 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4891 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4892 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4893 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4895 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4898 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4900 srvCellCfg->bwp_InactivityTimer = NULLP;
4902 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4903 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4904 if(!srvCellCfg->defaultDownlinkBWP_Id)
4906 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4909 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4911 srvCellCfg->uplinkConfig = NULLP;
4912 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4913 if(!srvCellCfg->uplinkConfig)
4915 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4919 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4921 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4924 srvCellCfg->supplementaryUplink = NULLP;
4925 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4927 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4928 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4929 if(!srvCellCfg->pdsch_ServingCellConfig)
4931 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4935 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4937 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4941 srvCellCfg->csi_MeasConfig = NULLP;
4943 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4944 if(!srvCellCfg->csi_MeasConfig)
4946 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4950 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4952 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4956 srvCellCfg->sCellDeactivationTimer = NULLP;
4957 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4958 srvCellCfg->tag_Id = TAG_ID;
4959 srvCellCfg->dummy = NULLP;
4960 srvCellCfg->pathlossReferenceLinking = NULLP;
4961 srvCellCfg->servingCellMO = NULLP;
4962 srvCellCfg->ext1 = NULLP;
4966 /*******************************************************************
4968 * @brief Builds Spcell config
4972 * Function : BuildSpCellCfg
4974 * Functionality: Builds sp cell config in DuToCuRrcContainer
4976 * @params[in] SpCellConfig_t spCellCfg
4978 * @return ROK - success
4981 * ****************************************************************/
4982 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4985 spCellCfg->servCellIndex = NULLP;
4986 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4987 if(!spCellCfg->servCellIndex)
4989 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4992 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4994 spCellCfg->reconfigurationWithSync = NULLP;
4995 spCellCfg->rlf_TimersAndConstants = NULLP;
4996 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4997 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4998 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5000 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5003 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5005 spCellCfg->spCellConfigDedicated = NULLP;
5006 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5007 if(!spCellCfg->spCellConfigDedicated)
5009 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5012 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5014 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5019 /*******************************************************************
5021 * @brief Builds Phy cell group config
5025 * Function : BuildPhyCellGrpCfg
5027 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5029 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5031 * @return ROK - success
5034 * ****************************************************************/
5035 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5037 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5038 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5040 phyCellGrpCfg->p_NR_FR1 = NULLP;
5041 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5042 if(!phyCellGrpCfg->p_NR_FR1)
5044 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5047 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5048 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5049 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5050 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5051 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5052 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5053 phyCellGrpCfg->cs_RNTI = NULLP;
5054 phyCellGrpCfg->ext1 = NULLP;
5055 phyCellGrpCfg->ext2 = NULLP;
5060 /*******************************************************************
5062 * @brief Builds tag config
5066 * Function : BuildTagConfig
5068 * Functionality: Builds tag config in MacCellGroupConfig
5070 * @params[in] TAG_Config *tag_Config
5072 * @return ROK - success
5075 * ****************************************************************/
5076 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5078 struct TAG_Config__tag_ToAddModList *tagList;
5079 uint8_t idx, elementCnt;
5081 tagConfig->tag_ToReleaseList = NULLP;
5082 tagConfig->tag_ToAddModList = NULLP;
5083 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5084 if(!tagConfig->tag_ToAddModList)
5086 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5090 elementCnt = 1; //ODU_VALUE_ONE;
5091 tagList = tagConfig->tag_ToAddModList;
5092 tagList->list.count = elementCnt;
5093 tagList->list.size = elementCnt * sizeof(struct TAG *);
5095 tagList->list.array = NULLP;
5096 CU_ALLOC(tagList->list.array, tagList->list.size);
5097 if(!tagList->list.array)
5099 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5103 for(idx=0; idx<tagList->list.count; idx++)
5105 tagList->list.array[idx] = NULLP;
5106 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5107 if(!tagList->list.array[idx])
5109 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5115 tagList->list.array[idx]->tag_Id = TAG_ID;
5116 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5121 /*******************************************************************
5123 * @brief Builds PHR Config
5127 * Function : BuildPhrConfig
5129 * Functionality: Builds phrConfig in MacCellGroupConfig
5131 * @params[in] PHR Config *
5133 * @return ROK - success
5136 * ****************************************************************/
5137 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5140 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5141 phrConfig->choice.setup = NULLP;
5142 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5143 if(!phrConfig->choice.setup)
5145 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5149 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5150 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5151 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5152 phrConfig->choice.setup->multiplePHR = false;
5153 phrConfig->choice.setup->dummy = false;
5154 phrConfig->choice.setup->phr_Type2OtherCell = false;
5155 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5160 /*******************************************************************
5162 * @brief Builds BSR Config
5166 * Function : BuildBsrConfig
5168 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5170 * @params[in] BSR_Config *bsrConfig
5172 * @return ROK - success
5175 * ****************************************************************/
5176 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5178 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5179 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5180 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5185 /*******************************************************************
5187 * @brief Builds scheduling request config
5191 * Function : BuildSchedulingReqConfig
5193 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5195 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5197 * @return ROK - success
5200 * ****************************************************************/
5201 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5203 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5204 uint8_t idx, elementCnt;
5206 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5207 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5208 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5209 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5211 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5215 elementCnt = 1; //ODU_VALUE_ONE;
5216 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5217 schReqList->list.count = elementCnt;
5218 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5220 schReqList->list.array = NULLP;
5221 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5222 if(!schReqList->list.array)
5224 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5228 for(idx=0;idx<schReqList->list.count; idx++)
5230 schReqList->list.array[idx] = NULLP;
5231 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5232 if(!schReqList->list.array[idx])
5234 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5240 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5242 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5243 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5244 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5246 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5249 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5250 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5251 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5255 /*******************************************************************
5257 * @brief Builds Mac cell group config
5261 * Function : BuildMacCellGrpCfg
5263 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5265 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5267 * @return ROK - success
5270 * ****************************************************************/
5271 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5273 macCellGrpCfg->drx_ConfigRrc = NULLP;
5274 macCellGrpCfg->schedulingRequestConfig = NULLP;
5275 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5276 if(!macCellGrpCfg->schedulingRequestConfig)
5278 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5282 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5284 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5288 macCellGrpCfg->bsr_Config = NULLP;
5289 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5290 if(!macCellGrpCfg->bsr_Config)
5292 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5296 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5298 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5302 macCellGrpCfg->tag_Config = NULLP;
5303 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5304 if(!macCellGrpCfg->tag_Config)
5306 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5310 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5312 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5316 macCellGrpCfg->phr_Config = NULLP;
5317 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5318 if(!macCellGrpCfg->phr_Config)
5320 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5324 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5326 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5330 macCellGrpCfg->skipUplinkTxDynamic = false;
5331 macCellGrpCfg->ext1 = NULLP;
5335 /*******************************************************************
5337 * @brief Frees memeory allocated for SearchSpcToAddModList
5341 * Function : FreeSearchSpcToAddModList
5343 * Functionality: Deallocating memory of SearchSpcToAddModList
5345 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5349 4221 * ****************************************************************/
5350 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5354 struct SearchSpace *searchSpc=NULLP;
5356 if(searchSpcList->list.array)
5358 if(searchSpcList->list.array[idx2])
5360 searchSpc = searchSpcList->list.array[idx2];
5361 if(searchSpc->controlResourceSetId)
5363 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5365 if(searchSpc->monitoringSymbolsWithinSlot)
5367 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5369 if(searchSpc->nrofCandidates)
5371 if(searchSpc->searchSpaceType)
5373 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5374 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5375 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5376 SearchSpace__searchSpaceType));
5378 CU_FREE(searchSpc->nrofCandidates,
5379 sizeof(struct SearchSpace__nrofCandidates));
5381 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5382 searchSpc->monitoringSymbolsWithinSlot->size);
5384 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5385 sizeof(BIT_STRING_t));
5387 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5388 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5390 CU_FREE(searchSpc->controlResourceSetId,
5391 sizeof(ControlResourceSetId_t));
5394 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5396 CU_FREE(searchSpcList->list.array[idx1],
5397 sizeof(struct SearchSpace));
5399 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5402 /*******************************************************************
5404 * @brief Frees memory allocated for PdschTimeDomAllocList
5408 * Function : FreePdschTimeDomAllocList
5410 * Functionality: Deallocating memory of PdschTimeDomAllocList
5412 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5416 4221 * ****************************************************************/
5417 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5421 if(timeDomAllocList->choice.setup)
5423 if(timeDomAllocList->choice.setup->list.array)
5425 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5427 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5428 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5430 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5431 timeDomAllocList->choice.setup->list.size);
5433 CU_FREE(timeDomAllocList->choice.setup,\
5434 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5437 /*******************************************************************
5439 * @brief Frees memory allocated for PuschTimeDomAllocList
5443 * Function : FreePuschTimeDomAllocList
5445 * Functionality: Deallocating memory of PuschTimeDomAllocList
5447 * @params[in] PUSCH_Config_t *puschCfg
5451 ***********************************************************************/
5452 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5456 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5458 if(puschCfg->pusch_TimeDomainAllocationList)
5460 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5461 if(timeDomAllocList_t->choice.setup)
5463 if(timeDomAllocList_t->choice.setup->list.array)
5465 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5466 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5468 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5469 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5471 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5472 timeDomAllocList_t->choice.setup->list.size);
5474 CU_FREE(timeDomAllocList_t->choice.setup, \
5475 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5477 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5478 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5479 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5484 /*******************************************************************
5486 * @brief Frees memory allocated for Dedicated PUCCH config
5490 * Function : FreeBWPUlDedPucchCfg
5492 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5494 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5498 * ****************************************************************/
5499 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5501 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5502 PUCCH_Config_t *pucchCfg = NULLP;
5503 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5504 PUCCH_Resource_t *rsrc = NULLP;
5508 if(ulBwpPucchCfg->choice.setup)
5510 pucchCfg = ulBwpPucchCfg->choice.setup;
5512 //Free resource set list
5513 if(pucchCfg->resourceSetToAddModList)
5515 if(pucchCfg->resourceSetToAddModList->list.array)
5517 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5519 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5520 if(rsrcSet->resourceList.list.array)
5522 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5524 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5526 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5528 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5530 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5532 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5535 //Free resource list
5536 if(pucchCfg->resourceToAddModList)
5538 if(pucchCfg->resourceToAddModList->list.array)
5540 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5542 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5543 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5544 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5546 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5548 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5552 if(pucchCfg->format1)
5554 if(pucchCfg->format1->choice.setup)
5556 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5557 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5559 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5563 if(pucchCfg->dl_DataToUL_ACK)
5565 if(pucchCfg->dl_DataToUL_ACK->list.array)
5567 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5569 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5571 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5573 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5576 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5578 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5582 /*******************************************************************
5584 * @brief Frees memory allocated for InitialUlBWP
5588 * Function : FreeInitialUlBWP
5590 * Functionality: Deallocating memory of InitialUlBWP
5592 * @params[in] BWP_UplinkDedicated_t *ulBwp
5596 * ****************************************************************/
5597 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5599 uint8_t rSetIdx, rsrcIdx;
5600 SRS_Config_t *srsCfg = NULLP;
5601 PUSCH_Config_t *puschCfg = NULLP;
5602 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5603 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5604 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5605 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5607 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5609 if(ulBwp->pusch_Config)
5611 if(ulBwp->pusch_Config->choice.setup)
5613 puschCfg=ulBwp->pusch_Config->choice.setup;
5614 if(puschCfg->dataScramblingIdentityPUSCH)
5616 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5618 FreePuschTimeDomAllocList(puschCfg);
5619 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5620 if(dmrsUlCfg->choice.setup)
5622 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5624 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5626 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5628 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5629 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5631 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5634 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5636 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5637 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5639 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5641 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5643 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5645 /* Free SRS-Config */
5646 if(ulBwp->srs_Config)
5648 if(ulBwp->srs_Config->choice.setup)
5650 srsCfg = ulBwp->srs_Config->choice.setup;
5652 /* Free Resource Set to add/mod list */
5653 if(srsCfg->srs_ResourceSetToAddModList)
5655 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5656 if(rsrcSetList->list.array)
5660 /* Free SRS resource Id list in this SRS resource set */
5661 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5663 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5665 if(rsrcIdList->list.array)
5667 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5669 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5671 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5673 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5674 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5677 /* Free resource type info for this SRS resource set */
5678 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5679 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5681 /* Free memory for each resource set */
5682 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5684 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5686 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5688 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5689 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5692 /* Free resource to add/modd list */
5693 if(srsCfg->srs_ResourceToAddModList)
5695 resourceList = srsCfg->srs_ResourceToAddModList;
5696 if(resourceList->list.array)
5699 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5700 sizeof(struct SRS_Resource__transmissionComb__n2));
5701 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5702 sizeof(struct SRS_Resource__resourceType__aperiodic));
5704 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5706 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5708 CU_FREE(resourceList->list.array, resourceList->list.size);
5710 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5711 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5714 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5716 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5720 /*******************************************************************
5722 * @brief Frees memory allocated for initialUplinkBWP
5726 * Function : FreeinitialUplinkBWP
5728 * Functionality: Deallocating memory of initialUplinkBWP
5730 * @params[in] UplinkConfig_t *ulCfg
5735 * ****************************************************************/
5736 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5738 BWP_UplinkDedicated_t *ulBwp=NULLP;
5739 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5741 if(ulCfg->initialUplinkBWP)
5743 ulBwp=ulCfg->initialUplinkBWP;
5744 if(ulCfg->firstActiveUplinkBWP_Id)
5746 if(ulCfg->pusch_ServingCellConfig)
5748 puschCfg=ulCfg->pusch_ServingCellConfig;
5749 if(puschCfg->choice.setup)
5751 if(puschCfg->choice.setup->ext1)
5753 CU_FREE(puschCfg->choice.setup->ext1->\
5754 processingType2Enabled,sizeof(BOOLEAN_t));
5755 CU_FREE(puschCfg->choice.setup->ext1->\
5756 maxMIMO_Layers,sizeof(long));
5757 CU_FREE(puschCfg->choice.setup->ext1, \
5758 sizeof(struct PUSCH_ServingCellConfig__ext1));
5760 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5762 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5764 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5766 FreeInitialUlBWP(ulBwp);
5767 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5770 /*******************************************************************
5772 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5776 * Function : FreeBWPDlDedPdschCfg
5778 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5780 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5785 * ****************************************************************/
5786 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5788 struct PDSCH_Config *pdschCfg=NULLP;
5789 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5790 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5791 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5793 if(dlBwp->pdsch_Config->choice.setup)
5795 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5796 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5798 if(pdschCfg->pdsch_TimeDomainAllocationList)
5800 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5801 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5803 prbBndlType=&pdschCfg->prb_BundlingType;
5804 CU_FREE(prbBndlType->choice.staticBundling,\
5805 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5806 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5808 FreePdschTimeDomAllocList(timeDomAllocList);
5809 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5810 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5812 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5813 if(dmrsDlCfg->choice.setup)
5815 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5817 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5819 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5820 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5822 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5825 /*******************************************************************
5827 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5831 * Function : FreeBWPDlDedPdcchCfg
5833 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5835 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5840 * ****************************************************************/
5841 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5845 struct PDCCH_Config *pdcchCfg=NULLP;
5846 struct ControlResourceSet *controlRSet=NULLP;
5847 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5849 if(dlBwp->pdcch_Config->choice.setup)
5851 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5852 if(pdcchCfg->controlResourceSetToAddModList)
5854 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5855 if(controlRSetList->list.array)
5857 controlRSet = controlRSetList->list.array[idx2];
5860 if(controlRSet->frequencyDomainResources.buf)
5862 if(controlRSet->pdcch_DMRS_ScramblingID)
5864 if(pdcchCfg->searchSpacesToAddModList)
5866 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5867 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5868 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5870 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5872 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5873 controlRSet->frequencyDomainResources.size);
5876 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5878 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5880 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5882 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5883 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5885 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5888 /*******************************************************************
5890 * @brief Builds RLC Config
5894 * Function : BuildRlcConfig
5896 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5898 * @params[in] RLC_Config *rlcConfig
5900 * @return ROK - success
5903 * ****************************************************************/
5904 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
5906 rlcConfig->present = rlcLcCfgDb.rlcMode;
5908 switch(rlcConfig->present)
5910 case RLC_Config_PR_am:
5912 rlcConfig->choice.am = NULLP;
5913 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5914 if(!rlcConfig->choice.am)
5916 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5921 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5922 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5923 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5925 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5928 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
5929 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
5930 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
5931 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
5932 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
5935 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5936 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5937 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5939 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5942 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
5943 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
5944 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
5949 case RLC_Config_PR_um_Bi_Directional:
5951 rlcConfig->choice.um_Bi_Directional = NULLP;
5952 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
5953 if(!rlcConfig->choice.um_Bi_Directional)
5955 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5960 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
5961 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5962 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
5964 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5967 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
5970 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
5971 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5972 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
5974 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5977 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
5978 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
5985 /*******************************************************************
5987 * @brief Builds MAC LC Config
5991 * Function : BuildMacLCConfig
5993 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5995 * @params[in] struct LogicalChannelConfig macLcConfig
5997 * @return ROK - success
6000 * ****************************************************************/
6001 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6004 macLcConfig->ul_SpecificParameters = NULLP;
6005 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6006 if(!macLcConfig->ul_SpecificParameters)
6008 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6012 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6013 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6014 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6015 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6016 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6017 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6018 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6020 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6021 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6022 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6024 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6027 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6029 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6030 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6031 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6033 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6036 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6038 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6039 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6040 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6044 /*******************************************************************
6046 * @brief Builds RLC Bearer to Add/Mod list
6050 * Function :BuildRlcBearerToAddModList
6052 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6054 * @params[in] rlc_BearerToAddModList
6056 * @return ROK - success
6059 * ****************************************************************/
6060 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6062 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6065 elementCnt = ueCb->numSrb + ueCb->numDrb;
6068 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6070 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6074 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6076 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6083 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6086 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6089 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6092 rlcBearerList->list.count = elementCnt;
6093 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6095 rlcBearerList->list.array = NULLP;
6096 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6097 if(!rlcBearerList->list.array)
6099 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6103 for(idx=0; idx<rlcBearerList->list.count; idx++)
6105 rlcBearerList->list.array[idx] = NULLP;
6106 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6107 if(!rlcBearerList->list.array[idx])
6109 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6116 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6118 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6121 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6123 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6124 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6126 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6130 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6131 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6133 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6134 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6135 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6136 if(!rlcBearerList->list.array[idx]->rlc_Config)
6138 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6142 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6144 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6148 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6149 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6150 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6152 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6156 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6158 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6164 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6166 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6169 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6171 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6172 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6174 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6178 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6179 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6181 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6182 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6183 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6184 if(!rlcBearerList->list.array[idx]->rlc_Config)
6186 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6190 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6192 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6196 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6197 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6198 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6200 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6204 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6206 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6214 /*******************************************************************
6216 * @brief Free memory allocated for CellGroupConfig
6220 * Function : FreeMemCellGrpCfg
6222 * Functionality: Deallocating memory of CellGroupConfig
6224 * @params[in] pointer to CellGroupConfigRrc_t
6226 * @return ROK - success
6229 ******************************************************************/
6230 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6233 SpCellConfig_t *spCellCfg=NULLP;
6234 ServingCellConfig_t *srvCellCfg=NULLP;
6235 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6236 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6237 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6238 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6239 struct RLC_Config *rlcConfig=NULLP;
6240 struct LogicalChannelConfig *macLcConfig=NULLP;
6241 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6242 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6243 struct TAG_Config *tagConfig=NULLP;
6244 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6245 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6246 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6248 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6251 if(rlcBearerList->list.array)
6253 for(idx=0; idx<rlcBearerList->list.count; idx++)
6255 if(rlcBearerList->list.array[idx])
6257 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6258 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6261 if(rlcConfig->choice.am)
6263 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6264 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6265 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6267 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6269 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6272 if(macLcConfig->ul_SpecificParameters)
6274 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6275 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6276 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6278 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6280 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6283 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6285 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6288 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6291 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6292 if(schedulingRequestConfig)
6294 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6297 if(schReqList->list.array)
6299 for(idx=0;idx<schReqList->list.count; idx++)
6301 if(schReqList->list.array[idx])
6303 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6304 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6307 CU_FREE(schReqList->list.array, schReqList->list.size);
6309 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6310 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6311 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6313 if(macCellGrpCfg->bsr_Config)
6315 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6317 tagConfig = macCellGrpCfg->tag_Config;
6320 tagList = tagConfig->tag_ToAddModList;
6323 if(tagList->list.array)
6325 for(idx=0; idx<tagList->list.count; idx++)
6327 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6329 CU_FREE(tagList->list.array, tagList->list.size);
6331 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6333 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6336 phrConfig = macCellGrpCfg->phr_Config;
6339 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6340 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6343 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6346 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6349 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6350 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6353 spCellCfg = cellGrpCfg->spCellConfig;
6356 if(spCellCfg->servCellIndex)
6358 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6360 if(spCellCfg->spCellConfigDedicated)
6362 srvCellCfg = spCellCfg->spCellConfigDedicated;
6363 if(srvCellCfg->initialDownlinkBWP)
6365 dlBwp = srvCellCfg->initialDownlinkBWP;
6366 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6368 if(srvCellCfg->defaultDownlinkBWP_Id)
6370 if(srvCellCfg->uplinkConfig)
6372 if(srvCellCfg->pdsch_ServingCellConfig)
6374 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6375 if(pdschCfg->choice.setup)
6377 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6378 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6380 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6381 ServingCellConfig__pdsch_ServingCellConfig));
6383 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6384 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6386 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6388 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6390 if(dlBwp->pdcch_Config)
6392 if(dlBwp->pdsch_Config)
6394 FreeBWPDlDedPdschCfg(dlBwp);
6395 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6397 FreeBWPDlDedPdcchCfg(dlBwp);
6398 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6400 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6402 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6404 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6406 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6408 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6413 /*******************************************************************
6415 * @brief Fills CellGroupConfig
6419 * Function : fillCellGrpCfg
6421 * Functionality: Fills CellGroupConfig
6423 * @params[in] pointer to CellGroupConfigRrc_t
6425 * @return ROK - success
6428 ******************************************************************/
6430 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6432 uint8_t ret = RFAILED;
6433 CellGroupConfigRrc_t cellGrpCfg;
6434 asn_enc_rval_t encRetVal;
6438 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6440 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6442 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6444 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6448 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6449 cellGrpCfg.mac_CellGroupConfig = NULLP;
6450 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6451 if(!cellGrpCfg.mac_CellGroupConfig)
6453 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6456 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6458 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6462 cellGrpCfg.physicalCellGroupConfig = NULLP;
6463 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6464 if(!cellGrpCfg.physicalCellGroupConfig)
6466 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6469 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6471 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6475 cellGrpCfg.spCellConfig = NULLP;
6476 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6477 if(!cellGrpCfg.spCellConfig)
6479 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6482 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6484 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6488 cellGrpCfg.sCellToAddModList = NULLP;
6489 cellGrpCfg.sCellToReleaseList = NULLP;
6490 cellGrpCfg.ext1 = NULLP;
6492 /* encode cellGrpCfg into duToCuRrcContainer */
6493 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6494 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6496 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6497 /* Encode results */
6498 if(encRetVal.encoded == ENCODE_FAIL)
6500 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6501 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6506 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6507 for(int i=0; i< encBufSize; i++)
6509 DU_LOG("%x",encBuf[i]);
6513 cellGrp->size = encBufSize;
6514 CU_ALLOC(cellGrp->buf, cellGrp->size);
6517 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6520 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6524 FreeMemCellGrpCfg(&cellGrpCfg);
6528 /*******************************************************************
6530 * @brief Free UE Capability RAT container
6534 * Function : freeUeCapRatCont
6537 * Free UE Capability RAT conatiner
6540 * @return ROK - success
6543 * ****************************************************************/
6544 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6547 FeatureSets_t *featureSets;
6549 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6551 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6553 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6554 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6556 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6559 if(ueNrCap->featureSets)
6561 featureSets = ueNrCap->featureSets;
6562 if(featureSets->featureSetsDownlinkPerCC)
6564 if(featureSets->featureSetsDownlinkPerCC->list.array)
6566 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6568 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6569 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6570 sizeof(ModulationOrder_t));
6571 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6573 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6575 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6578 if(featureSets->featureSetsUplinkPerCC)
6580 if(featureSets->featureSetsUplinkPerCC->list.array)
6582 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6584 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6586 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6587 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6588 sizeof(ModulationOrder_t));
6589 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6592 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6594 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6596 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6600 /*******************************************************************
6602 * @brief Free UE capability RAT container list
6606 * Function : freeUeCapRatContList
6608 * Functionality: Free UE capability RAT container list
6611 * @return ROK - success
6614 * ****************************************************************/
6615 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6618 if(ueCapablityList->list.array)
6620 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6622 if(ueCapablityList->list.array[idx])
6623 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6625 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6629 /*******************************************************************
6631 * @brief Free Handover preparation information
6635 * Function : freeHOPreparationInfo
6637 * Functionality: Free Handover preparation information
6640 * @return ROK - success
6643 * ****************************************************************/
6644 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6646 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6648 if(hoPrep->criticalExtensions.choice.c1)
6650 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6652 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6653 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6654 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6655 sizeof(HandoverPreparationInformationRrc_IEs_t));
6657 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6661 /*******************************************************************
6663 * @brief Fill feature sets
6667 * Function : fillFeatureSets
6669 * Functionality: Fill feature sets
6672 * @return ROK - success
6675 * ****************************************************************/
6676 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6678 uint8_t idx, elementCnt;
6680 featureSets->featureSetsDownlink = NULLP;
6681 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6682 if(!featureSets->featureSetsDownlinkPerCC)
6684 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6689 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6690 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6691 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6692 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6694 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6698 for(idx = 0; idx < elementCnt; idx++)
6700 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6701 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6703 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6709 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6710 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6711 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6712 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6713 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6715 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6716 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6718 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6721 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6723 featureSets->featureSetsUplink = NULLP;
6724 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6725 if(!featureSets->featureSetsUplinkPerCC)
6727 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6732 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6733 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6734 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6735 if(!featureSets->featureSetsUplinkPerCC->list.array)
6737 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6741 for(idx = 0; idx < elementCnt; idx++)
6743 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6744 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6746 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6752 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6753 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6754 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6755 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6756 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6757 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6759 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6760 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6762 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6765 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6770 /*******************************************************************
6772 * @brief Fill UE capability RAT container
6776 * Function : fillUeCapRatCont
6778 * Functionality: Fill UE capability RAT container
6780 * @params[in] UE Capability RAT container buffer
6781 * @return ROK - success
6784 * ****************************************************************/
6785 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6788 uint8_t idx, elementCnt;
6789 asn_enc_rval_t encRetVal;
6790 UE_NR_Capability_t ueNrCap;
6794 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6796 /* Filling PDCP parameters */
6797 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6798 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6799 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6800 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6801 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6802 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6803 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6804 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6805 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6806 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6807 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6808 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6809 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6810 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6811 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6812 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6813 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6815 ueNrCap.rlc_Parameters = NULLP;
6816 ueNrCap.mac_Parameters = NULLP;
6818 /* Filling PHY parameters */
6819 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6820 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6821 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6822 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6823 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6825 /* Filling RF parameters */
6827 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6828 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6829 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6830 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6832 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6837 for(idx = 0; idx < elementCnt; idx++)
6839 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6840 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6850 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6851 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6852 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6854 ueNrCap.measAndMobParameters = NULLP;
6855 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6856 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6857 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6858 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6859 ueNrCap.featureSets = NULLP;
6861 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6862 if(!ueNrCap.featureSets)
6864 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6869 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6871 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6876 ueNrCap.featureSetCombinations = NULLP;
6877 ueNrCap.lateNonCriticalExtension = NULLP;
6878 ueNrCap.nonCriticalExtension = NULLP;
6880 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6881 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6882 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6884 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6886 /* Encode results */
6887 if(encRetVal.encoded == ENCODE_FAIL)
6889 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6890 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6895 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6896 for(int i=0; i< encBufSize; i++)
6898 DU_LOG("%x",encBuf[i]);
6902 ueCapRatContBuf->size = encBufSize;
6903 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6904 if(!ueCapRatContBuf->buf)
6906 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6909 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6913 freeUeCapRatCont(&ueNrCap);
6917 /*******************************************************************
6919 * @brief Fill UE Capability RAT container list
6923 * Function : fillUeCapRatContList
6925 * Functionality: Fill UE Capability RAT container list
6928 * @params[in] UE capability RAT container list
6929 * @return ROK - success
6932 * ****************************************************************/
6933 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6935 uint8_t ret = RFAILED;
6936 uint8_t idx, elementCnt;
6941 ueCapablityList->list.count = elementCnt;
6942 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6944 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
6945 if(!ueCapablityList->list.array)
6947 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6952 for(idx=0; idx<elementCnt; idx++)
6954 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6955 if(ueCapablityList->list.array[idx] == NULLP)
6957 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6963 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
6964 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
6966 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
6977 /*******************************************************************
6979 * @brief Fill UE Capability RAT container list octet string
6983 * Function : fillUeCapRatContListBuf
6985 * Functionality: Fill UE Capability RAT container list octet string
6988 * @params[in] UE capability RAT container list buffer
6989 * @return ROK - success
6992 * ****************************************************************/
6993 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6995 uint8_t ret = RFAILED;
6996 asn_enc_rval_t encRetVal;
6997 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7001 ret = fillUeCapRatContList(&ueCapablityList);
7004 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7008 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7009 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7010 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7012 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7013 &ueCapablityList, PrepFinalEncBuf, encBuf);
7015 /* Encode results */
7016 if(encRetVal.encoded == ENCODE_FAIL)
7018 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7019 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7024 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7025 for(int i=0; i< encBufSize; i++)
7027 DU_LOG("%x",encBuf[i]);
7031 ueCapablityListBuf->size = encBufSize;
7032 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7033 if(!ueCapablityListBuf->buf)
7035 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7038 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7042 freeUeCapRatContList(&ueCapablityList);
7046 /*******************************************************************
7048 * @brief Free Measurement Timing Configuration
7052 * Function : freeMeasuementTimingConfig
7054 * Functionality: Free Measurement Timing Configuration
7056 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7059 * ****************************************************************/
7060 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7063 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7064 MeasTiming_t *measTiming = NULLP;
7066 if(measTimingConfig.criticalExtensions.choice.c1)
7068 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7070 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7071 if(measTimingCfg->measTiming)
7073 if(measTimingCfg->measTiming->list.array)
7075 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7077 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7078 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7079 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7081 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7083 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7085 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7087 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7091 /*******************************************************************
7093 * @brief Fill Measurement Timing Configuration
7097 * Function : fillMeasTimingCfg
7099 * Functionality: Fill Measurement Timing Configuration
7101 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7102 * @return ROK - success
7105 * ****************************************************************/
7106 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7108 uint8_t elementCnt = 0;
7109 uint8_t measCfgIdx = 0;
7110 MeasTiming_t *measTiming;
7113 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7114 if(!measTimingCfg->measTiming)
7116 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7121 measTimingCfg->measTiming->list.count = elementCnt;
7122 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7123 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7124 if(!measTimingCfg->measTiming->list.array)
7126 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7130 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7132 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7133 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7135 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7141 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7142 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7143 if(!measTiming->frequencyAndTiming)
7145 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7149 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7150 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7152 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7153 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7154 smtc->periodicityAndOffset.choice.sf20 = 0;
7155 smtc->duration = SSB_MTC__duration_sf1;
7159 /*******************************************************************
7161 * @brief Fill Measurement Timing Configuration Octet string
7165 * Function : fillMeasConfigBuf
7167 * Functionality: Fill Measurement Timing Configuration Octet string
7170 * @params[in] MeasConfig_t *measConfgBuf
7171 * @return ROK - success
7174 * ****************************************************************/
7175 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7177 uint8_t ret = RFAILED;
7178 asn_enc_rval_t encRetVal;
7179 MeasurementTimingConfigurationRrc_t measTimingConfig;
7183 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7184 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7185 if(!measTimingConfig.criticalExtensions.choice.c1)
7187 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7190 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7192 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7193 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7195 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7199 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7202 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7206 /* Encode measurement timing configuration into octet string */
7207 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7208 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7210 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7212 /* Encode results */
7213 if(encRetVal.encoded == ENCODE_FAIL)
7215 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7216 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7221 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7222 for(int i=0; i< encBufSize; i++)
7224 DU_LOG("%x",encBuf[i]);
7228 measTimingConfigBuf->size = encBufSize;
7229 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7230 if(!measTimingConfigBuf->buf)
7232 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7235 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7239 freeMeasuementTimingConfig(measTimingConfig);
7243 /******************************************************************
7245 * @brief Free RRC reconfiguration non-critical extension
7249 * Function : freeRrcReconfigNonCriticalExt
7251 * Functionality: Free RRC reconfiguration non-critical extension
7253 * @params[in] RRC reconfiguration IE
7256 * ****************************************************************/
7257 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7259 if(rrcRecfg->masterCellGroup)
7261 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7265 /******************************************************************
7267 * @brief Free measurement object addmod list
7271 * Function : freeMeasObjToAddModList
7273 * Functionality: Free measurement object add mod list
7275 * @params[in] Measurement object add/mod list
7278 * ****************************************************************/
7279 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7282 MeasObjectNR_t *measObject;
7284 if(measObjList->list.array)
7286 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7288 if(measObjList->list.array[objIdx])
7290 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7292 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7293 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7294 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7295 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7296 if(measObject->absThreshSS_BlocksConsolidation)
7298 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7299 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7300 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7301 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7303 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7304 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7305 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7306 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7307 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7309 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7312 CU_FREE(measObjList->list.array, measObjList->list.size);
7316 /******************************************************************
7318 * @brief Free report config add mod list
7322 * Function : freeReportCfgToAddModList
7324 * Functionality: Free report config add mod list
7326 * @params[in] Report config list
7329 * ****************************************************************/
7330 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7332 uint8_t reportCfgIdx;
7333 ReportConfigToAddMod_t *reportCfg;
7334 ReportConfigNR_t *reportCfgNr;
7335 EventTriggerConfig_t *eventTriggCfg;
7337 if(reportCfgList->list.array)
7339 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7341 if(reportCfgList->list.array[reportCfgIdx])
7343 reportCfg = reportCfgList->list.array[reportCfgIdx];
7344 if(reportCfg->reportConfig.choice.reportConfigNR)
7346 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7347 if(reportCfgNr->reportType.choice.eventTriggered)
7349 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7350 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7351 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7352 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7353 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7357 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7359 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7363 /******************************************************************
7365 * @brief Free measurement id to add mod list
7369 * Function : freeMeasIdToAddModList
7371 * Functionality: Free measurement id to add mod list
7373 * @params[in] Measurement id to add mod list
7376 * ****************************************************************/
7377 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7380 if(measIdList->list.array)
7382 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7384 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7386 CU_FREE(measIdList->list.array, measIdList->list.size);
7390 /*******************************************************************
7392 * @brief Free quantity config
7396 * Function : freeQunatityConfig
7398 * Functionality: Free quantity config
7400 * @params[in] Quantity Config
7403 * ****************************************************************/
7404 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7407 QuantityConfigNR_t *quantityCfgNr;
7409 if(quantityCfg->quantityConfigNR_List)
7411 if(quantityCfg->quantityConfigNR_List->list.array)
7413 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7415 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7417 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7418 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7419 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7420 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7421 if(quantityCfgNr->quantityConfigRS_Index)
7423 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7424 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7425 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7426 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7428 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7431 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7433 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7437 /******************************************************************
7439 * @brief Free measurement Config
7443 * Function : freeMeasConfig
7445 * Functionality: Free measurement config
7447 * @params[in] Measurement config
7450 * ****************************************************************/
7451 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7453 if(measConfig->measObjectToAddModList)
7455 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7456 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7458 if(measConfig->reportConfigToAddModList)
7460 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7461 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7463 if(measConfig->measIdToAddModList)
7465 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7466 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7468 if(measConfig->s_MeasureConfig)
7470 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7472 if(measConfig->quantityConfig)
7474 freeQuantityConfig(measConfig->quantityConfig);
7475 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7478 /******************************************************************
7480 * @brief Free DRB to AddMod List
7484 * Function : freeDrbToAddModList
7486 * Functionality: Free SRB to AddMod List
7488 * @params[in] SBR to add/mod list
7491 * ****************************************************************/
7492 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7495 if(drbToAddList->list.array)
7497 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7499 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7501 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7503 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7504 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7505 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7506 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7508 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7509 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7511 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7513 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7517 /******************************************************************
7519 * @brief Free SRB to AddMod List
7523 * Function : freeSrbToAddModList
7525 * Functionality: Free SRB to AddMod List
7527 * @params[in] SBR to add/mod list
7530 * ****************************************************************/
7531 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7534 if(srbToAddList->list.array)
7536 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7538 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7539 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7541 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7542 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7545 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7547 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7551 /******************************************************************
7553 * @brief Free Radio Bearer Config
7557 * Function : freeRadioBearerConfig
7559 * Functionality: Free Radio Bearer config
7561 * @params[in] Radio bearer config
7564 * ****************************************************************/
7565 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7567 if(radioBearerConfig->srb_ToAddModList)
7569 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7570 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7572 if(radioBearerConfig->drb_ToAddModList)
7574 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7575 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7579 /******************************************************************
7581 * @brief Free reconfiguration message
7585 * Function : freeRrcReconfig
7587 * Functionality: Free reconfiguration message
7589 * @params[in] RRC Reconfiguration message
7592 * ****************************************************************/
7593 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7595 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7597 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7599 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7600 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7602 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7604 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7605 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7607 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7609 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7610 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7612 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7616 /******************************************************************
7618 * @brief Fill SRB To Add Mod list
7622 * Function : fillSrbToAddModList
7624 * Functionality: fill SRB to Add Mod list
7626 * @params[in] UE control block
7627 * SRB to Add/Mod list
7628 * @return ROK - success
7631 * ****************************************************************/
7632 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7634 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7637 elementCnt = ueCb->numSrb;
7640 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7642 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7649 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7653 srbToAddList->list.count = elementCnt;
7654 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7656 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7657 if(!srbToAddList->list.array)
7659 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7664 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7666 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7669 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7670 if(!srbToAddList->list.array[srbIdx])
7672 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7676 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7678 /* Reestablish PDCP */
7679 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7680 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7682 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7685 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7687 /* PDCP configuration */
7688 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7689 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7691 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7695 /* Reordering timer */
7696 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7697 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7699 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7702 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7709 /******************************************************************
7711 * @biief Fill DRBeTo Add Mod list
7715 * Function : fillDrbToAddModList
7717 * Functionality: fill DRB to Add Mod list
7719 * @params[in] UE control block
7720 * DRB to Add/Mod list
7721 * @return ROK - success
7724 * ****************************************************************/
7725 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7727 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7730 elementCnt = ueCb->numDrb;
7733 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7735 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7742 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7747 drbToAddList->list.count = elementCnt;
7748 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7750 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7751 if(!drbToAddList->list.array)
7753 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7758 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7760 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7763 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7764 if(!drbToAddList->list.array[drbIdx])
7766 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
7771 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
7774 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7775 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
7777 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
7781 /* PDCP Config -> DRB */
7782 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7783 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7785 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
7789 /* DRB -> Discard Timer */
7790 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7791 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
7793 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
7796 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
7798 /* UL PDCP SN length */
7799 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7800 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
7802 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
7805 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
7807 /* DL PDCP SN length */
7808 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7809 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
7811 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
7814 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
7816 /* Header Compression */
7817 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
7818 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
7820 /* Reordering timer */
7821 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7822 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
7824 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
7827 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7835 /******************************************************************
7837 * @brief Fill Radio bearer configuration
7841 * Function : fillRadioBearerConfig
7843 * Functionality: Fill Radio bearer configuration
7845 * @params[in] UE control block
7846 * Radio bearer config pointer
7847 * @return ROK - success
7850 * ****************************************************************/
7851 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
7853 /* SRB To Add/Mod List */
7854 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7855 if(!radioBearerConfig->srb_ToAddModList)
7857 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
7860 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
7862 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
7866 /* DRB To Add/Mod List */
7867 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7868 if(!radioBearerConfig->drb_ToAddModList)
7870 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
7873 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
7875 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
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)
8445 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8449 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8450 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8451 if(!rrcRecfg->masterCellGroup->buf)
8453 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8456 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8459 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8460 * received from DU */
8461 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8463 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8471 /*******************************************************************
8473 * @brief Fill RRC reconfiguration structure
8477 * Function : fillRrcReconfig
8479 * Functionality: Fill RRC reconfiguration
8483 * RRC reconfiguration structure
8484 * @return ROK - success
8487 * ****************************************************************/
8488 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8490 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8492 rrcReconfig->rrc_TransactionIdentifier = 1;
8493 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8495 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8496 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8498 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8502 /* Radio Bearer Configuration */
8503 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8504 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8506 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8509 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8511 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8515 /* Measurement Configuration */
8516 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8517 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8519 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8522 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8524 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8528 /* Non Critical extension */
8529 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8530 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8532 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8535 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8537 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8543 /*******************************************************************
8545 * @brief Fill RRC reconfiguration Octet string
8549 * Function : fillRrcReconfigBuf
8551 * Functionality: Fill RRC reconfiguration octet string
8554 * @params[in] OCTET_STRING_t buffer
8555 * @return ROK - success
8558 * ****************************************************************/
8559 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8561 uint8_t ret = RFAILED;
8562 asn_enc_rval_t encRetVal;
8563 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8564 rrcReconfig = &rrcRecfg;
8568 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8570 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8574 /* Encode RRC Reconfiguration */
8575 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8576 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8578 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8580 /* Encode results */
8581 if(encRetVal.encoded == ENCODE_FAIL)
8583 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8584 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8589 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8590 for(int i=0; i< encBufSize; i++)
8592 DU_LOG("%x",encBuf[i]);
8596 rrcReconfigBuf->size = encBufSize;
8597 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8598 if(!rrcReconfigBuf->buf)
8600 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8603 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8608 freeRrcReconfig(rrcReconfig);
8612 /*******************************************************************
8614 * @brief Fill HO preparation information Octet string
8618 * Function : fillHOPreparationInfoBuf
8620 * Functionality: Fill HO preparation information Octet string
8623 * @params[in] HandoverPreparationInformation_t buffer
8624 * @return ROK - success
8627 * ****************************************************************/
8628 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8630 uint8_t ret = RFAILED;
8631 asn_enc_rval_t encRetVal;
8632 HandoverPreparationInformationRrc_t hoPrepInfo;
8633 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8638 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8639 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8640 if(!hoPrepInfo.criticalExtensions.choice.c1)
8642 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8645 hoPrepInfo.criticalExtensions.choice.c1->present = \
8646 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8648 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8649 sizeof(HandoverPreparationInformationRrc_IEs_t));
8650 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8652 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8655 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8657 /* Fill UE Capability RAT container list */
8658 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8661 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8665 /* Fill Source config */
8666 hoPrepInfoIe->sourceConfig = NULLP;
8667 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8668 if(!hoPrepInfoIe->sourceConfig)
8670 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8673 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8677 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8681 hoPrepInfoIe->rrm_Config = NULLP;
8682 hoPrepInfoIe->as_Context = NULLP;
8683 hoPrepInfoIe->nonCriticalExtension = NULLP;
8685 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8686 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8687 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8689 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8690 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8692 /* Encode results */
8693 if(encRetVal.encoded == ENCODE_FAIL)
8695 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8696 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8701 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8702 for(int i=0; i< encBufSize; i++)
8704 DU_LOG("%x",encBuf[i]);
8708 hoPrepInfoBuf->size = encBufSize;
8709 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8710 if(!hoPrepInfoBuf->buf)
8712 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8715 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8719 freeHOPreparationInfo(&hoPrepInfo);
8723 /*******************************************************************
8725 * @brief Fills CuToDuContainer
8729 * Function : fillCuToDuContainer
8731 * Functionality: Fills CuToDuContainer
8733 * @params[in] pointer to CUtoDURRCInformation_t
8735 * @return ROK - success
8738 ******************************************************************/
8740 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8742 uint8_t elementCnt = 0;
8746 /* UE Capabulity RAT Container List */
8747 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8748 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8750 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8753 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8755 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8756 if(!rrcMsg->measConfig)
8758 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8761 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8763 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8766 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8767 if(rrcMsg->iE_Extensions)
8770 rrcMsg->iE_Extensions->list.count = elementCnt;
8771 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
8773 /* Initialize the CUtoDURRCInformation_ExtIEs */
8774 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8776 if(rrcMsg->iE_Extensions->list.array == NULLP)
8778 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
8782 for(idx=0; idx<elementCnt; idx++)
8784 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
8785 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
8787 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
8794 /* Cell Group Configuration */
8795 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
8796 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8797 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
8798 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
8799 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
8802 /* Handover Preparation Information */
8803 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
8804 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8805 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
8806 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
8807 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
8813 /*******************************************************************
8815 * @brief Free CuToDuContainer
8819 * Function : FreeCuToDuInfo
8821 * Functionality: Free CuToDuContainer
8823 * @params[in] pointer to CUtoDURRCInformation_t
8825 * @return ROK - success
8828 ******************************************************************/
8830 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8834 if(rrcMsg->uE_CapabilityRAT_ContainerList)
8836 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8837 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
8838 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8840 if(rrcMsg->iE_Extensions)
8842 if(rrcMsg->iE_Extensions->list.array)
8844 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
8846 if(rrcMsg->iE_Extensions->list.array[idx])
8848 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
8850 case ProtocolIE_ID_id_CellGroupConfig:
8851 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8853 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
8854 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
8859 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8860 rrcMsg->iE_Extensions->list.array[idx]->id);
8866 for(idx2 = 0; idx2 < idx; idx2++)
8868 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
8870 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8874 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8877 /*******************************************************************
8879 * @brief Builds and sends the UE Setup Request
8883 * Function : BuildAndSendUeContextSetupReq
8885 * Functionality: Constructs the UE Setup Request and sends
8886 * it to the CU through SCTP.
8890 * @return ROK - success
8893 * ****************************************************************/
8894 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
8896 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
8897 uint8_t ret= RFAILED, ret1;
8899 uint8_t idx, idx1, bufLen, duIdx;
8901 DuDb *targetDuDb = NULLP;
8902 F1AP_PDU_t *f1apMsg = NULLP;
8903 UEContextSetupRequest_t *ueSetReq = NULLP;
8904 asn_enc_rval_t encRetVal; /* Encoder return value */
8905 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
8909 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
8911 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8912 if(f1apMsg == NULLP)
8914 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8918 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8919 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8920 if(f1apMsg->choice.initiatingMessage == NULLP)
8922 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8926 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
8927 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8928 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
8930 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
8932 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8936 ueSetReq->protocolIEs.list.count = elementCnt;
8937 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
8939 /* Initialize the UESetup members */
8940 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
8942 if(ueSetReq->protocolIEs.list.array == NULLP)
8944 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
8948 for(idx1=0; idx1<elementCnt; idx1++)
8950 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
8951 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
8959 /*GNB CU UE F1AP ID*/
8960 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8961 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8962 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8963 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
8965 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
8967 /*GNB DU UE F1AP ID*/
8969 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8970 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8971 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8972 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
8977 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
8978 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8979 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
8980 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8982 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
8983 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
8984 /* Since we are supporting only one cell per DU, accessing 0th index to
8985 * get target cell info */
8986 spCellId = targetDuDb->cellCb[0].nrCellId;
8989 spCellId = ueCb->cellCb->nrCellId;
8990 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
8996 /*Served Cell Index*/
8998 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
8999 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9000 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9001 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9003 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9005 /*CellULConfigured*/
9007 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9008 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9009 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9010 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9013 /*CUtoDURRCContainer*/
9015 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9016 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9017 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9018 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9023 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9025 /*Special Cells to be SetupList*/
9027 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9028 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9029 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9030 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9031 if(SplCellListret != ROK)
9037 /*SRBs To Be Setup List*/
9039 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9040 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9041 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9042 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9043 if(SrbSetupret != ROK)
9048 /*DRBs to Be Setup List*/
9050 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9051 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9052 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9053 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9059 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9061 /* RRC delivery status request */
9063 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9064 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9065 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9066 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9069 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9071 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9072 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9073 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9075 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9077 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9078 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9079 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9080 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9082 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9085 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9086 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9088 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9090 /* Encode the F1SetupRequest type as APER */
9091 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9093 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9095 /* Encode results */
9096 if(encRetVal.encoded == ENCODE_FAIL)
9098 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9099 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9104 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9105 for(int i=0; i< encBufSize; i++)
9107 DU_LOG("%x",encBuf[i]);
9112 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9114 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9120 FreeUeContextSetupReq(f1apMsg);
9123 }/* End of BuildAndSendUeContextSetupReq*/
9125 /**********************************************************************
9126 * @brief Function to extractTeId received in UE context setup Response
9130 * Function : extractTeId
9133 * - Function to extract TeId
9136 * @return ROK - success
9139 **********************************************************************/
9140 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9144 GTPTunnel_t *gtpDl = NULLP;
9146 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9148 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9150 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9152 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9153 if(gtpDl->gTP_TEID.size > 0)
9155 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9158 DU_LOG("\nERROR --> EGTP: No TeId received");
9166 /****************************************************************
9167 * @brief Function to add Drb tunnels
9171 * Function : addDrbTunnels
9174 * - Function to add Drb tunnels
9177 * @return ROK - success
9180 * ****************************************************************/
9181 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9186 if(teId > MAX_TEID || teId < MIN_TEID)
9188 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9190 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9191 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9192 tnlEvt.lclTeid = teId;
9193 tnlEvt.remTeid = teId;
9194 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9197 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9202 /****************************************************************
9203 * @brief Function to process Drb Setup List
9207 * Function : procDrbSetupList
9210 * - Function to process DRB Setup List
9213 * @return ROK - success
9216 * ****************************************************************/
9217 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9219 uint8_t arrIdx = 0, drbIdx = 0;
9221 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9223 if(drbSetupList != NULLP)
9225 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9227 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9228 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9230 /* extracting teId */
9231 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9234 if(addDrbTunnels(duId, teId)== ROK)
9236 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9238 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9239 * are sent to CU for setting up of Tunnels in DL direction.
9240 * Search for DRB ID in CU databse */
9241 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9243 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9245 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9258 /****************************************************************
9259 * @brief Function to process Ue Context Setup Response
9263 * Function : procUeContextSetupResponse
9266 * - Function to process Ue Context Setup Response
9269 * @return ROK - success
9272 * ****************************************************************/
9273 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9275 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9276 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9278 CuUeCb *ueCb = NULLP;
9279 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9280 OCTET_STRING_t *duToCuRrcContainer;
9282 SEARCH_DU_DB(duIdx, duId, duDb);
9283 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9285 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9287 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9289 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9291 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9294 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9296 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9297 ueCb = &duDb->ueCb[duUeF1apId-1];
9298 /* If ue context is not present in du db, then create UE context
9299 * here. This flow is hit in case of UE handover where UE
9300 * context is created before UE performs RACH on target DU */
9301 if(ueCb->gnbDuUeF1apId == 0)
9303 /* Creating UE context in target DU */
9304 memset(ueCb, 0, sizeof(CuUeCb));
9305 ueCb->cellCb = &duDb->cellCb[0];
9306 ueCb->gnbDuUeF1apId = duUeF1apId;
9307 ueCb->gnbCuUeF1apId = cuUeF1apId;
9308 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9309 ueCb->hoInfo.targetDuId = duId;
9312 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9313 ueCb->cellCb->numUe++;
9317 case ProtocolIE_ID_id_C_RNTI:
9319 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9322 case ProtocolIE_ID_id_DRBs_Setup_List:
9324 /* Adding Tunnels for successful DRB */
9325 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9328 case ProtocolIE_ID_id_DUtoCURRCInformation:
9330 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9331 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9332 DUtoCURRCInformation.cellGroupConfig;
9333 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9334 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9336 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9344 /* If the UE is in handover, UE context modification request is to be sent to
9345 * source DU once UE context setup response is received from target DU */
9346 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9348 DuDb *srcDuDb = NULLP;
9349 CuUeCb *ueCbInSrcDu = NULLP;
9351 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9352 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9353 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9355 /* UE context setup response is received from target DU. Search all
9356 * DUs to find source DU except this target DU Id.*/
9357 if(cuCb.duInfo[duIdx].duId != duId)
9359 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9362 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9363 * received in UE context setup response since CU UE F1AP ID does not
9364 * change for UE in handover.
9365 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9367 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9368 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9370 srcDuDb = &cuCb.duInfo[duIdx];
9371 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9373 /* Store source DU info in the new UE context created in
9375 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9377 /* Copy the received container to UeCb */
9378 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9380 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9382 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9389 if(srcDuDb && ueCbInSrcDu)
9395 ueCb->f1apMsgDb.dlRrcMsgCount++;
9396 rrcMsgType = setDlRRCMsgType(ueCb);
9398 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9399 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9401 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9409 /****************************************************************
9410 * @brief Function to process Ul Rrc Msg received from DU
9414 * Function : procUlRrcMsg
9417 * - Function to process Ul Rrc Msg received from DU
9420 * @return ROK - success
9423 * ****************************************************************/
9425 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9427 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9428 uint8_t *rrcContainer = NULLP;
9429 uint16_t rrcContLen = 0;
9430 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9432 CuUeCb *ueCb = NULLP;
9433 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9436 SEARCH_DU_DB(duIdx, duId, duDb);
9437 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9439 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9441 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9443 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9445 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9448 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9450 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9453 case ProtocolIE_ID_id_SRBID:
9454 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9457 case ProtocolIE_ID_id_RRCContainer:
9459 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9460 CU_ALLOC(rrcContainer, rrcContLen);
9463 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9466 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9468 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9471 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
9472 DuDb *srcDuDb = NULLP;
9474 /* In target DU DB, mark UE as active and delete HO info */
9475 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9476 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9478 /* Release UE context in source DU because the UE is now
9479 * attached to target DU */
9480 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9481 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9483 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9485 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9488 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9499 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9506 ueCb = &duDb->ueCb[duUeF1apId-1];
9507 ueCb->f1apMsgDb.dlRrcMsgCount++;
9508 rrcMsgType = setDlRRCMsgType(ueCb);
9509 if(rrcMsgType == RRC_SETUP_COMPLETE)
9511 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for Security Mode Command");
9512 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9514 else if(rrcMsgType == SECURITY_MODE_COMPLETE)
9516 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9517 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9519 else if(rrcMsgType == REGISTRATION_COMPLETE)
9521 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9522 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9524 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9526 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9527 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9533 /****************************************************************
9534 * @brief Build And Send F1ResetAck
9538 * Function : FreeF1ResetAck
9541 * - Build And Send F1ResetRSP
9544 * @return ROK - success
9547 * ****************************************************************/
9548 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9551 ResetAcknowledge_t *f1ResetAck;
9555 if(f1apMsg->choice.successfulOutcome)
9557 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9559 if(f1ResetAck->protocolIEs.list.array)
9561 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9563 if(f1ResetAck->protocolIEs.list.array[idx])
9565 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9568 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9570 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9572 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9576 /****************************************************************
9577 * @brief Build And Send F1ResetAck
9581 * Function : BuildAndSendF1ResetAck
9584 * - Build And Send F1ResetRSP
9587 * @return ROK - success
9590 * ****************************************************************/
9592 uint8_t BuildAndSendF1ResetAck()
9595 uint8_t elementCnt = 0;
9596 uint8_t ret = RFAILED;
9597 F1AP_PDU_t *f1apMsg = NULL;
9598 ResetAcknowledge_t *f1ResetAck = NULLP;
9599 asn_enc_rval_t encRetVal;
9600 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9603 /* Allocate the memory for F1ResetRequest_t */
9604 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9605 if(f1apMsg == NULLP)
9607 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9611 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9613 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9614 if(f1apMsg->choice.successfulOutcome == NULLP)
9616 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9620 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9621 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9622 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9623 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9627 f1ResetAck->protocolIEs.list.count = elementCnt;
9628 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9630 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9631 if(f1ResetAck->protocolIEs.list.array == NULLP)
9633 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9637 for(idx=0; idx<elementCnt; idx++)
9639 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9640 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9647 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9648 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9649 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9650 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9652 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9654 /* Encode the F1SetupRequest type as UPER */
9655 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9657 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9659 /* Check encode results */
9660 if(encRetVal.encoded == ENCODE_FAIL)
9662 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9663 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9668 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9669 for(int i=0; i< encBufSize; i++)
9671 DU_LOG("%x",encBuf[i]);
9676 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9677 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9679 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9687 FreeF1ResetAck(f1apMsg);
9691 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9695 if(ulInfo->list.array)
9697 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9699 if(ulInfo->list.array[arrIdx])
9701 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9703 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9705 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9707 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9708 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9709 gTPTunnel->gTP_TEID.size);
9711 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9712 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9713 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9715 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9716 sizeof(GTPTunnel_t));
9718 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9721 CU_FREE(ulInfo->list.array,ulInfo->list.size);
9725 /*******************************************************************
9727 * @brief Deletes the EGTP tunnel
9731 * Function : deleteEgtpTunnel
9733 * Functionality: Deletes the EGTP tunnel
9735 * @params[in] uint8_t *buf
9737 * @return ROK - success
9740 * ****************************************************************/
9741 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
9746 teIdStringToInt(buf, &teId);
9747 if(teId > MAX_TEID || teId < MIN_TEID)
9749 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
9752 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9753 tnlEvt.action = EGTP_TNL_MGMT_DEL;
9754 tnlEvt.lclTeid = teId;
9755 tnlEvt.remTeid = teId;
9756 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
9758 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
9763 /*******************************************************************
9765 * @brief Builds the Uplink Tunnel Info
9769 * Function : BuildUlTnlInfoforSetupMod
9771 * Functionality: Constructs the UL TnlInfo For DRB list
9773 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
9775 * @return ROK - success
9778 * ****************************************************************/
9779 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
9785 ulInfo->list.count = ulCnt;
9786 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
9787 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
9788 if(ulInfo->list.array == NULLP)
9790 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9793 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
9795 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9796 if(ulInfo->list.array[arrIdx] == NULLP)
9798 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9804 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
9805 UPTransportLayerInformation_PR_gTPTunnel;
9808 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9809 sizeof(GTPTunnel_t));
9810 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
9812 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9815 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9816 transportLayerAddress.size = 4*sizeof(uint8_t);
9817 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9818 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9819 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9820 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9821 transportLayerAddress.buf == NULLP)
9823 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9827 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9828 transportLayerAddress.buf[0] = 192;
9829 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9830 transportLayerAddress.buf[1] = 168;
9831 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9832 transportLayerAddress.buf[2] = 130;
9833 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9834 transportLayerAddress.buf[3] = 82;
9835 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9836 transportLayerAddress.bits_unused = 0;
9838 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
9839 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
9840 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
9841 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
9844 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
9845 = 4 * sizeof(uint8_t);
9846 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9847 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9848 gTPTunnel->gTP_TEID.size);
9849 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
9852 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9855 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9856 gTP_TEID.buf[0] = 0;
9857 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9858 gTP_TEID.buf[1] = 0;
9859 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9860 gTP_TEID.buf[2] = 0;
9861 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
9863 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
9864 * fetched based on the Drb Id */
9866 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
9867 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
9868 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
9872 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9873 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
9876 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
9877 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
9878 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
9879 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
9881 }/*End of BuildULTnlInfo*/
9883 /*******************************************************************
9885 * @brief freeing the DRB item
9889 * Function : FreeDrbItem
9891 * Functionality: freeing the DRB item
9893 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9895 * @return ROK - success
9898 * ****************************************************************/
9900 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
9903 SNSSAI_t *snssai =NULLP;
9904 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
9906 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9907 switch(drbItem->qoSInformation.present)
9909 case QoSInformation_PR_NOTHING:
9911 case QoSInformation_PR_eUTRANQoS:
9913 if(drbItem->qoSInformation.choice.eUTRANQoS)
9915 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9919 case QoSInformation_PR_choice_extension:
9921 if(drbItem->qoSInformation.choice.choice_extension)
9923 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
9925 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
9928 CU_FREE(snssai->sST.buf,snssai->sST.size);
9934 CU_FREE(snssai->sD->buf,snssai->sD->size);
9936 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
9939 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
9940 if(flowMap->list.array)
9942 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
9944 if(flowMap->list.array[arrIdx] )
9946 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
9947 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
9950 CU_FREE(flowMap->list.array,flowMap->list.size);
9953 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
9959 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
9960 if(drbItem->uLConfiguration)
9962 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
9966 /*******************************************************************
9968 * @brief filling the DRB setup Mod item
9972 * Function : FillDrbItemToSetupMod
9974 * Functionality: filling the DRB setup Mod item
9977 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9979 * @return ROK - success
9982 * ****************************************************************/
9984 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
9989 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
9990 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
9993 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9995 switch(drbItem->qoSInformation.present)
9997 case QoSInformation_PR_NOTHING:
10001 case QoSInformation_PR_eUTRANQoS:
10004 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10005 if(drbItem->qoSInformation.choice.eUTRANQoS)
10007 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10010 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10011 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10012 PriorityLevel_no_priority;
10014 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10015 Pre_emptionCapability_may_trigger_pre_emption;
10017 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10018 Pre_emptionVulnerability_pre_emptable;
10022 case QoSInformation_PR_choice_extension:
10024 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10025 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10027 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10031 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10032 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10033 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10034 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10035 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10038 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10043 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10044 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10047 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10051 /*Flows mapped to DRB List*/
10052 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10053 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10054 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10057 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10063 /*ULUPTNLInformation To Be Setup List*/
10064 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10065 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10068 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10073 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10074 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10080 /*******************************************************************
10082 * @brief Builds the DRB to be Setup Mod ItemIes
10086 * Function : FillDrbItemList
10088 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10090 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10092 * @return ROK - success
10093 * RFAILED - failure
10095 * ****************************************************************/
10097 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10099 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10100 drbItemIe->criticality = Criticality_reject;
10101 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10103 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10105 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10110 /*******************************************************************
10112 * @brief free the DRB to be Setup Mod list
10116 * Function : FreeDrbToBeSetupModList
10118 * Functionality: free the DRB to be Setup Mod list
10120 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10122 * @return ROK - success
10123 * RFAILED - failure
10125 * ****************************************************************/
10126 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10129 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10131 if(drbSet->list.array)
10133 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10135 if(drbSet->list.array[arrIdx] != NULLP)
10139 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10140 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10142 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10145 CU_FREE(drbSet->list.array, drbSet->list.size);
10150 /*******************************************************************
10152 * @brief Builds the DRB to be Setup Mod list
10156 * Function : BuildDrbToBeSetupList
10158 * Functionality: Constructs the DRB to be Setup Mod list
10160 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10162 * @return ROK - success
10163 * RFAILED - failure
10165 * ****************************************************************/
10167 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10173 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10174 drbSet->list.count = drbCnt;
10175 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10176 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10177 if(drbSet->list.array == NULLP)
10179 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10183 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10185 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10186 if(drbSet->list.array[arrIdx] == NULLP)
10188 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10192 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10195 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10202 /*******************************************************************
10204 * @brief Filling the DRB to be modified item
10208 * Function : FillDrbToBeModItem
10210 * Functionality: filling the DRB to be modified item
10212 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10214 * @return ROK - success
10215 * RFAILED - failure
10217 * ****************************************************************/
10219 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10223 DrbInfo *drbToBeMod;
10226 drbItem->dRBID = DRB2 + arrIdx;
10228 /* Search for DRB ID in CU databse */
10229 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10231 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10233 drbToBeMod = &ueCb->drbList[drbIdx];
10239 drbItem->qoSInformation = NULLP;
10240 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10241 if(drbItem->qoSInformation != NULLP)
10243 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10245 switch(drbItem->qoSInformation->present)
10247 case QoSInformation_PR_NOTHING:
10251 case QoSInformation_PR_eUTRANQoS:
10254 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10255 if(drbItem->qoSInformation->choice.eUTRANQoS)
10257 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10260 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10261 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10262 PriorityLevel_no_priority;
10264 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10265 Pre_emptionCapability_may_trigger_pre_emption;
10267 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10268 Pre_emptionVulnerability_pre_emptable;
10272 case QoSInformation_PR_choice_extension:
10274 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10275 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10277 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10281 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10282 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10283 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10284 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10285 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10288 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10293 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10294 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10297 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10301 /*Flows mapped to DRB List*/
10302 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10303 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10304 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10307 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10314 /*ULUPTNLInformation To Be Setup List*/
10315 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10316 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10319 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10325 /*******************************************************************
10327 * @brief Builds the DRB to be modified Item IE
10331 * Function : FillDrbToBeModItemList
10333 * Functionality: Constructs the DRB to be modified Mod Item Ies
10335 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10337 * @return ROK - success
10338 * RFAILED - failure
10340 * ****************************************************************/
10342 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10344 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10345 drbItemIe->criticality = Criticality_reject;
10346 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10347 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10349 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10356 /*******************************************************************
10358 * @brief Builds the DRB to be modified list
10362 * Function : BuildDrbToBeModList
10364 * Functionality: Constructs the DRB to be modified list
10366 * @params[in] DRBs_ToBeModified_List_t *drbSet
10368 * @return ROK - success
10369 * RFAILED - failure
10371 * ****************************************************************/
10373 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10379 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10380 drbSet->list.count = drbCnt;
10381 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10382 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10383 if(drbSet->list.array == NULLP)
10385 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10388 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10390 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10391 if(drbSet->list.array[arrIdx] == NULLP)
10393 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10397 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10400 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10407 /*******************************************************************
10409 * @brief freeing the DRB item
10413 * Function : FreeModifiedDrbItem
10415 * Functionality: freeing the DRB 2 item
10417 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10419 * @return ROK - success
10420 * RFAILED - failure
10422 * ****************************************************************/
10424 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10427 SNSSAI_t *snssai =NULLP;
10428 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10430 if(drbItem->qoSInformation != NULLP)
10432 switch(drbItem->qoSInformation->present)
10434 case QoSInformation_PR_NOTHING:
10436 case QoSInformation_PR_eUTRANQoS:
10438 if(drbItem->qoSInformation->choice.eUTRANQoS)
10440 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10444 case QoSInformation_PR_choice_extension:
10446 if(drbItem->qoSInformation->choice.choice_extension)
10448 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10450 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10451 if(snssai->sST.buf)
10453 CU_FREE(snssai->sST.buf,snssai->sST.size);
10457 if(snssai->sD->buf)
10459 CU_FREE(snssai->sD->buf,snssai->sD->size);
10461 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10464 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10465 if(flowMap->list.array)
10467 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10469 if(flowMap->list.array[arrIdx] )
10471 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10472 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10475 CU_FREE(flowMap->list.array,flowMap->list.size);
10478 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10484 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10485 if(drbItem->uLConfiguration)
10487 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10491 /*******************************************************************
10493 * @brief free the DRB to be modfified list
10497 * Function : FreeDrbToBeModifiedList
10499 * Functionality: free the DRB to be Setup Mod list
10501 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10503 * @return ROK - success
10504 * RFAILED - failure
10506 * ****************************************************************/
10507 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10510 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10512 if(drbSet->list.array)
10514 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10516 if(drbSet->list.array[arrIdx] != NULLP)
10518 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10519 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10520 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10523 CU_FREE(drbSet->list.array, drbSet->list.size);
10528 /*******************************************************************
10530 * @brief free the UeContextModification Request
10534 * Function : FreeUeContextModicationRequest
10536 * Functionality : deallocation of memory allocated in UeContextModiification
10539 * @params[in] F1AP_PDU_t *f1apMsg
10543 * ****************************************************************/
10544 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10546 uint8_t arrIdx =0 , ieId=0;
10547 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10551 if(f1apMsg->choice.initiatingMessage)
10553 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10554 if(ueContextModifyReq->protocolIEs.list.array)
10556 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10558 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10560 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10563 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10565 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10567 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10569 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10570 choice.DRBs_ToBeSetupMod_List);
10573 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10575 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10576 choice.DRBs_ToBeModified_List);
10579 case ProtocolIE_ID_id_TransmissionActionIndicator:
10581 case ProtocolIE_ID_id_RRCContainer:
10583 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10584 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10588 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10591 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10593 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10595 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10599 /*******************************************************************
10601 * @brief Builds the Ue Context Modification Req
10605 * Function : BuildAndSendUeContextModificationReq
10607 * Functionality: Constructs the Ue Context Modification Req
10611 * @return ROK - success
10612 * RFAILED - failure
10614 * ****************************************************************/
10615 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10618 uint8_t elementCnt = 0;
10619 uint8_t ret = RFAILED;
10620 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10621 F1AP_PDU_t *f1apMsg = NULLP;
10622 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10623 asn_enc_rval_t encRetVal;
10624 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10627 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10628 if(f1apMsg == NULLP)
10630 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10634 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10636 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10637 if(f1apMsg->choice.initiatingMessage == NULLP)
10639 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10642 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10643 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10644 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10646 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10648 if(action == MODIFY_UE)
10650 else if(action == QUERY_CONFIG)
10652 else if(action == RRC_RECONFIG_COMPLETE_IND)
10654 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10657 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10658 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10660 /* Initialize the UE context modification members */
10661 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10662 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10664 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10668 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10670 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10671 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10673 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10679 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10680 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10681 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10682 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10683 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10686 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10687 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10688 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10689 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10690 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10692 if(action == MODIFY_UE)
10694 /* DRB to be setup list */
10696 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10697 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10698 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10699 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10700 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10701 value.choice.DRBs_ToBeSetupMod_List));
10703 /* DRB to be modified list */
10705 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
10706 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10707 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10708 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
10709 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10710 value.choice.DRBs_ToBeModified_List));
10712 /* TODO: DRB to be release list */
10716 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
10720 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
10722 else if(action == QUERY_CONFIG)
10725 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
10726 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10727 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10728 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
10729 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
10731 else if(action == RRC_RECONFIG_COMPLETE_IND)
10734 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
10735 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10736 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10737 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
10738 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
10739 RRCReconfigurationCompleteIndicator_true;
10741 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10744 if(action == STOP_DATA_TX)
10746 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10747 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10748 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10749 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10750 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10751 TransmissionActionIndicator_stop;
10753 else if (action == RESTART_DATA_TX)
10755 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10756 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10757 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10758 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10759 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10760 TransmissionActionIndicator_restart;
10764 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10765 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10766 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10767 UEContextModificationRequestIEs__value_PR_RRCContainer;
10768 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
10770 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
10774 /* RRC delivery status request */
10776 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
10777 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10778 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
10779 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
10782 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10784 /* Encode the F1SetupRequest type as APER */
10785 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10787 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10789 /* Encode results */
10790 if(encRetVal.encoded == ENCODE_FAIL)
10792 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
10793 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10798 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
10800 /* This for loop was going into an infinite loop even though encBufSize
10801 * has a small value. Hence commented this
10803 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
10805 DU_LOG("%x",encBuf[ieIdx]);
10810 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10811 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
10813 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
10821 FreeUeContextModicationRequest(f1apMsg);
10825 /*****************************************************************i
10827 * @brief Free memory allocated for UE Context Release Command
10831 * Function : FreeUeContextReleaseCommand
10834 * - Free memory allocated for UE Context Release Command
10836 * @params[in] F1AP_PDU_t *f1apMsg
10839 * *************************************************************/
10840 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
10843 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
10847 if(f1apMsg->choice.initiatingMessage)
10849 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10850 if(ueReleaseCommand->protocolIEs.list.array)
10852 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
10854 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10856 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
10858 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10860 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10863 /*******************************************************************
10865 * @brief Builds the Ue Context Release Command
10869 * Function : BuildAndSendUeContextReleaseCommand
10871 * Functionality: Constructs the Ue Context Release Command
10875 * @return ROK - success
10876 * RFAILED - failure
10878 * ****************************************************************/
10879 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
10881 bool memAllocFailed = false;
10882 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
10885 F1AP_PDU_t *f1apMsg = NULLP;
10886 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
10888 asn_enc_rval_t encRetVal;
10889 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
10893 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10894 if(f1apMsg == NULLP)
10896 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
10900 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10902 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10903 if(f1apMsg->choice.initiatingMessage == NULLP)
10905 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
10908 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
10909 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10910 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
10912 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10914 SEARCH_DU_DB(duIdx, duId, duDb);
10915 ueCb = &duDb->ueCb[duUeF1apId-1];
10916 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
10921 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
10922 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
10924 /* Initialize the UE context modification members */
10925 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
10926 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
10928 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
10932 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10934 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10935 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
10937 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
10938 memAllocFailed = true;
10943 if(memAllocFailed == true)
10949 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10950 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10951 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10952 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
10953 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
10956 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10957 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10958 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10959 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
10960 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
10962 /* Cause of UE context release */
10964 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
10965 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10966 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10967 UEContextReleaseCommandIEs__value_PR_Cause;
10968 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10969 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
10970 CauseRadioNetwork_normal_release;
10971 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
10973 /* RRC Container for RRC release */
10975 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10976 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10977 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10978 UEContextReleaseCommandIEs__value_PR_RRCContainer;
10979 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
10981 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
10982 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
10983 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
10984 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
10986 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
10989 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
10990 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
10992 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10994 /* Encode the UE Context Release Command type as APER */
10995 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10997 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11000 /* Encode results */
11001 if(encRetVal.encoded == ENCODE_FAIL)
11003 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11004 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11009 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11010 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11012 DU_LOG("%x",encBuf[ieIdx]);
11016 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11017 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11019 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11027 FreeUeContextReleaseCommand(f1apMsg);
11030 /*******************************************************************
11032 * @brief process Ue context release request
11036 * Function : procUeContextReleaseReq
11039 * - process Ue context release request
11041 * @params[in] F1AP_PDU_t *f1apMsg
11042 * @return ROK - success
11043 * RFAILED - failure
11045 * ****************************************************************/
11046 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11048 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11050 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11051 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11053 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11055 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11057 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11059 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11062 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11064 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11072 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11074 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11079 /*******************************************************************
11081 * @brief processing of Gnb-DU config update
11085 * Function : procGnbDuUpdate
11088 * - processing of Gnb-DU config update
11090 * @params[in] F1AP_PDU_t *f1apMsg
11091 * @return ROK - success
11092 * RFAILED - failure
11094 * ****************************************************************/
11095 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11097 bool cellToBeDelete = false;
11098 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11102 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11104 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11105 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11107 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11109 case ProtocolIE_ID_id_TransactionID:
11111 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11113 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11115 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11116 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11117 Served_Cells_To_Delete_List.list.array[0];
11118 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11119 cellToBeDelete = true;
11122 case ProtocolIE_ID_id_gNB_DU_ID:
11126 if(BuildAndSendDUUpdateAck(duId) != ROK)
11128 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11132 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11133 * commented this trigger for now */
11135 if(cellToBeDelete == false)
11137 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11138 if(BuildAndSendF1ResetReq() != ROK)
11140 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11145 if(cellToBeDelete == true)
11147 SEARCH_DU_DB(duIdx, duId, duDb);
11148 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11149 if(cellCb->numUe == 0)
11151 memset(cellCb, 0, sizeof(CuCellCb));
11155 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11160 /*******************************************************************
11162 * @brief storing slice list in CU database
11166 * Function : buildSliceList
11169 * - storing slice list in CU database
11171 * @params[in] SliceSupportList_t *sliceSupportList
11172 * @return ROK - success
11173 * RFAILED - failure
11175 * ****************************************************************/
11176 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11178 uint8_t sliceListIdx = 0;
11180 if(sliceSupportList)
11182 if(sliceSupportList->list.array)
11184 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11185 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11187 if(sliceSupportList->list.array[sliceListIdx])
11189 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11190 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11192 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11195 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11197 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11198 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11200 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11202 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11203 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11204 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11213 /****************************************************************
11214 * @brief Function to process Srb Setup Mod List
11218 * Function : procSrbSetupModList
11221 * - Function to process SRB Setup Mod List
11224 * @return ROK - success
11225 * RFAILED - failure
11227 * ****************************************************************/
11228 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11230 uint8_t arrIdx = 0, srbIdx;
11231 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11233 if(srbSetupList != NULLP)
11235 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11237 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11238 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11240 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11242 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11244 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11256 /****************************************************************
11257 * @brief Function to process Drb Setup Mod List
11261 * Function : procDrbSetupModList
11264 * - Function to process DRB Setup Mod List
11267 * @return ROK - success
11268 * RFAILED - failure
11270 * ****************************************************************/
11271 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11273 uint8_t arrIdx = 0, drbIdx;
11275 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11277 if(drbSetupList != NULLP)
11279 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11281 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11282 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11284 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11286 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11288 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11289 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11294 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11296 /* extracting teId */
11297 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11300 if(addDrbTunnels(duId, teId)== ROK)
11302 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11314 /*******************************************************************
11316 * @brief processing of GNB_DU_Served_Cells Plmn list information
11320 * Function : procServedCellPlmnList
11323 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11326 * @params[in] F1AP_PDU_t *f1apMsg
11327 * @return ROK - success
11328 * RFAILED - failure
11330 * ****************************************************************/
11331 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11333 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11334 ProtocolExtensionContainer_4624P3_t **ieExtend;
11336 if(srvPlmn->list.array)
11338 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11340 if(srvPlmn->list.array[srvPlmnIdx])
11342 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11345 if((*ieExtend)->list.array)
11347 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11349 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11351 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11353 case ProtocolIE_ID_id_TAISliceSupportList:
11355 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11356 extensionValue.choice.SliceSupportList) != ROK)
11358 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11373 /****************************************************************
11374 * @brief Function to process Ue Context Modification Response
11378 * Function : procUeContextModificationResponse
11381 * - Function to process Ue Context Modification Response
11384 * @return ROK - success
11385 * RFAILED - failure
11387 * ****************************************************************/
11388 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11390 uint8_t idx=0, duIdx=0;
11391 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11392 DuDb *duDb = NULLP;
11393 CuUeCb *ueCb = NULLP;
11394 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11396 SEARCH_DU_DB(duIdx, duId, duDb);
11397 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11399 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11401 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11403 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11405 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11408 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11410 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11411 ueCb = &duDb->ueCb[duUeF1apId-1];
11414 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11416 /* Adding Tunnels for successful DRB */
11417 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11421 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11423 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11426 case ProtocolIE_ID_id_DUtoCURRCInformation:
11428 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11429 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11430 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11432 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11441 /* If UE is in handover and UE context is not yet created at target DU, then send
11442 * UE context setup request to target DU */
11443 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11446 DuDb *tgtDuDb = NULLP;
11447 CuUeCb *ueCbInTgtDu = NULLP;
11449 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11452 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11453 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11455 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11457 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11459 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11464 /* If UE context is not found in Target DU DU, send UE context setup
11466 if(ueCbInTgtDu == NULLP)
11468 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
11470 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11480 /*******************************************************************
11482 * @brief processing of F1 setup request
11486 * Function : procF1SetupReq
11489 * - processing of F1 setup request
11491 * @params[in] F1AP_PDU_t *f1apMsg
11492 * @return ROK - success
11493 * RFAILED - failure
11495 * ****************************************************************/
11496 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11498 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11500 uint64_t nrCellId = 0;
11501 DuDb *duDb = NULLP;
11502 CuCellCb *cellCb = NULLP;
11503 BIT_STRING_t nrcellIdentity;
11504 F1SetupRequest_t *f1SetupReq = NULLP;
11505 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11506 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11508 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11509 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11511 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11513 case ProtocolIE_ID_id_gNB_DU_ID:
11515 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11516 SEARCH_DU_DB(duIdx, duId, duDb);
11519 duDb = &cuCb.duInfo[cuCb.numDu];
11520 memset(duDb, 0, sizeof(DuDb));
11529 case ProtocolIE_ID_id_gNB_DU_Name:
11531 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11534 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11536 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11537 if(duServedCell->list.array)
11539 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11541 if(duServedCell->list.array[plmnidx])
11543 switch(duServedCell->list.array[plmnidx]->id)
11545 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11547 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11548 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11549 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11551 bitStringToInt(&nrcellIdentity, &nrCellId);
11552 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11553 if(cellCb == NULLP)
11555 cellCb = &duDb->cellCb[duDb->numCells];
11556 memset(cellCb, 0, sizeof(CuCellCb));
11557 cellCb->nrCellId = nrCellId;
11558 cellCb->cellStatus = CELL_ACTIVE;
11571 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11575 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11579 /****************************************************************
11581 * @brief processing of UE Context Release Complete
11585 * Function : procUeContextReleaseComplete
11588 * - processing of UE Context Release Complete
11590 * @params[in] F1AP_PDU_t *f1apMsg
11591 * @return ROK - success
11592 * RFAILED - failure
11594 * ****************************************************************/
11595 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11597 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
11598 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11599 DuDb *duDb = NULLP;
11600 CuUeCb *ueCb = NULLP;
11601 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11603 SEARCH_DU_DB(duIdx, duId, duDb);
11606 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11610 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11611 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11613 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11615 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11617 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11620 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11622 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11623 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11624 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11626 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11628 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11629 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11631 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11633 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
11635 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11636 ueCb->cellCb->numUe--;
11637 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
11639 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11646 memset(ueCb, 0, sizeof(CuUeCb));
11654 /*******************************************************************
11656 * @brief Builds the Paging cell list
11660 * Function : BuildPagingCellList
11662 * Functionality: Build the paging cell list
11664 * @params[in] PagingCell_list_t *pagingCelllist,
11666 * @return ROK - success
11667 * RFAILED - failure
11669 * ****************************************************************/
11670 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11672 uint8_t cellIdx =0;
11673 PagingCell_ItemIEs_t *pagingCellItemIes;
11674 PagingCell_Item_t *pagingCellItem;
11676 pagingCelllist->list.count = numCells;
11677 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11678 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11679 if(pagingCelllist->list.array == NULLP)
11681 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11685 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11687 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11688 if(pagingCelllist->list.array[cellIdx] == NULLP)
11690 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11695 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11697 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11698 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
11699 pagingCellItemIes->criticality = Criticality_ignore;
11700 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
11701 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11703 /* Fill NrCgi Information */
11704 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
11710 /*******************************************************************
11712 * @brief Deallocation of memory allocated in paging msg
11716 * Function :FreePagingMsg
11718 * Functionality: Deallocation of memory allocated in paging msg
11720 * @params[in] F1AP_PDU_t *f1apMsg
11724 * ****************************************************************/
11725 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
11727 uint8_t ieIdx, cellIdx;
11729 PagingCell_ItemIEs_t *pagingCellItemIes;
11730 PagingCell_Item_t *pagingCellItem;
11731 PagingCell_list_t *pagingCelllist;
11735 if(f1apMsg->choice.initiatingMessage)
11737 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11738 if(paging->protocolIEs.list.array)
11740 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
11742 if(paging->protocolIEs.list.array[ieIdx])
11744 switch(paging->protocolIEs.list.array[ieIdx]->id)
11746 case ProtocolIE_ID_id_UEIdentityIndexValue:
11748 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11749 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11753 case ProtocolIE_ID_id_PagingIdentity:
11755 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
11757 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11759 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
11761 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11762 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11764 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
11765 sizeof(struct CNUEPagingIdentity));
11771 case ProtocolIE_ID_id_PagingCell_List:
11773 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
11774 if(pagingCelllist->list.array)
11776 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11778 if(pagingCelllist->list.array[cellIdx])
11780 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11781 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
11783 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11784 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
11785 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
11787 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11790 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
11795 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11798 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11800 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11802 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11805 /*******************************************************************
11807 * @brief Builds and sends the paging message if UE is in idle mode
11811 * Function : BuildAndSendPagingMsg
11813 * Functionality: Builds and sends the paging message
11815 * @params[in] uint32_t duId, uint8_t gsTmsi
11817 * @return ROK - success
11818 * RFAILED - failure
11820 * ****************************************************************/
11821 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
11823 bool memAllocFailed = false;
11824 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
11825 uint16_t ueId = 0, duIdx = 0;
11827 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
11828 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
11829 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
11830 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
11832 F1AP_PDU_t *f1apMsg = NULLP;
11833 Paging_t *paging = NULLP;
11835 asn_enc_rval_t encRetVal;
11837 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
11839 SEARCH_DU_DB(duIdx, duId, duDb);
11842 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
11848 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11849 if(f1apMsg == NULLP)
11851 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
11855 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11857 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11858 if(f1apMsg->choice.initiatingMessage == NULLP)
11860 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
11863 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
11864 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11865 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
11867 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11870 paging->protocolIEs.list.count = elementCnt;
11871 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
11873 /* Initialize the Paging Message members */
11874 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11875 if(paging->protocolIEs.list.array == NULLP)
11877 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
11881 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11883 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11884 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
11886 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11887 memAllocFailed = true;
11892 if(memAllocFailed == true)
11897 /* UE Identity Index Value */
11899 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
11900 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11901 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
11902 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
11903 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
11904 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11905 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11906 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
11908 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11912 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
11913 ueId = gsTmsi % 1024;
11914 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
11916 /* Paging Identity */
11918 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
11919 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11920 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
11921 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
11922 PagingIdentity_PR_cNUEPagingIdentity;
11923 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
11924 sizeof(struct CNUEPagingIdentity));
11925 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11927 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11931 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
11932 CNUEPagingIdentity_PR_fiveG_S_TMSI;
11934 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
11935 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11936 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11937 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
11939 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11943 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
11944 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
11948 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
11949 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11950 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
11951 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
11953 /* Paging Priority */
11955 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
11956 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11957 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
11958 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
11960 /* Paging Cell List */
11962 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
11963 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11964 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
11965 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
11967 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
11971 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11973 /* Encode the UE Context Release Command type as APER */
11974 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11976 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11979 /* Encode results */
11980 if(encRetVal.encoded == ENCODE_FAIL)
11982 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11983 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11988 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
11989 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11991 DU_LOG("%x",encBuf[ieIdx]);
11995 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11997 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12006 FreePagingMsg(f1apMsg);
12010 /*******************************************************************
12012 * @brief Handles received F1AP message and sends back response
12016 * Function : F1APMsgHdlr
12019 * - Decodes received F1AP control message
12020 * - Prepares response message, encodes and sends to SCTP
12023 * @return ROK - success
12024 * RFAILED - failure
12026 * ****************************************************************/
12027 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12033 F1AP_PDU_t *f1apMsg = NULLP;
12034 asn_dec_rval_t rval; /* Decoder return value */
12035 F1AP_PDU_t f1apasnmsg ;
12037 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12038 ODU_PRINT_MSG(mBuf, 0,0);
12040 /* Copy mBuf into char array to decode it */
12041 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12042 CU_ALLOC(recvBuf, (Size)recvBufLen);
12044 if(recvBuf == NULLP)
12046 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12049 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12051 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12055 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12056 for(i=0; i< recvBufLen; i++)
12058 DU_LOG("%x",recvBuf[i]);
12061 /* Decoding flat buffer into F1AP messsage */
12062 f1apMsg = &f1apasnmsg;
12063 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12065 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12066 CU_FREE(recvBuf, (Size)recvBufLen);
12068 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12070 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12074 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12076 switch(f1apMsg->present)
12078 case F1AP_PDU_PR_initiatingMessage:
12080 switch(f1apMsg->choice.initiatingMessage->value.present)
12082 case InitiatingMessage__value_PR_Reset:
12084 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12085 BuildAndSendF1ResetAck();
12089 case InitiatingMessage__value_PR_F1SetupRequest:
12091 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12092 procF1SetupReq(duId, f1apMsg);
12096 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12098 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12099 procGnbDuUpdate(*duId, f1apMsg);
12102 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12104 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12105 procInitULRRCMsg(*duId, f1apMsg);
12108 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12110 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12111 procUlRrcMsg(*duId, f1apMsg);
12115 case InitiatingMessage__value_PR_RRCDeliveryReport:
12117 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12120 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12122 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12123 procUeContextReleaseReq(*duId, f1apMsg);
12128 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12129 f1apMsg->choice.initiatingMessage->value.present);
12132 }/* End of switch(initiatingMessage) */
12136 case F1AP_PDU_PR_successfulOutcome:
12138 switch(f1apMsg->choice.successfulOutcome->value.present)
12140 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12142 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12145 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12147 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12148 procUeContextSetupResponse(*duId, f1apMsg);
12151 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12153 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12154 procUeContextModificationResponse(*duId, f1apMsg);
12157 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12159 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12160 procUeContextReleaseComplete(*duId, f1apMsg);
12165 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12166 f1apMsg->choice.successfulOutcome->value.present);
12169 }/* End of switch(successfulOutcome) */
12174 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12177 }/* End of switch(f1apMsg->present) */
12179 } /* End of F1APMsgHdlr */
12181 /**********************************************************************
12183 **********************************************************************/