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"
131 #include "cu_stub_sctp.h"
132 #include "cu_stub_egtp.h"
133 #include "cu_f1ap_msg_hdl.h"
136 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
137 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
139 /*******************************************************************
141 * @brief Sends F1 msg over SCTP
145 * Function : SendF1APMsg
147 * Functionality: Sends F1 msg over SCTP
149 * @params[in] Region region
151 * @return ROK - success
154 * ****************************************************************/
155 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
157 Buffer *mBuf = NULLP;
159 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
161 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
163 ODU_PRINT_MSG(mBuf, 0,0);
165 if(sctpSend(duId, mBuf) != ROK)
167 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
168 ODU_PUT_MSG_BUF(mBuf);
174 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
175 ODU_PUT_MSG_BUF(mBuf);
178 ODU_PUT_MSG_BUF(mBuf);
182 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
189 /*******************************************************************
191 * @brief Builds NRCell ID
195 * Function : BuildNrCellId
197 * Functionality: Building the NR Cell ID
199 * @params[in] BIT_STRING_t *nrcell
200 * @return ROK - success
203 * ****************************************************************/
205 S16 BuildNrCellId(BIT_STRING_t *nrcell)
207 memset(nrcell->buf, 0, nrcell->size);
209 nrcell->bits_unused = 4;
210 nrcell->size = 5 * sizeof(uint8_t);
214 /********************************************************************
216 * @brief Builds and sends the F1SetupResponse
220 * Function : BuildAndSendF1SetupRsp
222 * Functionality: Constructs the F1SetupResponse message and sends
223 * it back to the DU through SCTP.
225 * @params[in] void **buf,Buffer to which encoded pattern is written into
226 * @params[in] int *size,size of buffer
228 * @return ROK - success
231 * ****************************************************************/
232 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
235 uint8_t elementCnt,cellCnt;
236 F1AP_PDU_t *f1apMsg = NULL;
237 F1SetupResponse_t *f1SetupRsp;
238 GNB_CU_Name_t *cuName;
239 Cells_to_be_Activated_List_t *cellToActivate;
240 RRC_Version_t *rrcVer;
241 asn_enc_rval_t encRetVal;
242 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
244 /* Allocate the memory for F1SetupRequest_t */
245 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
248 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
251 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
253 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
254 if(f1apMsg->choice.successfulOutcome == NULLP)
256 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
257 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
261 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
262 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
263 f1apMsg->choice.successfulOutcome->value.present = \
264 SuccessfulOutcome__value_PR_F1SetupResponse;
265 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
268 f1SetupRsp->protocolIEs.list.count = elementCnt;
269 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
271 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
272 elementCnt * sizeof(F1SetupResponseIEs_t *));
273 if(f1SetupRsp->protocolIEs.list.array == NULLP)
275 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
276 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
277 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
281 for(idx=0; idx<elementCnt; idx++)
283 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
284 sizeof(F1SetupResponseIEs_t));
285 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
287 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
288 elementCnt * sizeof(F1SetupResponseIEs_t *));
289 CU_FREE(f1apMsg->choice.successfulOutcome, \
290 sizeof(SuccessfulOutcome_t));
291 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
298 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
299 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
300 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
301 F1SetupResponseIEs__value_PR_TransactionID;
302 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
307 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
308 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
309 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
310 F1SetupResponseIEs__value_PR_GNB_CU_Name;
311 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
312 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
314 CU_ALLOC(cuName->buf, sizeof(cuName->size));
315 if(cuName->buf == NULLP)
317 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
319 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
320 sizeof(F1SetupResponseIEs_t));
322 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
323 elementCnt * sizeof(F1SetupResponseIEs_t *));
324 CU_FREE(f1apMsg->choice.successfulOutcome,\
325 sizeof(SuccessfulOutcome_t));
326 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
329 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
331 /*Cells to be activated list*/
333 f1SetupRsp->protocolIEs.list.array[idx]->id = \
334 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
335 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
336 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
337 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
338 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
339 Cells_to_be_Activated_List;
341 cellToActivate->list.count = cellCnt;
342 cellToActivate->list.size = \
343 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
344 CU_ALLOC(cellToActivate->list.array,\
345 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
346 if(cellToActivate->list.array == NULLP)
348 CU_FREE(cuName->buf, sizeof(cuName->size));
349 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
351 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
352 sizeof(F1SetupResponseIEs_t));
354 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
355 elementCnt * sizeof(F1SetupResponseIEs_t *));
356 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
357 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
360 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
362 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
363 if(cellToActivate->list.array[ieIdx] == NULLP)
365 CU_FREE(cellToActivate->list.array,\
366 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
367 CU_FREE(cuName->buf, sizeof(cuName->size));
368 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
370 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
371 sizeof(F1SetupResponseIEs_t));
373 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
374 elementCnt * sizeof(F1SetupResponseIEs_t *));
375 CU_FREE(f1apMsg->choice.successfulOutcome, \
376 sizeof(SuccessfulOutcome_t));
377 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
381 cellToActivate->list.array[0]->id = \
382 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
383 cellToActivate->list.array[0]->criticality = Criticality_ignore;
384 cellToActivate->list.array[0]->value.present = \
385 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
386 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
387 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
388 CU_ALLOC(cellToActivate->list.array[0]->\
389 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
391 if(cellToActivate->list.array[0]->value.choice.\
392 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
395 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
397 CU_FREE(cellToActivate->list.array[ieIdx],\
398 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
401 CU_FREE(cellToActivate->list.array,\
402 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
403 CU_FREE(cuName->buf, sizeof(cuName->size));
404 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
406 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
407 sizeof(F1SetupResponseIEs_t));
409 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
410 elementCnt * sizeof(F1SetupResponseIEs_t *));
411 CU_FREE(f1apMsg->choice.successfulOutcome, \
412 sizeof(SuccessfulOutcome_t));
413 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
416 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
417 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
418 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
419 nRCGI.nRCellIdentity.size = 5;
420 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
421 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
423 if(cellToActivate->list.array[0]->value.choice.\
424 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
426 CU_FREE(cellToActivate->list.array[0]->\
427 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
429 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
431 CU_FREE(cellToActivate->list.array[ieIdx],\
432 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
435 CU_FREE(cellToActivate->list.array,\
436 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
437 CU_FREE(cuName->buf, sizeof(cuName->size));
438 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
440 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
441 sizeof(F1SetupResponseIEs_t));
443 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
444 elementCnt * sizeof(F1SetupResponseIEs_t *));
445 CU_FREE(f1apMsg->choice.successfulOutcome, \
446 sizeof(SuccessfulOutcome_t));
447 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
450 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
453 f1SetupRsp->protocolIEs.list.array[idx]->id = \
454 ProtocolIE_ID_id_GNB_CU_RRC_Version;
455 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
456 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
457 F1SetupResponseIEs__value_PR_RRC_Version;
458 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
459 rrcVer->latest_RRC_Version.size = RRC_SIZE;
461 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
462 if(rrcVer->latest_RRC_Version.buf == NULLP)
464 CU_FREE(cuName->buf, sizeof(cuName->size));
465 for(ieIdx=0; ieIdx<elementCnt; idx++)
467 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
468 sizeof(F1SetupResponseIEs_t));
470 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
471 elementCnt * sizeof(F1SetupResponseIEs_t *));
472 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
473 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
477 /* Need to check RRC Version */
478 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
479 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
480 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
481 if(rrcVer->iE_Extensions == NULLP)
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 rrcVer->iE_Extensions->list.count = 1;
497 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
498 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
499 sizeof(struct RRC_Version_ExtIEs *));
500 if(rrcVer->iE_Extensions->list.array == NULLP)
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 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
518 sizeof(struct RRC_Version_ExtIEs));
519 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
521 CU_FREE(rrcVer->iE_Extensions->list.array,\
522 sizeof(struct RRC_Version_ExtIEs *));
523 CU_FREE(rrcVer->iE_Extensions,\
524 sizeof(ProtocolExtensionContainer_4624P81_t));
525 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
526 CU_FREE(cuName->buf, sizeof(cuName->size));
527 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
529 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
530 sizeof(F1SetupResponseIEs_t));
532 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
533 elementCnt * sizeof(F1SetupResponseIEs_t *));
534 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
535 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
538 rrcVer->iE_Extensions->list.array[0]->id = \
539 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
540 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
541 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
542 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
543 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
544 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
545 CU_ALLOC(rrcVer->iE_Extensions->list.\
546 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
548 if(rrcVer->iE_Extensions->list.\
549 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
551 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
552 sizeof(struct RRC_Version_ExtIEs));
553 CU_FREE(rrcVer->iE_Extensions->list.array,\
554 sizeof(struct RRC_Version_ExtIEs *));
555 CU_FREE(rrcVer->iE_Extensions,\
556 sizeof(ProtocolExtensionContainer_4624P81_t));
557 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
558 CU_FREE(cuName->buf, sizeof(cuName->size));
559 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
561 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
562 sizeof(F1SetupResponseIEs_t));
564 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
565 elementCnt * sizeof(F1SetupResponseIEs_t *));
566 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
567 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
570 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
571 Latest_RRC_Version_Enhanced.buf[0] = 0;
572 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
573 Latest_RRC_Version_Enhanced.buf[1] = 5;
574 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
575 Latest_RRC_Version_Enhanced.buf[2] = 15;
577 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
579 /* Encode the F1SetupRequest type as UPER */
580 memset(encBuf, 0, ENC_BUF_MAX_LEN);
582 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
585 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
586 CU_FREE(cuName->buf, sizeof(cuName->size));
587 for(idx=0; idx<elementCnt; idx++)
589 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
591 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
592 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
593 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
595 /* Check encode results */
596 if(encRetVal.encoded == ENCODE_FAIL)
598 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
599 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
604 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
605 for(int i=0; i< encBufSize; i++)
607 DU_LOG("%x",encBuf[i]);
612 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
614 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
619 }/* End of BuildAndSendF1SetupRsp */
621 /*******************************************************************
623 * @brief Builds and sends the DUUpdateAcknowledge
627 * Function : BuildAndSendDUUpdateAck
629 * Functionality: Constructs the DU Update Acknowledge message and sends
630 * it to the DU through SCTP.
634 * @return ROK - success
637 * ****************************************************************/
639 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
643 F1AP_PDU_t *f1apMsg = NULL;
644 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
645 asn_enc_rval_t enRetVal; /* Encoder return value */
647 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
649 /* Allocate the memory for F1SetupRequest_t */
650 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
653 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
657 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
659 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
660 if(f1apMsg->choice.successfulOutcome == NULLP)
662 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
663 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
667 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
668 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
669 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
670 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
673 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
674 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
676 /* Initialize the F1Setup members */
677 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
678 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
680 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
681 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
682 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
686 for(idx=0; idx<elementCnt; idx++)
688 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
689 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
691 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
692 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
693 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
700 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
701 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
702 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
703 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
704 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
706 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
708 /* Encode the F1SetupRequest type as UPER */
709 memset(encBuf, 0, ENC_BUF_MAX_LEN);
711 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
714 for(idx=0; idx<elementCnt; idx++)
716 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
718 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
719 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
720 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
722 /* Checking encode results */
723 if(enRetVal.encoded == ENCODE_FAIL)
725 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
726 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
731 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
732 for(int i=0; i< encBufSize; i++)
734 DU_LOG("%x",encBuf[i]);
739 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
740 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
742 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
748 }/* End of BuildAndSendDUUpdateAck*/
750 /*******************************************************************
752 * @brief deallocating the memory of F1reset msg
756 * Function : FreeF1ResetReq
759 * - freeing memory of F1reset request msg
765 * ****************************************************************/
766 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
769 Reset_t *f1ResetMsg = NULLP;
773 if(f1apMsg->choice.initiatingMessage)
775 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
776 if(f1ResetMsg->protocolIEs.list.array)
778 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
780 if(f1ResetMsg->protocolIEs.list.array[idx])
782 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
785 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
787 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
789 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
792 /*******************************************************************
794 * @brief build ansld ans send f1reset msg
798 * Function : BuildAndSendF1ResetReq
800 * Functionality: build and send f1reset msg
802 * @return ROK - success
805 * ****************************************************************/
806 uint8_t BuildAndSendF1ResetReq()
808 uint8_t elementCnt=0;
810 uint8_t ret= RFAILED;
811 Reset_t *f1ResetMsg = NULLP;
812 F1AP_PDU_t *f1apMsg = NULLP;
813 asn_enc_rval_t encRetVal;
814 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
817 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
820 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
823 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
824 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
825 if(f1apMsg->choice.initiatingMessage == NULLP)
827 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
830 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
831 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
832 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
834 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
837 f1ResetMsg->protocolIEs.list.count = elementCnt;
838 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
840 /* Initialize the F1Reset members */
841 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
842 if(f1ResetMsg->protocolIEs.list.array == NULLP)
844 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
847 for(idx=0; idx<elementCnt; idx++)
849 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
850 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
852 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
859 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
860 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
861 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
862 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
866 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
867 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
868 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
869 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
870 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
874 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
875 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
876 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
877 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
878 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
880 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
882 /* Encode the F1SetupRequest type as APER */
883 memset(encBuf, 0, ENC_BUF_MAX_LEN);
885 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
889 if(encRetVal.encoded == ENCODE_FAIL)
891 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
892 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
897 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
898 for(idx=0; idx< encBufSize; idx++)
900 DU_LOG("%x",encBuf[idx]);
904 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
905 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
907 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
915 FreeF1ResetReq(f1apMsg);
919 /*******************************************************************
921 * @brief Fills Radio Bearer Config
925 * Function : fillSrbCfg
927 * Functionality: Fills Radio Bearer Config
929 * @params[in] SRB_ToAddModList *
931 * @return ROK - success
934 * ****************************************************************/
935 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
937 uint8_t elementCnt = 0;
938 uint8_t idx, ieId, srbIdx = 0;
940 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
942 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
946 if(bearerCfg != NULLP)
948 bearerCfg->list.count = elementCnt;
949 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
950 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
951 if(bearerCfg->list.array != NULLP)
953 for(idx = 0; idx < elementCnt; idx++)
955 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
956 if(bearerCfg->list.array[idx] == NULLP)
958 for(ieId = 0; ieId < idx; ieId++)
960 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
962 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
969 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
974 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
976 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
977 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
983 /*******************************************************************
985 * @brief Fills Master CellGroup Info
989 * Function : fillMasterCellGroup
991 * Functionality: Fills Master Cell Group IE
993 * @params[in] RRCSetup_IEs_t *
995 * @return ROK - success
998 * ****************************************************************/
1000 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
1003 masterCellGroup->buf = NULLP;
1004 if(ueCb->f1apMsgDb.duToCuContainer.buf)
1006 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
1007 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1008 if(masterCellGroup->buf != NULLP)
1010 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1014 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1025 /*******************************************************************
1027 * @brief Fills RRC setup IE
1031 * Function : fillRRCSetupIE
1033 * Functionality: Fills RRC Setup IE
1035 * @params[in] RRCSetup_IEs_t *
1037 * @return ROK - success
1040 * ****************************************************************/
1042 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1044 uint8_t ret = ROK, srbIdx = 0;
1047 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1048 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1050 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1054 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1058 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1062 /* If SRB configuration are filled successfully in RRC Setup, mark these
1063 * configurartion as sent to UE */
1064 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1066 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1067 ueCb->srbList[srbIdx].cfgSentToUe = true;
1072 /*******************************************************************
1074 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1078 * Function : fillDlCcchRrcMsg
1080 * Functionality: Fills DL DCCCH Message required for
1081 * DLRRCMessageTransfer
1083 * @params[in] RRCContainer_t *rrcContainer
1085 * @return ROK - success
1088 * ****************************************************************/
1090 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1094 DL_CCCH_Message_t dl_CCCH_Msg;
1095 asn_enc_rval_t encRetVal;
1097 if(rrcContainer != NULLP)
1099 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1101 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1102 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1104 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1105 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1106 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1108 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1109 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1110 RRCSetup__criticalExtensions_PR_rrcSetup;
1112 /* Fill RRC Setup IE */
1113 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1114 sizeof(RRCSetup_IEs_t));
1115 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1117 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1121 /* encode DL-CCCH message into RRC Container */
1122 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1123 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1125 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1126 /* Encode results */
1127 if(encRetVal.encoded == ENCODE_FAIL)
1129 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1130 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1135 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1136 for(int i = 0; i< encBufSize; i++)
1138 DU_LOG("%x",encBuf[i]);
1140 rrcContainer->size = encBufSize;
1141 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1142 if(rrcContainer->buf != NULLP)
1144 memset(rrcContainer->buf, 0, encBufSize);
1145 for(idx2 = 0; idx2 < encBufSize; idx2++)
1147 rrcContainer->buf[idx2] = encBuf[idx2];
1159 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1165 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1171 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1177 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1182 /*******************************************************************
1184 * @brief Fills QOS flow configuration
1188 * Function : fillQosFlowsToAdd
1190 * Functionality: Fills QOS flow configuration
1192 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1194 * @return ROK - success
1197 * ****************************************************************/
1198 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1200 uint8_t idx, ied, elementCnt;
1203 qosFlow->list.count = elementCnt;
1204 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1205 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1206 if(qosFlow->list.array != NULLP)
1208 for(idx = 0; idx < elementCnt; idx++)
1210 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1211 if(qosFlow->list.array[idx] == NULLP)
1213 for(ied = 0; ied < idx; ied++)
1215 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1217 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1223 *qosFlow->list.array[idx] = 9;
1227 /*******************************************************************
1229 * @brief Fills CN Assoc for Drb to Add/Mod List
1233 * Function : fillCnAssoc
1235 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1237 * @params[in] struct DRB_ToAddMod__cnAssociation *
1239 * @return ROK - success
1242 * ****************************************************************/
1244 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1248 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1249 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1251 cnAssoc->choice.eps_BearerIdentity = 5;
1253 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1255 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1256 if(cnAssoc->choice.sdap_Config)
1258 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1259 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1260 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1261 cnAssoc->choice.sdap_Config->defaultDRB = true;
1262 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1263 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1264 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1265 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1266 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1268 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1272 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1273 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1279 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1286 /*******************************************************************
1288 * @brief Fills Radio Bearer Config for Drb
1292 * Function : fillDrbCfg
1294 * Functionality: Fills Radio Bearer Config for Drb
1296 * @params[in] drbId, DRB_ToAddModList *
1298 * @return ROK - success
1301 * ****************************************************************/
1302 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1304 uint8_t idx, ied, ret, elementCnt;
1310 drbCfg->list.count = elementCnt;
1311 drbCfg->list.size =\
1312 elementCnt * sizeof(DRB_ToAddMod_t *);
1313 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1314 if(drbCfg->list.array != NULLP)
1316 for(idx = 0; idx < elementCnt; idx++)
1318 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1319 if(drbCfg->list.array[idx] == NULLP)
1321 for(ied = 0; ied < idx; ied++)
1323 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1325 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1335 /* CN ASSOCIATION */
1336 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1337 if(drbCfg->list.array[idx]->cnAssociation)
1339 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1342 drbCfg->list.array[idx]->drb_Identity = drbId;
1347 /*******************************************************************
1349 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1353 * Function : fillRrcReconfigIE
1355 * Functionality: Fills RRC Reconfig Message required for
1356 * DLRRCMessageTransfer
1358 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1360 * @return ROK - success
1363 * ****************************************************************/
1365 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1368 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1369 if(rrcReconfigMsg->radioBearerConfig)
1371 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1372 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1374 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1379 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1380 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1382 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1385 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1386 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1387 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1393 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1394 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1400 /*******************************************************************
1402 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1406 * Function : fillDlDcchRrcMsg
1408 * Functionality: Fills DL DCCH Message required for
1409 * DLRRCMessageTransfer
1411 * @params[in] RRCContainer_t *rrcContainer
1413 * @return ROK - success
1416 * ****************************************************************/
1418 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1421 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1422 DL_DCCH_Message_t dl_DCCH_Msg;
1423 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1424 asn_enc_rval_t encRetVal;
1426 if(rrcContainer != NULLP)
1428 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1430 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1431 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1433 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1434 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1435 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1437 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1438 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1441 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1442 * configurartion as sent to UE */
1443 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1445 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1446 ueCb->srbList[srbIdx].cfgSentToUe = true;
1448 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1450 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1451 ueCb->drbList[drbIdx].cfgSentToUe = true;
1454 /* encode DL-DCCH message into RRC Container */
1455 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1456 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1458 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1459 /* Encode results */
1460 if(encRetVal.encoded == ENCODE_FAIL)
1462 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1463 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1468 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1469 for(int i = 0; i< encBufSize; i++)
1471 DU_LOG("%x",encBuf[i]);
1473 rrcContainer->size = encBufSize;
1474 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1475 if(rrcContainer->buf != NULLP)
1477 memset(rrcContainer->buf, 0, encBufSize);
1478 for(idx2 = 0; idx2 < encBufSize; idx2++)
1480 rrcContainer->buf[idx2] = encBuf[idx2];
1488 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1494 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1500 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1506 /*******************************************************************
1508 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1512 * Function : BuildDLRRCContainer
1514 * Functionality: Builds RRC Container IE required for
1515 * DLRRCMessageTransfer
1519 * @return ROK - success
1522 * ****************************************************************/
1524 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1526 uint8_t ret, bufLen;
1529 if(rrcMsgType == RRC_SETUP)
1531 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1533 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1535 else if(rrcMsgType == REGISTRATION_ACCEPT)
1537 /*Hardcoded RRC Container from reference logs*/
1538 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1540 rrcContainer->size = bufLen;
1541 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1542 if(rrcContainer->buf != NULLP)
1544 memset(rrcContainer->buf, 0, bufLen);
1545 memcpy(rrcContainer->buf, buf, bufLen);
1549 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1553 else if(rrcMsgType == RRC_RECONFIG)
1555 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Message ");
1556 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1558 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1564 /*******************************************************************
1566 * @brief Frees the DLRRCMessageTransfer
1570 * Function : freeDlRrcMessageTransfer
1572 * Functionality: Frees the DLRRCMessageTransfer
1576 * @return ROK - success
1579 * ****************************************************************/
1580 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1583 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1587 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1588 if(dlRRCMsg->protocolIEs.list.array)
1591 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1592 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1593 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1595 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1597 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1599 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1603 /*******************************************************************
1605 * @brief Builds and sends the DLRRCMessageTransfer
1609 * Function : BuildAndSendDLRRCMessageTransfer
1611 * Functionality: Constructs the DL RRC Message Transfer and sends
1612 * it to the CU through SCTP.
1616 * @return ROK - success
1619 * ****************************************************************/
1620 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1622 uint8_t elementCnt = 0;
1625 F1AP_PDU_t *f1apMsg = NULLP;
1626 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1627 asn_enc_rval_t encRetVal; /* Encoder return value */
1629 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1631 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1632 if(f1apMsg == NULLP)
1634 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1638 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1639 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1640 if(f1apMsg->choice.initiatingMessage == NULLP)
1642 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1643 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1647 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1648 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1649 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1650 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1653 dlRRCMsg->protocolIEs.list.count = elementCnt;
1654 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1656 /* Initialize the F1Setup members */
1657 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1658 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1660 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1661 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1662 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1666 for(idx=0; idx<elementCnt; idx++)
1668 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1669 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1671 for(ieId=0; ieId<idx; ieId++)
1673 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1675 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1676 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1677 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1682 /* GNB CU UE F1AP ID */
1684 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1685 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1686 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1687 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1689 /* GNB DU UE F1AP ID */
1691 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1692 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1693 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1694 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1698 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1699 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1700 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1701 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1705 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1706 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1707 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1708 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1710 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1712 /* Encode the F1SetupRequest type as APER */
1713 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1715 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1717 /* Encode results */
1718 if(encRetVal.encoded == ENCODE_FAIL)
1720 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1721 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1726 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1727 for(int i=0; i< encBufSize; i++)
1729 DU_LOG("%x",encBuf[i]);
1734 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1736 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1739 freeDlRrcMessageTransfer(f1apMsg);
1741 }/* End of BuildAndSendDLRRCMessageTransfer */
1743 /*******************************************************************
1745 * @brief Function to set the Dl RRC Msg Type
1749 * Function : setDlRRCMsgType
1751 * Functionality: Constructs the UE Setup Response and sends
1752 * it to the DU through SCTP.
1756 * @return ROK - success
1759 * ****************************************************************/
1761 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1763 uint8_t rrcMsgType = 0;
1764 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1767 rrcMsgType = RRC_SETUP;
1769 case REGISTRATION_ACCEPT:
1770 rrcMsgType = REGISTRATION_ACCEPT;
1772 case UE_CONTEXT_SETUP_REQ:
1773 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1775 case SECURITY_MODE_COMPLETE:
1776 rrcMsgType = SECURITY_MODE_COMPLETE;
1779 rrcMsgType = RRC_RECONFIG;
1781 case RRC_RECONFIG_COMPLETE:
1782 rrcMsgType = RRC_RECONFIG_COMPLETE;
1784 case UE_CONTEXT_MOD_REQ:
1785 rrcMsgType = UE_CONTEXT_MOD_REQ;
1793 /*******************************************************************
1795 * @brief Extract configuration from CellGroupConfig
1799 * Function : extractCellGroupConfig
1801 * Functionality: Extract configuration from CellGroupConfig
1802 * and store in local database
1804 * @params[in] UE control block
1807 * @return ROK - success
1810 * ****************************************************************/
1811 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
1813 uint8_t rbIdx, srbIdx, drbIdx;
1814 bool srbFound, drbFound;
1815 SrbInfo *srbCfgDb = NULLP;
1816 DrbInfo *drbCfgDb = NULLP;
1817 RlcLcCfg *rlcLcCfgDb = NULLP;
1818 MacLcCfg *macLcCfgDb = NULLP;
1819 RLC_BearerConfig_t *rlcCfg = NULLP;
1820 RLC_Config_t *rlcLcCfg = NULLP;
1821 LogicalChannelConfig_t *macLcCfg = NULLP;
1825 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
1829 if(cellGrpCfg == NULLP)
1831 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
1835 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
1840 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
1842 /* Update SRB configuration in local DB */
1843 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
1845 /* Search if SRB entry is already present in DB */
1846 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
1848 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
1850 srbCfgDb = &ueCb->srbList[srbIdx];
1856 /* If not, add SRB to UE CB's SRB list */
1859 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
1860 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
1864 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1865 srbCfgDb->cfgSentToUe = false;
1866 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
1867 macLcCfgDb = &srbCfgDb->macLcCfg;
1870 /* Update DRB configuration in local DB */
1871 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
1873 /* Search if DRB entry is already present in DB */
1874 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
1876 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
1878 drbCfgDb = &ueCb->drbList[drbIdx];
1884 /* If not, add DRB to UE CB's SRB list */
1887 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
1888 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
1892 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1893 drbCfgDb->cfgSentToUe = false;
1894 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
1895 macLcCfgDb = &drbCfgDb->macLcCfg;
1899 /* Update RLC configuration for this RB */
1900 rlcLcCfg = rlcCfg->rlc_Config;
1901 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
1902 switch(rlcLcCfgDb->rlcMode)
1904 case RLC_Config_PR_am:
1906 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
1907 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
1908 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
1909 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
1910 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
1912 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
1913 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
1914 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
1918 case RLC_Config_PR_um_Bi_Directional:
1920 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
1922 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
1923 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
1928 /* Update MAC configuration for this LC */
1929 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
1930 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
1931 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
1932 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
1933 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
1934 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
1939 /*******************************************************************
1941 * @brief Function to decode DU to CU RRC container
1945 * Function : extractDuToCuRrcCont
1947 * Functionality: Function to decode DU to CU RRC container
1950 * RRC conatiner octect string to be decoded
1952 * @return ROK - success
1955 * ****************************************************************/
1956 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
1958 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
1959 asn_dec_rval_t rval; /* Decoder return value */
1961 /* Decoding DU to CU RRC container octet string to cell group config */
1962 cellGrpCfgMsg = &cellGrpCfg;
1963 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
1965 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
1967 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1969 DU_LOG("\nERROR --> F1AP : ASN decode failed");
1973 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
1975 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
1977 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
1984 /*******************************************************************
1986 * @brief Function to build Initial UL RRC Message
1990 * Function : procInitULRRCMsg
1992 * Functionality: Function to build Initial UL RRC Message
1996 * @return ROK - success
1999 * ****************************************************************/
2001 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2003 uint8_t idx,cellIdx=0, duIdx=0, rrcMsgType, gnbDuUeF1apId;
2005 uint32_t nrCellId, crnti;
2009 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2011 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2013 SEARCH_DU_DB(duIdx, duId, duDb);
2014 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2016 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2018 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2020 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2021 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2024 case ProtocolIE_ID_id_NRCGI:
2025 nrCellId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.buf[4] >>
2026 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.bits_unused;
2027 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2032 case ProtocolIE_ID_id_C_RNTI:
2033 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2034 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2036 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2037 memset(ueCb, 0, sizeof(CuUeCb));
2038 ueCb->cellCb = cellCb;
2039 ueCb->crnti = crnti;
2040 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2041 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2042 ueCb->state = UE_ATTACH_IN_PROGRESS;
2045 cellCb->ueCb[cellCb->numUe] = ueCb;
2050 case ProtocolIE_ID_id_RRCContainer:
2053 case ProtocolIE_ID_id_DUtoCURRCContainer:
2055 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2056 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2058 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2059 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2060 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2061 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2063 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2064 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2065 ueCb->f1apMsgDb.duToCuContainer.size);
2067 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2069 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2075 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2082 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2091 ueCb->f1apMsgDb.dlRrcMsgCount++;
2092 rrcMsgType = setDlRRCMsgType(ueCb);
2093 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2098 /*******************************************************************
2100 * @brief Builds Nrcgi
2104 * Function : BuildNrcgi
2106 * Functionality: Building the PLMN ID and NR Cell id
2108 * @params[in] NRCGI_t *nrcgi
2109 * @return ROK - success
2112 * ****************************************************************/
2113 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2116 uint8_t unused_bits = 4;
2117 uint8_t byteSize = 5;
2118 uint8_t val = nrCellId << unused_bits;
2120 /* Allocate Buffer Memory */
2121 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2122 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2123 if(nrcgi->pLMN_Identity.buf == NULLP)
2127 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2133 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2134 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2135 if(nrcgi->nRCellIdentity.buf == NULLP)
2139 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, val);
2143 /*******************************************************************
2145 * @brief Builds Special cell list for UE Setup Request
2149 * Function : BuildSplCellList
2151 * Functionality: Constructs the Special Cell list for UESetReq
2153 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2155 * @return ROK - success
2158 * ****************************************************************/
2159 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2165 spCellLst->list.count = cellCnt;
2166 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2167 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2168 if(spCellLst->list.array == NULLP)
2172 for(idx=0; idx<cellCnt; idx++)
2174 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2175 if(spCellLst->list.array[idx] == NULLP)
2181 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2182 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2183 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2185 /* Special Cell ID -NRCGI */
2186 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2191 /*Special Cell Index*/
2192 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2194 }/* End of BuildSplCellList*/
2196 /*******************************************************************
2198 * @brief Builds SRBS to be setup
2202 * Function : BuildSRBSetup
2204 * Functionality: Constructs the SRB's for UESetReq
2206 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2208 * @return ROK - success
2211 * ****************************************************************/
2212 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2217 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2218 srbCnt = ueCb->numSrb;
2221 srbSet->list.count = srbCnt;
2222 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2223 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2224 if(srbSet->list.array == NULLP)
2226 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2230 for(idx=0; idx<srbCnt; idx++)
2232 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2233 if(srbSet->list.array[idx] == NULLP)
2235 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2240 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2243 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2244 srbSet->list.array[idx]->criticality = Criticality_ignore;
2245 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2246 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2247 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2252 for(idx=0; idx<srbCnt; idx++)
2254 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2255 srbSet->list.array[idx]->criticality = Criticality_ignore;
2256 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2257 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2261 }/* End of BuildSRBSetup*/
2263 /*******************************************************************
2265 * @brief Builds QOS Info for DRB Setum Item
2269 * Function : BuildQOSInfo
2271 * Functionality: Constructs the QOS Info for DRB Setup Item
2273 * @params[in] QoSInformation_t *qosinfo
2274 * int16_t pduSessionID
2276 * @return ROK - success
2279 * ****************************************************************/
2280 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2282 uint8_t elementCnt = 0, qosCntIdx = 0;
2283 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2285 /* NonDynamic5QIDescriptor */
2286 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2287 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2288 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2294 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2298 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2299 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2301 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2303 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2309 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2310 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2314 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2315 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2317 /*MaxDataBurstVolume*/
2318 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2319 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2323 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2324 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2327 /*nRGRAN Allocation Retention Priority*/
2330 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2331 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2332 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2336 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2337 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2338 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2340 qosInfo->priorityLevel = PriorityLevel_lowest;
2341 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2342 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2345 /* PDU session ID */
2348 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2349 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2351 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2355 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2356 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2360 elementCnt = NUM_QOS_EXT;
2361 qosIeExt->list.count = elementCnt;
2362 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2364 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2365 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2367 if(qosIeExt->list.array == NULLP)
2369 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2373 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2375 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2376 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2378 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2381 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2382 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2383 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2384 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2385 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2386 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2387 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2388 qosInfo->pduSessionId = pduSessionID;
2393 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2398 }/*End of BuildQOSInfo*/
2400 /*******************************************************************
2402 * @brief Builds SNSSAI
2406 * Function : BuildSNSSAI
2408 * Functionality: Constructs the SNSSAI For DRB list
2410 * @params[in] SNSSAI_t *snssai
2411 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2413 * @return ROK - success
2416 * ****************************************************************/
2417 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2421 snssai->sST.size = sizeof(uint8_t);
2422 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2423 if(snssai->sST.buf == NULLP)
2428 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2430 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2433 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2434 if(snssai->sD == NULLP)
2438 snssai->sD->size = 3 * sizeof(uint8_t);
2439 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2440 if(snssai->sD->buf == NULLP)
2445 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2447 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2450 drbInfo->snssai = snssaiToCopy;
2452 }/*End of BuildSNSSAI*/
2454 /*******************************************************************
2456 * @brief Builds the flow map.
2460 * Function : BuildFlowsMap
2462 * Functionality: Constructs the flowmap For DRB list
2464 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2466 * @return ROK - success
2469 * ****************************************************************/
2470 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2472 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2473 FlowsMapped *qosFlow;
2478 flowCnt = drbInfo->numFlowMap;
2479 flowMap->list.count = flowCnt;
2480 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2481 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2482 if(flowMap->list.array == NULLP)
2484 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2487 for(idx=0; idx<flowCnt; idx++)
2489 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2490 if(flowMap->list.array[idx] == NULLP)
2492 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2498 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2499 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2501 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2503 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2505 qosFlow = &drbInfo->flowMapList[flowIdx];
2512 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2513 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2518 qosFlow = &drbInfo->flowMapList[idx];
2519 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2522 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2523 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2526 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2530 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2531 drbInfo->numFlowMap++;
2534 }/*End of BuildFlowsMap*/
2536 /*******************************************************************
2538 * @brief Builds the Uplink Tunnel Info
2542 * Function : BuildULTnlInfo
2544 * Functionality: Constructs the UL TnlInfo For DRB list
2546 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2548 * @return ROK - success
2551 * ****************************************************************/
2552 uint8_t BuildULTnlInfo(TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2558 ulInfo->list.count = ulCnt;
2559 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2560 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2561 if(ulInfo->list.array == NULLP)
2563 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2566 for(idx=0; idx<ulCnt; idx++)
2568 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2569 if(ulInfo->list.array[idx] == NULLP)
2571 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2576 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2578 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2579 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2581 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2584 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2585 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2586 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2587 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2589 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2595 /* NOTE: Below IP address must be changed if running on different IP configuration */
2596 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2597 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2598 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2599 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2600 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2602 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2603 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2604 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2605 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2609 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2610 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2611 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2612 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2613 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2617 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2618 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2619 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2620 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2622 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2628 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2629 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2630 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2631 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2633 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2634 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2635 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2636 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2640 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2641 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2642 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2643 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2646 }/*End of BuildULTnlInfo*/
2648 /*******************************************************************
2650 * @brief Builds DRBS to be setup
2654 * Function : BuildDRBSetup
2656 * Functionality: Constructs the DRB's for UESetReq
2658 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2660 * @return ROK - success
2663 * ****************************************************************/
2664 uint8_t BuildDRBSetup(CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2666 uint8_t idx = 0, extIeIdx = 0;
2667 uint8_t elementCnt = 0, drbCnt = 0;
2668 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2669 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2670 DRBs_ToBeSetup_Item_t *drbSetItem;
2671 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2672 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2674 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2675 drbCnt = ueCb->numDrb;
2677 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2678 drbSet->list.count = drbCnt;
2680 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2681 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2682 if(drbSet->list.array == NULLP)
2684 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2688 for(idx=0; idx<drbCnt; idx++)
2690 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2691 if(drbSet->list.array[idx] == NULLP)
2693 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2697 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2698 drbSet->list.array[idx]->criticality = Criticality_ignore;
2699 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2700 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2702 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2704 drbSetItem->dRBID = idx + 1;
2705 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2708 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2711 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2712 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2713 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2715 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2718 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2719 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2720 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2721 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2722 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2723 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2725 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2726 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2727 if(BuildQOSInforet != ROK)
2729 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2734 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2735 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2736 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
2738 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2739 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], TRUE);
2740 if(BuildSNSSAIret != ROK)
2742 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2746 /*Flows mapped to DRB List*/
2747 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2748 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2749 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2751 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2752 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2753 if(BuildFlowsMapret != ROK)
2755 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2759 /*ULUPTNLInformation To Be Setup List*/
2760 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2761 BuildULTnlInforet = BuildULTnlInfo(&ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2764 BuildULTnlInforet = BuildULTnlInfo(&ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2766 if(BuildULTnlInforet != ROK)
2768 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2773 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2775 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2776 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
2779 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
2781 /* DL PDCP SN Length */
2782 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2784 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
2785 if(!drbToBeSetupExt)
2787 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
2792 drbToBeSetupExt->list.count = elementCnt;
2793 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
2795 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
2796 if(!drbToBeSetupExt->list.array)
2798 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
2802 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
2804 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
2805 if(!drbToBeSetupExt->list.array[extIeIdx])
2807 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
2813 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
2815 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
2816 drbToBeSetupExtIe->criticality = Criticality_ignore;
2817 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
2818 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
2819 drbSetItem->iE_Extensions = drbToBeSetupExt;
2822 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2826 }/* End of BuildDRBSetup*/
2828 /*******************************************************************
2830 * @brief Deallocating memory of function BuildAndSendUESetReq
2834 * Function : FreeNrcgi
2836 * Functionality: Deallocating memory for function BuildNrcgi
2838 * @params[in] NRCGI_t *nrcgi
2842 *******************************************************************/
2843 void FreeNrcgi(NRCGI_t *nrcgi)
2845 if(nrcgi->pLMN_Identity.buf != NULLP)
2847 if(nrcgi->nRCellIdentity.buf != NULLP)
2849 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2851 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2854 /*******************************************************************
2856 * @brief Deallocating memory of function BuildAndSendUESetReq
2860 * Function : FreeSplCellList
2862 * Functionality: Deallocating memory for function BuildSplCellList
2864 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2869 * *****************************************************************/
2870 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2873 if(spCellLst->list.array != NULLP)
2875 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2877 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2879 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2881 if(spCellLst->list.array[cellidx]!=NULLP)
2883 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2886 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2889 /*******************************************************************
2891 * @brief Deallocating memory of function BuildAndSendUESetReq
2895 * Function : FreeSRBSetup
2897 * Functionality: Deallocating memory for function BuildSRBSetup
2899 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2904 * ******************************************************************/
2905 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2908 if(srbSet->list.array != NULLP)
2910 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2912 if(srbSet->list.array[srbidx]!=NULLP)
2914 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2917 CU_FREE(srbSet->list.array,srbSet->list.size);
2920 /*******************************************************************
2922 * @brief Deallocating memory of function BuildAndSendUESetReq
2926 * Function : FreeQOSInfo
2928 * Functionality: Deallocating memory for function BuildQOSInfo
2930 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2934 * ****************************************************************/
2935 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2937 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2938 uint8_t qosCntIdx = 0;
2940 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2942 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2944 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2946 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2947 sizeof(MaxDataBurstVolume_t));
2949 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2950 sizeof(AveragingWindow_t));
2952 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2953 sizeof(NonDynamic5QIDescriptor_t));
2955 if(drbQos->iE_Extensions)
2957 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2958 if(qosIeExt->list.array != NULLP)
2960 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2962 if(qosIeExt->list.array[qosCntIdx])
2964 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2967 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2970 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2973 /*******************************************************************
2975 * @brief Deallocating memory of function BuildAndSendUESetReq
2979 * Function : FreeULTnlInfo
2981 * Functionality: Deallocating memory for function BuildULTnlInfo
2983 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2988 * ****************************************************************/
2989 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2992 if(ulInfo->list.array != NULLP)
2994 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2996 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2998 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3000 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3001 transportLayerAddress.buf != NULLP)
3003 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3006 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3007 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3008 gTPTunnel->gTP_TEID.size);
3010 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3011 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3012 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3014 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3015 sizeof(GTPTunnel_t));
3018 if(ulInfo->list.array[ulidx]!=NULLP)
3020 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3023 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3026 /*******************************************************************
3028 * @brief Deallocating memory for BuildAndSendUESetReq
3032 * Function : FreeDRBSetup
3034 * Functionality: Deallocating memory for BuildDRBSetup
3036 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3040 * ****************************************************************/
3041 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3043 DRBs_ToBeSetup_Item_t *drbSetItem;
3044 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3046 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3048 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3049 if(drbSet->list.array != NULLP)
3051 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3053 if(drbSet->list.array[drbidx] != NULLP)
3055 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3056 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3058 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3059 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3061 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3062 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3064 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3065 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3067 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3069 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3071 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3073 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3074 flows_Mapped_To_DRB_List.list.array != NULLP)
3076 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3077 flows_Mapped_To_DRB_List.list.count; flowidx++)
3079 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3080 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3082 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3083 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3084 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3086 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3087 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3088 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3090 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3091 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3092 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3094 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3095 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3097 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3098 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3099 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3100 sizeof(MaxDataBurstVolume_t));
3102 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3103 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3104 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3106 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3107 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3108 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3111 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3112 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3114 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3115 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3118 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3119 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3120 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3122 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3123 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3125 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3126 sizeof(OCTET_STRING_t));
3128 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3129 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3131 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3132 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3134 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3135 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3137 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3138 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3140 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3141 iE_Extensions != NULLP)
3143 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3144 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3145 if(qosIeExt->list.array != NULLP)
3147 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3149 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3151 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3154 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3156 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3157 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3160 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3162 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3165 CU_FREE(drbSet->list.array,drbSet->list.size);
3170 /*******************************************************************
3172 * @brief Free the UE Setup Request
3176 * Function : FreeUeContextSetupReq
3178 * Functionality: Deallocate the memory of BuildUESetReq
3180 * @params[in] F1AP_PDU_t *f1apMsg
3185 * ****************************************************************/
3186 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3189 UEContextSetupRequest_t *ueSetReq = NULLP;
3191 if(f1apMsg != NULLP)
3193 if(f1apMsg->choice.initiatingMessage != NULLP)
3195 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3196 if(ueSetReq->protocolIEs.list.array != NULLP)
3198 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3200 if(ueSetReq->protocolIEs.list.array[idx])
3202 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3204 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3206 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3208 case ProtocolIE_ID_id_SpCell_ID:
3209 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3211 case ProtocolIE_ID_id_ServCellIndex:
3213 case ProtocolIE_ID_id_SpCellULConfigured:
3215 case ProtocolIE_ID_id_CUtoDURRCInformation:
3216 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3218 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3219 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3221 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3222 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3224 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3225 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3227 case ProtocolIE_ID_id_RRCContainer:
3228 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3230 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3231 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3234 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3235 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3236 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3239 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3243 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3245 for(ieId=0; ieId<idx; ieId++)
3247 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3249 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3252 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3254 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3256 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3260 /**Filling cell group info **/
3261 /*******************************************************************
3263 * @brief Build Control resource set to add/modify list
3267 * Function : BuildControlRSetToAddModList
3269 * Functionality: Build Control resource set to add/modify list
3272 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3274 * @return ROK - success
3277 * ****************************************************************/
3278 uint8_t BuildControlRSetToAddModList
3280 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3285 uint8_t numBytes, bitsUnused;
3286 struct ControlResourceSet *controlRSet;
3287 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3288 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3291 controlRSetList->list.count = elementCnt;
3292 controlRSetList->list.size = \
3293 elementCnt * sizeof(struct ControlResourceSet *);
3295 controlRSetList->list.array = NULLP;
3296 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3297 if(!controlRSetList->list.array)
3299 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3303 for(idx = 0; idx < elementCnt; idx++)
3305 controlRSetList->list.array[idx] = NULLP;
3306 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3307 if(!controlRSetList->list.array[idx])
3309 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3315 controlRSet = controlRSetList->list.array[idx];
3316 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3318 /* Values harcoded according to our design:
3321 * Bit string stored ff0000000000
3325 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3326 controlRSet->frequencyDomainResources.buf = NULLP;
3327 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3328 controlRSet->frequencyDomainResources.size);
3329 if(!controlRSet->frequencyDomainResources.buf)
3331 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3335 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3336 coreset0EndPrb = CORESET0_END_PRB;
3337 coreset1StartPrb = coreset0EndPrb + 6;
3338 coreset1NumPrb = CORESET1_NUM_PRB;
3339 /* calculate the PRBs */
3340 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3341 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3342 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3344 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3345 controlRSet->cce_REG_MappingType.present = \
3346 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3348 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3349 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3350 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3351 controlRSet->tci_PresentInDCI = NULLP;
3353 uint8_t tciStateIdx;
3355 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3356 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3357 if(!controlRset->tci_StatesPDCCH_ToAddList)
3359 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3364 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3365 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3366 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3367 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3368 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3370 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3374 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3376 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3377 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3379 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3386 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3388 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3389 if(!controlRset->tci_PresentInDCI)
3391 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3395 *(controlRset->tci_PresentInDCI);
3398 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3399 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3400 if(!controlRSet->pdcch_DMRS_ScramblingID)
3402 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3405 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3408 } /* End BuildControlRSetToAddModList */
3410 /*******************************************************************
3412 * @brief Build search space to add/modify list
3416 * Function : BuildSearchSpcToAddModList
3418 * Functionality: Build search space to add/modify list
3421 * @return ROK - success
3424 * ****************************************************************/
3425 uint8_t BuildSearchSpcToAddModList
3427 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3435 struct SearchSpace *searchSpc;
3438 searchSpcList->list.count = elementCnt;
3439 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3441 searchSpcList->list.array = NULLP;
3442 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3443 if(!searchSpcList->list.array)
3445 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3449 for(idx = 0; idx < elementCnt; idx++)
3451 searchSpcList->list.array[idx] = NULLP;
3452 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3453 if(!searchSpcList->list.array[idx])
3455 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3461 searchSpc = searchSpcList->list.array[idx];
3463 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3465 searchSpc->controlResourceSetId = NULLP;
3466 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3467 if(!searchSpc->controlResourceSetId)
3469 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3472 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3474 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3475 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3476 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3477 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3479 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3482 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3483 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3485 searchSpc->duration = NULLP;
3486 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3487 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3488 if(!searchSpc->monitoringSymbolsWithinSlot)
3490 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3494 /* Values taken from reference logs :
3497 * Bit string stores 8000
3502 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3503 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3504 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3505 searchSpc->monitoringSymbolsWithinSlot->size);
3506 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3508 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3513 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3514 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3515 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3516 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3518 searchSpc->nrofCandidates = NULLP;
3519 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3520 if(!searchSpc->nrofCandidates)
3522 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3526 searchSpc->nrofCandidates->aggregationLevel1 = \
3527 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3528 searchSpc->nrofCandidates->aggregationLevel2 = \
3529 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3530 searchSpc->nrofCandidates->aggregationLevel4 = \
3531 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3532 searchSpc->nrofCandidates->aggregationLevel8 = \
3533 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3534 searchSpc->nrofCandidates->aggregationLevel16 = \
3535 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3537 searchSpc->searchSpaceType = NULLP;
3538 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3539 if(!searchSpc->searchSpaceType)
3541 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3545 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3547 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3548 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3549 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3550 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3552 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3555 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3556 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3559 }/* End BuildSearchSpcToAddModList */
3561 /*******************************************************************
3563 * @brief Builds BWP DL dedicated PDCCH config
3567 * Function : BuildBWPDlDedPdcchCfg
3569 * Functionality: Builds BWP DL dedicated PDCCH config
3571 * @params[in] struct PDCCH_Config *pdcchCfg
3573 * @return ROK - success
3576 * ****************************************************************/
3577 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3579 pdcchCfg->controlResourceSetToAddModList = NULLP;
3580 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3581 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3582 if(!pdcchCfg->controlResourceSetToAddModList)
3584 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3588 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3593 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3595 pdcchCfg->searchSpacesToAddModList = NULLP;
3596 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3597 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3598 if(!pdcchCfg->searchSpacesToAddModList)
3600 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3604 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3609 pdcchCfg->searchSpacesToReleaseList = NULLP;
3610 pdcchCfg->downlinkPreemption = NULLP;
3611 pdcchCfg->tpc_PUSCH = NULLP;
3612 pdcchCfg->tpc_PUCCH = NULLP;
3613 pdcchCfg->tpc_SRS = NULLP;
3618 /*******************************************************************
3620 * @brief Builds DMRS DL PDSCH Mapping type A
3624 * Function : BuildDMRSDLPdschMapTypeA
3626 * Functionality: Builds DMRS DL PDSCH Mapping type A
3629 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3630 * @return ROK - success
3633 * ****************************************************************/
3634 uint8_t BuildDMRSDLPdschMapTypeA
3636 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3639 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3640 dmrsDlCfg->choice.setup = NULLP;
3641 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3642 if(!dmrsDlCfg->choice.setup)
3644 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3648 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3649 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3650 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3651 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3653 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3656 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3658 dmrsDlCfg->choice.setup->maxLength = NULLP;
3659 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3660 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3661 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3666 /*******************************************************************
3668 * @brief Builds TCI states to add/modify list
3672 * Function : BuildTCIStatesToAddModList
3674 * Functionality:Builds TCI states to add/modify list
3677 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3679 * @return ROK - success
3682 * ****************************************************************/
3683 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3688 /*******************************************************************
3690 * @brief Builds PDSCH time domain allocation list
3694 * Function : BuildPdschTimeDomAllocList
3696 * Functionality: Builds PDSCH time domain allocation list
3699 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3701 * @return ROK - success
3704 * ****************************************************************/
3705 uint8_t BuildPdschTimeDomAllocList
3707 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3712 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3714 timeDomAllocList->present = \
3715 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3717 timeDomAllocList->choice.setup = NULLP;
3718 CU_ALLOC(timeDomAllocList->choice.setup, \
3719 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3720 if(!timeDomAllocList->choice.setup)
3722 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3727 timeDomAllocList->choice.setup->list.count = elementCnt;
3728 timeDomAllocList->choice.setup->list.size = \
3729 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3731 timeDomAllocList->choice.setup->list.array = NULLP;
3732 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3733 timeDomAllocList->choice.setup->list.size);
3734 if(!timeDomAllocList->choice.setup->list.array)
3736 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3740 for(idx = 0; idx < elementCnt; idx++)
3742 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3743 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3744 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3745 if(!timeDomAllocList->choice.setup->list.array[idx])
3747 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3753 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3754 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3755 if(!timeDomAlloc->k0)
3757 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3760 *(timeDomAlloc->k0) = 0;
3761 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3762 timeDomAlloc->startSymbolAndLength = 66;
3765 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3766 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3767 if(!timeDomAlloc->k0)
3769 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3772 *(timeDomAlloc->k0) = 1;
3773 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3774 timeDomAlloc->startSymbolAndLength = 66;
3779 /*******************************************************************
3781 * @brief Builds PDSCH PRB Bundling type
3785 * Function : BuildPdschPrbBundlingType
3787 * Functionality: Builds PDSCH PRB Bundling type
3790 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3792 * @return ROK - success
3795 * ****************************************************************/
3796 uint8_t BuildPdschPrbBundlingType
3798 struct PDSCH_Config__prb_BundlingType *prbBndlType
3801 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3803 prbBndlType->choice.staticBundling = NULLP;
3804 CU_ALLOC(prbBndlType->choice.staticBundling, \
3805 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3806 if(!prbBndlType->choice.staticBundling)
3808 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3811 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3816 /*******************************************************************
3818 * @brief Builds BWP DL dedicated PDSCH config
3822 * Function : BuildBWPDlDedPdschCfg
3824 * Functionality: Builds BWP DL dedicated PDSCH config
3826 * @params[in] struct PDSCH_Config *pdschCfg
3828 * @return ROK - success
3831 * ****************************************************************/
3832 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3834 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3836 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3837 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3838 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3839 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3841 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3845 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3850 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3851 pdschCfg->tci_StatesToAddModList = NULLP;
3852 pdschCfg->tci_StatesToReleaseList = NULLP;
3853 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3855 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3856 if(!pdschCfg->tci_StatesToAddModList)
3858 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3861 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3867 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3869 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3870 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3871 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3872 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3874 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3877 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3881 pdschCfg->pdsch_AggregationFactor = NULLP;
3882 pdschCfg->rateMatchPatternToAddModList = NULLP;
3883 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3884 pdschCfg->rateMatchPatternGroup1 = NULLP;
3885 pdschCfg->rateMatchPatternGroup2 = NULLP;
3886 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3887 pdschCfg->mcs_Table = NULLP;
3889 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3890 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3891 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3893 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3896 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3898 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3903 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3904 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3905 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3906 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3907 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3908 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3909 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3914 /*******************************************************************
3916 * @brief Builds intitial DL BWP
3919 * Function : BuildInitialDlBWP
3921 * Functionality: Builds intitial DL BWP in spCellCfgDed
3923 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3925 * @return ROK - success
3928 * ****************************************************************/
3929 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3931 dlBwp->pdcch_Config = NULLP;
3932 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3933 if(!dlBwp->pdcch_Config)
3935 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3938 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3940 dlBwp->pdcch_Config->choice.setup = NULLP;
3941 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3942 if(!dlBwp->pdcch_Config->choice.setup)
3944 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3947 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3952 dlBwp->pdsch_Config = NULLP;
3953 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3954 if(!dlBwp->pdsch_Config)
3956 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3959 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3961 dlBwp->pdsch_Config->choice.setup = NULLP;
3962 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3963 if(!dlBwp->pdsch_Config->choice.setup)
3965 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3969 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3974 dlBwp->sps_Config = NULLP;
3975 dlBwp->radioLinkMonitoringConfig = NULLP;
3979 /*******************************************************************
3981 * @brief Builds DMRS UL Pusch Mapping type A
3985 * Function : BuildDMRSULPuschMapTypeA
3987 * Functionality: Builds DMRS UL Pusch Mapping type A
3990 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3991 * @return ROK - success
3994 * ****************************************************************/
3995 uint8_t BuildDMRSULPuschMapTypeA
3997 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4000 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4001 dmrsUlCfg->choice.setup= NULLP;
4002 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4003 if(!dmrsUlCfg->choice.setup)
4005 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4009 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4010 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4011 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4012 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4014 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4017 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4019 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4020 dmrsUlCfg->choice.setup->maxLength = NULLP;
4021 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4022 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4023 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4024 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4026 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4030 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4031 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4033 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4035 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4038 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4040 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4041 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4045 /*******************************************************************
4047 * @brief Build PUSCH time domain allocation list
4051 * Function : BuildPuschTimeDomAllocList
4053 * Functionality: Build PUSCH time domain allocation list
4056 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4058 * @return ROK - success
4061 * ****************************************************************/
4062 uint8_t BuildPuschTimeDomAllocList
4064 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4069 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4071 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4072 timeDomAllocList->choice.setup = NULLP;
4073 CU_ALLOC(timeDomAllocList->choice.setup, \
4074 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4075 if(!timeDomAllocList->choice.setup)
4077 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4082 timeDomAllocList->choice.setup->list.count = elementCnt;
4083 timeDomAllocList->choice.setup->list.size = \
4084 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4085 timeDomAllocList->choice.setup->list.array = NULLP;
4086 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4087 timeDomAllocList->choice.setup->list.size);
4088 if(!timeDomAllocList->choice.setup->list.array)
4090 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4094 for(idx = 0; idx < elementCnt; idx++)
4096 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4097 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4098 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4099 if(!timeDomAllocList->choice.setup->list.array[idx])
4101 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4107 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4108 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4109 if(!timeDomAlloc->k2)
4111 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4114 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4115 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4116 timeDomAlloc->startSymbolAndLength = 66;
4119 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4120 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4121 if(!timeDomAlloc->k2)
4123 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4126 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4127 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4128 timeDomAlloc->startSymbolAndLength = 66;
4133 /*******************************************************************
4135 * @brief Builds BWP UL dedicated PUSCH Config
4139 * Function : BuildBWPUlDedPuschCfg
4142 * Builds BWP UL dedicated PUSCH Config
4144 * @params[in] : PUSCH_Config_t *puschCfg
4146 * @return ROK - success
4149 * ****************************************************************/
4150 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4152 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4153 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4154 if(!puschCfg->dataScramblingIdentityPUSCH)
4156 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4159 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4161 puschCfg->txConfig = NULLP;
4162 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4163 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4164 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4165 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4167 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4171 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4176 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4177 puschCfg->pusch_PowerControl = NULLP;
4178 puschCfg->frequencyHopping = NULLP;
4179 puschCfg->frequencyHoppingOffsetLists = NULLP;
4180 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4182 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4183 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4184 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4185 if(!puschCfg->pusch_TimeDomainAllocationList)
4187 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4191 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4196 puschCfg->pusch_AggregationFactor = NULLP;
4197 puschCfg->mcs_Table = NULLP;
4198 puschCfg->mcs_TableTransformPrecoder = NULLP;
4199 puschCfg->transformPrecoder = NULLP;
4200 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4201 if(!puschCfg->transformPrecoder)
4203 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4206 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4208 puschCfg->codebookSubset = NULLP;
4209 puschCfg->maxRank = NULLP;
4210 puschCfg->rbg_Size = NULLP;
4211 puschCfg->uci_OnPUSCH = NULLP;
4212 puschCfg->tp_pi2BPSK = NULLP;
4217 /*******************************************************************
4219 * @brief Builds BWP UL dedicated PUCCH Config
4223 * Function : BuildBWPUlDedPucchCfg
4226 * Builds BWP UL dedicated PUCCH Config
4228 * @params[in] : PUCCH_Config_t *pucchCfg
4230 * @return ROK - success
4233 * ****************************************************************/
4234 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4236 uint8_t arrIdx, elementCnt;
4237 uint8_t rsrcIdx, rsrcSetIdx;
4238 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4239 PUCCH_Resource_t *rsrc = NULLP;
4243 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4244 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4245 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4246 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4247 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4249 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4252 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4253 rsrcSet->pucch_ResourceSetId = 1;
4255 rsrcSet->resourceList.list.count = elementCnt;
4256 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4257 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4258 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4260 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4263 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4267 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4268 pucchCfg->resourceToAddModList->list.count = elementCnt;
4269 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4270 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4271 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4273 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4276 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4277 rsrc->pucch_ResourceId = 1;
4278 rsrc->startingPRB = 0;
4279 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4280 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4281 rsrc->format.choice.format1->initialCyclicShift = 0;
4282 rsrc->format.choice.format1->nrofSymbols = 4;
4283 rsrc->format.choice.format1->startingSymbolIndex = 0;
4284 rsrc->format.choice.format1->timeDomainOCC = 0;
4287 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4288 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4289 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4290 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4291 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4294 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4295 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4297 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4302 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4303 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4304 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4305 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4307 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4311 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4313 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4314 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4316 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4322 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4323 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4328 /*******************************************************************
4330 * @brief Fills SRS resource to add/modify list
4334 * Function : BuildSrsRsrcAddModList
4336 * Functionality: Fills SRS resource to add/modify list
4339 * @return ROK - success
4342 * ****************************************************************/
4343 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4349 resourceList->list.count = elementCnt;
4350 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4351 resourceList->list.array = NULLP;
4352 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4353 if(!resourceList->list.array)
4355 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4359 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4361 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4362 if(!resourceList->list.array[rsrcIdx])
4364 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4370 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4371 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4372 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4374 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4375 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4376 sizeof(struct SRS_Resource__transmissionComb__n2));
4377 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4379 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4382 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4383 = SRS_COMB_OFFSET_N2;
4384 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4385 = SRS_CYCLIC_SHIFT_N2;
4387 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4388 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4389 SRS_Resource__resourceMapping__nrofSymbols_n1;
4390 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4391 SRS_Resource__resourceMapping__repetitionFactor_n1;
4393 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4394 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4395 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4396 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4397 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4398 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4399 SRS_Resource__groupOrSequenceHopping_neither;
4401 /* Setting resource type to aperiodic for intergration purposes */
4402 resourceList->list.array[rsrcIdx]->resourceType.present = \
4403 SRS_Resource__resourceType_PR_aperiodic;
4404 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4405 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4406 sizeof(struct SRS_Resource__resourceType__aperiodic));
4407 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4409 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4412 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4417 /*******************************************************************
4419 * @brief Build SRS resource set Add/mod list
4423 * Function : BuildSrsRsrcSetAddModList
4425 * Functionality: Build SRS resource set Add/mod list
4428 * @return ROK - success
4431 * ****************************************************************/
4432 uint8_t BuildSrsRsrcSetAddModList
4434 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4440 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4443 rsrcSetList->list.count = elementCnt;
4444 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4445 rsrcSetList->list.array = NULLP;
4446 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4447 if(!rsrcSetList->list.array)
4449 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4453 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4455 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4456 if(!rsrcSetList->list.array[rSetIdx])
4458 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4464 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4466 /* Fill Resource Id list in resource set */
4467 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4468 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4469 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4470 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4472 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4477 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4478 rsrcIdList->list.count = elementCnt;
4479 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4480 rsrcIdList->list.array = NULLP;
4481 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4482 if(!rsrcIdList->list.array)
4484 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4488 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4490 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4491 if(!rsrcIdList->list.array[rsrcIdx])
4493 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4499 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4501 /* Fill resource type */
4502 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4503 SRS_ResourceSet__resourceType_PR_aperiodic;
4505 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4506 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4507 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4508 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4510 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4513 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4514 = APERIODIC_SRS_RESRC_TRIGGER;
4516 /* TODO : Fill values for below IEs as expected by Viavi */
4517 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4518 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4521 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4522 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4523 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4524 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4525 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4530 /*******************************************************************
4532 * @brief Builds BWP UL dedicated SRS Config
4536 * Function : BuildBWPUlDedSrsCfg
4538 * Functionality: Builds BWP UL dedicated SRS Config
4540 * @params[in] SRS Config
4541 * @return ROK - success
4544 * ****************************************************************/
4545 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4547 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4548 srsCfg->srs_ResourceSetToAddModList = NULLP;
4549 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4550 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4551 if(!srsCfg->srs_ResourceSetToAddModList)
4553 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4556 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4561 srsCfg->srs_ResourceToReleaseList = NULLP;
4563 /* Resource to Add/Modify list */
4564 srsCfg->srs_ResourceToAddModList = NULLP;
4565 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4566 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4567 if(!srsCfg->srs_ResourceToAddModList)
4569 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4573 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4578 srsCfg->tpc_Accumulation = NULLP;
4583 /*******************************************************************
4585 * @brief Builds inital UL BWP
4589 * Function : BuildInitialUlBWP
4591 * Functionality: Builds initial UL BWP
4593 * @params[in] BWP_UplinkDedicated_t *ulBwp
4594 * @return ROK - success
4597 * ****************************************************************/
4598 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4600 ulBwp->pucch_Config = NULLP;
4601 ulBwp->pucch_Config = NULLP;
4602 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4603 if(!ulBwp->pucch_Config)
4605 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4609 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4610 ulBwp->pucch_Config->choice.setup = NULLP;
4611 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4612 if(!ulBwp->pucch_Config->choice.setup)
4614 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4618 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4623 /* Fill BWP UL dedicated PUSCH config */
4624 ulBwp->pusch_Config = NULLP;
4625 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4626 if(!ulBwp->pusch_Config)
4628 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4632 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4633 ulBwp->pusch_Config->choice.setup = NULLP;
4634 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4635 if(!ulBwp->pusch_Config->choice.setup)
4637 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4641 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4646 ulBwp->configuredGrantConfig = NULLP;
4648 /* Fill BPW UL dedicated SRS config */
4649 ulBwp->srs_Config = NULLP;
4650 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4651 if(!ulBwp->srs_Config)
4653 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4657 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4658 ulBwp->srs_Config->choice.setup = NULLP;
4659 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4660 if(!ulBwp->srs_Config->choice.setup)
4662 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4666 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4671 ulBwp->beamFailureRecoveryConfig = NULLP;
4676 /*******************************************************************
4678 * @brief Builds Pusch Serving cell Config
4682 * Function : BuildPuschSrvCellCfg
4684 * Functionality: Builds Pusch Serving cell Config
4686 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4688 * @return ROK - success
4691 * ****************************************************************/
4692 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4694 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4695 puschCfg->choice.setup = NULLP;
4696 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4697 if(!puschCfg->choice.setup)
4699 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4703 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4704 puschCfg->choice.setup->rateMatching = NULLP;
4705 puschCfg->choice.setup->xOverhead = NULLP;
4706 puschCfg->choice.setup->ext1 = NULLP;
4707 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4708 if(!puschCfg->choice.setup->ext1)
4710 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4714 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4715 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4716 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4718 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4721 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4723 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4724 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4725 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4727 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4730 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4734 /*******************************************************************
4736 * @brief Builds UL config
4739 * Function : BuildUlCfg
4741 * Functionality: Builds UL config in spCellCfgDed
4743 * @params[in] UplinkConfig_t *ulCfg
4745 * @return ROK - success
4748 * ****************************************************************/
4749 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4751 ulCfg->initialUplinkBWP = NULLP;
4752 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4753 if(!ulCfg->initialUplinkBWP)
4755 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4759 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4764 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4765 ulCfg->uplinkBWP_ToAddModList = NULLP;
4766 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4767 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4768 if(!ulCfg->firstActiveUplinkBWP_Id)
4770 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4773 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4775 ulCfg->pusch_ServingCellConfig = NULLP;
4776 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4777 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4778 if(!ulCfg->pusch_ServingCellConfig)
4780 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4784 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4789 ulCfg->carrierSwitching = NULLP;
4790 ulCfg->ext1 = NULLP;
4794 /*******************************************************************
4796 * @brief Builds PDSCH serving cell config
4799 * Function : BuildPdschSrvCellCfg
4801 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4803 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4805 * @return ROK - success
4808 * ****************************************************************/
4809 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4811 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4812 pdschCfg->choice.setup = NULLP;
4813 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4814 if(!pdschCfg->choice.setup)
4816 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4820 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4821 pdschCfg->choice.setup->xOverhead = NULLP;
4822 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4823 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4824 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4826 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4829 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4830 pdschCfg->choice.setup->pucch_Cell = NULLP;
4831 pdschCfg->choice.setup->ext1 = NULLP;
4836 /*******************************************************************
4838 * @brief Builds CSI Meas config
4841 * Function : BuildCsiMeasCfg
4843 * Functionality: Builds CSI Meas config in spCellCfgDed
4845 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4847 * @return ROK - success
4850 * ****************************************************************/
4851 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4857 /*******************************************************************
4859 * @brief Builds Spcell config dedicated
4862 * Function : BuildSpCellCfgDed
4864 * Functionality: Builds sp cell config dedicated in spCellCfg
4866 * @params[in] ServingCellConfig_t srvCellCfg
4868 * @return ROK - success
4871 * ****************************************************************/
4872 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4874 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4876 srvCellCfg->initialDownlinkBWP = NULLP;
4877 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4878 if(!srvCellCfg->initialDownlinkBWP)
4880 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4884 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4886 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4889 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4890 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4892 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4893 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4894 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4896 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4899 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4901 srvCellCfg->bwp_InactivityTimer = NULLP;
4903 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4904 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4905 if(!srvCellCfg->defaultDownlinkBWP_Id)
4907 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4910 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4912 srvCellCfg->uplinkConfig = NULLP;
4913 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4914 if(!srvCellCfg->uplinkConfig)
4916 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4920 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4922 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4925 srvCellCfg->supplementaryUplink = NULLP;
4926 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4928 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4929 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4930 if(!srvCellCfg->pdsch_ServingCellConfig)
4932 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4936 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4938 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4942 srvCellCfg->csi_MeasConfig = NULLP;
4944 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4945 if(!srvCellCfg->csi_MeasConfig)
4947 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4951 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4953 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4957 srvCellCfg->sCellDeactivationTimer = NULLP;
4958 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4959 srvCellCfg->tag_Id = TAG_ID;
4960 srvCellCfg->dummy = NULLP;
4961 srvCellCfg->pathlossReferenceLinking = NULLP;
4962 srvCellCfg->servingCellMO = NULLP;
4963 srvCellCfg->ext1 = NULLP;
4967 /*******************************************************************
4969 * @brief Builds Spcell config
4973 * Function : BuildSpCellCfg
4975 * Functionality: Builds sp cell config in DuToCuRrcContainer
4977 * @params[in] SpCellConfig_t spCellCfg
4979 * @return ROK - success
4982 * ****************************************************************/
4983 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4986 spCellCfg->servCellIndex = NULLP;
4987 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4988 if(!spCellCfg->servCellIndex)
4990 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4993 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4995 spCellCfg->reconfigurationWithSync = NULLP;
4996 spCellCfg->rlf_TimersAndConstants = NULLP;
4997 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4998 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4999 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5001 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5004 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5006 spCellCfg->spCellConfigDedicated = NULLP;
5007 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5008 if(!spCellCfg->spCellConfigDedicated)
5010 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5013 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5015 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5020 /*******************************************************************
5022 * @brief Builds Phy cell group config
5026 * Function : BuildPhyCellGrpCfg
5028 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5030 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5032 * @return ROK - success
5035 * ****************************************************************/
5036 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5038 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5039 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5041 phyCellGrpCfg->p_NR_FR1 = NULLP;
5042 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5043 if(!phyCellGrpCfg->p_NR_FR1)
5045 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5048 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5049 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5050 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5051 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5052 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5053 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5054 phyCellGrpCfg->cs_RNTI = NULLP;
5055 phyCellGrpCfg->ext1 = NULLP;
5056 phyCellGrpCfg->ext2 = NULLP;
5061 /*******************************************************************
5063 * @brief Builds tag config
5067 * Function : BuildTagConfig
5069 * Functionality: Builds tag config in MacCellGroupConfig
5071 * @params[in] TAG_Config *tag_Config
5073 * @return ROK - success
5076 * ****************************************************************/
5077 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5079 struct TAG_Config__tag_ToAddModList *tagList;
5080 uint8_t idx, elementCnt;
5082 tagConfig->tag_ToReleaseList = NULLP;
5083 tagConfig->tag_ToAddModList = NULLP;
5084 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5085 if(!tagConfig->tag_ToAddModList)
5087 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5091 elementCnt = 1; //ODU_VALUE_ONE;
5092 tagList = tagConfig->tag_ToAddModList;
5093 tagList->list.count = elementCnt;
5094 tagList->list.size = elementCnt * sizeof(struct TAG *);
5096 tagList->list.array = NULLP;
5097 CU_ALLOC(tagList->list.array, tagList->list.size);
5098 if(!tagList->list.array)
5100 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5104 for(idx=0; idx<tagList->list.count; idx++)
5106 tagList->list.array[idx] = NULLP;
5107 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5108 if(!tagList->list.array[idx])
5110 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5116 tagList->list.array[idx]->tag_Id = TAG_ID;
5117 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5122 /*******************************************************************
5124 * @brief Builds PHR Config
5128 * Function : BuildPhrConfig
5130 * Functionality: Builds phrConfig in MacCellGroupConfig
5132 * @params[in] PHR Config *
5134 * @return ROK - success
5137 * ****************************************************************/
5138 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5141 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5142 phrConfig->choice.setup = NULLP;
5143 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5144 if(!phrConfig->choice.setup)
5146 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5150 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5151 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5152 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5153 phrConfig->choice.setup->multiplePHR = false;
5154 phrConfig->choice.setup->dummy = false;
5155 phrConfig->choice.setup->phr_Type2OtherCell = false;
5156 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5161 /*******************************************************************
5163 * @brief Builds BSR Config
5167 * Function : BuildBsrConfig
5169 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5171 * @params[in] BSR_Config *bsrConfig
5173 * @return ROK - success
5176 * ****************************************************************/
5177 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5179 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5180 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5181 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5186 /*******************************************************************
5188 * @brief Builds scheduling request config
5192 * Function : BuildSchedulingReqConfig
5194 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5196 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5198 * @return ROK - success
5201 * ****************************************************************/
5202 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5204 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5205 uint8_t idx, elementCnt;
5207 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5208 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5209 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5210 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5212 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5216 elementCnt = 1; //ODU_VALUE_ONE;
5217 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5218 schReqList->list.count = elementCnt;
5219 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5221 schReqList->list.array = NULLP;
5222 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5223 if(!schReqList->list.array)
5225 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5229 for(idx=0;idx<schReqList->list.count; idx++)
5231 schReqList->list.array[idx] = NULLP;
5232 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5233 if(!schReqList->list.array[idx])
5235 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5241 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5243 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5244 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5245 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5247 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5250 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5251 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5252 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5256 /*******************************************************************
5258 * @brief Builds Mac cell group config
5262 * Function : BuildMacCellGrpCfg
5264 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5266 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5268 * @return ROK - success
5271 * ****************************************************************/
5272 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5274 macCellGrpCfg->drx_Config = NULLP;
5275 macCellGrpCfg->schedulingRequestConfig = NULLP;
5276 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5277 if(!macCellGrpCfg->schedulingRequestConfig)
5279 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5283 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5285 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5289 macCellGrpCfg->bsr_Config = NULLP;
5290 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5291 if(!macCellGrpCfg->bsr_Config)
5293 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5297 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5299 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5303 macCellGrpCfg->tag_Config = NULLP;
5304 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5305 if(!macCellGrpCfg->tag_Config)
5307 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5311 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5313 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5317 macCellGrpCfg->phr_Config = NULLP;
5318 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5319 if(!macCellGrpCfg->phr_Config)
5321 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5325 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5327 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5331 macCellGrpCfg->skipUplinkTxDynamic = false;
5332 macCellGrpCfg->ext1 = NULLP;
5336 /*******************************************************************
5338 * @brief Frees memeory allocated for SearchSpcToAddModList
5342 * Function : FreeSearchSpcToAddModList
5344 * Functionality: Deallocating memory of SearchSpcToAddModList
5346 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5350 4221 * ****************************************************************/
5351 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5355 struct SearchSpace *searchSpc=NULLP;
5357 if(searchSpcList->list.array)
5359 if(searchSpcList->list.array[idx2])
5361 searchSpc = searchSpcList->list.array[idx2];
5362 if(searchSpc->controlResourceSetId)
5364 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5366 if(searchSpc->monitoringSymbolsWithinSlot)
5368 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5370 if(searchSpc->nrofCandidates)
5372 if(searchSpc->searchSpaceType)
5374 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5375 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5376 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5377 SearchSpace__searchSpaceType));
5379 CU_FREE(searchSpc->nrofCandidates,
5380 sizeof(struct SearchSpace__nrofCandidates));
5382 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5383 searchSpc->monitoringSymbolsWithinSlot->size);
5385 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5386 sizeof(BIT_STRING_t));
5388 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5389 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5391 CU_FREE(searchSpc->controlResourceSetId,
5392 sizeof(ControlResourceSetId_t));
5395 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5397 CU_FREE(searchSpcList->list.array[idx1],
5398 sizeof(struct SearchSpace));
5400 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5403 /*******************************************************************
5405 * @brief Frees memory allocated for PdschTimeDomAllocList
5409 * Function : FreePdschTimeDomAllocList
5411 * Functionality: Deallocating memory of PdschTimeDomAllocList
5413 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5417 4221 * ****************************************************************/
5418 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5422 if(timeDomAllocList->choice.setup)
5424 if(timeDomAllocList->choice.setup->list.array)
5426 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5428 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5429 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5431 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5432 timeDomAllocList->choice.setup->list.size);
5434 CU_FREE(timeDomAllocList->choice.setup,\
5435 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5438 /*******************************************************************
5440 * @brief Frees memory allocated for PuschTimeDomAllocList
5444 * Function : FreePuschTimeDomAllocList
5446 * Functionality: Deallocating memory of PuschTimeDomAllocList
5448 * @params[in] PUSCH_Config_t *puschCfg
5452 ***********************************************************************/
5453 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5457 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5459 if(puschCfg->pusch_TimeDomainAllocationList)
5461 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5462 if(timeDomAllocList_t->choice.setup)
5464 if(timeDomAllocList_t->choice.setup->list.array)
5466 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5467 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5469 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5470 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5472 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5473 timeDomAllocList_t->choice.setup->list.size);
5475 CU_FREE(timeDomAllocList_t->choice.setup, \
5476 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5478 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5479 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5480 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5485 /*******************************************************************
5487 * @brief Frees memory allocated for Dedicated PUCCH config
5491 * Function : FreeBWPUlDedPucchCfg
5493 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5495 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5499 * ****************************************************************/
5500 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5502 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5503 PUCCH_Config_t *pucchCfg = NULLP;
5504 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5505 PUCCH_Resource_t *rsrc = NULLP;
5509 if(ulBwpPucchCfg->choice.setup)
5511 pucchCfg = ulBwpPucchCfg->choice.setup;
5513 //Free resource set list
5514 if(pucchCfg->resourceSetToAddModList)
5516 if(pucchCfg->resourceSetToAddModList->list.array)
5518 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5520 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5521 if(rsrcSet->resourceList.list.array)
5523 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5525 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5527 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5529 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5531 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5533 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5536 //Free resource list
5537 if(pucchCfg->resourceToAddModList)
5539 if(pucchCfg->resourceToAddModList->list.array)
5541 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5543 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5544 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5545 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5547 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5549 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5553 if(pucchCfg->format1)
5555 if(pucchCfg->format1->choice.setup)
5557 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5558 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5560 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5564 if(pucchCfg->dl_DataToUL_ACK)
5566 if(pucchCfg->dl_DataToUL_ACK->list.array)
5568 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5570 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5572 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5574 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5577 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5579 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5583 /*******************************************************************
5585 * @brief Frees memory allocated for InitialUlBWP
5589 * Function : FreeInitialUlBWP
5591 * Functionality: Deallocating memory of InitialUlBWP
5593 * @params[in] BWP_UplinkDedicated_t *ulBwp
5597 * ****************************************************************/
5598 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5600 uint8_t rSetIdx, rsrcIdx;
5601 SRS_Config_t *srsCfg = NULLP;
5602 PUSCH_Config_t *puschCfg = NULLP;
5603 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5604 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5605 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5606 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5608 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5610 if(ulBwp->pusch_Config)
5612 if(ulBwp->pusch_Config->choice.setup)
5614 puschCfg=ulBwp->pusch_Config->choice.setup;
5615 if(puschCfg->dataScramblingIdentityPUSCH)
5617 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5619 FreePuschTimeDomAllocList(puschCfg);
5620 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5621 if(dmrsUlCfg->choice.setup)
5623 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5625 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5627 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5629 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5630 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5632 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5635 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5637 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5638 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5640 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5642 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5644 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5646 /* Free SRS-Config */
5647 if(ulBwp->srs_Config)
5649 if(ulBwp->srs_Config->choice.setup)
5651 srsCfg = ulBwp->srs_Config->choice.setup;
5653 /* Free Resource Set to add/mod list */
5654 if(srsCfg->srs_ResourceSetToAddModList)
5656 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5657 if(rsrcSetList->list.array)
5661 /* Free SRS resource Id list in this SRS resource set */
5662 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5664 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5666 if(rsrcIdList->list.array)
5668 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5670 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5672 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5674 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5675 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5678 /* Free resource type info for this SRS resource set */
5679 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5680 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5682 /* Free memory for each resource set */
5683 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5685 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5687 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5689 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5690 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5693 /* Free resource to add/modd list */
5694 if(srsCfg->srs_ResourceToAddModList)
5696 resourceList = srsCfg->srs_ResourceToAddModList;
5697 if(resourceList->list.array)
5700 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5701 sizeof(struct SRS_Resource__transmissionComb__n2));
5702 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5703 sizeof(struct SRS_Resource__resourceType__aperiodic));
5705 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5707 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5709 CU_FREE(resourceList->list.array, resourceList->list.size);
5711 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5712 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5715 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5717 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5721 /*******************************************************************
5723 * @brief Frees memory allocated for initialUplinkBWP
5727 * Function : FreeinitialUplinkBWP
5729 * Functionality: Deallocating memory of initialUplinkBWP
5731 * @params[in] UplinkConfig_t *ulCfg
5736 * ****************************************************************/
5737 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5739 BWP_UplinkDedicated_t *ulBwp=NULLP;
5740 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5742 if(ulCfg->initialUplinkBWP)
5744 ulBwp=ulCfg->initialUplinkBWP;
5745 if(ulCfg->firstActiveUplinkBWP_Id)
5747 if(ulCfg->pusch_ServingCellConfig)
5749 puschCfg=ulCfg->pusch_ServingCellConfig;
5750 if(puschCfg->choice.setup)
5752 if(puschCfg->choice.setup->ext1)
5754 CU_FREE(puschCfg->choice.setup->ext1->\
5755 processingType2Enabled,sizeof(BOOLEAN_t));
5756 CU_FREE(puschCfg->choice.setup->ext1->\
5757 maxMIMO_Layers,sizeof(long));
5758 CU_FREE(puschCfg->choice.setup->ext1, \
5759 sizeof(struct PUSCH_ServingCellConfig__ext1));
5761 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5763 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5765 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5767 FreeInitialUlBWP(ulBwp);
5768 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5771 /*******************************************************************
5773 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5777 * Function : FreeBWPDlDedPdschCfg
5779 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5781 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5786 * ****************************************************************/
5787 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5789 struct PDSCH_Config *pdschCfg=NULLP;
5790 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5791 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5792 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5794 if(dlBwp->pdsch_Config->choice.setup)
5796 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5797 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5799 if(pdschCfg->pdsch_TimeDomainAllocationList)
5801 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5802 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5804 prbBndlType=&pdschCfg->prb_BundlingType;
5805 CU_FREE(prbBndlType->choice.staticBundling,\
5806 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5807 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5809 FreePdschTimeDomAllocList(timeDomAllocList);
5810 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5811 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5813 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5814 if(dmrsDlCfg->choice.setup)
5816 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5818 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5820 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5821 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5823 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5826 /*******************************************************************
5828 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5832 * Function : FreeBWPDlDedPdcchCfg
5834 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5836 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5841 * ****************************************************************/
5842 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5846 struct PDCCH_Config *pdcchCfg=NULLP;
5847 struct ControlResourceSet *controlRSet=NULLP;
5848 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5850 if(dlBwp->pdcch_Config->choice.setup)
5852 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5853 if(pdcchCfg->controlResourceSetToAddModList)
5855 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5856 if(controlRSetList->list.array)
5858 controlRSet = controlRSetList->list.array[idx2];
5861 if(controlRSet->frequencyDomainResources.buf)
5863 if(controlRSet->pdcch_DMRS_ScramblingID)
5865 if(pdcchCfg->searchSpacesToAddModList)
5867 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5868 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5869 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5871 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5873 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5874 controlRSet->frequencyDomainResources.size);
5877 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5879 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5881 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5883 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5884 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5886 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5889 /*******************************************************************
5891 * @brief Builds RLC Config
5895 * Function : BuildRlcConfig
5897 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5899 * @params[in] RLC_Config *rlcConfig
5901 * @return ROK - success
5904 * ****************************************************************/
5905 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
5907 rlcConfig->present = rlcLcCfgDb.rlcMode;
5909 switch(rlcConfig->present)
5911 case RLC_Config_PR_am:
5913 rlcConfig->choice.am = NULLP;
5914 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5915 if(!rlcConfig->choice.am)
5917 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5922 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5923 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5924 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5926 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5929 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
5930 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
5931 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
5932 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
5933 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
5936 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5937 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5938 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5940 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5943 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
5944 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
5945 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
5950 case RLC_Config_PR_um_Bi_Directional:
5952 rlcConfig->choice.um_Bi_Directional = NULLP;
5953 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
5954 if(!rlcConfig->choice.um_Bi_Directional)
5956 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5961 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
5962 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5963 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
5965 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5968 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
5971 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
5972 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5973 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
5975 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5978 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
5979 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
5986 /*******************************************************************
5988 * @brief Builds MAC LC Config
5992 * Function : BuildMacLCConfig
5994 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5996 * @params[in] struct LogicalChannelConfig macLcConfig
5998 * @return ROK - success
6001 * ****************************************************************/
6002 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6005 macLcConfig->ul_SpecificParameters = NULLP;
6006 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6007 if(!macLcConfig->ul_SpecificParameters)
6009 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6013 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6014 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6015 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6016 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6017 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6018 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6019 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6021 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6022 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6023 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6025 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6028 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6030 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6031 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6032 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6034 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6037 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6039 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6040 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6041 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6045 /*******************************************************************
6047 * @brief Builds RLC Bearer to Add/Mod list
6051 * Function :BuildRlcBearerToAddModList
6053 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6055 * @params[in] rlc_BearerToAddModList
6057 * @return ROK - success
6060 * ****************************************************************/
6061 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6063 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6066 elementCnt = ueCb->numSrb + ueCb->numDrb;
6069 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6071 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6075 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6077 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6084 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6087 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6090 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6093 rlcBearerList->list.count = elementCnt;
6094 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6096 rlcBearerList->list.array = NULLP;
6097 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6098 if(!rlcBearerList->list.array)
6100 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6104 for(idx=0; idx<rlcBearerList->list.count; idx++)
6106 rlcBearerList->list.array[idx] = NULLP;
6107 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6108 if(!rlcBearerList->list.array[idx])
6110 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6117 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6119 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6122 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6124 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6125 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6127 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6131 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6132 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6134 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6135 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6136 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6137 if(!rlcBearerList->list.array[idx]->rlc_Config)
6139 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6143 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6145 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6149 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6150 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6151 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6153 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6157 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6159 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6165 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6167 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6170 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6172 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6173 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6175 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6179 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6180 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6182 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6183 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6184 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6185 if(!rlcBearerList->list.array[idx]->rlc_Config)
6187 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6191 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6193 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6197 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6198 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6199 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6201 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6205 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6207 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6215 /*******************************************************************
6217 * @brief Free memory allocated for CellGroupConfig
6221 * Function : FreeMemCellGrpCfg
6223 * Functionality: Deallocating memory of CellGroupConfig
6225 * @params[in] pointer to CellGroupConfigRrc_t
6227 * @return ROK - success
6230 ******************************************************************/
6231 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6234 SpCellConfig_t *spCellCfg=NULLP;
6235 ServingCellConfig_t *srvCellCfg=NULLP;
6236 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6237 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6238 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6239 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6240 struct RLC_Config *rlcConfig=NULLP;
6241 struct LogicalChannelConfig *macLcConfig=NULLP;
6242 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6243 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6244 struct TAG_Config *tagConfig=NULLP;
6245 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6246 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6247 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6249 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6252 if(rlcBearerList->list.array)
6254 for(idx=0; idx<rlcBearerList->list.count; idx++)
6256 if(rlcBearerList->list.array[idx])
6258 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6259 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6262 if(rlcConfig->choice.am)
6264 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6265 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6266 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6268 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6270 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6273 if(macLcConfig->ul_SpecificParameters)
6275 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6276 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6277 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6279 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6281 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6284 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6286 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6289 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6292 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6293 if(schedulingRequestConfig)
6295 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6298 if(schReqList->list.array)
6300 for(idx=0;idx<schReqList->list.count; idx++)
6302 if(schReqList->list.array[idx])
6304 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6305 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6308 CU_FREE(schReqList->list.array, schReqList->list.size);
6310 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6311 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6312 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6314 if(macCellGrpCfg->bsr_Config)
6316 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6318 tagConfig = macCellGrpCfg->tag_Config;
6321 tagList = tagConfig->tag_ToAddModList;
6324 if(tagList->list.array)
6326 for(idx=0; idx<tagList->list.count; idx++)
6328 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6330 CU_FREE(tagList->list.array, tagList->list.size);
6332 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6334 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6337 phrConfig = macCellGrpCfg->phr_Config;
6340 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6341 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6344 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6347 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6350 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6351 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6354 spCellCfg = cellGrpCfg->spCellConfig;
6357 if(spCellCfg->servCellIndex)
6359 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6361 if(spCellCfg->spCellConfigDedicated)
6363 srvCellCfg = spCellCfg->spCellConfigDedicated;
6364 if(srvCellCfg->initialDownlinkBWP)
6366 dlBwp = srvCellCfg->initialDownlinkBWP;
6367 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6369 if(srvCellCfg->defaultDownlinkBWP_Id)
6371 if(srvCellCfg->uplinkConfig)
6373 if(srvCellCfg->pdsch_ServingCellConfig)
6375 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6376 if(pdschCfg->choice.setup)
6378 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6379 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6381 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6382 ServingCellConfig__pdsch_ServingCellConfig));
6384 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6385 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6387 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6389 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6391 if(dlBwp->pdcch_Config)
6393 if(dlBwp->pdsch_Config)
6395 FreeBWPDlDedPdschCfg(dlBwp);
6396 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6398 FreeBWPDlDedPdcchCfg(dlBwp);
6399 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6401 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6403 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6405 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6407 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6409 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6414 /*******************************************************************
6416 * @brief Fills CellGroupConfig
6420 * Function : fillCellGrpCfg
6422 * Functionality: Fills CellGroupConfig
6424 * @params[in] pointer to CellGroupConfigRrc_t
6426 * @return ROK - success
6429 ******************************************************************/
6431 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6433 uint8_t ret = RFAILED;
6434 CellGroupConfigRrc_t cellGrpCfg;
6435 asn_enc_rval_t encRetVal;
6439 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6441 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6443 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6445 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6449 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6450 cellGrpCfg.mac_CellGroupConfig = NULLP;
6451 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6452 if(!cellGrpCfg.mac_CellGroupConfig)
6454 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6457 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6459 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6463 cellGrpCfg.physicalCellGroupConfig = NULLP;
6464 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6465 if(!cellGrpCfg.physicalCellGroupConfig)
6467 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6470 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6472 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6476 cellGrpCfg.spCellConfig = NULLP;
6477 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6478 if(!cellGrpCfg.spCellConfig)
6480 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6483 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6485 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6489 cellGrpCfg.sCellToAddModList = NULLP;
6490 cellGrpCfg.sCellToReleaseList = NULLP;
6491 cellGrpCfg.ext1 = NULLP;
6493 /* encode cellGrpCfg into duToCuRrcContainer */
6494 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6495 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6497 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6498 /* Encode results */
6499 if(encRetVal.encoded == ENCODE_FAIL)
6501 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6502 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6507 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6508 for(int i=0; i< encBufSize; i++)
6510 DU_LOG("%x",encBuf[i]);
6514 cellGrp->size = encBufSize;
6515 CU_ALLOC(cellGrp->buf, cellGrp->size);
6518 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6521 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6525 FreeMemCellGrpCfg(&cellGrpCfg);
6529 /*******************************************************************
6531 * @brief Free UE Capability RAT container
6535 * Function : freeUeCapRatCont
6538 * Free UE Capability RAT conatiner
6541 * @return ROK - success
6544 * ****************************************************************/
6545 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6548 FeatureSets_t *featureSets;
6550 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6552 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6554 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6555 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6557 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6560 if(ueNrCap->featureSets)
6562 featureSets = ueNrCap->featureSets;
6563 if(featureSets->featureSetsDownlinkPerCC)
6565 if(featureSets->featureSetsDownlinkPerCC->list.array)
6567 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6569 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6570 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6571 sizeof(ModulationOrder_t));
6572 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6574 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6576 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6579 if(featureSets->featureSetsUplinkPerCC)
6581 if(featureSets->featureSetsUplinkPerCC->list.array)
6583 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6585 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6587 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6588 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6589 sizeof(ModulationOrder_t));
6590 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6593 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6595 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6597 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6601 /*******************************************************************
6603 * @brief Free UE capability RAT container list
6607 * Function : freeUeCapRatContList
6609 * Functionality: Free UE capability RAT container list
6612 * @return ROK - success
6615 * ****************************************************************/
6616 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6619 if(ueCapablityList->list.array)
6621 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6623 if(ueCapablityList->list.array[idx])
6624 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6626 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6630 /*******************************************************************
6632 * @brief Free Handover preparation information
6636 * Function : freeHOPreparationInfo
6638 * Functionality: Free Handover preparation information
6641 * @return ROK - success
6644 * ****************************************************************/
6645 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6647 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6649 if(hoPrep->criticalExtensions.choice.c1)
6651 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6653 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6654 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6655 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6656 sizeof(HandoverPreparationInformationRrc_IEs_t));
6658 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6662 /*******************************************************************
6664 * @brief Fill feature sets
6668 * Function : fillFeatureSets
6670 * Functionality: Fill feature sets
6673 * @return ROK - success
6676 * ****************************************************************/
6677 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6679 uint8_t idx, elementCnt;
6681 featureSets->featureSetsDownlink = NULLP;
6682 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6683 if(!featureSets->featureSetsDownlinkPerCC)
6685 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6690 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6691 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6692 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6693 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6695 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6699 for(idx = 0; idx < elementCnt; idx++)
6701 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6702 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6704 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6710 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6711 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6712 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6713 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6714 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6716 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6717 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6719 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6722 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6724 featureSets->featureSetsUplink = NULLP;
6725 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6726 if(!featureSets->featureSetsUplinkPerCC)
6728 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6733 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6734 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6735 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6736 if(!featureSets->featureSetsUplinkPerCC->list.array)
6738 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6742 for(idx = 0; idx < elementCnt; idx++)
6744 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6745 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6747 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6753 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6754 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6755 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6756 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6757 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6758 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6760 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6761 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6763 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6766 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6771 /*******************************************************************
6773 * @brief Fill UE capability RAT container
6777 * Function : fillUeCapRatCont
6779 * Functionality: Fill UE capability RAT container
6781 * @params[in] UE Capability RAT container buffer
6782 * @return ROK - success
6785 * ****************************************************************/
6786 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6789 uint8_t idx, elementCnt;
6790 asn_enc_rval_t encRetVal;
6791 UE_NR_Capability_t ueNrCap;
6795 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6797 /* Filling PDCP parameters */
6798 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6799 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6800 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6801 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6802 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6803 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6804 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6805 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6806 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6807 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6808 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6809 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6810 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6811 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6812 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6813 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6814 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6816 ueNrCap.rlc_Parameters = NULLP;
6817 ueNrCap.mac_Parameters = NULLP;
6819 /* Filling PHY parameters */
6820 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6821 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6822 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6823 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6824 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6826 /* Filling RF parameters */
6828 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6829 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6830 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6831 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6833 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6838 for(idx = 0; idx < elementCnt; idx++)
6840 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6841 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6851 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6852 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6853 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6855 ueNrCap.measAndMobParameters = NULLP;
6856 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6857 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6858 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6859 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6860 ueNrCap.featureSets = NULLP;
6862 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6863 if(!ueNrCap.featureSets)
6865 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6870 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6872 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6877 ueNrCap.featureSetCombinations = NULLP;
6878 ueNrCap.lateNonCriticalExtension = NULLP;
6879 ueNrCap.nonCriticalExtension = NULLP;
6881 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6882 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6883 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6885 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6887 /* Encode results */
6888 if(encRetVal.encoded == ENCODE_FAIL)
6890 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6891 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6896 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6897 for(int i=0; i< encBufSize; i++)
6899 DU_LOG("%x",encBuf[i]);
6903 ueCapRatContBuf->size = encBufSize;
6904 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6905 if(!ueCapRatContBuf->buf)
6907 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6910 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6914 freeUeCapRatCont(&ueNrCap);
6918 /*******************************************************************
6920 * @brief Fill UE Capability RAT container list
6924 * Function : fillUeCapRatContList
6926 * Functionality: Fill UE Capability RAT container list
6929 * @params[in] UE capability RAT container list
6930 * @return ROK - success
6933 * ****************************************************************/
6934 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6936 uint8_t ret = RFAILED;
6937 uint8_t idx, elementCnt;
6942 ueCapablityList->list.count = elementCnt;
6943 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6945 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
6946 if(!ueCapablityList->list.array)
6948 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6953 for(idx=0; idx<elementCnt; idx++)
6955 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6956 if(ueCapablityList->list.array[idx] == NULLP)
6958 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6964 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
6965 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
6967 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
6978 /*******************************************************************
6980 * @brief Fill UE Capability RAT container list octet string
6984 * Function : fillUeCapRatContListBuf
6986 * Functionality: Fill UE Capability RAT container list octet string
6989 * @params[in] UE capability RAT container list buffer
6990 * @return ROK - success
6993 * ****************************************************************/
6994 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6996 uint8_t ret = RFAILED;
6997 asn_enc_rval_t encRetVal;
6998 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7002 ret = fillUeCapRatContList(&ueCapablityList);
7005 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7009 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7010 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7011 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7013 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7014 &ueCapablityList, PrepFinalEncBuf, encBuf);
7016 /* Encode results */
7017 if(encRetVal.encoded == ENCODE_FAIL)
7019 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7020 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7025 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7026 for(int i=0; i< encBufSize; i++)
7028 DU_LOG("%x",encBuf[i]);
7032 ueCapablityListBuf->size = encBufSize;
7033 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7034 if(!ueCapablityListBuf->buf)
7036 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7039 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7043 freeUeCapRatContList(&ueCapablityList);
7047 /*******************************************************************
7049 * @brief Free Measurement Timing Configuration
7053 * Function : freeMeasuementTimingConfig
7055 * Functionality: Free Measurement Timing Configuration
7057 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7060 * ****************************************************************/
7061 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7064 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7065 MeasTiming_t *measTiming = NULLP;
7067 if(measTimingConfig.criticalExtensions.choice.c1)
7069 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7071 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7072 if(measTimingCfg->measTiming)
7074 if(measTimingCfg->measTiming->list.array)
7076 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7078 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7079 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7080 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7082 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7084 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7086 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7088 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7092 /*******************************************************************
7094 * @brief Fill Measurement Timing Configuration
7098 * Function : fillMeasTimingCfg
7100 * Functionality: Fill Measurement Timing Configuration
7102 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7103 * @return ROK - success
7106 * ****************************************************************/
7107 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7109 uint8_t elementCnt = 0;
7110 uint8_t measCfgIdx = 0;
7111 MeasTiming_t *measTiming;
7114 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7115 if(!measTimingCfg->measTiming)
7117 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7122 measTimingCfg->measTiming->list.count = elementCnt;
7123 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7124 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7125 if(!measTimingCfg->measTiming->list.array)
7127 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7131 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7133 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7134 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7136 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7142 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7143 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7144 if(!measTiming->frequencyAndTiming)
7146 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7150 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7151 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7153 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7154 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7155 smtc->periodicityAndOffset.choice.sf20 = 0;
7156 smtc->duration = SSB_MTC__duration_sf1;
7160 /*******************************************************************
7162 * @brief Fill Measurement Timing Configuration Octet string
7166 * Function : fillMeasConfigBuf
7168 * Functionality: Fill Measurement Timing Configuration Octet string
7171 * @params[in] MeasConfig_t *measConfgBuf
7172 * @return ROK - success
7175 * ****************************************************************/
7176 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7178 uint8_t ret = RFAILED;
7179 asn_enc_rval_t encRetVal;
7180 MeasurementTimingConfigurationRrc_t measTimingConfig;
7184 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7185 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7186 if(!measTimingConfig.criticalExtensions.choice.c1)
7188 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7191 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7193 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7194 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7196 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7200 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7203 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7207 /* Encode measurement timing configuration into octet string */
7208 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7209 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7211 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7213 /* Encode results */
7214 if(encRetVal.encoded == ENCODE_FAIL)
7216 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7217 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7222 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7223 for(int i=0; i< encBufSize; i++)
7225 DU_LOG("%x",encBuf[i]);
7229 measTimingConfigBuf->size = encBufSize;
7230 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7231 if(!measTimingConfigBuf->buf)
7233 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7236 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7240 freeMeasuementTimingConfig(measTimingConfig);
7244 /******************************************************************
7246 * @brief Free RRC reconfiguration non-critical extension
7250 * Function : freeRrcReconfigNonCriticalExt
7252 * Functionality: Free RRC reconfiguration non-critical extension
7254 * @params[in] RRC reconfiguration IE
7257 * ****************************************************************/
7258 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7260 if(rrcRecfg->masterCellGroup)
7262 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7266 /******************************************************************
7268 * @brief Free measurement object addmod list
7272 * Function : freeMeasObjToAddModList
7274 * Functionality: Free measurement object add mod list
7276 * @params[in] Measurement object add/mod list
7279 * ****************************************************************/
7280 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7283 MeasObjectNR_t *measObject;
7285 if(measObjList->list.array)
7287 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7289 if(measObjList->list.array[objIdx])
7291 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7293 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7294 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7295 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7296 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7297 if(measObject->absThreshSS_BlocksConsolidation)
7299 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7300 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7301 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7302 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7304 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7305 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7306 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7307 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7308 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7310 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7313 CU_FREE(measObjList->list.array, measObjList->list.size);
7317 /******************************************************************
7319 * @brief Free report config add mod list
7323 * Function : freeReportCfgToAddModList
7325 * Functionality: Free report config add mod list
7327 * @params[in] Report config list
7330 * ****************************************************************/
7331 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7333 uint8_t reportCfgIdx;
7334 ReportConfigToAddMod_t *reportCfg;
7335 ReportConfigNR_t *reportCfgNr;
7336 EventTriggerConfig_t *eventTriggCfg;
7338 if(reportCfgList->list.array)
7340 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7342 if(reportCfgList->list.array[reportCfgIdx])
7344 reportCfg = reportCfgList->list.array[reportCfgIdx];
7345 if(reportCfg->reportConfig.choice.reportConfigNR)
7347 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7348 if(reportCfgNr->reportType.choice.eventTriggered)
7350 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7351 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7352 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7353 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7354 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7358 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7360 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7364 /******************************************************************
7366 * @brief Free measurement id to add mod list
7370 * Function : freeMeasIdToAddModList
7372 * Functionality: Free measurement id to add mod list
7374 * @params[in] Measurement id to add mod list
7377 * ****************************************************************/
7378 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7381 if(measIdList->list.array)
7383 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7385 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7387 CU_FREE(measIdList->list.array, measIdList->list.size);
7391 /*******************************************************************
7393 * @brief Free quantity config
7397 * Function : freeQunatityConfig
7399 * Functionality: Free quantity config
7401 * @params[in] Quantity Config
7404 * ****************************************************************/
7405 uint8_t freeQuantityConfig(QuantityConfig_t *quantityCfg)
7408 QuantityConfigNR_t *quantityCfgNr;
7410 if(quantityCfg->quantityConfigNR_List)
7412 if(quantityCfg->quantityConfigNR_List->list.array)
7414 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7416 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7418 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7419 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7420 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7421 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7422 if(quantityCfgNr->quantityConfigRS_Index)
7424 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7425 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7426 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7427 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7429 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7432 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7434 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7438 /******************************************************************
7440 * @brief Free measurement Config
7444 * Function : freeMeasConfig
7446 * Functionality: Free measurement config
7448 * @params[in] Measurement config
7451 * ****************************************************************/
7452 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7454 if(measConfig->measObjectToAddModList)
7456 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7457 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7459 if(measConfig->reportConfigToAddModList)
7461 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7462 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7464 if(measConfig->measIdToAddModList)
7466 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7467 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7469 if(measConfig->s_MeasureConfig)
7471 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7473 if(measConfig->quantityConfig)
7475 freeQuantityConfig(measConfig->quantityConfig);
7476 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7479 /******************************************************************
7481 * @brief Free DRB to AddMod List
7485 * Function : freeDrbToAddModList
7487 * Functionality: Free SRB to AddMod List
7489 * @params[in] SBR to add/mod list
7492 * ****************************************************************/
7493 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7496 if(drbToAddList->list.array)
7498 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7500 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7502 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7504 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7505 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7506 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7507 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7509 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7510 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7512 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7514 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7518 /******************************************************************
7520 * @brief Free SRB to AddMod List
7524 * Function : freeSrbToAddModList
7526 * Functionality: Free SRB to AddMod List
7528 * @params[in] SBR to add/mod list
7531 * ****************************************************************/
7532 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7535 if(srbToAddList->list.array)
7537 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7539 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7540 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7542 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7543 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7546 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7548 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7552 /******************************************************************
7554 * @brief Free Radio Bearer Config
7558 * Function : fillRadioBearerConfig
7560 * Functionality: Free Radio Bearer config
7562 * @params[in] Radio bearer config
7565 * ****************************************************************/
7566 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7568 if(radioBearerConfig->srb_ToAddModList)
7570 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7571 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7573 if(radioBearerConfig->drb_ToAddModList)
7575 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7576 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7580 /******************************************************************
7582 * @brief Free reconfiguration message
7586 * Function : freeRrcReconfig
7588 * Functionality: Free reconfiguration message
7590 * @params[in] RRC Reconfiguration message
7593 * ****************************************************************/
7594 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7596 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7598 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7600 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7601 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7603 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7605 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7606 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7608 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7610 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7611 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7613 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7617 /******************************************************************
7619 * @brief Fill SRB To Add Mod list
7623 * Function : fillSrbToAddModList
7625 * Functionality: fill SRB to Add Mod list
7627 * @params[in] UE control block
7628 * SRB to Add/Mod list
7629 * @return ROK - success
7632 * ****************************************************************/
7633 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7635 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7638 elementCnt = ueCb->numSrb;
7641 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7643 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7650 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7654 CU_ALLOC(srbToAddList, sizeof(SRB_ToAddModList_t));
7657 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
7660 srbToAddList->list.count = elementCnt;
7661 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7663 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7664 if(!srbToAddList->list.array)
7666 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7671 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7673 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7676 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7677 if(!srbToAddList->list.array[srbIdx])
7679 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7683 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7685 /* Reestablish PDCP */
7686 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7687 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7689 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7692 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7694 /* PDCP configuration */
7695 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7696 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7698 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7702 /* Reordering timer */
7703 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7704 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7706 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7709 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7716 /******************************************************************
7718 * @biief Fill DRBeTo Add Mod list
7722 * Function : fillDrbToAddModList
7724 * Functionality: fill DRB to Add Mod list
7726 * @params[in] UE control block
7727 * DRB to Add/Mod list
7728 * @return ROK - success
7731 * ****************************************************************/
7732 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7734 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7737 elementCnt = ueCb->numDrb;
7740 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7742 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7749 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7753 /* DRB To Add/Mod List */
7754 CU_ALLOC(drbToAddList, sizeof(DRB_ToAddModList_t));
7757 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
7761 drbToAddList->list.count = elementCnt;
7762 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7764 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7765 if(!drbToAddList->list.array)
7767 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7772 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7774 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7777 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7778 if(!drbToAddList->list.array[drbIdx])
7780 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
7785 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
7788 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7789 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
7791 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
7795 /* PDCP Config -> DRB */
7796 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7797 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7799 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
7803 /* DRB -> Discard Timer */
7804 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7805 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
7807 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
7810 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
7812 /* UL PDCP SN length */
7813 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7814 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
7816 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
7819 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
7821 /* DL PDCP SN length */
7822 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7823 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
7825 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
7828 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
7830 /* Header Compression */
7831 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
7832 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
7834 /* Reordering timer */
7835 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7836 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
7838 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
7841 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7849 /******************************************************************
7851 * @brief Fill Radio bearer configuration
7855 * Function : fillRadioBearerConfig
7857 * Functionality: Fill Radio bearer configuration
7859 * @params[in] UE control block
7860 * Radio bearer config pointer
7861 * @return ROK - success
7864 * ****************************************************************/
7865 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
7867 /* SRB To Add/Mod List */
7868 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
7873 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
7881 /*******************************************************************
7883 * @brief Fill measurement object to add/mod list
7887 * Function : fillMeasObjToAddModList
7889 * Functionality: Fill measurement object to add/mod list
7891 * @params[in] Measurement object to add/mod list
7892 * @return ROK - success
7895 * ****************************************************************/
7896 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7898 uint8_t elementCnt, objIdx;
7899 MeasObjectNR_t *measObject;
7902 measObjList->list.count = elementCnt;
7903 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
7905 CU_ALLOC(measObjList->list.array, measObjList->list.size);
7906 if(!measObjList->list.array)
7908 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
7912 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7914 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7915 if(!measObjList->list.array[objIdx])
7917 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
7923 measObjList->list.array[objIdx]->measObjectId = 1;
7924 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
7925 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7926 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7928 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
7932 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7935 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7936 if(!measObject->ssbFrequency)
7938 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
7941 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
7943 /* Subcarrier spacing */
7944 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7945 if(!measObject->ssbSubcarrierSpacing)
7947 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
7950 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
7953 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
7954 if(!measObject->smtc1)
7956 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
7959 measObject->smtc1->duration = SSB_MTC__duration_sf1;
7960 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7961 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
7963 /* Absoulute threshold SSB consolidation */
7964 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7965 if(!measObject->absThreshSS_BlocksConsolidation)
7967 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
7971 /* RSRP threshold */
7972 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7973 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
7975 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
7978 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
7980 /* RSRQ threshold */
7981 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7982 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
7984 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
7987 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
7989 /* SINR threshold */
7990 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7991 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
7993 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
7996 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
7998 /* Number of SSBs to average */
7999 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8000 if(!measObject->nrofSS_BlocksToAverage)
8002 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8005 *(measObject->nrofSS_BlocksToAverage) = 2;
8007 /* Quantity Config index */
8008 measObject->quantityConfigIndex = 1;
8011 /* RSRP offset for SSB */
8012 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8013 if(!measObject->offsetMO.rsrpOffsetSSB)
8015 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8018 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8020 /* RSRQ offset for SSB */
8021 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8022 if(!measObject->offsetMO.rsrpOffsetSSB)
8024 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8027 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8029 /* SINR offset for SSB */
8030 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8031 if(!measObject->offsetMO.sinrOffsetSSB)
8033 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8036 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8041 /*******************************************************************
8043 * @brief Fill Report configuration to Add/mod list
8047 * Function : fillReportCfgToAddModList
8049 * Functionality: Fill Report configuration to Add/mod list
8051 * @params[in] Report Config To Add/Mod List
8052 * @return ROK - success
8055 * ****************************************************************/
8056 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8059 uint8_t reportCfgIdx;
8060 ReportConfigToAddMod_t *reportCfg;
8061 ReportConfigNR_t *reportCfgNr;
8062 EventTriggerConfig_t *eventTriggCfg;
8065 reportCfgList->list.count = elementCnt;
8066 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8068 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8069 if(!reportCfgList->list.array)
8071 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8075 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8077 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8078 if(!reportCfgList->list.array[reportCfgIdx])
8080 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8086 reportCfg = reportCfgList->list.array[reportCfgIdx];
8087 reportCfg->reportConfigId = 1;
8088 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8090 /* Report Configuration for NR */
8091 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8092 if(!reportCfg->reportConfig.choice.reportConfigNR)
8094 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8097 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8100 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8101 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8102 if(!reportCfgNr->reportType.choice.eventTriggered)
8104 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8107 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8110 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8111 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8112 if(!eventTriggCfg->eventId.choice.eventA3)
8114 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8118 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8119 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8120 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8121 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8122 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8123 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8125 /* Reference Signal Type */
8126 eventTriggCfg->rsType = NR_RS_Type_ssb;
8128 /* Report Interval */
8129 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8132 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8134 /* Report Quantity cell */
8135 eventTriggCfg->reportQuantityCell.rsrp = true;
8136 eventTriggCfg->reportQuantityCell.rsrq = false;
8137 eventTriggCfg->reportQuantityCell.sinr = false;
8139 /* Maximum reported cells */
8140 eventTriggCfg->maxReportCells = 3;
8142 /* Report qunatity RS Indexes */
8143 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8144 if(!eventTriggCfg->reportQuantityRS_Indexes)
8146 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8149 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8150 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8151 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8153 /* Maximum number of RS indexes to report */
8154 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8155 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8157 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8160 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8162 /* Include Beam measurement */
8163 eventTriggCfg->includeBeamMeasurements = false;
8168 /*******************************************************************
8170 * @brief Fill measurement Id to add/mod list
8174 * Function : fillMeasIdToAddModList
8176 * Functionality: Fill measurement Id to add/mod list
8178 * @params[in] Measurement Id to add/mod list
8179 * @return ROK - success
8182 * ****************************************************************/
8183 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8189 measIdList->list.count = elementCnt;
8190 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8192 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8193 if(!measIdList->list.array)
8198 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8200 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8201 if(!measIdList->list.array[measIdIdx])
8207 measIdList->list.array[measIdIdx]->measId = 1;
8208 measIdList->list.array[measIdIdx]->measObjectId = 1;
8209 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8214 /*******************************************************************
8216 * @brief Fill s-measurement configuration
8220 * Function : fillSMeasConfig
8222 * Functionality: Fill s-measurement configuration
8224 * @params[in] s-Measurement config
8225 * @return ROK - success
8228 * ****************************************************************/
8229 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8231 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8232 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8237 /*******************************************************************
8239 * @brief Fill quantity config
8243 * Function : fillQunatityConfig
8245 * Functionality: Fill quantity config
8247 * @params[in] Quantity Config
8248 * @return ROK - success
8251 * ****************************************************************/
8252 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8254 uint8_t elementCnt = 0;
8255 uint8_t quanCfgIdx = 0;
8256 QuantityConfigNR_t *quantityCfgNr;
8258 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8259 if(!quantityCfg->quantityConfigNR_List)
8265 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8266 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8268 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8269 if(!quantityCfg->quantityConfigNR_List->list.array)
8274 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8276 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8277 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8284 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8286 /* Quantity Config of Reference signal */
8287 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8288 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8292 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8294 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8295 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8299 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8301 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8302 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8306 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8308 /* Quantity Config RS index */
8309 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8310 if(!quantityCfgNr->quantityConfigRS_Index)
8315 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8316 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8320 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8322 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8323 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8327 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8329 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8330 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8334 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8339 /*******************************************************************
8341 * @brief Fill measurement configuration
8345 * Function : fillMeasConfig
8347 * Functionality: Fill measurement configuration
8349 * @params[in] Measurement config
8350 * @return ROK - success
8353 * ****************************************************************/
8354 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8356 /* Measurement object to add/mod list */
8357 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8358 if(!measConfig->measObjectToAddModList)
8360 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8363 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8365 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8369 /* Report Config To add/mod list */
8370 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8371 if(!measConfig->reportConfigToAddModList)
8373 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8376 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8378 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8382 /* Measurement Id to add/mod list */
8383 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8384 if(!measConfig->measIdToAddModList)
8386 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8389 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8391 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8395 /* S-Measurement config */
8396 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8397 if(!measConfig->s_MeasureConfig)
8399 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8402 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8404 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8408 /* Qunatity Config */
8409 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8410 if(!measConfig->quantityConfig)
8412 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8415 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8417 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8424 /*******************************************************************
8426 * @brief Fill RRC reconfiguration non-critical extension IE
8430 * Function : fillRrcReconfigNonCriticalExt
8432 * Functionality: Fill RRC reconfiguration non-critical extension
8434 * @params[in] RRC Reconfig Non-critical extension
8435 * @return ROK - success
8438 * ****************************************************************/
8439 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8441 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8442 if(!rrcRecfg->masterCellGroup)
8447 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8455 /*******************************************************************
8457 * @brief Fill RRC reconfiguration structure
8461 * Function : fillRrcReconfig
8463 * Functionality: Fill RRC reconfiguration
8467 * RRC reconfiguration structure
8468 * @return ROK - success
8471 * ****************************************************************/
8472 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8474 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8476 rrcReconfig->rrc_TransactionIdentifier = 1;
8477 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8479 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8480 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8482 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8486 /* Radio Bearer Configuration */
8487 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8488 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8490 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8493 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8495 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8499 /* Measurement Configuration */
8500 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8501 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8503 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8506 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8508 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8512 /* Non Critical extension */
8513 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8514 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8516 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8519 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8521 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8527 /*******************************************************************
8529 * @brief Fill RRC reconfiguration Octet string
8533 * Function : fillRrcReconfigBuf
8535 * Functionality: Fill RRC reconfiguration octet string
8538 * @params[in] OCTET_STRING_t buffer
8539 * @return ROK - success
8542 * ****************************************************************/
8543 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8545 uint8_t ret = RFAILED;
8546 asn_enc_rval_t encRetVal;
8547 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8548 rrcReconfig = &rrcRecfg;
8552 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8554 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8558 /* Encode RRC Reconfiguration */
8559 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8560 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8562 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8564 /* Encode results */
8565 if(encRetVal.encoded == ENCODE_FAIL)
8567 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8568 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8573 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8574 for(int i=0; i< encBufSize; i++)
8576 DU_LOG("%x",encBuf[i]);
8580 rrcReconfigBuf->size = encBufSize;
8581 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8582 if(!rrcReconfigBuf->buf)
8584 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8587 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8592 freeRrcReconfig(rrcReconfig);
8596 /*******************************************************************
8598 * @brief Fill HO preparation information Octet string
8602 * Function : fillHOPreparationInfoBuf
8604 * Functionality: Fill HO preparation information Octet string
8607 * @params[in] HandoverPreparationInformation_t buffer
8608 * @return ROK - success
8611 * ****************************************************************/
8612 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8614 uint8_t ret = RFAILED;
8615 asn_enc_rval_t encRetVal;
8616 HandoverPreparationInformationRrc_t hoPrepInfo;
8617 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8622 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8623 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8624 if(!hoPrepInfo.criticalExtensions.choice.c1)
8626 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8629 hoPrepInfo.criticalExtensions.choice.c1->present = \
8630 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8632 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8633 sizeof(HandoverPreparationInformationRrc_IEs_t));
8634 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8636 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8639 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8641 /* Fill UE Capability RAT container list */
8642 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8645 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8649 /* Fill Source config */
8650 hoPrepInfoIe->sourceConfig = NULLP;
8651 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8652 if(!hoPrepInfoIe->sourceConfig)
8654 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8657 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8661 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8665 hoPrepInfoIe->rrm_Config = NULLP;
8666 hoPrepInfoIe->as_Context = NULLP;
8667 hoPrepInfoIe->nonCriticalExtension = NULLP;
8669 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8670 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8671 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8673 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8674 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8676 /* Encode results */
8677 if(encRetVal.encoded == ENCODE_FAIL)
8679 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8680 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8685 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8686 for(int i=0; i< encBufSize; i++)
8688 DU_LOG("%x",encBuf[i]);
8692 hoPrepInfoBuf->size = encBufSize;
8693 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8694 if(!hoPrepInfoBuf->buf)
8696 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8699 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8703 freeHOPreparationInfo(&hoPrepInfo);
8707 /*******************************************************************
8709 * @brief Fills CuToDuContainer
8713 * Function : fillCuToDuContainer
8715 * Functionality: Fills CuToDuContainer
8717 * @params[in] pointer to CUtoDURRCInformation_t
8719 * @return ROK - success
8722 ******************************************************************/
8724 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8726 uint8_t elementCnt = 0;
8728 uint8_t idx, idx2, rrcBufLen;
8730 /* UE Capabulity RAT Container List */
8731 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8732 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8734 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8737 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8739 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8740 if(!rrcMsg->measConfig)
8742 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8745 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8747 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8750 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8751 if(rrcMsg->iE_Extensions)
8754 rrcMsg->iE_Extensions->list.count = elementCnt;
8755 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
8757 /* Initialize the CUtoDURRCInformation_ExtIEs */
8758 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8760 if(rrcMsg->iE_Extensions->list.array == NULLP)
8762 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
8766 for(idx=0; idx<elementCnt; idx++)
8768 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
8769 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
8771 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
8778 /* Cell Group Configuration */
8779 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
8780 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8781 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
8782 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
8783 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
8786 /* Handover Preparation Information */
8787 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
8788 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8789 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
8790 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
8791 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
8797 /*******************************************************************
8799 * @brief Free CuToDuContainer
8803 * Function : FreeCuToDuInfo
8805 * Functionality: Free CuToDuContainer
8807 * @params[in] pointer to CUtoDURRCInformation_t
8809 * @return ROK - success
8812 ******************************************************************/
8814 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8818 if(rrcMsg->uE_CapabilityRAT_ContainerList)
8820 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8821 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
8822 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8824 if(rrcMsg->iE_Extensions)
8826 if(rrcMsg->iE_Extensions->list.array)
8828 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
8830 if(rrcMsg->iE_Extensions->list.array[idx])
8832 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
8834 case ProtocolIE_ID_id_CellGroupConfig:
8835 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8837 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
8838 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
8843 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8844 rrcMsg->iE_Extensions->list.array[idx]->id);
8850 for(idx2 = 0; idx2 < idx; idx2++)
8852 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
8854 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8858 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8861 /*******************************************************************
8863 * @brief Builds and sends the UE Setup Request
8867 * Function : BuildAndSendUeContextSetupReq
8869 * Functionality: Constructs the UE Setup Request and sends
8870 * it to the CU through SCTP.
8874 * @return ROK - success
8877 * ****************************************************************/
8878 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcContLen, uint8_t *rrcContainer)
8880 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
8881 uint8_t ret= RFAILED, ret1;
8883 uint8_t idx, idx1, bufLen, duIdx;
8885 DuDb *targetDuDb = NULLP;
8886 F1AP_PDU_t *f1apMsg = NULLP;
8887 UEContextSetupRequest_t *ueSetReq = NULLP;
8888 asn_enc_rval_t encRetVal; /* Encoder return value */
8889 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
8893 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
8895 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8896 if(f1apMsg == NULLP)
8898 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8902 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8903 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8904 if(f1apMsg->choice.initiatingMessage == NULLP)
8906 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8910 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
8911 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8912 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
8914 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
8916 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8920 ueSetReq->protocolIEs.list.count = elementCnt;
8921 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
8923 /* Initialize the UESetup members */
8924 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
8926 if(ueSetReq->protocolIEs.list.array == NULLP)
8928 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
8932 for(idx1=0; idx1<elementCnt; idx1++)
8934 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
8935 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
8943 /*GNB CU UE F1AP ID*/
8944 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8945 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8946 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8947 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
8949 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
8951 /*GNB DU UE F1AP ID*/
8953 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8954 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8955 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8956 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
8961 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
8962 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8963 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
8964 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8966 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
8967 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
8968 /* Since we are supporting only one cell per DU, accessing 0th index to
8969 * get target cell info */
8970 spCellId = targetDuDb->cellCb[0].nrCellId;
8973 spCellId = ueCb->cellCb->nrCellId;
8974 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
8980 /*Served Cell Index*/
8982 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
8983 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8984 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
8985 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
8987 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
8989 /*CellULConfigured*/
8991 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
8992 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8993 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
8994 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
8997 /*CUtoDURRCContainer*/
8999 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9000 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9001 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9002 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9007 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9009 /*Special Cells to be SetupList*/
9011 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9012 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9013 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9014 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9015 if(SplCellListret != ROK)
9021 /*SRBs To Be Setup List*/
9023 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9024 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9025 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9026 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9027 if(SrbSetupret != ROK)
9032 /*DRBs to Be Setup List*/
9034 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9035 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9036 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9037 ret1 = BuildDRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9043 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9045 /* RRC Container for security mode */
9047 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
9048 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9049 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCContainer;
9051 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
9053 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
9054 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
9055 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
9056 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
9058 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
9061 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
9062 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
9064 /* RRC delivery status request */
9066 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9067 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9068 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9069 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9072 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9074 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9075 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9076 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9078 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9080 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9081 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9082 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9083 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9085 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9088 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9089 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9091 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9093 /* Encode the F1SetupRequest type as APER */
9094 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9096 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9098 /* Encode results */
9099 if(encRetVal.encoded == ENCODE_FAIL)
9101 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9102 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9107 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9108 for(int i=0; i< encBufSize; i++)
9110 DU_LOG("%x",encBuf[i]);
9115 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9117 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9123 FreeUeContextSetupReq(f1apMsg);
9126 }/* End of BuildAndSendUeContextSetupReq*/
9128 /**********************************************************************
9129 * @brief Function to extractTeId received in UE context setup Response
9133 * Function : extractTeId
9136 * - Function to extract TeId
9139 * @return ROK - success
9142 **********************************************************************/
9143 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9147 GTPTunnel_t *gtpDl = NULLP;
9149 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9151 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9153 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9155 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9156 if(gtpDl->gTP_TEID.size > 0)
9158 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9161 DU_LOG("\nERROR --> EGTP: No TeId received");
9169 /****************************************************************
9170 * @brief Function to add Drb tunnels
9174 * Function : addDrbTunnels
9177 * - Function to add Drb tunnels
9180 * @return ROK - success
9183 * ****************************************************************/
9184 uint8_t addDrbTunnels(uint8_t teId)
9189 if(teId > MAX_TEID || teId < MIN_TEID)
9191 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9193 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9194 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9195 tnlEvt.lclTeid = teId;
9196 tnlEvt.remTeid = teId;
9197 ret = cuEgtpTnlMgmtReq(tnlEvt);
9200 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9205 /****************************************************************
9206 * @brief Function to process Drb Setup List
9210 * Function : procDrbSetupList
9213 * - Function to process DRB Setup List
9216 * @return ROK - success
9219 * ****************************************************************/
9220 uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
9224 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9226 if(drbSetupList != NULLP)
9228 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9230 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9231 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9233 /* extracting teId */
9234 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9237 if(addDrbTunnels(teId)== ROK)
9239 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9250 /****************************************************************
9251 * @brief Function to process Ue Context Setup Response
9255 * Function : procUeContextSetupResponse
9258 * - Function to process Ue Context Setup Response
9261 * @return ROK - success
9264 * ****************************************************************/
9265 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9267 uint8_t duIdx=0, idx, duUeF1apId;
9270 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9272 SEARCH_DU_DB(duIdx, duId, duDb);
9273 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9275 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9277 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9279 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9281 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9282 ueCb = &duDb->ueCb[duUeF1apId-1];
9285 case ProtocolIE_ID_id_DRBs_Setup_List:
9287 /* Adding Tunnels for successful DRB */
9288 procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9291 case ProtocolIE_ID_id_DUtoCURRCInformation:
9293 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9294 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9295 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9297 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9304 ueCb->f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
9308 /****************************************************************
9309 * @brief Function to process Ul Rrc Msg received from DU
9313 * Function : procUlRrcMsg
9316 * - Function to process Ul Rrc Msg received from DU
9319 * @return ROK - success
9322 * ****************************************************************/
9324 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9326 uint8_t idx, ret, srbId, rrcMsgType, duIdx=0;
9327 uint8_t cuUeF1apId, duUeF1apId;
9328 uint8_t *rrcContainer = NULLP;
9329 uint16_t rrcContLen;
9332 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9335 SEARCH_DU_DB(duIdx, duId, duDb);
9336 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9338 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9340 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9342 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9344 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9347 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9349 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9352 case ProtocolIE_ID_id_SRBID:
9353 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9356 case ProtocolIE_ID_id_RRCContainer:
9358 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9359 CU_ALLOC(rrcContainer, rrcContLen);
9362 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9365 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9370 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9377 ueCb = &duDb->ueCb[duUeF1apId-1];
9378 ueCb->f1apMsgDb.dlRrcMsgCount++;
9379 rrcMsgType = setDlRRCMsgType(ueCb);
9380 if(rrcMsgType == REGISTRATION_ACCEPT)
9382 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9383 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9385 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
9387 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
9388 ret = BuildAndSendUeContextSetupReq(duId, ueCb, rrcContLen, rrcContainer);
9390 if(rrcMsgType == SECURITY_MODE_COMPLETE)
9392 /* To trigger the DL RRC Msg for RRC Reconfig */
9393 ueCb->f1apMsgDb.dlRrcMsgCount++;
9394 rrcMsgType = setDlRRCMsgType(ueCb);
9395 if(rrcMsgType == RRC_RECONFIG)
9397 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
9398 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9401 if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9403 ueCb->state = UE_ACTIVE;
9404 ueCb->f1apMsgDb.dlRrcMsgCount++;
9405 rrcMsgType = setDlRRCMsgType(ueCb);
9406 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
9408 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9409 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9416 /****************************************************************
9417 * @brief Build And Send F1ResetAck
9421 * Function : FreeF1ResetAck
9424 * - Build And Send F1ResetRSP
9427 * @return ROK - success
9430 * ****************************************************************/
9431 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9434 ResetAcknowledge_t *f1ResetAck;
9438 if(f1apMsg->choice.successfulOutcome)
9440 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9442 if(f1ResetAck->protocolIEs.list.array)
9444 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9446 if(f1ResetAck->protocolIEs.list.array[idx])
9448 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9451 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9453 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9455 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9459 /****************************************************************
9460 * @brief Build And Send F1ResetAck
9464 * Function : BuildAndSendF1ResetAck
9467 * - Build And Send F1ResetRSP
9470 * @return ROK - success
9473 * ****************************************************************/
9475 uint8_t BuildAndSendF1ResetAck()
9478 uint8_t elementCnt = 0;
9479 uint8_t ret = RFAILED;
9480 F1AP_PDU_t *f1apMsg = NULL;
9481 ResetAcknowledge_t *f1ResetAck = NULLP;
9482 asn_enc_rval_t encRetVal;
9483 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9486 /* Allocate the memory for F1ResetRequest_t */
9487 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9488 if(f1apMsg == NULLP)
9490 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9494 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9496 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9497 if(f1apMsg->choice.successfulOutcome == NULLP)
9499 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9503 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9504 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9505 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9506 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9510 f1ResetAck->protocolIEs.list.count = elementCnt;
9511 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9513 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9514 if(f1ResetAck->protocolIEs.list.array == NULLP)
9516 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9520 for(idx=0; idx<elementCnt; idx++)
9522 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9523 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9530 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9531 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9532 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9533 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9535 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9537 /* Encode the F1SetupRequest type as UPER */
9538 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9540 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9542 /* Check encode results */
9543 if(encRetVal.encoded == ENCODE_FAIL)
9545 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9546 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9551 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9552 for(int i=0; i< encBufSize; i++)
9554 DU_LOG("%x",encBuf[i]);
9559 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9560 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9562 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9570 FreeF1ResetAck(f1apMsg);
9574 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9578 if(ulInfo->list.array)
9580 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9582 if(ulInfo->list.array[arrIdx])
9584 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9586 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9588 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9590 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9591 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9592 gTPTunnel->gTP_TEID.size);
9594 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9595 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9596 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9598 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9599 sizeof(GTPTunnel_t));
9601 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9604 CU_FREE(ulInfo->list.array,ulInfo->list.size);
9608 /*******************************************************************
9610 * @brief Deletes the EGTP tunnel
9614 * Function : deleteEgtpTunnel
9616 * Functionality: Deletes the EGTP tunnel
9618 * @params[in] uint8_t *buf
9620 * @return ROK - success
9623 * ****************************************************************/
9624 uint8_t deleteEgtpTunnel(uint8_t *buf)
9629 teIdStringToInt(buf, &teId);
9630 if(teId > MAX_TEID || teId < MIN_TEID)
9632 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
9635 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9636 tnlEvt.action = EGTP_TNL_MGMT_DEL;
9637 tnlEvt.lclTeid = teId;
9638 tnlEvt.remTeid = teId;
9639 if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
9641 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
9646 /*******************************************************************
9648 * @brief Builds the Uplink Tunnel Info
9652 * Function : BuildUlTnlInfoforSetupMod
9654 * Functionality: Constructs the UL TnlInfo For DRB list
9656 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
9658 * @return ROK - success
9661 * ****************************************************************/
9662 uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
9668 ulInfo->list.count = ulCnt;
9669 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
9670 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
9671 if(ulInfo->list.array == NULLP)
9673 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9676 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
9678 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9679 if(ulInfo->list.array[arrIdx] == NULLP)
9681 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9687 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
9688 UPTransportLayerInformation_PR_gTPTunnel;
9691 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9692 sizeof(GTPTunnel_t));
9693 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
9695 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9698 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9699 transportLayerAddress.size = 4*sizeof(uint8_t);
9700 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9701 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9702 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9703 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9704 transportLayerAddress.buf == NULLP)
9706 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9710 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9711 transportLayerAddress.buf[0] = 192;
9712 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9713 transportLayerAddress.buf[1] = 168;
9714 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9715 transportLayerAddress.buf[2] = 130;
9716 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9717 transportLayerAddress.buf[3] = 82;
9718 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9719 transportLayerAddress.bits_unused = 0;
9721 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
9722 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
9723 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
9724 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
9727 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
9728 = 4 * sizeof(uint8_t);
9729 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9730 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9731 gTPTunnel->gTP_TEID.size);
9732 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
9735 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9738 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9739 gTP_TEID.buf[0] = 0;
9740 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9741 gTP_TEID.buf[1] = 0;
9742 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9743 gTP_TEID.buf[2] = 0;
9744 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
9746 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
9747 * fetched based on the Drb Id */
9749 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
9750 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
9751 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
9755 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9756 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
9759 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
9760 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
9761 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
9762 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
9764 }/*End of BuildULTnlInfo*/
9766 /*******************************************************************
9768 * @brief freeing the DRB item
9772 * Function : FreeDrbItem
9774 * Functionality: freeing the DRB item
9776 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9778 * @return ROK - success
9781 * ****************************************************************/
9783 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
9786 SNSSAI_t *snssai =NULLP;
9787 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
9789 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9790 switch(drbItem->qoSInformation.present)
9792 case QoSInformation_PR_NOTHING:
9794 case QoSInformation_PR_eUTRANQoS:
9796 if(drbItem->qoSInformation.choice.eUTRANQoS)
9798 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9802 case QoSInformation_PR_choice_extension:
9804 if(drbItem->qoSInformation.choice.choice_extension)
9806 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
9808 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
9811 CU_FREE(snssai->sST.buf,snssai->sST.size);
9817 CU_FREE(snssai->sD->buf,snssai->sD->size);
9819 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
9822 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
9823 if(flowMap->list.array)
9825 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
9827 if(flowMap->list.array[arrIdx] )
9829 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
9830 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
9833 CU_FREE(flowMap->list.array,flowMap->list.size);
9836 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
9842 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
9843 if(drbItem->uLConfiguration)
9845 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
9849 /*******************************************************************
9851 * @brief filling the DRB setup Mod item
9855 * Function : FillDrbItemToSetupMod
9857 * Functionality: filling the DRB setup Mod item
9860 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9862 * @return ROK - success
9865 * ****************************************************************/
9867 uint8_t FillDrbItemToSetupMod(CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
9872 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
9873 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
9876 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9878 switch(drbItem->qoSInformation.present)
9880 case QoSInformation_PR_NOTHING:
9884 case QoSInformation_PR_eUTRANQoS:
9887 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9888 if(drbItem->qoSInformation.choice.eUTRANQoS)
9890 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
9893 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
9894 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
9895 PriorityLevel_no_priority;
9897 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
9898 Pre_emptionCapability_may_trigger_pre_emption;
9900 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
9901 Pre_emptionVulnerability_pre_emptable;
9905 case QoSInformation_PR_choice_extension:
9907 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
9908 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
9910 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
9914 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
9915 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
9916 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
9917 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
9918 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
9921 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
9926 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
9927 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
9930 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
9934 /*Flows mapped to DRB List*/
9935 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
9936 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
9937 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
9940 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
9946 /*ULUPTNLInformation To Be Setup List*/
9947 ret = BuildUlTnlInfoforSetupMod(ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
9948 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
9951 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
9956 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
9957 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
9963 /*******************************************************************
9965 * @brief Builds the DRB to be Setup Mod ItemIes
9969 * Function : FillDrbItemList
9971 * Functionality: Constructs the DRB to be Setup Mod Item Ies
9973 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
9975 * @return ROK - success
9978 * ****************************************************************/
9980 uint8_t FillDrbItemList(CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
9982 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
9983 drbItemIe->criticality = Criticality_reject;
9984 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
9986 if(FillDrbItemToSetupMod(ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
9988 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
9993 /*******************************************************************
9995 * @brief free the DRB to be Setup Mod list
9999 * Function : FreeDrbToBeSetupModList
10001 * Functionality: free the DRB to be Setup Mod list
10003 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10005 * @return ROK - success
10006 * RFAILED - failure
10008 * ****************************************************************/
10009 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10012 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10014 if(drbSet->list.array)
10016 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10018 if(drbSet->list.array[arrIdx] != NULLP)
10022 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10023 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10025 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10028 CU_FREE(drbSet->list.array, drbSet->list.size);
10033 /*******************************************************************
10035 * @brief Builds the DRB to be Setup Mod list
10039 * Function : BuildDrbToBeSetupList
10041 * Functionality: Constructs the DRB to be Setup Mod list
10043 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10045 * @return ROK - success
10046 * RFAILED - failure
10048 * ****************************************************************/
10050 uint8_t BuildDrbToBeSetupList(CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10056 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10057 drbSet->list.count = drbCnt;
10058 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10059 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10060 if(drbSet->list.array == NULLP)
10062 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10066 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10068 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10069 if(drbSet->list.array[arrIdx] == NULLP)
10071 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10075 ret = FillDrbItemList(ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10078 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10085 /*******************************************************************
10087 * @brief Filling the DRB to be modified item
10091 * Function : FillDrbToBeModItem
10093 * Functionality: filling the DRB to be modified item
10095 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10097 * @return ROK - success
10098 * RFAILED - failure
10100 * ****************************************************************/
10102 uint8_t FillDrbToBeModItem(CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10106 DrbInfo *drbToBeMod;
10109 drbItem->dRBID = DRB2 + arrIdx;
10111 /* Search for DRB ID in CU databse */
10112 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10114 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10116 drbToBeMod = &ueCb->drbList[drbIdx];
10122 drbItem->qoSInformation = NULLP;
10123 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10124 if(drbItem->qoSInformation != NULLP)
10126 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10128 switch(drbItem->qoSInformation->present)
10130 case QoSInformation_PR_NOTHING:
10134 case QoSInformation_PR_eUTRANQoS:
10137 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10138 if(drbItem->qoSInformation->choice.eUTRANQoS)
10140 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10143 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10144 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10145 PriorityLevel_no_priority;
10147 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10148 Pre_emptionCapability_may_trigger_pre_emption;
10150 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10151 Pre_emptionVulnerability_pre_emptable;
10155 case QoSInformation_PR_choice_extension:
10157 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10158 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10160 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10164 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10165 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10166 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10167 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10168 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10171 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10176 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10177 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10180 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10184 /*Flows mapped to DRB List*/
10185 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10186 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10187 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10190 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10197 /*ULUPTNLInformation To Be Setup List*/
10198 ret = BuildUlTnlInfoforSetupMod(ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10199 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10202 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10208 /*******************************************************************
10210 * @brief Builds the DRB to be modified Item IE
10214 * Function : FillDrbToBeModItemList
10216 * Functionality: Constructs the DRB to be modified Mod Item Ies
10218 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10220 * @return ROK - success
10221 * RFAILED - failure
10223 * ****************************************************************/
10225 uint8_t FillDrbToBeModItemList(CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10227 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10228 drbItemIe->criticality = Criticality_reject;
10229 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10230 if(FillDrbToBeModItem(ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10232 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10239 /*******************************************************************
10241 * @brief Builds the DRB to be modified list
10245 * Function : BuildDrbToBeModList
10247 * Functionality: Constructs the DRB to be modified list
10249 * @params[in] DRBs_ToBeModified_List_t *drbSet
10251 * @return ROK - success
10252 * RFAILED - failure
10254 * ****************************************************************/
10256 uint8_t BuildDrbToBeModifiedList(CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10262 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10263 drbSet->list.count = drbCnt;
10264 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10265 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10266 if(drbSet->list.array == NULLP)
10268 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10271 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10273 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10274 if(drbSet->list.array[arrIdx] == NULLP)
10276 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10280 ret = FillDrbToBeModItemList(ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10283 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10290 /*******************************************************************
10292 * @brief freeing the DRB item
10296 * Function : FreeModifiedDrbItem
10298 * Functionality: freeing the DRB 2 item
10300 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10302 * @return ROK - success
10303 * RFAILED - failure
10305 * ****************************************************************/
10307 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10310 SNSSAI_t *snssai =NULLP;
10311 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10313 if(drbItem->qoSInformation != NULLP)
10315 switch(drbItem->qoSInformation->present)
10317 case QoSInformation_PR_NOTHING:
10319 case QoSInformation_PR_eUTRANQoS:
10321 if(drbItem->qoSInformation->choice.eUTRANQoS)
10323 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10327 case QoSInformation_PR_choice_extension:
10329 if(drbItem->qoSInformation->choice.choice_extension)
10331 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10333 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10334 if(snssai->sST.buf)
10336 CU_FREE(snssai->sST.buf,snssai->sST.size);
10340 if(snssai->sD->buf)
10342 CU_FREE(snssai->sD->buf,snssai->sD->size);
10344 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10347 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10348 if(flowMap->list.array)
10350 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10352 if(flowMap->list.array[arrIdx] )
10354 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10355 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10358 CU_FREE(flowMap->list.array,flowMap->list.size);
10361 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10367 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10368 if(drbItem->uLConfiguration)
10370 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10374 /*******************************************************************
10376 * @brief free the DRB to be modfified list
10380 * Function : FreeDrbToBeModifiedList
10382 * Functionality: free the DRB to be Setup Mod list
10384 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10386 * @return ROK - success
10387 * RFAILED - failure
10389 * ****************************************************************/
10390 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10393 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10395 if(drbSet->list.array)
10397 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10399 if(drbSet->list.array[arrIdx] != NULLP)
10401 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10402 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10403 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10406 CU_FREE(drbSet->list.array, drbSet->list.size);
10411 /*******************************************************************
10413 * @brief free the UeContextModification Request
10417 * Function : FreeUeContextModicationRequest
10419 * Functionality : deallocation of memory allocated in UeContextModiification
10422 * @params[in] F1AP_PDU_t *f1apMsg
10426 * ****************************************************************/
10427 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10429 uint8_t arrIdx =0 , ieId=0;
10430 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10434 if(f1apMsg->choice.initiatingMessage)
10436 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10437 if(ueContextModifyReq->protocolIEs.list.array)
10439 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10441 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10443 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10446 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10448 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10450 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10452 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10453 choice.DRBs_ToBeSetupMod_List);
10456 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10458 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10459 choice.DRBs_ToBeModified_List);
10462 case ProtocolIE_ID_id_TransmissionActionIndicator:
10464 case ProtocolIE_ID_id_RRCContainer:
10466 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10467 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10471 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10474 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10476 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10478 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10482 /*******************************************************************
10484 * @brief Builds the Ue Context Modification Req
10488 * Function : BuildAndSendUeContextModificationReq
10490 * Functionality: Constructs the Ue Context Modification Req
10494 * @return ROK - success
10495 * RFAILED - failure
10497 * ****************************************************************/
10498 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10501 uint8_t elementCnt = 0;
10502 uint8_t ret = RFAILED;
10503 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10504 F1AP_PDU_t *f1apMsg = NULLP;
10505 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10506 action =RESTART_DATA_TX;
10507 asn_enc_rval_t encRetVal;
10508 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10511 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10512 if(f1apMsg == NULLP)
10514 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10518 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10520 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10521 if(f1apMsg->choice.initiatingMessage == NULLP)
10523 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10526 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10527 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10528 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10530 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10532 if(action == MODIFY_UE)
10534 else if(action == QUERY_CONFIG)
10536 else if(action == RRC_RECONFIG_COMPLETE_IND)
10538 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10541 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10542 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10544 /* Initialize the UE context modification members */
10545 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10546 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10548 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10552 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10554 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10555 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10557 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10563 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10564 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10565 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10566 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10567 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10570 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10571 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10572 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10573 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10574 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10576 if(action == MODIFY_UE)
10578 /* DRB to be setup list */
10580 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10581 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10582 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10583 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10584 ret = BuildDrbToBeSetupList(ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10585 value.choice.DRBs_ToBeSetupMod_List));
10587 /* DRB to be modified list */
10589 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
10590 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10591 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10592 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
10593 ret = BuildDrbToBeModifiedList(ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10594 value.choice.DRBs_ToBeModified_List));
10596 /* TODO: DRB to be release list */
10600 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
10604 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
10606 else if(action == QUERY_CONFIG)
10609 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
10610 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10611 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10612 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
10613 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
10615 else if(action == RRC_RECONFIG_COMPLETE_IND)
10618 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
10619 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10620 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10621 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
10622 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
10623 RRCReconfigurationCompleteIndicator_true;
10625 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10628 if(action == STOP_DATA_TX)
10630 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10631 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10632 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10633 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10634 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10635 TransmissionActionIndicator_stop;
10637 else if (action == RESTART_DATA_TX)
10639 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10640 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10641 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10642 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10643 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10644 TransmissionActionIndicator_restart;
10647 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10648 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10649 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10650 UEContextModificationRequestIEs__value_PR_RRCContainer;
10651 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
10653 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
10657 /* RRC delivery status request */
10659 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
10660 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10661 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
10662 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
10665 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10667 /* Encode the F1SetupRequest type as APER */
10668 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10670 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10672 /* Encode results */
10673 if(encRetVal.encoded == ENCODE_FAIL)
10675 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
10676 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10681 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
10682 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
10684 DU_LOG("%x",encBuf[ieIdx]);
10688 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10689 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
10691 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
10699 FreeUeContextModicationRequest(f1apMsg);
10703 /*****************************************************************i
10705 * @brief Free memory allocated for UE Context Release Command
10709 * Function : FreeUeContextReleaseCommand
10712 * - Free memory allocated for UE Context Release Command
10714 * @params[in] F1AP_PDU_t *f1apMsg
10717 * *************************************************************/
10718 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
10721 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
10725 if(f1apMsg->choice.initiatingMessage)
10727 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10728 if(ueReleaseCommand->protocolIEs.list.array)
10730 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
10732 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10734 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
10736 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10738 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10741 /*******************************************************************
10743 * @brief Builds the Ue Context Release Command
10747 * Function : BuildAndSendUeContextReleaseCommand
10749 * Functionality: Constructs the Ue Context Release Command
10753 * @return ROK - success
10754 * RFAILED - failure
10756 * ****************************************************************/
10757 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
10759 bool memAllocFailed = false;
10760 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
10763 F1AP_PDU_t *f1apMsg = NULLP;
10764 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
10766 asn_enc_rval_t encRetVal;
10767 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
10771 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10772 if(f1apMsg == NULLP)
10774 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
10778 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10780 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10781 if(f1apMsg->choice.initiatingMessage == NULLP)
10783 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
10786 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
10787 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10788 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
10790 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10792 SEARCH_DU_DB(duIdx, duId, duDb);
10793 ueCb = &duDb->ueCb[duUeF1apId-1];
10794 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
10799 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
10800 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
10802 /* Initialize the UE context modification members */
10803 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
10804 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
10806 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
10810 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10812 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10813 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
10815 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
10816 memAllocFailed = true;
10821 if(memAllocFailed == true)
10827 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10828 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10829 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10830 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
10831 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
10834 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10835 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10836 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10837 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
10838 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
10840 /* Cause of UE context release */
10842 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
10843 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10844 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10845 UEContextReleaseCommandIEs__value_PR_Cause;
10846 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10847 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
10848 CauseRadioNetwork_normal_release;
10849 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
10851 /* RRC Container for RRC release */
10853 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10854 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10855 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10856 UEContextReleaseCommandIEs__value_PR_RRCContainer;
10857 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
10859 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
10860 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
10861 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
10862 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
10864 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
10867 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
10868 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
10870 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10872 /* Encode the UE Context Release Command type as APER */
10873 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10875 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10878 /* Encode results */
10879 if(encRetVal.encoded == ENCODE_FAIL)
10881 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
10882 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10887 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
10888 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
10890 DU_LOG("%x",encBuf[ieIdx]);
10894 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10895 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
10897 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
10905 FreeUeContextReleaseCommand(f1apMsg);
10908 /*******************************************************************
10910 * @brief process Ue context release request
10914 * Function : procUeContextReleaseReq
10917 * - process Ue context release request
10919 * @params[in] F1AP_PDU_t *f1apMsg
10920 * @return ROK - success
10921 * RFAILED - failure
10923 * ****************************************************************/
10924 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
10926 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
10928 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
10929 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
10931 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
10933 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
10935 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10937 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
10940 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10942 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
10950 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
10952 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
10957 /*******************************************************************
10959 * @brief processing of Gnb-DU config update
10963 * Function : procGnbDuUpdate
10966 * - processing of Gnb-DU config update
10968 * @params[in] F1AP_PDU_t *f1apMsg
10969 * @return ROK - success
10970 * RFAILED - failure
10972 * ****************************************************************/
10973 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
10975 bool cellToBeDelete = false;
10976 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
10980 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
10982 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
10983 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
10985 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
10987 case ProtocolIE_ID_id_TransactionID:
10989 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
10991 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
10993 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
10994 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
10995 Served_Cells_To_Delete_List.list.array[0];
10996 nrCellId = deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.buf[4] >>\
10997 deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.bits_unused;
10998 cellToBeDelete = true;
11001 case ProtocolIE_ID_id_gNB_DU_ID:
11005 if(BuildAndSendDUUpdateAck(duId) != ROK)
11007 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11011 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11012 * commented this trigger for now */
11014 if(cellToBeDelete == false)
11016 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11017 if(BuildAndSendF1ResetReq() != ROK)
11019 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11024 if(cellToBeDelete == true)
11026 SEARCH_DU_DB(duIdx, duId, duDb);
11027 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11028 if(cellCb->numUe == 0)
11030 memset(cellCb, 0, sizeof(CuCellCb));
11034 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11039 /*******************************************************************
11041 * @brief storing slice list in CU database
11045 * Function : buildSliceList
11048 * - storing slice list in CU database
11050 * @params[in] SliceSupportList_t *sliceSupportList
11051 * @return ROK - success
11052 * RFAILED - failure
11054 * ****************************************************************/
11055 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11057 uint8_t sliceListIdx = 0;
11059 if(sliceSupportList)
11061 if(sliceSupportList->list.array)
11063 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11064 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11066 if(sliceSupportList->list.array[sliceListIdx])
11068 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11069 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11071 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11074 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11076 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11077 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11079 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11081 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11082 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11083 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11092 /****************************************************************
11093 * @brief Function to process Srb Setup Mod List
11097 * Function : procSrbSetupModList
11100 * - Function to process SRB Setup Mod List
11103 * @return ROK - success
11104 * RFAILED - failure
11106 * ****************************************************************/
11107 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11109 uint8_t arrIdx = 0, srbIdx;
11110 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11112 if(srbSetupList != NULLP)
11114 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11116 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11117 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11119 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11121 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11123 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11135 /****************************************************************
11136 * @brief Function to process Drb Setup Mod List
11140 * Function : procDrbSetupModList
11143 * - Function to process DRB Setup Mod List
11146 * @return ROK - success
11147 * RFAILED - failure
11149 * ****************************************************************/
11150 uint8_t procDrbSetupModList(CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11152 uint8_t arrIdx = 0, drbIdx;
11154 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11156 if(drbSetupList != NULLP)
11158 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11160 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11161 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11163 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11165 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11167 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11168 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11173 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11175 /* extracting teId */
11176 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11179 if(addDrbTunnels(teId)== ROK)
11181 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11193 /*******************************************************************
11195 * @brief processing of GNB_DU_Served_Cells Plmn list information
11199 * Function : procServedCellPlmnList
11202 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11205 * @params[in] F1AP_PDU_t *f1apMsg
11206 * @return ROK - success
11207 * RFAILED - failure
11209 * ****************************************************************/
11210 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11212 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11213 ProtocolExtensionContainer_4624P3_t **ieExtend;
11215 if(srvPlmn->list.array)
11217 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11219 if(srvPlmn->list.array[srvPlmnIdx])
11221 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11224 if((*ieExtend)->list.array)
11226 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11228 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11230 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11232 case ProtocolIE_ID_id_TAISliceSupportList:
11234 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11235 extensionValue.choice.SliceSupportList) != ROK)
11237 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11252 /****************************************************************
11253 * @brief Function to process Ue Context Modification Response
11257 * Function : procUeContextModificationResponse
11260 * - Function to process Ue Context Modification Response
11263 * @return ROK - success
11264 * RFAILED - failure
11266 * ****************************************************************/
11267 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11269 uint8_t idx=0, duIdx=0, duUeF1apId;
11272 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11274 SEARCH_DU_DB(duIdx, duId, duDb);
11275 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11277 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11279 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11281 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11283 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11284 ueCb = &duDb->ueCb[duUeF1apId-1];
11287 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11289 /* Adding Tunnels for successful DRB */
11290 procDrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11294 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11296 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11299 case ProtocolIE_ID_id_DUtoCURRCInformation:
11301 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11302 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11303 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11305 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11313 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11315 BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb, 0, NULLP);
11322 /*******************************************************************
11324 * @brief processing of F1 setup request
11328 * Function : procF1SetupReq
11331 * - processing of F1 setup request
11333 * @params[in] F1AP_PDU_t *f1apMsg
11334 * @return ROK - success
11335 * RFAILED - failure
11337 * ****************************************************************/
11338 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11340 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11341 uint32_t duId = 0, nrCellId = 0;
11342 DuDb *duDb = NULLP;
11343 CuCellCb *cellCb = NULLP;
11344 BIT_STRING_t nrcellIdentity;
11345 F1SetupRequest_t *f1SetupReq = NULLP;
11346 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11347 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11349 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11350 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11352 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11354 case ProtocolIE_ID_id_gNB_DU_ID:
11356 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11357 SEARCH_DU_DB(duIdx, duId, duDb);
11360 duDb = &cuCb.duInfo[cuCb.numDu];
11361 memset(duDb, 0, sizeof(DuDb));
11370 case ProtocolIE_ID_id_gNB_DU_Name:
11372 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11375 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11377 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11378 if(duServedCell->list.array)
11380 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11382 if(duServedCell->list.array[plmnidx])
11384 switch(duServedCell->list.array[plmnidx]->id)
11386 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11388 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11389 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11390 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11392 nrCellId = nrcellIdentity.buf[4] >> nrcellIdentity.bits_unused;
11393 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11394 if(cellCb == NULLP)
11396 cellCb = &duDb->cellCb[duDb->numCells];
11397 memset(cellCb, 0, sizeof(CuCellCb));
11398 cellCb->nrCellId = nrCellId;
11399 cellCb->cellStatus = CELL_ACTIVE;
11412 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11416 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11420 /****************************************************************
11422 * @brief processing of UE Context Release Complete
11426 * Function : procUeContextReleaseComplete
11429 * - processing of UE Context Release Complete
11431 * @params[in] F1AP_PDU_t *f1apMsg
11432 * @return ROK - success
11433 * RFAILED - failure
11435 * ****************************************************************/
11436 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11438 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0;
11439 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11440 DuDb *duDb = NULLP;
11441 CuUeCb *ueCb = NULLP;
11442 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11444 SEARCH_DU_DB(duIdx, duId, duDb);
11447 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11451 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11452 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11454 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11456 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11458 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11461 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11463 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11464 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11465 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11467 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11469 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11470 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11472 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11473 ueCb->cellCb->numUe--;
11474 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus = CELL_DELETION_IN_PROGRESS))
11476 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11483 memset(ueCb, 0, sizeof(CuUeCb));
11491 /*******************************************************************
11493 * @brief Handles received F1AP message and sends back response
11497 * Function : F1APMsgHdlr
11500 * - Decodes received F1AP control message
11501 * - Prepares response message, encodes and sends to SCTP
11504 * @return ROK - success
11505 * RFAILED - failure
11507 * ****************************************************************/
11508 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
11514 F1AP_PDU_t *f1apMsg = NULLP;
11515 asn_dec_rval_t rval; /* Decoder return value */
11516 F1AP_PDU_t f1apasnmsg ;
11518 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
11519 ODU_PRINT_MSG(mBuf, 0,0);
11521 /* Copy mBuf into char array to decode it */
11522 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
11523 CU_ALLOC(recvBuf, (Size)recvBufLen);
11525 if(recvBuf == NULLP)
11527 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
11530 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
11532 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
11536 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
11537 for(i=0; i< recvBufLen; i++)
11539 DU_LOG("%x",recvBuf[i]);
11542 /* Decoding flat buffer into F1AP messsage */
11543 f1apMsg = &f1apasnmsg;
11544 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
11546 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
11547 CU_FREE(recvBuf, (Size)recvBufLen);
11549 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
11551 DU_LOG("\nERROR --> F1AP : ASN decode failed");
11555 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11557 switch(f1apMsg->present)
11559 case F1AP_PDU_PR_initiatingMessage:
11561 switch(f1apMsg->choice.initiatingMessage->value.present)
11563 case InitiatingMessage__value_PR_Reset:
11565 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
11566 BuildAndSendF1ResetAck();
11570 case InitiatingMessage__value_PR_F1SetupRequest:
11572 DU_LOG("\nINFO --> F1AP : F1 setup request received");
11573 procF1SetupReq(duId, f1apMsg);
11577 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
11579 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
11580 procGnbDuUpdate(*duId, f1apMsg);
11583 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
11585 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
11586 procInitULRRCMsg(*duId, f1apMsg);
11589 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
11591 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
11592 procUlRrcMsg(*duId, f1apMsg);
11596 case InitiatingMessage__value_PR_RRCDeliveryReport:
11598 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
11601 case InitiatingMessage__value_PR_UEContextReleaseRequest:
11603 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
11604 procUeContextReleaseReq(*duId, f1apMsg);
11609 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
11610 f1apMsg->choice.initiatingMessage->value.present);
11613 }/* End of switch(initiatingMessage) */
11617 case F1AP_PDU_PR_successfulOutcome:
11619 switch(f1apMsg->choice.successfulOutcome->value.present)
11621 case SuccessfulOutcome__value_PR_ResetAcknowledge:
11623 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
11626 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
11628 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
11629 procUeContextSetupResponse(*duId, f1apMsg);
11632 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
11634 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
11635 procUeContextModificationResponse(*duId, f1apMsg);
11638 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
11640 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
11641 procUeContextReleaseComplete(*duId, f1apMsg);
11646 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
11647 f1apMsg->choice.successfulOutcome->value.present);
11650 }/* End of switch(successfulOutcome) */
11655 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
11658 }/* End of switch(f1apMsg->present) */
11660 } /* End of F1APMsgHdlr */
11662 /**********************************************************************
11664 **********************************************************************/