1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ProtocolIE-Field.h"
25 #include "ProtocolExtensionField.h"
26 #include "ProtocolIE-SingleContainer.h"
28 #include "ModulationOrder.h"
30 #include "UE-CapabilityRAT-Container.h"
31 #include "UE-CapabilityRAT-ContainerList.h"
32 #include "UE-CapabilityRAT-ContainerListRRC.h"
33 #include "HandoverPreparationInformationRrc-IEs.h"
34 #include "HandoverPreparationInformationRrc.h"
35 #include "SupportedBandwidth.h"
36 #include "FeatureSetUplinkPerCC.h"
37 #include "FeatureSetDownlinkPerCC.h"
38 #include "FeatureSets.h"
39 #include "RF-Parameters.h"
40 #include "UE-NR-Capability.h"
41 #include "ProtocolExtensionContainer.h"
42 #include "CellGroupConfigRrc.h"
43 #include "MAC-CellGroupConfig.h"
44 #include "SchedulingRequestConfig.h"
45 #include "SchedulingRequestToAddMod.h"
46 #include "BSR-Config.h"
47 #include "TAG-Config.h"
49 #include "PHR-Config.h"
50 #include "RLC-Config.h"
51 #include "UL-AM-RLC.h"
52 #include "DL-AM-RLC.h"
53 #include "LogicalChannelConfig.h"
54 #include "RLC-BearerConfig.h"
55 #include "PhysicalCellGroupConfig.h"
56 #include "SpCellConfig.h"
57 #include "ServingCellConfig.h"
58 #include "ControlResourceSet.h"
59 #include "SearchSpace.h"
60 #include "PDCCH-Config.h"
61 #include "PDSCH-TimeDomainResourceAllocation.h"
62 #include "PDSCH-TimeDomainResourceAllocationList.h"
63 #include "DMRS-DownlinkConfig.h"
64 #include "PDSCH-Config.h"
65 #include "BWP-DownlinkDedicated.h"
66 #include "PUSCH-TimeDomainResourceAllocation.h"
67 #include "PUSCH-TimeDomainResourceAllocationList.h"
68 #include "DMRS-UplinkConfig.h"
69 #include "PUSCH-Config.h"
70 #include "SRS-ResourceId.h"
71 #include "SRS-Resource.h"
72 #include "SRS-ResourceSet.h"
73 #include "SRS-Config.h"
74 #include "PUCCH-Config.h"
75 #include "PUCCH-ResourceSet.h"
76 #include "PUCCH-Resource.h"
77 #include "PUCCH-format1.h"
78 #include "PUCCH-FormatConfig.h"
79 #include "BWP-UplinkDedicated.h"
80 #include "PUSCH-ServingCellConfig.h"
81 #include "UplinkConfig.h"
82 #include "PDSCH-ServingCellConfig.h"
83 #include "EUTRANQoS.h"
84 #include "GBR-QosInformation.h"
85 #include "DRBs-ToBeSetupMod-List.h"
86 #include "DRBs-ToBeSetupMod-Item.h"
87 #include "DRBs-Setup-Item.h"
88 #include "DLUPTNLInformation-ToBeSetup-List.h"
89 #include "DLUPTNLInformation-ToBeSetup-Item.h"
90 #include "UPTransportLayerInformation.h"
91 #include "GTPTunnel.h"
92 #include "QoSInformation.h"
93 #include "Cells-to-be-Activated-List.h"
94 #include "DL-CCCH-Message.h"
95 #include "SRB-ToAddModList.h"
96 #include "SRB-ToAddMod.h"
97 #include "RRCSetup-IEs.h"
99 #include "DL-DCCH-Message.h"
100 #include "RRCReconfiguration-IEs.h"
101 #include "RRCReconfiguration.h"
102 #include "DRB-ToAddModList.h"
103 #include "DRB-ToAddMod.h"
104 #include "SDAP-Config.h"
106 #include "MeasTiming.h"
107 #include "MeasTimingList.h"
108 #include "MeasurementTimingConfigurationRrc-IEs.h"
109 #include "MeasurementTimingConfigurationRrc.h"
110 #include "PDCP-Config.h"
111 #include "RSRP-Range.h"
112 #include "RSRQ-Range.h"
113 #include "SINR-Range.h"
114 #include "ThresholdNR.h"
115 #include "MeasObjectToAddMod.h"
116 #include "MeasObjectNR.h"
117 #include "MeasObjectToAddModList.h"
118 #include "EventTriggerConfig.h"
119 #include "ReportConfigNR.h"
120 #include "ReportConfigToAddMod.h"
121 #include "ReportConfigToAddModList.h"
122 #include "MeasIdToAddMod.h"
123 #include "MeasIdToAddModList.h"
124 #include "FilterCoefficient.h"
125 #include "QuantityConfigNR.h"
126 #include "QuantityConfig.h"
127 #include "MeasConfigRrc.h"
128 #include "AS-Config.h"
129 #include "RRCReconfiguration-v1530-IEs.h"
130 #include "CNUEPagingIdentity.h"
131 #include "PagingCell-Item.h"
132 #include "UL-DCCH-Message.h"
134 #include "cu_stub_sctp.h"
135 #include "cu_stub_egtp.h"
136 #include "cu_f1ap_msg_hdl.h"
139 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
140 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
142 /*******************************************************************
144 * @brief Sends F1 msg over SCTP
148 * Function : SendF1APMsg
150 * Functionality: Sends F1 msg over SCTP
152 * @params[in] Region region
154 * @return ROK - success
157 * ****************************************************************/
158 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
160 Buffer *mBuf = NULLP;
162 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
164 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
166 ODU_PRINT_MSG(mBuf, 0,0);
168 if(sctpSend(duId, mBuf) != ROK)
170 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
171 ODU_PUT_MSG_BUF(mBuf);
177 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
178 ODU_PUT_MSG_BUF(mBuf);
181 ODU_PUT_MSG_BUF(mBuf);
185 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
192 /*******************************************************************
194 * @brief Builds NRCell ID
198 * Function : BuildNrCellId
200 * Functionality: Building the NR Cell ID
202 * @params[in] BIT_STRING_t *nrcell
203 * @return ROK - success
206 * ****************************************************************/
208 S16 BuildNrCellId(BIT_STRING_t *nrcell)
210 memset(nrcell->buf, 0, nrcell->size);
212 nrcell->bits_unused = 4;
213 nrcell->size = 5 * sizeof(uint8_t);
217 /********************************************************************
219 * @brief Builds and sends the F1SetupResponse
223 * Function : BuildAndSendF1SetupRsp
225 * Functionality: Constructs the F1SetupResponse message and sends
226 * it back to the DU through SCTP.
228 * @params[in] void **buf,Buffer to which encoded pattern is written into
229 * @params[in] int *size,size of buffer
231 * @return ROK - success
234 * ****************************************************************/
235 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
238 uint8_t elementCnt,cellCnt;
239 F1AP_PDU_t *f1apMsg = NULL;
240 F1SetupResponse_t *f1SetupRsp;
241 GNB_CU_Name_t *cuName;
242 Cells_to_be_Activated_List_t *cellToActivate;
243 RRC_Version_t *rrcVer;
244 asn_enc_rval_t encRetVal;
245 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
247 /* Allocate the memory for F1SetupRequest_t */
248 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
251 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
254 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
256 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
257 if(f1apMsg->choice.successfulOutcome == NULLP)
259 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
260 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
264 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
265 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
266 f1apMsg->choice.successfulOutcome->value.present = \
267 SuccessfulOutcome__value_PR_F1SetupResponse;
268 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
271 f1SetupRsp->protocolIEs.list.count = elementCnt;
272 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
274 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
275 elementCnt * sizeof(F1SetupResponseIEs_t *));
276 if(f1SetupRsp->protocolIEs.list.array == NULLP)
278 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
279 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
280 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
284 for(idx=0; idx<elementCnt; idx++)
286 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
287 sizeof(F1SetupResponseIEs_t));
288 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
290 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
291 elementCnt * sizeof(F1SetupResponseIEs_t *));
292 CU_FREE(f1apMsg->choice.successfulOutcome, \
293 sizeof(SuccessfulOutcome_t));
294 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
301 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
302 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
303 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
304 F1SetupResponseIEs__value_PR_TransactionID;
305 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
310 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
311 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
312 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
313 F1SetupResponseIEs__value_PR_GNB_CU_Name;
314 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
315 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
317 CU_ALLOC(cuName->buf, sizeof(cuName->size));
318 if(cuName->buf == NULLP)
320 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
322 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
323 sizeof(F1SetupResponseIEs_t));
325 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
326 elementCnt * sizeof(F1SetupResponseIEs_t *));
327 CU_FREE(f1apMsg->choice.successfulOutcome,\
328 sizeof(SuccessfulOutcome_t));
329 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
332 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
334 /*Cells to be activated list*/
336 f1SetupRsp->protocolIEs.list.array[idx]->id = \
337 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
338 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
339 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
340 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
341 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
342 Cells_to_be_Activated_List;
344 cellToActivate->list.count = cellCnt;
345 cellToActivate->list.size = \
346 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
347 CU_ALLOC(cellToActivate->list.array,\
348 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
349 if(cellToActivate->list.array == NULLP)
351 CU_FREE(cuName->buf, sizeof(cuName->size));
352 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
354 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
355 sizeof(F1SetupResponseIEs_t));
357 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
358 elementCnt * sizeof(F1SetupResponseIEs_t *));
359 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
360 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
363 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
365 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
366 if(cellToActivate->list.array[ieIdx] == NULLP)
368 CU_FREE(cellToActivate->list.array,\
369 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
370 CU_FREE(cuName->buf, sizeof(cuName->size));
371 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
373 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
374 sizeof(F1SetupResponseIEs_t));
376 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
377 elementCnt * sizeof(F1SetupResponseIEs_t *));
378 CU_FREE(f1apMsg->choice.successfulOutcome, \
379 sizeof(SuccessfulOutcome_t));
380 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
384 cellToActivate->list.array[0]->id = \
385 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
386 cellToActivate->list.array[0]->criticality = Criticality_ignore;
387 cellToActivate->list.array[0]->value.present = \
388 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
389 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
390 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
391 CU_ALLOC(cellToActivate->list.array[0]->\
392 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
394 if(cellToActivate->list.array[0]->value.choice.\
395 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
398 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
400 CU_FREE(cellToActivate->list.array[ieIdx],\
401 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
404 CU_FREE(cellToActivate->list.array,\
405 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
406 CU_FREE(cuName->buf, sizeof(cuName->size));
407 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
409 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
410 sizeof(F1SetupResponseIEs_t));
412 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
413 elementCnt * sizeof(F1SetupResponseIEs_t *));
414 CU_FREE(f1apMsg->choice.successfulOutcome, \
415 sizeof(SuccessfulOutcome_t));
416 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
419 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
420 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
421 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
422 nRCGI.nRCellIdentity.size = 5;
423 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
424 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
426 if(cellToActivate->list.array[0]->value.choice.\
427 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
429 CU_FREE(cellToActivate->list.array[0]->\
430 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
432 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
434 CU_FREE(cellToActivate->list.array[ieIdx],\
435 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
438 CU_FREE(cellToActivate->list.array,\
439 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
440 CU_FREE(cuName->buf, sizeof(cuName->size));
441 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
443 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
444 sizeof(F1SetupResponseIEs_t));
446 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
447 elementCnt * sizeof(F1SetupResponseIEs_t *));
448 CU_FREE(f1apMsg->choice.successfulOutcome, \
449 sizeof(SuccessfulOutcome_t));
450 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
453 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
456 f1SetupRsp->protocolIEs.list.array[idx]->id = \
457 ProtocolIE_ID_id_GNB_CU_RRC_Version;
458 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
459 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
460 F1SetupResponseIEs__value_PR_RRC_Version;
461 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
462 rrcVer->latest_RRC_Version.size = RRC_SIZE;
464 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
465 if(rrcVer->latest_RRC_Version.buf == NULLP)
467 CU_FREE(cuName->buf, sizeof(cuName->size));
468 for(ieIdx=0; ieIdx<elementCnt; idx++)
470 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
471 sizeof(F1SetupResponseIEs_t));
473 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
474 elementCnt * sizeof(F1SetupResponseIEs_t *));
475 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
476 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
480 /* Need to check RRC Version */
481 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
482 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
483 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
484 if(rrcVer->iE_Extensions == NULLP)
486 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
487 CU_FREE(cuName->buf, sizeof(cuName->size));
488 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
490 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
491 sizeof(F1SetupResponseIEs_t));
493 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
494 elementCnt * sizeof(F1SetupResponseIEs_t *));
495 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
496 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
499 rrcVer->iE_Extensions->list.count = 1;
500 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
501 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
502 sizeof(struct RRC_Version_ExtIEs *));
503 if(rrcVer->iE_Extensions->list.array == NULLP)
505 CU_FREE(rrcVer->iE_Extensions,\
506 sizeof(ProtocolExtensionContainer_4624P81_t));
507 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
508 CU_FREE(cuName->buf, sizeof(cuName->size));
509 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
511 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
512 sizeof(F1SetupResponseIEs_t));
514 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
515 elementCnt * sizeof(F1SetupResponseIEs_t *));
516 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
517 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
520 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
521 sizeof(struct RRC_Version_ExtIEs));
522 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
524 CU_FREE(rrcVer->iE_Extensions->list.array,\
525 sizeof(struct RRC_Version_ExtIEs *));
526 CU_FREE(rrcVer->iE_Extensions,\
527 sizeof(ProtocolExtensionContainer_4624P81_t));
528 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
529 CU_FREE(cuName->buf, sizeof(cuName->size));
530 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
532 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
533 sizeof(F1SetupResponseIEs_t));
535 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
536 elementCnt * sizeof(F1SetupResponseIEs_t *));
537 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
538 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
541 rrcVer->iE_Extensions->list.array[0]->id = \
542 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
543 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
544 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
545 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
546 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
547 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
548 CU_ALLOC(rrcVer->iE_Extensions->list.\
549 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
551 if(rrcVer->iE_Extensions->list.\
552 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
554 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
555 sizeof(struct RRC_Version_ExtIEs));
556 CU_FREE(rrcVer->iE_Extensions->list.array,\
557 sizeof(struct RRC_Version_ExtIEs *));
558 CU_FREE(rrcVer->iE_Extensions,\
559 sizeof(ProtocolExtensionContainer_4624P81_t));
560 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
561 CU_FREE(cuName->buf, sizeof(cuName->size));
562 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
564 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
565 sizeof(F1SetupResponseIEs_t));
567 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
568 elementCnt * sizeof(F1SetupResponseIEs_t *));
569 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
570 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
573 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
574 Latest_RRC_Version_Enhanced.buf[0] = 0;
575 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
576 Latest_RRC_Version_Enhanced.buf[1] = 5;
577 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
578 Latest_RRC_Version_Enhanced.buf[2] = 15;
580 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
582 /* Encode the F1SetupRequest type as UPER */
583 memset(encBuf, 0, ENC_BUF_MAX_LEN);
585 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
588 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
589 CU_FREE(cuName->buf, sizeof(cuName->size));
590 for(idx=0; idx<elementCnt; idx++)
592 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
594 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
595 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
596 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
598 /* Check encode results */
599 if(encRetVal.encoded == ENCODE_FAIL)
601 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
602 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
607 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
608 for(int i=0; i< encBufSize; i++)
610 DU_LOG("%x",encBuf[i]);
615 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
617 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
622 }/* End of BuildAndSendF1SetupRsp */
624 /*******************************************************************
626 * @brief Builds and sends the DUUpdateAcknowledge
630 * Function : BuildAndSendDUUpdateAck
632 * Functionality: Constructs the DU Update Acknowledge message and sends
633 * it to the DU through SCTP.
637 * @return ROK - success
640 * ****************************************************************/
642 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
646 F1AP_PDU_t *f1apMsg = NULL;
647 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
648 asn_enc_rval_t enRetVal; /* Encoder return value */
650 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
652 /* Allocate the memory for F1SetupRequest_t */
653 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
656 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
660 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
662 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
663 if(f1apMsg->choice.successfulOutcome == NULLP)
665 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
666 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
670 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
671 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
672 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
673 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
676 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
677 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
679 /* Initialize the F1Setup members */
680 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
681 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
683 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
684 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
685 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
689 for(idx=0; idx<elementCnt; idx++)
691 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
692 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
694 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
695 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
696 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
703 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
704 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
705 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
706 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
707 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
709 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
711 /* Encode the F1SetupRequest type as UPER */
712 memset(encBuf, 0, ENC_BUF_MAX_LEN);
714 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
717 for(idx=0; idx<elementCnt; idx++)
719 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
721 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
722 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
723 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
725 /* Checking encode results */
726 if(enRetVal.encoded == ENCODE_FAIL)
728 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
729 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
734 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
735 for(int i=0; i< encBufSize; i++)
737 DU_LOG("%x",encBuf[i]);
742 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
743 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
745 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
751 }/* End of BuildAndSendDUUpdateAck*/
753 /*******************************************************************
755 * @brief deallocating the memory of F1reset msg
759 * Function : FreeF1ResetReq
762 * - freeing memory of F1reset request msg
768 * ****************************************************************/
769 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
772 Reset_t *f1ResetMsg = NULLP;
776 if(f1apMsg->choice.initiatingMessage)
778 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
779 if(f1ResetMsg->protocolIEs.list.array)
781 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
783 if(f1ResetMsg->protocolIEs.list.array[idx])
785 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
788 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
790 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
792 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
795 /*******************************************************************
797 * @brief build ansld ans send f1reset msg
801 * Function : BuildAndSendF1ResetReq
803 * Functionality: build and send f1reset msg
805 * @return ROK - success
808 * ****************************************************************/
809 uint8_t BuildAndSendF1ResetReq()
811 uint8_t elementCnt=0;
813 uint8_t ret= RFAILED;
814 Reset_t *f1ResetMsg = NULLP;
815 F1AP_PDU_t *f1apMsg = NULLP;
816 asn_enc_rval_t encRetVal;
817 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
820 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
823 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
826 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
827 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
828 if(f1apMsg->choice.initiatingMessage == NULLP)
830 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
833 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
834 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
835 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
837 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
840 f1ResetMsg->protocolIEs.list.count = elementCnt;
841 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
843 /* Initialize the F1Reset members */
844 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
845 if(f1ResetMsg->protocolIEs.list.array == NULLP)
847 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
850 for(idx=0; idx<elementCnt; idx++)
852 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
853 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
855 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
862 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
863 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
864 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
865 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
869 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
870 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
871 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
872 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
873 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
877 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
878 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
879 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
880 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
881 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
883 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
885 /* Encode the F1SetupRequest type as APER */
886 memset(encBuf, 0, ENC_BUF_MAX_LEN);
888 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
892 if(encRetVal.encoded == ENCODE_FAIL)
894 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
895 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
900 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
901 for(idx=0; idx< encBufSize; idx++)
903 DU_LOG("%x",encBuf[idx]);
907 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
908 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
910 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
918 FreeF1ResetReq(f1apMsg);
922 /*******************************************************************
924 * @brief Fills Radio Bearer Config
928 * Function : fillSrbCfg
930 * Functionality: Fills Radio Bearer Config
932 * @params[in] SRB_ToAddModList *
934 * @return ROK - success
937 * ****************************************************************/
938 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
940 uint8_t elementCnt = 0;
941 uint8_t idx, ieId, srbIdx = 0;
943 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
945 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
949 if(bearerCfg != NULLP)
951 bearerCfg->list.count = elementCnt;
952 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
953 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
954 if(bearerCfg->list.array != NULLP)
956 for(idx = 0; idx < elementCnt; idx++)
958 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
959 if(bearerCfg->list.array[idx] == NULLP)
961 for(ieId = 0; ieId < idx; ieId++)
963 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
965 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
972 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
977 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
979 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
980 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
986 /*******************************************************************
988 * @brief Fills Master CellGroup Info
992 * Function : fillMasterCellGroup
994 * Functionality: Fills Master Cell Group IE
996 * @params[in] RRCSetup_IEs_t *
998 * @return ROK - success
1001 * ****************************************************************/
1003 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
1006 masterCellGroup->buf = NULLP;
1007 if(ueCb->f1apMsgDb.duToCuContainer.buf)
1009 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
1010 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1011 if(masterCellGroup->buf != NULLP)
1013 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1017 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1028 /*******************************************************************
1030 * @brief Fills RRC setup IE
1034 * Function : fillRRCSetupIE
1036 * Functionality: Fills RRC Setup IE
1038 * @params[in] RRCSetup_IEs_t *
1040 * @return ROK - success
1043 * ****************************************************************/
1045 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1047 uint8_t ret = ROK, srbIdx = 0;
1050 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1051 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1053 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1057 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1061 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1065 /* If SRB configuration are filled successfully in RRC Setup, mark these
1066 * configurartion as sent to UE */
1067 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1069 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1070 ueCb->srbList[srbIdx].cfgSentToUe = true;
1075 /*******************************************************************
1077 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1081 * Function : fillDlCcchRrcMsg
1083 * Functionality: Fills DL DCCCH Message required for
1084 * DLRRCMessageTransfer
1086 * @params[in] RRCContainer_t *rrcContainer
1088 * @return ROK - success
1091 * ****************************************************************/
1093 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1097 DL_CCCH_Message_t dl_CCCH_Msg;
1098 asn_enc_rval_t encRetVal;
1100 if(rrcContainer != NULLP)
1102 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1104 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1105 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1107 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1108 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1109 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1111 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1112 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1113 RRCSetup__criticalExtensions_PR_rrcSetup;
1115 /* Fill RRC Setup IE */
1116 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1117 sizeof(RRCSetup_IEs_t));
1118 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1120 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1124 /* encode DL-CCCH message into RRC Container */
1125 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1126 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1128 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1129 /* Encode results */
1130 if(encRetVal.encoded == ENCODE_FAIL)
1132 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1133 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1138 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1139 for(int i = 0; i< encBufSize; i++)
1141 DU_LOG("%x",encBuf[i]);
1143 rrcContainer->size = encBufSize;
1144 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1145 if(rrcContainer->buf != NULLP)
1147 memset(rrcContainer->buf, 0, encBufSize);
1148 for(idx2 = 0; idx2 < encBufSize; idx2++)
1150 rrcContainer->buf[idx2] = encBuf[idx2];
1162 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1168 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1174 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1180 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1185 /*******************************************************************
1187 * @brief Fills QOS flow configuration
1191 * Function : fillQosFlowsToAdd
1193 * Functionality: Fills QOS flow configuration
1195 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1197 * @return ROK - success
1200 * ****************************************************************/
1201 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1203 uint8_t idx, ied, elementCnt;
1206 qosFlow->list.count = elementCnt;
1207 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1208 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1209 if(qosFlow->list.array != NULLP)
1211 for(idx = 0; idx < elementCnt; idx++)
1213 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1214 if(qosFlow->list.array[idx] == NULLP)
1216 for(ied = 0; ied < idx; ied++)
1218 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1220 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1226 *qosFlow->list.array[idx] = 9;
1230 /*******************************************************************
1232 * @brief Fills CN Assoc for Drb to Add/Mod List
1236 * Function : fillCnAssoc
1238 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1240 * @params[in] struct DRB_ToAddMod__cnAssociation *
1242 * @return ROK - success
1245 * ****************************************************************/
1247 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1251 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1252 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1254 cnAssoc->choice.eps_BearerIdentity = 5;
1256 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1258 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1259 if(cnAssoc->choice.sdap_Config)
1261 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1262 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1263 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1264 cnAssoc->choice.sdap_Config->defaultDRB = true;
1265 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1266 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1267 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1268 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1269 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1271 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1275 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1276 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1282 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1289 /*******************************************************************
1291 * @brief Fills Radio Bearer Config for Drb
1295 * Function : fillDrbCfg
1297 * Functionality: Fills Radio Bearer Config for Drb
1299 * @params[in] drbId, DRB_ToAddModList *
1301 * @return ROK - success
1304 * ****************************************************************/
1305 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1307 uint8_t idx, ied, ret, elementCnt;
1313 drbCfg->list.count = elementCnt;
1314 drbCfg->list.size =\
1315 elementCnt * sizeof(DRB_ToAddMod_t *);
1316 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1317 if(drbCfg->list.array != NULLP)
1319 for(idx = 0; idx < elementCnt; idx++)
1321 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1322 if(drbCfg->list.array[idx] == NULLP)
1324 for(ied = 0; ied < idx; ied++)
1326 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1328 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1338 /* CN ASSOCIATION */
1339 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1340 if(drbCfg->list.array[idx]->cnAssociation)
1342 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1345 drbCfg->list.array[idx]->drb_Identity = drbId;
1350 /*******************************************************************
1352 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1356 * Function : fillRrcReconfigIE
1358 * Functionality: Fills RRC Reconfig Message required for
1359 * DLRRCMessageTransfer
1361 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1363 * @return ROK - success
1366 * ****************************************************************/
1368 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1371 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1372 if(rrcReconfigMsg->radioBearerConfig)
1374 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1375 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1377 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1382 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1383 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1385 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1388 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1389 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1390 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1396 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1397 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1403 /*******************************************************************
1405 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1409 * Function : fillDlDcchRrcMsg
1411 * Functionality: Fills DL DCCH Message required for
1412 * DLRRCMessageTransfer
1414 * @params[in] RRCContainer_t *rrcContainer
1416 * @return ROK - success
1419 * ****************************************************************/
1421 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1424 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1425 DL_DCCH_Message_t dl_DCCH_Msg;
1426 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1427 asn_enc_rval_t encRetVal;
1429 if(rrcContainer != NULLP)
1431 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1433 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1434 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1436 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1437 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1438 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1440 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1441 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1444 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1445 * configurartion as sent to UE */
1446 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1448 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1449 ueCb->srbList[srbIdx].cfgSentToUe = true;
1451 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1453 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1454 ueCb->drbList[drbIdx].cfgSentToUe = true;
1457 /* encode DL-DCCH message into RRC Container */
1458 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1459 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1461 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1462 /* Encode results */
1463 if(encRetVal.encoded == ENCODE_FAIL)
1465 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1466 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1471 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1472 for(int i = 0; i< encBufSize; i++)
1474 DU_LOG("%x",encBuf[i]);
1476 rrcContainer->size = encBufSize;
1477 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1478 if(rrcContainer->buf != NULLP)
1480 memset(rrcContainer->buf, 0, encBufSize);
1481 for(idx2 = 0; idx2 < encBufSize; idx2++)
1483 rrcContainer->buf[idx2] = encBuf[idx2];
1491 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1497 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1503 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1509 /*******************************************************************
1511 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1515 * Function : BuildDLRRCContainer
1517 * Functionality: Builds RRC Container IE required for
1518 * DLRRCMessageTransfer
1522 * @return ROK - success
1525 * ****************************************************************/
1527 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1529 uint8_t ret, bufLen;
1532 if(rrcMsgType == RRC_SETUP)
1534 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1536 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1538 else if(rrcMsgType == REGISTRATION_ACCEPT)
1540 /*Hardcoded RRC Container from reference logs*/
1541 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1543 rrcContainer->size = bufLen;
1544 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1545 if(rrcContainer->buf != NULLP)
1547 memset(rrcContainer->buf, 0, bufLen);
1548 memcpy(rrcContainer->buf, buf, bufLen);
1552 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1556 else if(rrcMsgType == RRC_RECONFIG)
1558 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Message ");
1559 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1561 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1567 /*******************************************************************
1569 * @brief Frees the DLRRCMessageTransfer
1573 * Function : freeDlRrcMessageTransfer
1575 * Functionality: Frees the DLRRCMessageTransfer
1579 * @return ROK - success
1582 * ****************************************************************/
1583 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1586 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1590 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1591 if(dlRRCMsg->protocolIEs.list.array)
1594 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1595 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1596 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1598 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1600 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1602 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1606 /*******************************************************************
1608 * @brief Builds and sends the DLRRCMessageTransfer
1612 * Function : BuildAndSendDLRRCMessageTransfer
1614 * Functionality: Constructs the DL RRC Message Transfer and sends
1615 * it to the CU through SCTP.
1619 * @return ROK - success
1622 * ****************************************************************/
1623 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1625 uint8_t elementCnt = 0;
1628 F1AP_PDU_t *f1apMsg = NULLP;
1629 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1630 asn_enc_rval_t encRetVal; /* Encoder return value */
1632 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1634 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1635 if(f1apMsg == NULLP)
1637 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1641 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1642 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1643 if(f1apMsg->choice.initiatingMessage == NULLP)
1645 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1646 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1650 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1651 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1652 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1653 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1656 dlRRCMsg->protocolIEs.list.count = elementCnt;
1657 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1659 /* Initialize the F1Setup members */
1660 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1661 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1663 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1664 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1665 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1669 for(idx=0; idx<elementCnt; idx++)
1671 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1672 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1674 for(ieId=0; ieId<idx; ieId++)
1676 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1678 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1679 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1680 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1685 /* GNB CU UE F1AP ID */
1687 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1688 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1689 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1690 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1692 /* GNB DU UE F1AP ID */
1694 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1695 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1696 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1697 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1701 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1702 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1703 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1704 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1708 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1709 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1710 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1711 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1713 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1715 /* Encode the F1SetupRequest type as APER */
1716 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1718 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1720 /* Encode results */
1721 if(encRetVal.encoded == ENCODE_FAIL)
1723 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1724 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1729 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1730 for(int i=0; i< encBufSize; i++)
1732 DU_LOG("%x",encBuf[i]);
1737 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1739 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1742 freeDlRrcMessageTransfer(f1apMsg);
1744 }/* End of BuildAndSendDLRRCMessageTransfer */
1746 /*******************************************************************
1748 * @brief Function to set the Dl RRC Msg Type
1752 * Function : setDlRRCMsgType
1754 * Functionality: Constructs the UE Setup Response and sends
1755 * it to the DU through SCTP.
1759 * @return ROK - success
1762 * ****************************************************************/
1764 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1766 uint8_t rrcMsgType = 0;
1767 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1770 rrcMsgType = RRC_SETUP;
1772 case REGISTRATION_ACCEPT:
1773 rrcMsgType = REGISTRATION_ACCEPT;
1775 case UE_CONTEXT_SETUP_REQ:
1776 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1778 case SECURITY_MODE_COMPLETE:
1779 rrcMsgType = SECURITY_MODE_COMPLETE;
1782 rrcMsgType = RRC_RECONFIG;
1784 case RRC_RECONFIG_COMPLETE:
1785 rrcMsgType = RRC_RECONFIG_COMPLETE;
1787 case UE_CONTEXT_MOD_REQ:
1788 rrcMsgType = UE_CONTEXT_MOD_REQ;
1796 /*******************************************************************
1798 * @brief Extract configuration from CellGroupConfig
1802 * Function : extractCellGroupConfig
1804 * Functionality: Extract configuration from CellGroupConfig
1805 * and store in local database
1807 * @params[in] UE control block
1810 * @return ROK - success
1813 * ****************************************************************/
1814 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
1816 uint8_t rbIdx, srbIdx, drbIdx;
1817 bool srbFound, drbFound;
1818 SrbInfo *srbCfgDb = NULLP;
1819 DrbInfo *drbCfgDb = NULLP;
1820 RlcLcCfg *rlcLcCfgDb = NULLP;
1821 MacLcCfg *macLcCfgDb = NULLP;
1822 RLC_BearerConfig_t *rlcCfg = NULLP;
1823 RLC_Config_t *rlcLcCfg = NULLP;
1824 LogicalChannelConfig_t *macLcCfg = NULLP;
1828 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
1832 if(cellGrpCfg == NULLP)
1834 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
1838 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
1843 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
1845 /* Update SRB configuration in local DB */
1846 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
1848 /* Search if SRB entry is already present in DB */
1849 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
1851 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
1853 srbCfgDb = &ueCb->srbList[srbIdx];
1859 /* If not, add SRB to UE CB's SRB list */
1862 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
1863 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
1867 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1868 srbCfgDb->cfgSentToUe = false;
1869 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
1870 macLcCfgDb = &srbCfgDb->macLcCfg;
1873 /* Update DRB configuration in local DB */
1874 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
1876 /* Search if DRB entry is already present in DB */
1877 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
1879 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
1881 drbCfgDb = &ueCb->drbList[drbIdx];
1887 /* If not, add DRB to UE CB's SRB list */
1890 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
1891 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
1895 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1896 drbCfgDb->cfgSentToUe = false;
1897 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
1898 macLcCfgDb = &drbCfgDb->macLcCfg;
1902 /* Update RLC configuration for this RB */
1903 rlcLcCfg = rlcCfg->rlc_Config;
1904 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
1905 switch(rlcLcCfgDb->rlcMode)
1907 case RLC_Config_PR_am:
1909 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
1910 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
1911 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
1912 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
1913 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
1915 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
1916 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
1917 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
1921 case RLC_Config_PR_um_Bi_Directional:
1923 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
1925 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
1926 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
1931 /* Update MAC configuration for this LC */
1932 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
1933 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
1934 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
1935 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
1936 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
1937 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
1942 /*******************************************************************
1944 * @brief Function to decode DU to CU RRC container
1948 * Function : extractDuToCuRrcCont
1950 * Functionality: Function to decode DU to CU RRC container
1953 * RRC conatiner octect string to be decoded
1955 * @return ROK - success
1958 * ****************************************************************/
1959 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
1961 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
1962 asn_dec_rval_t rval; /* Decoder return value */
1964 /* Copy the received container to UeCb */
1965 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
1967 /* Decoding DU to CU RRC container octet string to cell group config */
1968 cellGrpCfgMsg = &cellGrpCfg;
1969 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
1971 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
1973 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1975 DU_LOG("\nERROR --> F1AP : ASN decode failed");
1979 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
1981 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
1983 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
1990 /*******************************************************************
1992 * @brief Function to build Initial UL RRC Message
1996 * Function : procInitULRRCMsg
1998 * Functionality: Function to build Initial UL RRC Message
2002 * @return ROK - success
2005 * ****************************************************************/
2007 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2009 uint8_t idx,cellIdx=0, duIdx=0, rrcMsgType, gnbDuUeF1apId;
2011 uint32_t nrCellId, crnti;
2015 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2017 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2019 SEARCH_DU_DB(duIdx, duId, duDb);
2020 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2022 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2024 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2026 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2027 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2030 case ProtocolIE_ID_id_NRCGI:
2031 nrCellId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.buf[4] >>
2032 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.bits_unused;
2033 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2038 case ProtocolIE_ID_id_C_RNTI:
2039 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2040 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2042 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2043 memset(ueCb, 0, sizeof(CuUeCb));
2044 ueCb->cellCb = cellCb;
2045 ueCb->crnti = crnti;
2046 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2047 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2048 ueCb->state = UE_ATTACH_IN_PROGRESS;
2051 cellCb->ueCb[cellCb->numUe] = ueCb;
2056 case ProtocolIE_ID_id_RRCContainer:
2059 case ProtocolIE_ID_id_DUtoCURRCContainer:
2061 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2062 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2064 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2065 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2066 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2067 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2069 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2070 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2071 ueCb->f1apMsgDb.duToCuContainer.size);
2073 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2075 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2081 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2088 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2097 ueCb->f1apMsgDb.dlRrcMsgCount++;
2098 rrcMsgType = setDlRRCMsgType(ueCb);
2099 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2104 /*******************************************************************
2106 * @brief Builds Nrcgi
2110 * Function : BuildNrcgi
2112 * Functionality: Building the PLMN ID and NR Cell id
2114 * @params[in] NRCGI_t *nrcgi
2115 * @return ROK - success
2118 * ****************************************************************/
2119 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2122 uint8_t unused_bits = 4;
2123 uint8_t byteSize = 5;
2125 /* Allocate Buffer Memory */
2126 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2127 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2128 if(nrcgi->pLMN_Identity.buf == NULLP)
2132 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2138 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2139 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2140 if(nrcgi->nRCellIdentity.buf == NULLP)
2144 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2148 /*******************************************************************
2150 * @brief Builds Special cell list for UE Setup Request
2154 * Function : BuildSplCellList
2156 * Functionality: Constructs the Special Cell list for UESetReq
2158 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2160 * @return ROK - success
2163 * ****************************************************************/
2164 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2170 spCellLst->list.count = cellCnt;
2171 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2172 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2173 if(spCellLst->list.array == NULLP)
2177 for(idx=0; idx<cellCnt; idx++)
2179 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2180 if(spCellLst->list.array[idx] == NULLP)
2186 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2187 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2188 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2190 /* Special Cell ID -NRCGI */
2191 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2196 /*Special Cell Index*/
2197 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2199 }/* End of BuildSplCellList*/
2201 /*******************************************************************
2203 * @brief Builds SRBS to be setup
2207 * Function : BuildSRBSetup
2209 * Functionality: Constructs the SRB's for UESetReq
2211 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2213 * @return ROK - success
2216 * ****************************************************************/
2217 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2222 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2223 srbCnt = ueCb->numSrb;
2226 srbSet->list.count = srbCnt;
2227 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2228 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2229 if(srbSet->list.array == NULLP)
2231 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2235 for(idx=0; idx<srbCnt; idx++)
2237 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2238 if(srbSet->list.array[idx] == NULLP)
2240 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2245 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2248 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2249 srbSet->list.array[idx]->criticality = Criticality_ignore;
2250 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2251 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2252 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2257 for(idx=0; idx<srbCnt; idx++)
2259 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2260 srbSet->list.array[idx]->criticality = Criticality_ignore;
2261 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2262 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2266 }/* End of BuildSRBSetup*/
2268 /*******************************************************************
2270 * @brief Builds QOS Info for DRB Setum Item
2274 * Function : BuildQOSInfo
2276 * Functionality: Constructs the QOS Info for DRB Setup Item
2278 * @params[in] QoSInformation_t *qosinfo
2279 * int16_t pduSessionID
2281 * @return ROK - success
2284 * ****************************************************************/
2285 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2287 uint8_t elementCnt = 0, qosCntIdx = 0;
2288 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2290 /* NonDynamic5QIDescriptor */
2291 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2292 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2293 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2299 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2303 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2304 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2306 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2308 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2314 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2315 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2319 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2320 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2322 /*MaxDataBurstVolume*/
2323 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2324 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2328 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2329 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2332 /*nRGRAN Allocation Retention Priority*/
2335 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2336 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2337 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2341 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2342 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2343 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2345 qosInfo->priorityLevel = PriorityLevel_lowest;
2346 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2347 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2350 /* PDU session ID */
2353 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2354 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2356 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2360 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2361 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2365 elementCnt = NUM_QOS_EXT;
2366 qosIeExt->list.count = elementCnt;
2367 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2369 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2370 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2372 if(qosIeExt->list.array == NULLP)
2374 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2378 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2380 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2381 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2383 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2386 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2387 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2388 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2389 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2390 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2391 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2392 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2393 qosInfo->pduSessionId = pduSessionID;
2398 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2403 }/*End of BuildQOSInfo*/
2405 /*******************************************************************
2407 * @brief Builds SNSSAI
2411 * Function : BuildSNSSAI
2413 * Functionality: Constructs the SNSSAI For DRB list
2415 * @params[in] SNSSAI_t *snssai
2416 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2418 * @return ROK - success
2421 * ****************************************************************/
2422 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2426 snssai->sST.size = sizeof(uint8_t);
2427 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2428 if(snssai->sST.buf == NULLP)
2433 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2435 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2438 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2439 if(snssai->sD == NULLP)
2443 snssai->sD->size = 3 * sizeof(uint8_t);
2444 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2445 if(snssai->sD->buf == NULLP)
2450 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2452 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2455 drbInfo->snssai = snssaiToCopy;
2457 }/*End of BuildSNSSAI*/
2459 /*******************************************************************
2461 * @brief Builds the flow map.
2465 * Function : BuildFlowsMap
2467 * Functionality: Constructs the flowmap For DRB list
2469 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2471 * @return ROK - success
2474 * ****************************************************************/
2475 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2477 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2478 FlowsMapped *qosFlow;
2483 flowCnt = drbInfo->numFlowMap;
2484 flowMap->list.count = flowCnt;
2485 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2486 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2487 if(flowMap->list.array == NULLP)
2489 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2492 for(idx=0; idx<flowCnt; idx++)
2494 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2495 if(flowMap->list.array[idx] == NULLP)
2497 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2503 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2504 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2506 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2508 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2510 qosFlow = &drbInfo->flowMapList[flowIdx];
2517 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2518 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2523 qosFlow = &drbInfo->flowMapList[idx];
2524 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2527 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2528 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2531 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2535 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2536 drbInfo->numFlowMap++;
2539 }/*End of BuildFlowsMap*/
2541 /*******************************************************************
2543 * @brief Builds the Uplink Tunnel Info
2547 * Function : BuildULTnlInfo
2549 * Functionality: Constructs the UL TnlInfo For DRB list
2551 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2553 * @return ROK - success
2556 * ****************************************************************/
2557 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2563 ulInfo->list.count = ulCnt;
2564 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2565 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2566 if(ulInfo->list.array == NULLP)
2568 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2571 for(idx=0; idx<ulCnt; idx++)
2573 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2574 if(ulInfo->list.array[idx] == NULLP)
2576 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2581 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2583 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2584 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2586 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2589 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2590 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2591 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2592 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2594 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2600 /* NOTE: Below IP address must be changed if running on different IP configuration */
2601 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2602 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2603 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2604 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2605 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2607 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2608 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2609 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2610 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2614 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2615 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2616 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2617 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2618 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2622 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2623 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2624 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2625 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2627 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2633 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2634 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2635 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2636 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2638 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2639 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2640 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2641 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2645 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2646 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2647 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2648 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2651 }/*End of BuildULTnlInfo*/
2653 /*******************************************************************
2655 * @brief Builds DRBS to be setup
2659 * Function : BuildDRBSetup
2661 * Functionality: Constructs the DRB's for UESetReq
2663 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2665 * @return ROK - success
2668 * ****************************************************************/
2669 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2671 uint8_t idx = 0, extIeIdx = 0;
2672 uint8_t elementCnt = 0, drbCnt = 0;
2673 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2674 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2675 DRBs_ToBeSetup_Item_t *drbSetItem;
2676 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2677 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2679 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2680 drbCnt = ueCb->numDrb;
2682 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2683 drbSet->list.count = drbCnt;
2685 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2686 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2687 if(drbSet->list.array == NULLP)
2689 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2693 for(idx=0; idx<drbCnt; idx++)
2695 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2696 if(drbSet->list.array[idx] == NULLP)
2698 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2702 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2703 drbSet->list.array[idx]->criticality = Criticality_ignore;
2704 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2705 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2707 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2709 drbSetItem->dRBID = idx + 1;
2710 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2713 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2716 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2717 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2718 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2720 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2723 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2724 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2725 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2726 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2727 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2728 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2730 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2731 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2732 if(BuildQOSInforet != ROK)
2734 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2739 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2740 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2741 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
2743 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2744 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], TRUE);
2745 if(BuildSNSSAIret != ROK)
2747 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2751 /*Flows mapped to DRB List*/
2752 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2753 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2754 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2756 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2757 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2758 if(BuildFlowsMapret != ROK)
2760 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2764 /*ULUPTNLInformation To Be Setup List*/
2765 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2766 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2769 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2771 if(BuildULTnlInforet != ROK)
2773 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2778 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2780 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2781 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
2784 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
2786 /* DL PDCP SN Length */
2787 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2789 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
2790 if(!drbToBeSetupExt)
2792 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
2797 drbToBeSetupExt->list.count = elementCnt;
2798 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
2800 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
2801 if(!drbToBeSetupExt->list.array)
2803 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
2807 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
2809 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
2810 if(!drbToBeSetupExt->list.array[extIeIdx])
2812 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
2818 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
2820 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
2821 drbToBeSetupExtIe->criticality = Criticality_ignore;
2822 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
2823 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
2824 drbSetItem->iE_Extensions = drbToBeSetupExt;
2827 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2831 }/* End of BuildDRBSetup*/
2833 /*******************************************************************
2835 * @brief Deallocating memory of function BuildAndSendUESetReq
2839 * Function : FreeNrcgi
2841 * Functionality: Deallocating memory for function BuildNrcgi
2843 * @params[in] NRCGI_t *nrcgi
2847 *******************************************************************/
2848 void FreeNrcgi(NRCGI_t *nrcgi)
2850 if(nrcgi->pLMN_Identity.buf != NULLP)
2852 if(nrcgi->nRCellIdentity.buf != NULLP)
2854 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2856 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2859 /*******************************************************************
2861 * @brief Deallocating memory of function BuildAndSendUESetReq
2865 * Function : FreeSplCellList
2867 * Functionality: Deallocating memory for function BuildSplCellList
2869 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2874 * *****************************************************************/
2875 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2878 if(spCellLst->list.array != NULLP)
2880 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2882 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2884 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2886 if(spCellLst->list.array[cellidx]!=NULLP)
2888 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2891 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2894 /*******************************************************************
2896 * @brief Deallocating memory of function BuildAndSendUESetReq
2900 * Function : FreeSRBSetup
2902 * Functionality: Deallocating memory for function BuildSRBSetup
2904 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2909 * ******************************************************************/
2910 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2913 if(srbSet->list.array != NULLP)
2915 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2917 if(srbSet->list.array[srbidx]!=NULLP)
2919 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2922 CU_FREE(srbSet->list.array,srbSet->list.size);
2925 /*******************************************************************
2927 * @brief Deallocating memory of function BuildAndSendUESetReq
2931 * Function : FreeQOSInfo
2933 * Functionality: Deallocating memory for function BuildQOSInfo
2935 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2939 * ****************************************************************/
2940 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2942 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2943 uint8_t qosCntIdx = 0;
2945 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2947 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2949 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2951 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2952 sizeof(MaxDataBurstVolume_t));
2954 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2955 sizeof(AveragingWindow_t));
2957 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2958 sizeof(NonDynamic5QIDescriptor_t));
2960 if(drbQos->iE_Extensions)
2962 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2963 if(qosIeExt->list.array != NULLP)
2965 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2967 if(qosIeExt->list.array[qosCntIdx])
2969 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2972 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2975 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2978 /*******************************************************************
2980 * @brief Deallocating memory of function BuildAndSendUESetReq
2984 * Function : FreeULTnlInfo
2986 * Functionality: Deallocating memory for function BuildULTnlInfo
2988 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2993 * ****************************************************************/
2994 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2997 if(ulInfo->list.array != NULLP)
2999 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3001 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3003 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3005 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3006 transportLayerAddress.buf != NULLP)
3008 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3011 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3012 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3013 gTPTunnel->gTP_TEID.size);
3015 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3016 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3017 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3019 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3020 sizeof(GTPTunnel_t));
3023 if(ulInfo->list.array[ulidx]!=NULLP)
3025 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3028 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3031 /*******************************************************************
3033 * @brief Deallocating memory for BuildAndSendUESetReq
3037 * Function : FreeDRBSetup
3039 * Functionality: Deallocating memory for BuildDRBSetup
3041 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3045 * ****************************************************************/
3046 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3048 DRBs_ToBeSetup_Item_t *drbSetItem;
3049 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3051 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3053 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3054 if(drbSet->list.array != NULLP)
3056 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3058 if(drbSet->list.array[drbidx] != NULLP)
3060 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3061 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3063 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3064 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3066 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3067 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3069 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3070 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3072 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3074 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3076 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3078 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3079 flows_Mapped_To_DRB_List.list.array != NULLP)
3081 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3082 flows_Mapped_To_DRB_List.list.count; flowidx++)
3084 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3085 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3087 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3088 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3089 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3091 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3092 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3093 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3095 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3096 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3097 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3099 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3100 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_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->maxDataBurstVolume,\
3105 sizeof(MaxDataBurstVolume_t));
3107 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3108 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3109 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3111 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3112 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3113 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3116 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3117 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3119 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3120 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3123 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3124 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3125 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3127 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3128 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3130 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3131 sizeof(OCTET_STRING_t));
3133 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3134 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3136 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3137 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3139 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3140 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3142 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3143 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3145 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3146 iE_Extensions != NULLP)
3148 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3149 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3150 if(qosIeExt->list.array != NULLP)
3152 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3154 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3156 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3159 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3161 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3162 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3165 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3167 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3170 CU_FREE(drbSet->list.array,drbSet->list.size);
3175 /*******************************************************************
3177 * @brief Free the UE Setup Request
3181 * Function : FreeUeContextSetupReq
3183 * Functionality: Deallocate the memory of BuildUESetReq
3185 * @params[in] F1AP_PDU_t *f1apMsg
3190 * ****************************************************************/
3191 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3194 UEContextSetupRequest_t *ueSetReq = NULLP;
3196 if(f1apMsg != NULLP)
3198 if(f1apMsg->choice.initiatingMessage != NULLP)
3200 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3201 if(ueSetReq->protocolIEs.list.array != NULLP)
3203 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3205 if(ueSetReq->protocolIEs.list.array[idx])
3207 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3209 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3211 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3213 case ProtocolIE_ID_id_SpCell_ID:
3214 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3216 case ProtocolIE_ID_id_ServCellIndex:
3218 case ProtocolIE_ID_id_SpCellULConfigured:
3220 case ProtocolIE_ID_id_CUtoDURRCInformation:
3221 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3223 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3224 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3226 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3227 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3229 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3230 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3232 case ProtocolIE_ID_id_RRCContainer:
3233 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3235 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3236 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3239 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3240 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3241 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3244 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3248 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3250 for(ieId=0; ieId<idx; ieId++)
3252 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3254 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3257 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3259 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3261 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3265 /**Filling cell group info **/
3266 /*******************************************************************
3268 * @brief Build Control resource set to add/modify list
3272 * Function : BuildControlRSetToAddModList
3274 * Functionality: Build Control resource set to add/modify list
3277 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3279 * @return ROK - success
3282 * ****************************************************************/
3283 uint8_t BuildControlRSetToAddModList
3285 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3290 uint8_t numBytes, bitsUnused;
3291 struct ControlResourceSet *controlRSet;
3292 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3293 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3296 controlRSetList->list.count = elementCnt;
3297 controlRSetList->list.size = \
3298 elementCnt * sizeof(struct ControlResourceSet *);
3300 controlRSetList->list.array = NULLP;
3301 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3302 if(!controlRSetList->list.array)
3304 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3308 for(idx = 0; idx < elementCnt; idx++)
3310 controlRSetList->list.array[idx] = NULLP;
3311 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3312 if(!controlRSetList->list.array[idx])
3314 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3320 controlRSet = controlRSetList->list.array[idx];
3321 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3323 /* Values harcoded according to our design:
3326 * Bit string stored ff0000000000
3330 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3331 controlRSet->frequencyDomainResources.buf = NULLP;
3332 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3333 controlRSet->frequencyDomainResources.size);
3334 if(!controlRSet->frequencyDomainResources.buf)
3336 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3340 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3341 coreset0EndPrb = CORESET0_END_PRB;
3342 coreset1StartPrb = coreset0EndPrb + 6;
3343 coreset1NumPrb = CORESET1_NUM_PRB;
3344 /* calculate the PRBs */
3345 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3346 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3347 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3349 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3350 controlRSet->cce_REG_MappingType.present = \
3351 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3353 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3354 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3355 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3356 controlRSet->tci_PresentInDCI = NULLP;
3358 uint8_t tciStateIdx;
3360 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3361 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3362 if(!controlRset->tci_StatesPDCCH_ToAddList)
3364 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3369 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3370 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3371 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3372 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3373 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3375 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3379 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3381 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3382 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3384 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3391 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3393 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3394 if(!controlRset->tci_PresentInDCI)
3396 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3400 *(controlRset->tci_PresentInDCI);
3403 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3404 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3405 if(!controlRSet->pdcch_DMRS_ScramblingID)
3407 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3410 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3413 } /* End BuildControlRSetToAddModList */
3415 /*******************************************************************
3417 * @brief Build search space to add/modify list
3421 * Function : BuildSearchSpcToAddModList
3423 * Functionality: Build search space to add/modify list
3426 * @return ROK - success
3429 * ****************************************************************/
3430 uint8_t BuildSearchSpcToAddModList
3432 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3440 struct SearchSpace *searchSpc;
3443 searchSpcList->list.count = elementCnt;
3444 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3446 searchSpcList->list.array = NULLP;
3447 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3448 if(!searchSpcList->list.array)
3450 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3454 for(idx = 0; idx < elementCnt; idx++)
3456 searchSpcList->list.array[idx] = NULLP;
3457 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3458 if(!searchSpcList->list.array[idx])
3460 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3466 searchSpc = searchSpcList->list.array[idx];
3468 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3470 searchSpc->controlResourceSetId = NULLP;
3471 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3472 if(!searchSpc->controlResourceSetId)
3474 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3477 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3479 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3480 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3481 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3482 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3484 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3487 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3488 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3490 searchSpc->duration = NULLP;
3491 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3492 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3493 if(!searchSpc->monitoringSymbolsWithinSlot)
3495 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3499 /* Values taken from reference logs :
3502 * Bit string stores 8000
3507 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3508 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3509 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3510 searchSpc->monitoringSymbolsWithinSlot->size);
3511 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3513 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3518 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3519 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3520 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3521 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3523 searchSpc->nrofCandidates = NULLP;
3524 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3525 if(!searchSpc->nrofCandidates)
3527 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3531 searchSpc->nrofCandidates->aggregationLevel1 = \
3532 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3533 searchSpc->nrofCandidates->aggregationLevel2 = \
3534 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3535 searchSpc->nrofCandidates->aggregationLevel4 = \
3536 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3537 searchSpc->nrofCandidates->aggregationLevel8 = \
3538 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3539 searchSpc->nrofCandidates->aggregationLevel16 = \
3540 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3542 searchSpc->searchSpaceType = NULLP;
3543 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3544 if(!searchSpc->searchSpaceType)
3546 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3550 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3552 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3553 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3554 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3555 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3557 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3560 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3561 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3564 }/* End BuildSearchSpcToAddModList */
3566 /*******************************************************************
3568 * @brief Builds BWP DL dedicated PDCCH config
3572 * Function : BuildBWPDlDedPdcchCfg
3574 * Functionality: Builds BWP DL dedicated PDCCH config
3576 * @params[in] struct PDCCH_Config *pdcchCfg
3578 * @return ROK - success
3581 * ****************************************************************/
3582 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3584 pdcchCfg->controlResourceSetToAddModList = NULLP;
3585 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3586 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3587 if(!pdcchCfg->controlResourceSetToAddModList)
3589 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3593 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3598 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3600 pdcchCfg->searchSpacesToAddModList = NULLP;
3601 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3602 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3603 if(!pdcchCfg->searchSpacesToAddModList)
3605 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3609 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3614 pdcchCfg->searchSpacesToReleaseList = NULLP;
3615 pdcchCfg->downlinkPreemption = NULLP;
3616 pdcchCfg->tpc_PUSCH = NULLP;
3617 pdcchCfg->tpc_PUCCH = NULLP;
3618 pdcchCfg->tpc_SRS = NULLP;
3623 /*******************************************************************
3625 * @brief Builds DMRS DL PDSCH Mapping type A
3629 * Function : BuildDMRSDLPdschMapTypeA
3631 * Functionality: Builds DMRS DL PDSCH Mapping type A
3634 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3635 * @return ROK - success
3638 * ****************************************************************/
3639 uint8_t BuildDMRSDLPdschMapTypeA
3641 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3644 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3645 dmrsDlCfg->choice.setup = NULLP;
3646 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3647 if(!dmrsDlCfg->choice.setup)
3649 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3653 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3654 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3655 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3656 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3658 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3661 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3663 dmrsDlCfg->choice.setup->maxLength = NULLP;
3664 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3665 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3666 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3671 /*******************************************************************
3673 * @brief Builds TCI states to add/modify list
3677 * Function : BuildTCIStatesToAddModList
3679 * Functionality:Builds TCI states to add/modify list
3682 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3684 * @return ROK - success
3687 * ****************************************************************/
3688 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3693 /*******************************************************************
3695 * @brief Builds PDSCH time domain allocation list
3699 * Function : BuildPdschTimeDomAllocList
3701 * Functionality: Builds PDSCH time domain allocation list
3704 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3706 * @return ROK - success
3709 * ****************************************************************/
3710 uint8_t BuildPdschTimeDomAllocList
3712 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3717 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3719 timeDomAllocList->present = \
3720 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3722 timeDomAllocList->choice.setup = NULLP;
3723 CU_ALLOC(timeDomAllocList->choice.setup, \
3724 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3725 if(!timeDomAllocList->choice.setup)
3727 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3732 timeDomAllocList->choice.setup->list.count = elementCnt;
3733 timeDomAllocList->choice.setup->list.size = \
3734 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3736 timeDomAllocList->choice.setup->list.array = NULLP;
3737 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3738 timeDomAllocList->choice.setup->list.size);
3739 if(!timeDomAllocList->choice.setup->list.array)
3741 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3745 for(idx = 0; idx < elementCnt; idx++)
3747 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3748 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3749 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3750 if(!timeDomAllocList->choice.setup->list.array[idx])
3752 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3758 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3759 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3760 if(!timeDomAlloc->k0)
3762 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3765 *(timeDomAlloc->k0) = 0;
3766 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3767 timeDomAlloc->startSymbolAndLength = 66;
3770 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3771 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3772 if(!timeDomAlloc->k0)
3774 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3777 *(timeDomAlloc->k0) = 1;
3778 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3779 timeDomAlloc->startSymbolAndLength = 66;
3784 /*******************************************************************
3786 * @brief Builds PDSCH PRB Bundling type
3790 * Function : BuildPdschPrbBundlingType
3792 * Functionality: Builds PDSCH PRB Bundling type
3795 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3797 * @return ROK - success
3800 * ****************************************************************/
3801 uint8_t BuildPdschPrbBundlingType
3803 struct PDSCH_Config__prb_BundlingType *prbBndlType
3806 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3808 prbBndlType->choice.staticBundling = NULLP;
3809 CU_ALLOC(prbBndlType->choice.staticBundling, \
3810 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3811 if(!prbBndlType->choice.staticBundling)
3813 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3816 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3821 /*******************************************************************
3823 * @brief Builds BWP DL dedicated PDSCH config
3827 * Function : BuildBWPDlDedPdschCfg
3829 * Functionality: Builds BWP DL dedicated PDSCH config
3831 * @params[in] struct PDSCH_Config *pdschCfg
3833 * @return ROK - success
3836 * ****************************************************************/
3837 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3839 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3841 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3842 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3843 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3844 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3846 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3850 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3855 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3856 pdschCfg->tci_StatesToAddModList = NULLP;
3857 pdschCfg->tci_StatesToReleaseList = NULLP;
3858 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3860 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3861 if(!pdschCfg->tci_StatesToAddModList)
3863 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3866 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3872 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3874 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3875 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3876 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3877 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3879 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3882 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3886 pdschCfg->pdsch_AggregationFactor = NULLP;
3887 pdschCfg->rateMatchPatternToAddModList = NULLP;
3888 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3889 pdschCfg->rateMatchPatternGroup1 = NULLP;
3890 pdschCfg->rateMatchPatternGroup2 = NULLP;
3891 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3892 pdschCfg->mcs_Table = NULLP;
3894 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3895 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3896 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3898 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3901 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3903 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3908 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3909 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3910 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3911 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3912 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3913 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3914 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3919 /*******************************************************************
3921 * @brief Builds intitial DL BWP
3924 * Function : BuildInitialDlBWP
3926 * Functionality: Builds intitial DL BWP in spCellCfgDed
3928 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3930 * @return ROK - success
3933 * ****************************************************************/
3934 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3936 dlBwp->pdcch_Config = NULLP;
3937 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3938 if(!dlBwp->pdcch_Config)
3940 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3943 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3945 dlBwp->pdcch_Config->choice.setup = NULLP;
3946 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3947 if(!dlBwp->pdcch_Config->choice.setup)
3949 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3952 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3957 dlBwp->pdsch_Config = NULLP;
3958 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3959 if(!dlBwp->pdsch_Config)
3961 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3964 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3966 dlBwp->pdsch_Config->choice.setup = NULLP;
3967 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3968 if(!dlBwp->pdsch_Config->choice.setup)
3970 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3974 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3979 dlBwp->sps_Config = NULLP;
3980 dlBwp->radioLinkMonitoringConfig = NULLP;
3984 /*******************************************************************
3986 * @brief Builds DMRS UL Pusch Mapping type A
3990 * Function : BuildDMRSULPuschMapTypeA
3992 * Functionality: Builds DMRS UL Pusch Mapping type A
3995 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3996 * @return ROK - success
3999 * ****************************************************************/
4000 uint8_t BuildDMRSULPuschMapTypeA
4002 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4005 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4006 dmrsUlCfg->choice.setup= NULLP;
4007 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4008 if(!dmrsUlCfg->choice.setup)
4010 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4014 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4015 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4016 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4017 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4019 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4022 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4024 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4025 dmrsUlCfg->choice.setup->maxLength = NULLP;
4026 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4027 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4028 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4029 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4031 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4035 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4036 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4038 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4040 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4043 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4045 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4046 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4050 /*******************************************************************
4052 * @brief Build PUSCH time domain allocation list
4056 * Function : BuildPuschTimeDomAllocList
4058 * Functionality: Build PUSCH time domain allocation list
4061 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4063 * @return ROK - success
4066 * ****************************************************************/
4067 uint8_t BuildPuschTimeDomAllocList
4069 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4074 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4076 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4077 timeDomAllocList->choice.setup = NULLP;
4078 CU_ALLOC(timeDomAllocList->choice.setup, \
4079 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4080 if(!timeDomAllocList->choice.setup)
4082 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4087 timeDomAllocList->choice.setup->list.count = elementCnt;
4088 timeDomAllocList->choice.setup->list.size = \
4089 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4090 timeDomAllocList->choice.setup->list.array = NULLP;
4091 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4092 timeDomAllocList->choice.setup->list.size);
4093 if(!timeDomAllocList->choice.setup->list.array)
4095 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4099 for(idx = 0; idx < elementCnt; idx++)
4101 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4102 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4103 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4104 if(!timeDomAllocList->choice.setup->list.array[idx])
4106 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4112 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4113 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4114 if(!timeDomAlloc->k2)
4116 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4119 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4120 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4121 timeDomAlloc->startSymbolAndLength = 66;
4124 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4125 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4126 if(!timeDomAlloc->k2)
4128 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4131 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4132 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4133 timeDomAlloc->startSymbolAndLength = 66;
4138 /*******************************************************************
4140 * @brief Builds BWP UL dedicated PUSCH Config
4144 * Function : BuildBWPUlDedPuschCfg
4147 * Builds BWP UL dedicated PUSCH Config
4149 * @params[in] : PUSCH_Config_t *puschCfg
4151 * @return ROK - success
4154 * ****************************************************************/
4155 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4157 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4158 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4159 if(!puschCfg->dataScramblingIdentityPUSCH)
4161 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4164 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4166 puschCfg->txConfig = NULLP;
4167 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4168 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4169 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4170 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4172 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4176 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4181 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4182 puschCfg->pusch_PowerControl = NULLP;
4183 puschCfg->frequencyHopping = NULLP;
4184 puschCfg->frequencyHoppingOffsetLists = NULLP;
4185 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4187 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4188 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4189 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4190 if(!puschCfg->pusch_TimeDomainAllocationList)
4192 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4196 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4201 puschCfg->pusch_AggregationFactor = NULLP;
4202 puschCfg->mcs_Table = NULLP;
4203 puschCfg->mcs_TableTransformPrecoder = NULLP;
4204 puschCfg->transformPrecoder = NULLP;
4205 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4206 if(!puschCfg->transformPrecoder)
4208 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4211 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4213 puschCfg->codebookSubset = NULLP;
4214 puschCfg->maxRank = NULLP;
4215 puschCfg->rbg_Size = NULLP;
4216 puschCfg->uci_OnPUSCH = NULLP;
4217 puschCfg->tp_pi2BPSK = NULLP;
4222 /*******************************************************************
4224 * @brief Builds BWP UL dedicated PUCCH Config
4228 * Function : BuildBWPUlDedPucchCfg
4231 * Builds BWP UL dedicated PUCCH Config
4233 * @params[in] : PUCCH_Config_t *pucchCfg
4235 * @return ROK - success
4238 * ****************************************************************/
4239 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4241 uint8_t arrIdx, elementCnt;
4242 uint8_t rsrcIdx, rsrcSetIdx;
4243 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4244 PUCCH_Resource_t *rsrc = NULLP;
4248 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4249 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4250 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4251 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4252 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4254 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4257 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4258 rsrcSet->pucch_ResourceSetId = 1;
4260 rsrcSet->resourceList.list.count = elementCnt;
4261 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4262 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4263 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4265 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4268 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4272 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4273 pucchCfg->resourceToAddModList->list.count = elementCnt;
4274 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4275 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4276 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4278 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4281 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4282 rsrc->pucch_ResourceId = 1;
4283 rsrc->startingPRB = 0;
4284 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4285 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4286 rsrc->format.choice.format1->initialCyclicShift = 0;
4287 rsrc->format.choice.format1->nrofSymbols = 4;
4288 rsrc->format.choice.format1->startingSymbolIndex = 0;
4289 rsrc->format.choice.format1->timeDomainOCC = 0;
4292 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4293 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4294 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4295 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4296 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4299 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4300 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4302 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4307 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4308 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4309 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4310 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4312 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4316 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4318 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4319 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4321 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4327 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4328 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4333 /*******************************************************************
4335 * @brief Fills SRS resource to add/modify list
4339 * Function : BuildSrsRsrcAddModList
4341 * Functionality: Fills SRS resource to add/modify list
4344 * @return ROK - success
4347 * ****************************************************************/
4348 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4354 resourceList->list.count = elementCnt;
4355 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4356 resourceList->list.array = NULLP;
4357 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4358 if(!resourceList->list.array)
4360 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4364 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4366 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4367 if(!resourceList->list.array[rsrcIdx])
4369 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4375 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4376 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4377 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4379 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4380 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4381 sizeof(struct SRS_Resource__transmissionComb__n2));
4382 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4384 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4387 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4388 = SRS_COMB_OFFSET_N2;
4389 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4390 = SRS_CYCLIC_SHIFT_N2;
4392 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4393 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4394 SRS_Resource__resourceMapping__nrofSymbols_n1;
4395 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4396 SRS_Resource__resourceMapping__repetitionFactor_n1;
4398 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4399 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4400 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4401 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4402 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4403 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4404 SRS_Resource__groupOrSequenceHopping_neither;
4406 /* Setting resource type to aperiodic for intergration purposes */
4407 resourceList->list.array[rsrcIdx]->resourceType.present = \
4408 SRS_Resource__resourceType_PR_aperiodic;
4409 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4410 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4411 sizeof(struct SRS_Resource__resourceType__aperiodic));
4412 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4414 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4417 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4422 /*******************************************************************
4424 * @brief Build SRS resource set Add/mod list
4428 * Function : BuildSrsRsrcSetAddModList
4430 * Functionality: Build SRS resource set Add/mod list
4433 * @return ROK - success
4436 * ****************************************************************/
4437 uint8_t BuildSrsRsrcSetAddModList
4439 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4445 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4448 rsrcSetList->list.count = elementCnt;
4449 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4450 rsrcSetList->list.array = NULLP;
4451 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4452 if(!rsrcSetList->list.array)
4454 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4458 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4460 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4461 if(!rsrcSetList->list.array[rSetIdx])
4463 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4469 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4471 /* Fill Resource Id list in resource set */
4472 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4473 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4474 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4475 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4477 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4482 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4483 rsrcIdList->list.count = elementCnt;
4484 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4485 rsrcIdList->list.array = NULLP;
4486 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4487 if(!rsrcIdList->list.array)
4489 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4493 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4495 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4496 if(!rsrcIdList->list.array[rsrcIdx])
4498 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4504 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4506 /* Fill resource type */
4507 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4508 SRS_ResourceSet__resourceType_PR_aperiodic;
4510 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4511 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4512 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4513 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4515 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4518 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4519 = APERIODIC_SRS_RESRC_TRIGGER;
4521 /* TODO : Fill values for below IEs as expected by Viavi */
4522 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4523 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4526 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4527 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4528 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4529 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4530 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4535 /*******************************************************************
4537 * @brief Builds BWP UL dedicated SRS Config
4541 * Function : BuildBWPUlDedSrsCfg
4543 * Functionality: Builds BWP UL dedicated SRS Config
4545 * @params[in] SRS Config
4546 * @return ROK - success
4549 * ****************************************************************/
4550 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4552 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4553 srsCfg->srs_ResourceSetToAddModList = NULLP;
4554 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4555 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4556 if(!srsCfg->srs_ResourceSetToAddModList)
4558 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4561 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4566 srsCfg->srs_ResourceToReleaseList = NULLP;
4568 /* Resource to Add/Modify list */
4569 srsCfg->srs_ResourceToAddModList = NULLP;
4570 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4571 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4572 if(!srsCfg->srs_ResourceToAddModList)
4574 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4578 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4583 srsCfg->tpc_Accumulation = NULLP;
4588 /*******************************************************************
4590 * @brief Builds inital UL BWP
4594 * Function : BuildInitialUlBWP
4596 * Functionality: Builds initial UL BWP
4598 * @params[in] BWP_UplinkDedicated_t *ulBwp
4599 * @return ROK - success
4602 * ****************************************************************/
4603 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4605 ulBwp->pucch_Config = NULLP;
4606 ulBwp->pucch_Config = NULLP;
4607 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4608 if(!ulBwp->pucch_Config)
4610 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4614 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4615 ulBwp->pucch_Config->choice.setup = NULLP;
4616 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4617 if(!ulBwp->pucch_Config->choice.setup)
4619 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4623 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4628 /* Fill BWP UL dedicated PUSCH config */
4629 ulBwp->pusch_Config = NULLP;
4630 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4631 if(!ulBwp->pusch_Config)
4633 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4637 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4638 ulBwp->pusch_Config->choice.setup = NULLP;
4639 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4640 if(!ulBwp->pusch_Config->choice.setup)
4642 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4646 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4651 ulBwp->configuredGrantConfig = NULLP;
4653 /* Fill BPW UL dedicated SRS config */
4654 ulBwp->srs_Config = NULLP;
4655 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4656 if(!ulBwp->srs_Config)
4658 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4662 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4663 ulBwp->srs_Config->choice.setup = NULLP;
4664 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4665 if(!ulBwp->srs_Config->choice.setup)
4667 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4671 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4676 ulBwp->beamFailureRecoveryConfig = NULLP;
4681 /*******************************************************************
4683 * @brief Builds Pusch Serving cell Config
4687 * Function : BuildPuschSrvCellCfg
4689 * Functionality: Builds Pusch Serving cell Config
4691 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4693 * @return ROK - success
4696 * ****************************************************************/
4697 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4699 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4700 puschCfg->choice.setup = NULLP;
4701 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4702 if(!puschCfg->choice.setup)
4704 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4708 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4709 puschCfg->choice.setup->rateMatching = NULLP;
4710 puschCfg->choice.setup->xOverhead = NULLP;
4711 puschCfg->choice.setup->ext1 = NULLP;
4712 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4713 if(!puschCfg->choice.setup->ext1)
4715 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4719 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4720 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4721 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4723 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4726 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4728 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4729 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4730 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4732 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4735 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4739 /*******************************************************************
4741 * @brief Builds UL config
4744 * Function : BuildUlCfg
4746 * Functionality: Builds UL config in spCellCfgDed
4748 * @params[in] UplinkConfig_t *ulCfg
4750 * @return ROK - success
4753 * ****************************************************************/
4754 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4756 ulCfg->initialUplinkBWP = NULLP;
4757 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4758 if(!ulCfg->initialUplinkBWP)
4760 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4764 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4769 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4770 ulCfg->uplinkBWP_ToAddModList = NULLP;
4771 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4772 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4773 if(!ulCfg->firstActiveUplinkBWP_Id)
4775 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4778 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4780 ulCfg->pusch_ServingCellConfig = NULLP;
4781 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4782 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4783 if(!ulCfg->pusch_ServingCellConfig)
4785 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4789 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4794 ulCfg->carrierSwitching = NULLP;
4795 ulCfg->ext1 = NULLP;
4799 /*******************************************************************
4801 * @brief Builds PDSCH serving cell config
4804 * Function : BuildPdschSrvCellCfg
4806 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4808 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4810 * @return ROK - success
4813 * ****************************************************************/
4814 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4816 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4817 pdschCfg->choice.setup = NULLP;
4818 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4819 if(!pdschCfg->choice.setup)
4821 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4825 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4826 pdschCfg->choice.setup->xOverhead = NULLP;
4827 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4828 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4829 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4831 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4834 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4835 pdschCfg->choice.setup->pucch_Cell = NULLP;
4836 pdschCfg->choice.setup->ext1 = NULLP;
4841 /*******************************************************************
4843 * @brief Builds CSI Meas config
4846 * Function : BuildCsiMeasCfg
4848 * Functionality: Builds CSI Meas config in spCellCfgDed
4850 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4852 * @return ROK - success
4855 * ****************************************************************/
4856 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4862 /*******************************************************************
4864 * @brief Builds Spcell config dedicated
4867 * Function : BuildSpCellCfgDed
4869 * Functionality: Builds sp cell config dedicated in spCellCfg
4871 * @params[in] ServingCellConfig_t srvCellCfg
4873 * @return ROK - success
4876 * ****************************************************************/
4877 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4879 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4881 srvCellCfg->initialDownlinkBWP = NULLP;
4882 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4883 if(!srvCellCfg->initialDownlinkBWP)
4885 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4889 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4891 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4894 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4895 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4897 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4898 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4899 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4901 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4904 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4906 srvCellCfg->bwp_InactivityTimer = NULLP;
4908 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4909 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4910 if(!srvCellCfg->defaultDownlinkBWP_Id)
4912 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4915 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4917 srvCellCfg->uplinkConfig = NULLP;
4918 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4919 if(!srvCellCfg->uplinkConfig)
4921 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4925 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4927 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4930 srvCellCfg->supplementaryUplink = NULLP;
4931 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4933 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4934 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4935 if(!srvCellCfg->pdsch_ServingCellConfig)
4937 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4941 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4943 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4947 srvCellCfg->csi_MeasConfig = NULLP;
4949 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4950 if(!srvCellCfg->csi_MeasConfig)
4952 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4956 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4958 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4962 srvCellCfg->sCellDeactivationTimer = NULLP;
4963 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4964 srvCellCfg->tag_Id = TAG_ID;
4965 srvCellCfg->dummy = NULLP;
4966 srvCellCfg->pathlossReferenceLinking = NULLP;
4967 srvCellCfg->servingCellMO = NULLP;
4968 srvCellCfg->ext1 = NULLP;
4972 /*******************************************************************
4974 * @brief Builds Spcell config
4978 * Function : BuildSpCellCfg
4980 * Functionality: Builds sp cell config in DuToCuRrcContainer
4982 * @params[in] SpCellConfig_t spCellCfg
4984 * @return ROK - success
4987 * ****************************************************************/
4988 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4991 spCellCfg->servCellIndex = NULLP;
4992 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4993 if(!spCellCfg->servCellIndex)
4995 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4998 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5000 spCellCfg->reconfigurationWithSync = NULLP;
5001 spCellCfg->rlf_TimersAndConstants = NULLP;
5002 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5003 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5004 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5006 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5009 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5011 spCellCfg->spCellConfigDedicated = NULLP;
5012 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5013 if(!spCellCfg->spCellConfigDedicated)
5015 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5018 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5020 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5025 /*******************************************************************
5027 * @brief Builds Phy cell group config
5031 * Function : BuildPhyCellGrpCfg
5033 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5035 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5037 * @return ROK - success
5040 * ****************************************************************/
5041 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5043 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5044 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5046 phyCellGrpCfg->p_NR_FR1 = NULLP;
5047 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5048 if(!phyCellGrpCfg->p_NR_FR1)
5050 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5053 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5054 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5055 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5056 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5057 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5058 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5059 phyCellGrpCfg->cs_RNTI = NULLP;
5060 phyCellGrpCfg->ext1 = NULLP;
5061 phyCellGrpCfg->ext2 = NULLP;
5066 /*******************************************************************
5068 * @brief Builds tag config
5072 * Function : BuildTagConfig
5074 * Functionality: Builds tag config in MacCellGroupConfig
5076 * @params[in] TAG_Config *tag_Config
5078 * @return ROK - success
5081 * ****************************************************************/
5082 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5084 struct TAG_Config__tag_ToAddModList *tagList;
5085 uint8_t idx, elementCnt;
5087 tagConfig->tag_ToReleaseList = NULLP;
5088 tagConfig->tag_ToAddModList = NULLP;
5089 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5090 if(!tagConfig->tag_ToAddModList)
5092 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5096 elementCnt = 1; //ODU_VALUE_ONE;
5097 tagList = tagConfig->tag_ToAddModList;
5098 tagList->list.count = elementCnt;
5099 tagList->list.size = elementCnt * sizeof(struct TAG *);
5101 tagList->list.array = NULLP;
5102 CU_ALLOC(tagList->list.array, tagList->list.size);
5103 if(!tagList->list.array)
5105 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5109 for(idx=0; idx<tagList->list.count; idx++)
5111 tagList->list.array[idx] = NULLP;
5112 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5113 if(!tagList->list.array[idx])
5115 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5121 tagList->list.array[idx]->tag_Id = TAG_ID;
5122 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5127 /*******************************************************************
5129 * @brief Builds PHR Config
5133 * Function : BuildPhrConfig
5135 * Functionality: Builds phrConfig in MacCellGroupConfig
5137 * @params[in] PHR Config *
5139 * @return ROK - success
5142 * ****************************************************************/
5143 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5146 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5147 phrConfig->choice.setup = NULLP;
5148 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5149 if(!phrConfig->choice.setup)
5151 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5155 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5156 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5157 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5158 phrConfig->choice.setup->multiplePHR = false;
5159 phrConfig->choice.setup->dummy = false;
5160 phrConfig->choice.setup->phr_Type2OtherCell = false;
5161 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5166 /*******************************************************************
5168 * @brief Builds BSR Config
5172 * Function : BuildBsrConfig
5174 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5176 * @params[in] BSR_Config *bsrConfig
5178 * @return ROK - success
5181 * ****************************************************************/
5182 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5184 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5185 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5186 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5191 /*******************************************************************
5193 * @brief Builds scheduling request config
5197 * Function : BuildSchedulingReqConfig
5199 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5201 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5203 * @return ROK - success
5206 * ****************************************************************/
5207 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5209 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5210 uint8_t idx, elementCnt;
5212 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5213 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5214 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5215 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5217 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5221 elementCnt = 1; //ODU_VALUE_ONE;
5222 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5223 schReqList->list.count = elementCnt;
5224 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5226 schReqList->list.array = NULLP;
5227 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5228 if(!schReqList->list.array)
5230 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5234 for(idx=0;idx<schReqList->list.count; idx++)
5236 schReqList->list.array[idx] = NULLP;
5237 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5238 if(!schReqList->list.array[idx])
5240 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5246 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5248 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5249 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5250 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5252 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5255 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5256 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5257 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5261 /*******************************************************************
5263 * @brief Builds Mac cell group config
5267 * Function : BuildMacCellGrpCfg
5269 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5271 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5273 * @return ROK - success
5276 * ****************************************************************/
5277 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5279 macCellGrpCfg->drx_Config = NULLP;
5280 macCellGrpCfg->schedulingRequestConfig = NULLP;
5281 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5282 if(!macCellGrpCfg->schedulingRequestConfig)
5284 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5288 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5290 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5294 macCellGrpCfg->bsr_Config = NULLP;
5295 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5296 if(!macCellGrpCfg->bsr_Config)
5298 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5302 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5304 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5308 macCellGrpCfg->tag_Config = NULLP;
5309 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5310 if(!macCellGrpCfg->tag_Config)
5312 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5316 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5318 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5322 macCellGrpCfg->phr_Config = NULLP;
5323 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5324 if(!macCellGrpCfg->phr_Config)
5326 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5330 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5332 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5336 macCellGrpCfg->skipUplinkTxDynamic = false;
5337 macCellGrpCfg->ext1 = NULLP;
5341 /*******************************************************************
5343 * @brief Frees memeory allocated for SearchSpcToAddModList
5347 * Function : FreeSearchSpcToAddModList
5349 * Functionality: Deallocating memory of SearchSpcToAddModList
5351 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5355 4221 * ****************************************************************/
5356 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5360 struct SearchSpace *searchSpc=NULLP;
5362 if(searchSpcList->list.array)
5364 if(searchSpcList->list.array[idx2])
5366 searchSpc = searchSpcList->list.array[idx2];
5367 if(searchSpc->controlResourceSetId)
5369 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5371 if(searchSpc->monitoringSymbolsWithinSlot)
5373 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5375 if(searchSpc->nrofCandidates)
5377 if(searchSpc->searchSpaceType)
5379 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5380 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5381 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5382 SearchSpace__searchSpaceType));
5384 CU_FREE(searchSpc->nrofCandidates,
5385 sizeof(struct SearchSpace__nrofCandidates));
5387 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5388 searchSpc->monitoringSymbolsWithinSlot->size);
5390 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5391 sizeof(BIT_STRING_t));
5393 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5394 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5396 CU_FREE(searchSpc->controlResourceSetId,
5397 sizeof(ControlResourceSetId_t));
5400 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5402 CU_FREE(searchSpcList->list.array[idx1],
5403 sizeof(struct SearchSpace));
5405 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5408 /*******************************************************************
5410 * @brief Frees memory allocated for PdschTimeDomAllocList
5414 * Function : FreePdschTimeDomAllocList
5416 * Functionality: Deallocating memory of PdschTimeDomAllocList
5418 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5422 4221 * ****************************************************************/
5423 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5427 if(timeDomAllocList->choice.setup)
5429 if(timeDomAllocList->choice.setup->list.array)
5431 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5433 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5434 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5436 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5437 timeDomAllocList->choice.setup->list.size);
5439 CU_FREE(timeDomAllocList->choice.setup,\
5440 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5443 /*******************************************************************
5445 * @brief Frees memory allocated for PuschTimeDomAllocList
5449 * Function : FreePuschTimeDomAllocList
5451 * Functionality: Deallocating memory of PuschTimeDomAllocList
5453 * @params[in] PUSCH_Config_t *puschCfg
5457 ***********************************************************************/
5458 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5462 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5464 if(puschCfg->pusch_TimeDomainAllocationList)
5466 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5467 if(timeDomAllocList_t->choice.setup)
5469 if(timeDomAllocList_t->choice.setup->list.array)
5471 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5472 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5474 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5475 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5477 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5478 timeDomAllocList_t->choice.setup->list.size);
5480 CU_FREE(timeDomAllocList_t->choice.setup, \
5481 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5483 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5484 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5485 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5490 /*******************************************************************
5492 * @brief Frees memory allocated for Dedicated PUCCH config
5496 * Function : FreeBWPUlDedPucchCfg
5498 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5500 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5504 * ****************************************************************/
5505 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5507 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5508 PUCCH_Config_t *pucchCfg = NULLP;
5509 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5510 PUCCH_Resource_t *rsrc = NULLP;
5514 if(ulBwpPucchCfg->choice.setup)
5516 pucchCfg = ulBwpPucchCfg->choice.setup;
5518 //Free resource set list
5519 if(pucchCfg->resourceSetToAddModList)
5521 if(pucchCfg->resourceSetToAddModList->list.array)
5523 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5525 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5526 if(rsrcSet->resourceList.list.array)
5528 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5530 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5532 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5534 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5536 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5538 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5541 //Free resource list
5542 if(pucchCfg->resourceToAddModList)
5544 if(pucchCfg->resourceToAddModList->list.array)
5546 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5548 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5549 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5550 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5552 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5554 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5558 if(pucchCfg->format1)
5560 if(pucchCfg->format1->choice.setup)
5562 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5563 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5565 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5569 if(pucchCfg->dl_DataToUL_ACK)
5571 if(pucchCfg->dl_DataToUL_ACK->list.array)
5573 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5575 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5577 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5579 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5582 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5584 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5588 /*******************************************************************
5590 * @brief Frees memory allocated for InitialUlBWP
5594 * Function : FreeInitialUlBWP
5596 * Functionality: Deallocating memory of InitialUlBWP
5598 * @params[in] BWP_UplinkDedicated_t *ulBwp
5602 * ****************************************************************/
5603 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5605 uint8_t rSetIdx, rsrcIdx;
5606 SRS_Config_t *srsCfg = NULLP;
5607 PUSCH_Config_t *puschCfg = NULLP;
5608 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5609 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5610 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5611 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5613 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5615 if(ulBwp->pusch_Config)
5617 if(ulBwp->pusch_Config->choice.setup)
5619 puschCfg=ulBwp->pusch_Config->choice.setup;
5620 if(puschCfg->dataScramblingIdentityPUSCH)
5622 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5624 FreePuschTimeDomAllocList(puschCfg);
5625 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5626 if(dmrsUlCfg->choice.setup)
5628 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5630 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5632 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5634 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5635 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5637 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5640 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5642 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5643 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5645 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5647 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5649 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5651 /* Free SRS-Config */
5652 if(ulBwp->srs_Config)
5654 if(ulBwp->srs_Config->choice.setup)
5656 srsCfg = ulBwp->srs_Config->choice.setup;
5658 /* Free Resource Set to add/mod list */
5659 if(srsCfg->srs_ResourceSetToAddModList)
5661 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5662 if(rsrcSetList->list.array)
5666 /* Free SRS resource Id list in this SRS resource set */
5667 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5669 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5671 if(rsrcIdList->list.array)
5673 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5675 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5677 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5679 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5680 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5683 /* Free resource type info for this SRS resource set */
5684 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5685 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5687 /* Free memory for each resource set */
5688 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5690 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5692 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5694 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5695 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5698 /* Free resource to add/modd list */
5699 if(srsCfg->srs_ResourceToAddModList)
5701 resourceList = srsCfg->srs_ResourceToAddModList;
5702 if(resourceList->list.array)
5705 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5706 sizeof(struct SRS_Resource__transmissionComb__n2));
5707 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5708 sizeof(struct SRS_Resource__resourceType__aperiodic));
5710 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5712 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5714 CU_FREE(resourceList->list.array, resourceList->list.size);
5716 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5717 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5720 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5722 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5726 /*******************************************************************
5728 * @brief Frees memory allocated for initialUplinkBWP
5732 * Function : FreeinitialUplinkBWP
5734 * Functionality: Deallocating memory of initialUplinkBWP
5736 * @params[in] UplinkConfig_t *ulCfg
5741 * ****************************************************************/
5742 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5744 BWP_UplinkDedicated_t *ulBwp=NULLP;
5745 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5747 if(ulCfg->initialUplinkBWP)
5749 ulBwp=ulCfg->initialUplinkBWP;
5750 if(ulCfg->firstActiveUplinkBWP_Id)
5752 if(ulCfg->pusch_ServingCellConfig)
5754 puschCfg=ulCfg->pusch_ServingCellConfig;
5755 if(puschCfg->choice.setup)
5757 if(puschCfg->choice.setup->ext1)
5759 CU_FREE(puschCfg->choice.setup->ext1->\
5760 processingType2Enabled,sizeof(BOOLEAN_t));
5761 CU_FREE(puschCfg->choice.setup->ext1->\
5762 maxMIMO_Layers,sizeof(long));
5763 CU_FREE(puschCfg->choice.setup->ext1, \
5764 sizeof(struct PUSCH_ServingCellConfig__ext1));
5766 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5768 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5770 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5772 FreeInitialUlBWP(ulBwp);
5773 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5776 /*******************************************************************
5778 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5782 * Function : FreeBWPDlDedPdschCfg
5784 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5786 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5791 * ****************************************************************/
5792 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5794 struct PDSCH_Config *pdschCfg=NULLP;
5795 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5796 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5797 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5799 if(dlBwp->pdsch_Config->choice.setup)
5801 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5802 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5804 if(pdschCfg->pdsch_TimeDomainAllocationList)
5806 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5807 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5809 prbBndlType=&pdschCfg->prb_BundlingType;
5810 CU_FREE(prbBndlType->choice.staticBundling,\
5811 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5812 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5814 FreePdschTimeDomAllocList(timeDomAllocList);
5815 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5816 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5818 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5819 if(dmrsDlCfg->choice.setup)
5821 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5823 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5825 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5826 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5828 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5831 /*******************************************************************
5833 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5837 * Function : FreeBWPDlDedPdcchCfg
5839 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5841 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5846 * ****************************************************************/
5847 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5851 struct PDCCH_Config *pdcchCfg=NULLP;
5852 struct ControlResourceSet *controlRSet=NULLP;
5853 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5855 if(dlBwp->pdcch_Config->choice.setup)
5857 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5858 if(pdcchCfg->controlResourceSetToAddModList)
5860 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5861 if(controlRSetList->list.array)
5863 controlRSet = controlRSetList->list.array[idx2];
5866 if(controlRSet->frequencyDomainResources.buf)
5868 if(controlRSet->pdcch_DMRS_ScramblingID)
5870 if(pdcchCfg->searchSpacesToAddModList)
5872 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5873 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5874 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5876 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5878 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5879 controlRSet->frequencyDomainResources.size);
5882 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5884 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5886 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5888 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5889 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5891 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5894 /*******************************************************************
5896 * @brief Builds RLC Config
5900 * Function : BuildRlcConfig
5902 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5904 * @params[in] RLC_Config *rlcConfig
5906 * @return ROK - success
5909 * ****************************************************************/
5910 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
5912 rlcConfig->present = rlcLcCfgDb.rlcMode;
5914 switch(rlcConfig->present)
5916 case RLC_Config_PR_am:
5918 rlcConfig->choice.am = NULLP;
5919 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5920 if(!rlcConfig->choice.am)
5922 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5927 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5928 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5929 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5931 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5934 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
5935 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
5936 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
5937 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
5938 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
5941 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5942 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5943 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5945 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5948 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
5949 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
5950 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
5955 case RLC_Config_PR_um_Bi_Directional:
5957 rlcConfig->choice.um_Bi_Directional = NULLP;
5958 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
5959 if(!rlcConfig->choice.um_Bi_Directional)
5961 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5966 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
5967 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5968 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
5970 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5973 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
5976 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
5977 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5978 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
5980 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5983 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
5984 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
5991 /*******************************************************************
5993 * @brief Builds MAC LC Config
5997 * Function : BuildMacLCConfig
5999 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6001 * @params[in] struct LogicalChannelConfig macLcConfig
6003 * @return ROK - success
6006 * ****************************************************************/
6007 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6010 macLcConfig->ul_SpecificParameters = NULLP;
6011 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6012 if(!macLcConfig->ul_SpecificParameters)
6014 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6018 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6019 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6020 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6021 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6022 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6023 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6024 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6026 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6027 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6028 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6030 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6033 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6035 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6036 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6037 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6039 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6042 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6044 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6045 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6046 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6050 /*******************************************************************
6052 * @brief Builds RLC Bearer to Add/Mod list
6056 * Function :BuildRlcBearerToAddModList
6058 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6060 * @params[in] rlc_BearerToAddModList
6062 * @return ROK - success
6065 * ****************************************************************/
6066 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6068 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6071 elementCnt = ueCb->numSrb + ueCb->numDrb;
6074 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6076 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6080 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6082 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6089 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6092 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6095 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6098 rlcBearerList->list.count = elementCnt;
6099 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6101 rlcBearerList->list.array = NULLP;
6102 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6103 if(!rlcBearerList->list.array)
6105 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6109 for(idx=0; idx<rlcBearerList->list.count; idx++)
6111 rlcBearerList->list.array[idx] = NULLP;
6112 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6113 if(!rlcBearerList->list.array[idx])
6115 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6122 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6124 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6127 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6129 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6130 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6132 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6136 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6137 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6139 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6140 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6141 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6142 if(!rlcBearerList->list.array[idx]->rlc_Config)
6144 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6148 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6150 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6154 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6155 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6156 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6158 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6162 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6164 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6170 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6172 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6175 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6177 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6178 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6180 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6184 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6185 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6187 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6188 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6189 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6190 if(!rlcBearerList->list.array[idx]->rlc_Config)
6192 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6196 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6198 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6202 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6203 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6204 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6206 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6210 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6212 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6220 /*******************************************************************
6222 * @brief Free memory allocated for CellGroupConfig
6226 * Function : FreeMemCellGrpCfg
6228 * Functionality: Deallocating memory of CellGroupConfig
6230 * @params[in] pointer to CellGroupConfigRrc_t
6232 * @return ROK - success
6235 ******************************************************************/
6236 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6239 SpCellConfig_t *spCellCfg=NULLP;
6240 ServingCellConfig_t *srvCellCfg=NULLP;
6241 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6242 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6243 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6244 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6245 struct RLC_Config *rlcConfig=NULLP;
6246 struct LogicalChannelConfig *macLcConfig=NULLP;
6247 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6248 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6249 struct TAG_Config *tagConfig=NULLP;
6250 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6251 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6252 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6254 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6257 if(rlcBearerList->list.array)
6259 for(idx=0; idx<rlcBearerList->list.count; idx++)
6261 if(rlcBearerList->list.array[idx])
6263 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6264 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6267 if(rlcConfig->choice.am)
6269 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6270 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6271 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6273 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6275 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6278 if(macLcConfig->ul_SpecificParameters)
6280 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6281 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6282 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6284 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6286 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6289 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6291 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6294 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6297 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6298 if(schedulingRequestConfig)
6300 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6303 if(schReqList->list.array)
6305 for(idx=0;idx<schReqList->list.count; idx++)
6307 if(schReqList->list.array[idx])
6309 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6310 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6313 CU_FREE(schReqList->list.array, schReqList->list.size);
6315 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6316 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6317 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6319 if(macCellGrpCfg->bsr_Config)
6321 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6323 tagConfig = macCellGrpCfg->tag_Config;
6326 tagList = tagConfig->tag_ToAddModList;
6329 if(tagList->list.array)
6331 for(idx=0; idx<tagList->list.count; idx++)
6333 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6335 CU_FREE(tagList->list.array, tagList->list.size);
6337 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6339 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6342 phrConfig = macCellGrpCfg->phr_Config;
6345 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6346 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6349 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6352 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6355 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6356 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6359 spCellCfg = cellGrpCfg->spCellConfig;
6362 if(spCellCfg->servCellIndex)
6364 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6366 if(spCellCfg->spCellConfigDedicated)
6368 srvCellCfg = spCellCfg->spCellConfigDedicated;
6369 if(srvCellCfg->initialDownlinkBWP)
6371 dlBwp = srvCellCfg->initialDownlinkBWP;
6372 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6374 if(srvCellCfg->defaultDownlinkBWP_Id)
6376 if(srvCellCfg->uplinkConfig)
6378 if(srvCellCfg->pdsch_ServingCellConfig)
6380 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6381 if(pdschCfg->choice.setup)
6383 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6384 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6386 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6387 ServingCellConfig__pdsch_ServingCellConfig));
6389 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6390 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6392 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6394 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6396 if(dlBwp->pdcch_Config)
6398 if(dlBwp->pdsch_Config)
6400 FreeBWPDlDedPdschCfg(dlBwp);
6401 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6403 FreeBWPDlDedPdcchCfg(dlBwp);
6404 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6406 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6408 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6410 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6412 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6414 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6419 /*******************************************************************
6421 * @brief Fills CellGroupConfig
6425 * Function : fillCellGrpCfg
6427 * Functionality: Fills CellGroupConfig
6429 * @params[in] pointer to CellGroupConfigRrc_t
6431 * @return ROK - success
6434 ******************************************************************/
6436 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6438 uint8_t ret = RFAILED;
6439 CellGroupConfigRrc_t cellGrpCfg;
6440 asn_enc_rval_t encRetVal;
6444 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6446 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6448 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6450 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6454 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6455 cellGrpCfg.mac_CellGroupConfig = NULLP;
6456 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6457 if(!cellGrpCfg.mac_CellGroupConfig)
6459 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6462 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6464 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6468 cellGrpCfg.physicalCellGroupConfig = NULLP;
6469 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6470 if(!cellGrpCfg.physicalCellGroupConfig)
6472 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6475 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6477 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6481 cellGrpCfg.spCellConfig = NULLP;
6482 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6483 if(!cellGrpCfg.spCellConfig)
6485 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6488 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6490 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6494 cellGrpCfg.sCellToAddModList = NULLP;
6495 cellGrpCfg.sCellToReleaseList = NULLP;
6496 cellGrpCfg.ext1 = NULLP;
6498 /* encode cellGrpCfg into duToCuRrcContainer */
6499 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6500 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6502 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6503 /* Encode results */
6504 if(encRetVal.encoded == ENCODE_FAIL)
6506 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6507 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6512 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6513 for(int i=0; i< encBufSize; i++)
6515 DU_LOG("%x",encBuf[i]);
6519 cellGrp->size = encBufSize;
6520 CU_ALLOC(cellGrp->buf, cellGrp->size);
6523 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6526 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6530 FreeMemCellGrpCfg(&cellGrpCfg);
6534 /*******************************************************************
6536 * @brief Free UE Capability RAT container
6540 * Function : freeUeCapRatCont
6543 * Free UE Capability RAT conatiner
6546 * @return ROK - success
6549 * ****************************************************************/
6550 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6553 FeatureSets_t *featureSets;
6555 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6557 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6559 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6560 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6562 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6565 if(ueNrCap->featureSets)
6567 featureSets = ueNrCap->featureSets;
6568 if(featureSets->featureSetsDownlinkPerCC)
6570 if(featureSets->featureSetsDownlinkPerCC->list.array)
6572 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6574 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6575 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6576 sizeof(ModulationOrder_t));
6577 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6579 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6581 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6584 if(featureSets->featureSetsUplinkPerCC)
6586 if(featureSets->featureSetsUplinkPerCC->list.array)
6588 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6590 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6592 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6593 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6594 sizeof(ModulationOrder_t));
6595 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6598 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6600 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6602 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6606 /*******************************************************************
6608 * @brief Free UE capability RAT container list
6612 * Function : freeUeCapRatContList
6614 * Functionality: Free UE capability RAT container list
6617 * @return ROK - success
6620 * ****************************************************************/
6621 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6624 if(ueCapablityList->list.array)
6626 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6628 if(ueCapablityList->list.array[idx])
6629 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6631 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6635 /*******************************************************************
6637 * @brief Free Handover preparation information
6641 * Function : freeHOPreparationInfo
6643 * Functionality: Free Handover preparation information
6646 * @return ROK - success
6649 * ****************************************************************/
6650 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6652 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6654 if(hoPrep->criticalExtensions.choice.c1)
6656 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6658 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6659 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6660 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6661 sizeof(HandoverPreparationInformationRrc_IEs_t));
6663 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6667 /*******************************************************************
6669 * @brief Fill feature sets
6673 * Function : fillFeatureSets
6675 * Functionality: Fill feature sets
6678 * @return ROK - success
6681 * ****************************************************************/
6682 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6684 uint8_t idx, elementCnt;
6686 featureSets->featureSetsDownlink = NULLP;
6687 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6688 if(!featureSets->featureSetsDownlinkPerCC)
6690 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6695 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6696 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6697 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6698 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6700 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6704 for(idx = 0; idx < elementCnt; idx++)
6706 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6707 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6709 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6715 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6716 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6717 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6718 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6719 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6721 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6722 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6724 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6727 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6729 featureSets->featureSetsUplink = NULLP;
6730 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6731 if(!featureSets->featureSetsUplinkPerCC)
6733 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6738 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6739 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6740 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6741 if(!featureSets->featureSetsUplinkPerCC->list.array)
6743 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6747 for(idx = 0; idx < elementCnt; idx++)
6749 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6750 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6752 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6758 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6759 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6760 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6761 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6762 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6763 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6765 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6766 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6768 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6771 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6776 /*******************************************************************
6778 * @brief Fill UE capability RAT container
6782 * Function : fillUeCapRatCont
6784 * Functionality: Fill UE capability RAT container
6786 * @params[in] UE Capability RAT container buffer
6787 * @return ROK - success
6790 * ****************************************************************/
6791 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6794 uint8_t idx, elementCnt;
6795 asn_enc_rval_t encRetVal;
6796 UE_NR_Capability_t ueNrCap;
6800 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6802 /* Filling PDCP parameters */
6803 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6804 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6805 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6806 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6807 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6808 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6809 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6810 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6811 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6812 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6813 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6814 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6815 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6816 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6817 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6818 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6819 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6821 ueNrCap.rlc_Parameters = NULLP;
6822 ueNrCap.mac_Parameters = NULLP;
6824 /* Filling PHY parameters */
6825 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6826 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6827 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6828 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6829 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6831 /* Filling RF parameters */
6833 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6834 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6835 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6836 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6838 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6843 for(idx = 0; idx < elementCnt; idx++)
6845 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6846 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6856 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6857 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6858 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6860 ueNrCap.measAndMobParameters = NULLP;
6861 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6862 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6863 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6864 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6865 ueNrCap.featureSets = NULLP;
6867 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6868 if(!ueNrCap.featureSets)
6870 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6875 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6877 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6882 ueNrCap.featureSetCombinations = NULLP;
6883 ueNrCap.lateNonCriticalExtension = NULLP;
6884 ueNrCap.nonCriticalExtension = NULLP;
6886 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6887 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6888 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6890 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6892 /* Encode results */
6893 if(encRetVal.encoded == ENCODE_FAIL)
6895 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6896 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6901 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6902 for(int i=0; i< encBufSize; i++)
6904 DU_LOG("%x",encBuf[i]);
6908 ueCapRatContBuf->size = encBufSize;
6909 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6910 if(!ueCapRatContBuf->buf)
6912 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6915 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6919 freeUeCapRatCont(&ueNrCap);
6923 /*******************************************************************
6925 * @brief Fill UE Capability RAT container list
6929 * Function : fillUeCapRatContList
6931 * Functionality: Fill UE Capability RAT container list
6934 * @params[in] UE capability RAT container list
6935 * @return ROK - success
6938 * ****************************************************************/
6939 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6941 uint8_t ret = RFAILED;
6942 uint8_t idx, elementCnt;
6947 ueCapablityList->list.count = elementCnt;
6948 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6950 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
6951 if(!ueCapablityList->list.array)
6953 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6958 for(idx=0; idx<elementCnt; idx++)
6960 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6961 if(ueCapablityList->list.array[idx] == NULLP)
6963 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6969 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
6970 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
6972 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
6983 /*******************************************************************
6985 * @brief Fill UE Capability RAT container list octet string
6989 * Function : fillUeCapRatContListBuf
6991 * Functionality: Fill UE Capability RAT container list octet string
6994 * @params[in] UE capability RAT container list buffer
6995 * @return ROK - success
6998 * ****************************************************************/
6999 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7001 uint8_t ret = RFAILED;
7002 asn_enc_rval_t encRetVal;
7003 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7007 ret = fillUeCapRatContList(&ueCapablityList);
7010 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7014 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7015 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7016 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7018 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7019 &ueCapablityList, PrepFinalEncBuf, encBuf);
7021 /* Encode results */
7022 if(encRetVal.encoded == ENCODE_FAIL)
7024 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7025 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7030 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7031 for(int i=0; i< encBufSize; i++)
7033 DU_LOG("%x",encBuf[i]);
7037 ueCapablityListBuf->size = encBufSize;
7038 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7039 if(!ueCapablityListBuf->buf)
7041 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7044 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7048 freeUeCapRatContList(&ueCapablityList);
7052 /*******************************************************************
7054 * @brief Free Measurement Timing Configuration
7058 * Function : freeMeasuementTimingConfig
7060 * Functionality: Free Measurement Timing Configuration
7062 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7065 * ****************************************************************/
7066 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7069 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7070 MeasTiming_t *measTiming = NULLP;
7072 if(measTimingConfig.criticalExtensions.choice.c1)
7074 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7076 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7077 if(measTimingCfg->measTiming)
7079 if(measTimingCfg->measTiming->list.array)
7081 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7083 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7084 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7085 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7087 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7089 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7091 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7093 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7097 /*******************************************************************
7099 * @brief Fill Measurement Timing Configuration
7103 * Function : fillMeasTimingCfg
7105 * Functionality: Fill Measurement Timing Configuration
7107 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7108 * @return ROK - success
7111 * ****************************************************************/
7112 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7114 uint8_t elementCnt = 0;
7115 uint8_t measCfgIdx = 0;
7116 MeasTiming_t *measTiming;
7119 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7120 if(!measTimingCfg->measTiming)
7122 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7127 measTimingCfg->measTiming->list.count = elementCnt;
7128 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7129 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7130 if(!measTimingCfg->measTiming->list.array)
7132 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7136 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7138 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7139 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7141 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7147 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7148 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7149 if(!measTiming->frequencyAndTiming)
7151 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7155 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7156 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7158 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7159 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7160 smtc->periodicityAndOffset.choice.sf20 = 0;
7161 smtc->duration = SSB_MTC__duration_sf1;
7165 /*******************************************************************
7167 * @brief Fill Measurement Timing Configuration Octet string
7171 * Function : fillMeasConfigBuf
7173 * Functionality: Fill Measurement Timing Configuration Octet string
7176 * @params[in] MeasConfig_t *measConfgBuf
7177 * @return ROK - success
7180 * ****************************************************************/
7181 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7183 uint8_t ret = RFAILED;
7184 asn_enc_rval_t encRetVal;
7185 MeasurementTimingConfigurationRrc_t measTimingConfig;
7189 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7190 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7191 if(!measTimingConfig.criticalExtensions.choice.c1)
7193 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7196 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7198 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7199 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7201 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7205 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7208 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7212 /* Encode measurement timing configuration into octet string */
7213 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7214 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7216 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7218 /* Encode results */
7219 if(encRetVal.encoded == ENCODE_FAIL)
7221 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7222 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7227 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7228 for(int i=0; i< encBufSize; i++)
7230 DU_LOG("%x",encBuf[i]);
7234 measTimingConfigBuf->size = encBufSize;
7235 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7236 if(!measTimingConfigBuf->buf)
7238 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7241 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7245 freeMeasuementTimingConfig(measTimingConfig);
7249 /******************************************************************
7251 * @brief Free RRC reconfiguration non-critical extension
7255 * Function : freeRrcReconfigNonCriticalExt
7257 * Functionality: Free RRC reconfiguration non-critical extension
7259 * @params[in] RRC reconfiguration IE
7262 * ****************************************************************/
7263 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7265 if(rrcRecfg->masterCellGroup)
7267 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7271 /******************************************************************
7273 * @brief Free measurement object addmod list
7277 * Function : freeMeasObjToAddModList
7279 * Functionality: Free measurement object add mod list
7281 * @params[in] Measurement object add/mod list
7284 * ****************************************************************/
7285 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7288 MeasObjectNR_t *measObject;
7290 if(measObjList->list.array)
7292 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7294 if(measObjList->list.array[objIdx])
7296 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7298 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7299 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7300 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7301 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7302 if(measObject->absThreshSS_BlocksConsolidation)
7304 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7305 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7306 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7307 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7309 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7310 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7311 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7312 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7313 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7315 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7318 CU_FREE(measObjList->list.array, measObjList->list.size);
7322 /******************************************************************
7324 * @brief Free report config add mod list
7328 * Function : freeReportCfgToAddModList
7330 * Functionality: Free report config add mod list
7332 * @params[in] Report config list
7335 * ****************************************************************/
7336 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7338 uint8_t reportCfgIdx;
7339 ReportConfigToAddMod_t *reportCfg;
7340 ReportConfigNR_t *reportCfgNr;
7341 EventTriggerConfig_t *eventTriggCfg;
7343 if(reportCfgList->list.array)
7345 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7347 if(reportCfgList->list.array[reportCfgIdx])
7349 reportCfg = reportCfgList->list.array[reportCfgIdx];
7350 if(reportCfg->reportConfig.choice.reportConfigNR)
7352 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7353 if(reportCfgNr->reportType.choice.eventTriggered)
7355 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7356 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7357 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7358 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7359 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7363 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7365 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7369 /******************************************************************
7371 * @brief Free measurement id to add mod list
7375 * Function : freeMeasIdToAddModList
7377 * Functionality: Free measurement id to add mod list
7379 * @params[in] Measurement id to add mod list
7382 * ****************************************************************/
7383 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7386 if(measIdList->list.array)
7388 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7390 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7392 CU_FREE(measIdList->list.array, measIdList->list.size);
7396 /*******************************************************************
7398 * @brief Free quantity config
7402 * Function : freeQunatityConfig
7404 * Functionality: Free quantity config
7406 * @params[in] Quantity Config
7409 * ****************************************************************/
7410 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7413 QuantityConfigNR_t *quantityCfgNr;
7415 if(quantityCfg->quantityConfigNR_List)
7417 if(quantityCfg->quantityConfigNR_List->list.array)
7419 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7421 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7423 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7424 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7425 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7426 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7427 if(quantityCfgNr->quantityConfigRS_Index)
7429 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7430 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7431 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7432 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7434 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7437 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7439 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7443 /******************************************************************
7445 * @brief Free measurement Config
7449 * Function : freeMeasConfig
7451 * Functionality: Free measurement config
7453 * @params[in] Measurement config
7456 * ****************************************************************/
7457 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7459 if(measConfig->measObjectToAddModList)
7461 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7462 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7464 if(measConfig->reportConfigToAddModList)
7466 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7467 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7469 if(measConfig->measIdToAddModList)
7471 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7472 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7474 if(measConfig->s_MeasureConfig)
7476 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7478 if(measConfig->quantityConfig)
7480 freeQuantityConfig(measConfig->quantityConfig);
7481 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7484 /******************************************************************
7486 * @brief Free DRB to AddMod List
7490 * Function : freeDrbToAddModList
7492 * Functionality: Free SRB to AddMod List
7494 * @params[in] SBR to add/mod list
7497 * ****************************************************************/
7498 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7501 if(drbToAddList->list.array)
7503 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7505 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7507 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7509 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7510 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7511 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7512 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7514 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7515 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7517 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7519 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7523 /******************************************************************
7525 * @brief Free SRB to AddMod List
7529 * Function : freeSrbToAddModList
7531 * Functionality: Free SRB to AddMod List
7533 * @params[in] SBR to add/mod list
7536 * ****************************************************************/
7537 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7540 if(srbToAddList->list.array)
7542 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7544 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7545 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7547 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7548 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7551 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7553 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7557 /******************************************************************
7559 * @brief Free Radio Bearer Config
7563 * Function : fillRadioBearerConfig
7565 * Functionality: Free Radio Bearer config
7567 * @params[in] Radio bearer config
7570 * ****************************************************************/
7571 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7573 if(radioBearerConfig->srb_ToAddModList)
7575 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7576 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7578 if(radioBearerConfig->drb_ToAddModList)
7580 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7581 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7585 /******************************************************************
7587 * @brief Free reconfiguration message
7591 * Function : freeRrcReconfig
7593 * Functionality: Free reconfiguration message
7595 * @params[in] RRC Reconfiguration message
7598 * ****************************************************************/
7599 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7601 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7603 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7605 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7606 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7608 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7610 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7611 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7613 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7615 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7616 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7618 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7622 /******************************************************************
7624 * @brief Fill SRB To Add Mod list
7628 * Function : fillSrbToAddModList
7630 * Functionality: fill SRB to Add Mod list
7632 * @params[in] UE control block
7633 * SRB to Add/Mod list
7634 * @return ROK - success
7637 * ****************************************************************/
7638 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7640 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7643 elementCnt = ueCb->numSrb;
7646 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7648 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7655 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7659 CU_ALLOC(srbToAddList, sizeof(SRB_ToAddModList_t));
7662 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
7665 srbToAddList->list.count = elementCnt;
7666 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7668 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7669 if(!srbToAddList->list.array)
7671 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7676 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7678 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7681 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7682 if(!srbToAddList->list.array[srbIdx])
7684 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7688 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7690 /* Reestablish PDCP */
7691 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7692 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7694 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7697 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7699 /* PDCP configuration */
7700 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7701 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7703 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7707 /* Reordering timer */
7708 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7709 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7711 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7714 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7721 /******************************************************************
7723 * @biief Fill DRBeTo Add Mod list
7727 * Function : fillDrbToAddModList
7729 * Functionality: fill DRB to Add Mod list
7731 * @params[in] UE control block
7732 * DRB to Add/Mod list
7733 * @return ROK - success
7736 * ****************************************************************/
7737 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7739 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7742 elementCnt = ueCb->numDrb;
7745 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7747 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7754 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7758 /* DRB To Add/Mod List */
7759 CU_ALLOC(drbToAddList, sizeof(DRB_ToAddModList_t));
7762 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
7766 drbToAddList->list.count = elementCnt;
7767 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7769 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7770 if(!drbToAddList->list.array)
7772 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7777 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7779 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7782 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7783 if(!drbToAddList->list.array[drbIdx])
7785 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
7790 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
7793 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7794 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
7796 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
7800 /* PDCP Config -> DRB */
7801 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7802 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7804 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
7808 /* DRB -> Discard Timer */
7809 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7810 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
7812 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
7815 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
7817 /* UL PDCP SN length */
7818 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7819 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
7821 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
7824 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
7826 /* DL PDCP SN length */
7827 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7828 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
7830 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
7833 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
7835 /* Header Compression */
7836 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
7837 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
7839 /* Reordering timer */
7840 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7841 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
7843 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
7846 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7854 /******************************************************************
7856 * @brief Fill Radio bearer configuration
7860 * Function : fillRadioBearerConfig
7862 * Functionality: Fill Radio bearer configuration
7864 * @params[in] UE control block
7865 * Radio bearer config pointer
7866 * @return ROK - success
7869 * ****************************************************************/
7870 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
7872 /* SRB To Add/Mod List */
7873 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
7878 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
7886 /*******************************************************************
7888 * @brief Fill measurement object to add/mod list
7892 * Function : fillMeasObjToAddModList
7894 * Functionality: Fill measurement object to add/mod list
7896 * @params[in] Measurement object to add/mod list
7897 * @return ROK - success
7900 * ****************************************************************/
7901 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7903 uint8_t elementCnt, objIdx;
7904 MeasObjectNR_t *measObject;
7907 measObjList->list.count = elementCnt;
7908 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
7910 CU_ALLOC(measObjList->list.array, measObjList->list.size);
7911 if(!measObjList->list.array)
7913 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
7917 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7919 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7920 if(!measObjList->list.array[objIdx])
7922 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
7928 measObjList->list.array[objIdx]->measObjectId = 1;
7929 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
7930 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7931 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7933 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
7937 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7940 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7941 if(!measObject->ssbFrequency)
7943 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
7946 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
7948 /* Subcarrier spacing */
7949 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7950 if(!measObject->ssbSubcarrierSpacing)
7952 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
7955 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
7958 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
7959 if(!measObject->smtc1)
7961 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
7964 measObject->smtc1->duration = SSB_MTC__duration_sf1;
7965 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7966 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
7968 /* Absoulute threshold SSB consolidation */
7969 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7970 if(!measObject->absThreshSS_BlocksConsolidation)
7972 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
7976 /* RSRP threshold */
7977 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7978 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
7980 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
7983 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
7985 /* RSRQ threshold */
7986 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7987 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
7989 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
7992 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
7994 /* SINR threshold */
7995 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7996 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
7998 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8001 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8003 /* Number of SSBs to average */
8004 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8005 if(!measObject->nrofSS_BlocksToAverage)
8007 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8010 *(measObject->nrofSS_BlocksToAverage) = 2;
8012 /* Quantity Config index */
8013 measObject->quantityConfigIndex = 1;
8016 /* RSRP offset for SSB */
8017 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8018 if(!measObject->offsetMO.rsrpOffsetSSB)
8020 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8023 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8025 /* RSRQ offset for SSB */
8026 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8027 if(!measObject->offsetMO.rsrpOffsetSSB)
8029 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8032 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8034 /* SINR offset for SSB */
8035 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8036 if(!measObject->offsetMO.sinrOffsetSSB)
8038 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8041 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8046 /*******************************************************************
8048 * @brief Fill Report configuration to Add/mod list
8052 * Function : fillReportCfgToAddModList
8054 * Functionality: Fill Report configuration to Add/mod list
8056 * @params[in] Report Config To Add/Mod List
8057 * @return ROK - success
8060 * ****************************************************************/
8061 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8064 uint8_t reportCfgIdx;
8065 ReportConfigToAddMod_t *reportCfg;
8066 ReportConfigNR_t *reportCfgNr;
8067 EventTriggerConfig_t *eventTriggCfg;
8070 reportCfgList->list.count = elementCnt;
8071 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8073 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8074 if(!reportCfgList->list.array)
8076 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8080 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8082 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8083 if(!reportCfgList->list.array[reportCfgIdx])
8085 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8091 reportCfg = reportCfgList->list.array[reportCfgIdx];
8092 reportCfg->reportConfigId = 1;
8093 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8095 /* Report Configuration for NR */
8096 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8097 if(!reportCfg->reportConfig.choice.reportConfigNR)
8099 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8102 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8105 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8106 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8107 if(!reportCfgNr->reportType.choice.eventTriggered)
8109 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8112 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8115 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8116 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8117 if(!eventTriggCfg->eventId.choice.eventA3)
8119 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8123 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8124 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8125 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8126 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8127 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8128 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8130 /* Reference Signal Type */
8131 eventTriggCfg->rsType = NR_RS_Type_ssb;
8133 /* Report Interval */
8134 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8137 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8139 /* Report Quantity cell */
8140 eventTriggCfg->reportQuantityCell.rsrp = true;
8141 eventTriggCfg->reportQuantityCell.rsrq = false;
8142 eventTriggCfg->reportQuantityCell.sinr = false;
8144 /* Maximum reported cells */
8145 eventTriggCfg->maxReportCells = 3;
8147 /* Report qunatity RS Indexes */
8148 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8149 if(!eventTriggCfg->reportQuantityRS_Indexes)
8151 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8154 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8155 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8156 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8158 /* Maximum number of RS indexes to report */
8159 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8160 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8162 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8165 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8167 /* Include Beam measurement */
8168 eventTriggCfg->includeBeamMeasurements = false;
8173 /*******************************************************************
8175 * @brief Fill measurement Id to add/mod list
8179 * Function : fillMeasIdToAddModList
8181 * Functionality: Fill measurement Id to add/mod list
8183 * @params[in] Measurement Id to add/mod list
8184 * @return ROK - success
8187 * ****************************************************************/
8188 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8194 measIdList->list.count = elementCnt;
8195 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8197 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8198 if(!measIdList->list.array)
8203 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8205 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8206 if(!measIdList->list.array[measIdIdx])
8212 measIdList->list.array[measIdIdx]->measId = 1;
8213 measIdList->list.array[measIdIdx]->measObjectId = 1;
8214 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8219 /*******************************************************************
8221 * @brief Fill s-measurement configuration
8225 * Function : fillSMeasConfig
8227 * Functionality: Fill s-measurement configuration
8229 * @params[in] s-Measurement config
8230 * @return ROK - success
8233 * ****************************************************************/
8234 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8236 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8237 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8242 /*******************************************************************
8244 * @brief Fill quantity config
8248 * Function : fillQunatityConfig
8250 * Functionality: Fill quantity config
8252 * @params[in] Quantity Config
8253 * @return ROK - success
8256 * ****************************************************************/
8257 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8259 uint8_t elementCnt = 0;
8260 uint8_t quanCfgIdx = 0;
8261 QuantityConfigNR_t *quantityCfgNr;
8263 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8264 if(!quantityCfg->quantityConfigNR_List)
8270 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8271 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8273 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8274 if(!quantityCfg->quantityConfigNR_List->list.array)
8279 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8281 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8282 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8289 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8291 /* Quantity Config of Reference signal */
8292 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8293 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8297 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8299 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8300 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8304 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8306 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8307 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8311 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8313 /* Quantity Config RS index */
8314 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8315 if(!quantityCfgNr->quantityConfigRS_Index)
8320 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8321 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8325 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8327 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8328 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8332 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8334 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8335 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8339 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8344 /*******************************************************************
8346 * @brief Fill measurement configuration
8350 * Function : fillMeasConfig
8352 * Functionality: Fill measurement configuration
8354 * @params[in] Measurement config
8355 * @return ROK - success
8358 * ****************************************************************/
8359 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8361 /* Measurement object to add/mod list */
8362 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8363 if(!measConfig->measObjectToAddModList)
8365 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8368 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8370 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8374 /* Report Config To add/mod list */
8375 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8376 if(!measConfig->reportConfigToAddModList)
8378 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8381 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8383 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8387 /* Measurement Id to add/mod list */
8388 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8389 if(!measConfig->measIdToAddModList)
8391 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8394 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8396 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8400 /* S-Measurement config */
8401 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8402 if(!measConfig->s_MeasureConfig)
8404 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8407 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8409 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8413 /* Qunatity Config */
8414 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8415 if(!measConfig->quantityConfig)
8417 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8420 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8422 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8429 /*******************************************************************
8431 * @brief Fill RRC reconfiguration non-critical extension IE
8435 * Function : fillRrcReconfigNonCriticalExt
8437 * Functionality: Fill RRC reconfiguration non-critical extension
8439 * @params[in] RRC Reconfig Non-critical extension
8440 * @return ROK - success
8443 * ****************************************************************/
8444 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8446 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8447 if(!rrcRecfg->masterCellGroup)
8449 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8453 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8454 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8455 if(!rrcRecfg->masterCellGroup->buf)
8457 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8460 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8463 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8464 * received from DU */
8465 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8467 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8475 /*******************************************************************
8477 * @brief Fill RRC reconfiguration structure
8481 * Function : fillRrcReconfig
8483 * Functionality: Fill RRC reconfiguration
8487 * RRC reconfiguration structure
8488 * @return ROK - success
8491 * ****************************************************************/
8492 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8494 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8496 rrcReconfig->rrc_TransactionIdentifier = 1;
8497 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8499 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8500 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8502 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8506 /* Radio Bearer Configuration */
8507 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8508 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8510 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8513 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8515 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8519 /* Measurement Configuration */
8520 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8521 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8523 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8526 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8528 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8532 /* Non Critical extension */
8533 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8534 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8536 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8539 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8541 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8547 /*******************************************************************
8549 * @brief Fill RRC reconfiguration Octet string
8553 * Function : fillRrcReconfigBuf
8555 * Functionality: Fill RRC reconfiguration octet string
8558 * @params[in] OCTET_STRING_t buffer
8559 * @return ROK - success
8562 * ****************************************************************/
8563 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8565 uint8_t ret = RFAILED;
8566 asn_enc_rval_t encRetVal;
8567 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8568 rrcReconfig = &rrcRecfg;
8572 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8574 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8578 /* Encode RRC Reconfiguration */
8579 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8580 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8582 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8584 /* Encode results */
8585 if(encRetVal.encoded == ENCODE_FAIL)
8587 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8588 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8593 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8594 for(int i=0; i< encBufSize; i++)
8596 DU_LOG("%x",encBuf[i]);
8600 rrcReconfigBuf->size = encBufSize;
8601 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8602 if(!rrcReconfigBuf->buf)
8604 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8607 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8612 freeRrcReconfig(rrcReconfig);
8616 /*******************************************************************
8618 * @brief Fill HO preparation information Octet string
8622 * Function : fillHOPreparationInfoBuf
8624 * Functionality: Fill HO preparation information Octet string
8627 * @params[in] HandoverPreparationInformation_t buffer
8628 * @return ROK - success
8631 * ****************************************************************/
8632 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8634 uint8_t ret = RFAILED;
8635 asn_enc_rval_t encRetVal;
8636 HandoverPreparationInformationRrc_t hoPrepInfo;
8637 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8642 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8643 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8644 if(!hoPrepInfo.criticalExtensions.choice.c1)
8646 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8649 hoPrepInfo.criticalExtensions.choice.c1->present = \
8650 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8652 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8653 sizeof(HandoverPreparationInformationRrc_IEs_t));
8654 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8656 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8659 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8661 /* Fill UE Capability RAT container list */
8662 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8665 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8669 /* Fill Source config */
8670 hoPrepInfoIe->sourceConfig = NULLP;
8671 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8672 if(!hoPrepInfoIe->sourceConfig)
8674 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8677 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8681 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8685 hoPrepInfoIe->rrm_Config = NULLP;
8686 hoPrepInfoIe->as_Context = NULLP;
8687 hoPrepInfoIe->nonCriticalExtension = NULLP;
8689 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8690 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8691 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8693 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8694 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8696 /* Encode results */
8697 if(encRetVal.encoded == ENCODE_FAIL)
8699 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8700 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8705 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8706 for(int i=0; i< encBufSize; i++)
8708 DU_LOG("%x",encBuf[i]);
8712 hoPrepInfoBuf->size = encBufSize;
8713 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8714 if(!hoPrepInfoBuf->buf)
8716 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8719 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8723 freeHOPreparationInfo(&hoPrepInfo);
8727 /*******************************************************************
8729 * @brief Fills CuToDuContainer
8733 * Function : fillCuToDuContainer
8735 * Functionality: Fills CuToDuContainer
8737 * @params[in] pointer to CUtoDURRCInformation_t
8739 * @return ROK - success
8742 ******************************************************************/
8744 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8746 uint8_t elementCnt = 0;
8748 uint8_t idx, idx2, rrcBufLen;
8750 /* UE Capabulity RAT Container List */
8751 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8752 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8754 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8757 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8759 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8760 if(!rrcMsg->measConfig)
8762 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8765 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8767 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8770 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8771 if(rrcMsg->iE_Extensions)
8774 rrcMsg->iE_Extensions->list.count = elementCnt;
8775 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
8777 /* Initialize the CUtoDURRCInformation_ExtIEs */
8778 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8780 if(rrcMsg->iE_Extensions->list.array == NULLP)
8782 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
8786 for(idx=0; idx<elementCnt; idx++)
8788 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
8789 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
8791 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
8798 /* Cell Group Configuration */
8799 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
8800 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8801 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
8802 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
8803 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
8806 /* Handover Preparation Information */
8807 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
8808 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8809 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
8810 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
8811 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
8817 /*******************************************************************
8819 * @brief Free CuToDuContainer
8823 * Function : FreeCuToDuInfo
8825 * Functionality: Free CuToDuContainer
8827 * @params[in] pointer to CUtoDURRCInformation_t
8829 * @return ROK - success
8832 ******************************************************************/
8834 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8838 if(rrcMsg->uE_CapabilityRAT_ContainerList)
8840 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8841 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
8842 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8844 if(rrcMsg->iE_Extensions)
8846 if(rrcMsg->iE_Extensions->list.array)
8848 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
8850 if(rrcMsg->iE_Extensions->list.array[idx])
8852 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
8854 case ProtocolIE_ID_id_CellGroupConfig:
8855 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8857 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
8858 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
8863 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8864 rrcMsg->iE_Extensions->list.array[idx]->id);
8870 for(idx2 = 0; idx2 < idx; idx2++)
8872 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
8874 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8878 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8881 /*******************************************************************
8883 * @brief Builds and sends the UE Setup Request
8887 * Function : BuildAndSendUeContextSetupReq
8889 * Functionality: Constructs the UE Setup Request and sends
8890 * it to the CU through SCTP.
8894 * @return ROK - success
8897 * ****************************************************************/
8898 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcContLen, uint8_t *rrcContainer)
8900 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
8901 uint8_t ret= RFAILED, ret1;
8903 uint8_t idx, idx1, bufLen, duIdx;
8905 DuDb *targetDuDb = NULLP;
8906 F1AP_PDU_t *f1apMsg = NULLP;
8907 UEContextSetupRequest_t *ueSetReq = NULLP;
8908 asn_enc_rval_t encRetVal; /* Encoder return value */
8909 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
8913 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
8915 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8916 if(f1apMsg == NULLP)
8918 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8922 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8923 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8924 if(f1apMsg->choice.initiatingMessage == NULLP)
8926 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8930 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
8931 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8932 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
8934 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
8936 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8940 ueSetReq->protocolIEs.list.count = elementCnt;
8941 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
8943 /* Initialize the UESetup members */
8944 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
8946 if(ueSetReq->protocolIEs.list.array == NULLP)
8948 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
8952 for(idx1=0; idx1<elementCnt; idx1++)
8954 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
8955 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
8963 /*GNB CU UE F1AP ID*/
8964 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8965 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8966 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8967 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
8969 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
8971 /*GNB DU UE F1AP ID*/
8973 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8974 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8975 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8976 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
8981 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
8982 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8983 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
8984 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8986 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
8987 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
8988 /* Since we are supporting only one cell per DU, accessing 0th index to
8989 * get target cell info */
8990 spCellId = targetDuDb->cellCb[0].nrCellId;
8993 spCellId = ueCb->cellCb->nrCellId;
8994 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9000 /*Served Cell Index*/
9002 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9003 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9004 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9005 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9007 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9009 /*CellULConfigured*/
9011 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9012 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9013 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9014 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9017 /*CUtoDURRCContainer*/
9019 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9020 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9021 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9022 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9027 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9029 /*Special Cells to be SetupList*/
9031 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9032 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9033 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9034 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9035 if(SplCellListret != ROK)
9041 /*SRBs To Be Setup List*/
9043 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9044 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9045 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9046 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9047 if(SrbSetupret != ROK)
9052 /*DRBs to Be Setup List*/
9054 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9055 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9056 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9057 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9063 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9065 /* RRC Container for security mode */
9067 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
9068 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9069 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCContainer;
9071 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
9073 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
9074 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
9075 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
9076 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
9078 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
9081 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
9082 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
9084 /* RRC delivery status request */
9086 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9087 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9088 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9089 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9092 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9094 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9095 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9096 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9098 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9100 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9101 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9102 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9103 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9105 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9108 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9109 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9111 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9113 /* Encode the F1SetupRequest type as APER */
9114 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9116 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9118 /* Encode results */
9119 if(encRetVal.encoded == ENCODE_FAIL)
9121 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9122 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9127 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9128 for(int i=0; i< encBufSize; i++)
9130 DU_LOG("%x",encBuf[i]);
9135 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9137 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9143 FreeUeContextSetupReq(f1apMsg);
9146 }/* End of BuildAndSendUeContextSetupReq*/
9148 /**********************************************************************
9149 * @brief Function to extractTeId received in UE context setup Response
9153 * Function : extractTeId
9156 * - Function to extract TeId
9159 * @return ROK - success
9162 **********************************************************************/
9163 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9167 GTPTunnel_t *gtpDl = NULLP;
9169 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9171 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9173 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9175 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9176 if(gtpDl->gTP_TEID.size > 0)
9178 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9181 DU_LOG("\nERROR --> EGTP: No TeId received");
9189 /****************************************************************
9190 * @brief Function to add Drb tunnels
9194 * Function : addDrbTunnels
9197 * - Function to add Drb tunnels
9200 * @return ROK - success
9203 * ****************************************************************/
9204 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9209 if(teId > MAX_TEID || teId < MIN_TEID)
9211 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9213 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9214 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9215 tnlEvt.lclTeid = teId;
9216 tnlEvt.remTeid = teId;
9217 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9220 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9225 /****************************************************************
9226 * @brief Function to process Drb Setup List
9230 * Function : procDrbSetupList
9233 * - Function to process DRB Setup List
9236 * @return ROK - success
9239 * ****************************************************************/
9240 uint8_t procDrbSetupList(uint32_t duId, DRBs_Setup_List_t *drbSetupList)
9244 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9246 if(drbSetupList != NULLP)
9248 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9250 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9251 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9253 /* extracting teId */
9254 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9257 if(addDrbTunnels(duId, teId)== ROK)
9259 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9270 /****************************************************************
9271 * @brief Function to process Ue Context Setup Response
9275 * Function : procUeContextSetupResponse
9278 * - Function to process Ue Context Setup Response
9281 * @return ROK - success
9284 * ****************************************************************/
9285 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9287 uint8_t duIdx = 0, idx = 0, ueIdx = 0;
9288 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9290 CuUeCb *ueCb = NULLP;
9291 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9292 OCTET_STRING_t *duToCuRrcContainer;
9294 SEARCH_DU_DB(duIdx, duId, duDb);
9295 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9297 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9299 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9301 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9303 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9306 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9308 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9309 ueCb = &duDb->ueCb[duUeF1apId-1];
9310 /* If ue context is not present in du db, then create UE context
9311 * here. This flow is hit in case of UE handover where UE
9312 * context is created before UE performs RACH on target DU */
9313 if(ueCb->gnbDuUeF1apId == 0)
9315 /* Creating UE context in target DU */
9316 memset(ueCb, 0, sizeof(CuUeCb));
9317 ueCb->cellCb = &duDb->cellCb[0];
9318 ueCb->gnbDuUeF1apId = duUeF1apId;
9319 ueCb->gnbCuUeF1apId = cuUeF1apId;
9320 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9321 ueCb->hoInfo.targetDuId = duId;
9324 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9325 ueCb->cellCb->numUe++;
9329 case ProtocolIE_ID_id_C_RNTI:
9331 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9334 case ProtocolIE_ID_id_DRBs_Setup_List:
9336 /* Adding Tunnels for successful DRB */
9337 procDrbSetupList(duId, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9340 case ProtocolIE_ID_id_DUtoCURRCInformation:
9342 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9343 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9344 DUtoCURRCInformation.cellGroupConfig;
9345 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9346 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9348 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9356 ueCb->f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
9358 /* If the UE is in handover, UE context modification request is to be sent to
9359 * source DU once UE context setup response is received from target DU */
9360 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9362 DuDb *srcDuDb = NULLP;
9363 CuUeCb *ueCbInSrcDu = NULLP;
9365 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9366 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9367 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9369 /* UE context setup response is received from target DU. Search all
9370 * DUs to find source DU except this target DU Id.*/
9371 if(cuCb.duInfo[duIdx].duId != duId)
9373 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9376 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9377 * received in UE context setup response since CU UE F1AP ID does not
9378 * change for UE in handover.
9379 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9381 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9382 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9384 srcDuDb = &cuCb.duInfo[duIdx];
9385 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9387 /* Store source DU info in the new UE context created in
9389 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9391 /* Copy the received container to UeCb */
9392 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9394 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9396 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9403 if(srcDuDb && ueCbInSrcDu)
9410 /****************************************************************
9411 * @brief Function to process Ul Rrc Msg received from DU
9415 * Function : procUlRrcMsg
9418 * - Function to process Ul Rrc Msg received from DU
9421 * @return ROK - success
9424 * ****************************************************************/
9426 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9428 uint8_t idx, ret, srbId, rrcMsgType, duIdx=0;
9429 uint8_t cuUeF1apId, duUeF1apId;
9430 uint8_t *rrcContainer = NULLP;
9431 uint16_t rrcContLen;
9434 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9437 SEARCH_DU_DB(duIdx, duId, duDb);
9438 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9440 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9442 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9444 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9446 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9449 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9451 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9454 case ProtocolIE_ID_id_SRBID:
9455 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9458 case ProtocolIE_ID_id_RRCContainer:
9460 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9461 CU_ALLOC(rrcContainer, rrcContLen);
9464 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9467 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9469 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9476 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9483 ueCb = &duDb->ueCb[duUeF1apId-1];
9484 ueCb->f1apMsgDb.dlRrcMsgCount++;
9485 rrcMsgType = setDlRRCMsgType(ueCb);
9486 if(rrcMsgType == REGISTRATION_ACCEPT)
9488 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9489 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9491 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
9493 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
9494 ret = BuildAndSendUeContextSetupReq(duId, ueCb, rrcContLen, rrcContainer);
9496 if(rrcMsgType == SECURITY_MODE_COMPLETE)
9498 /* To trigger the DL RRC Msg for RRC Reconfig */
9499 ueCb->f1apMsgDb.dlRrcMsgCount++;
9500 rrcMsgType = setDlRRCMsgType(ueCb);
9501 if(rrcMsgType == RRC_RECONFIG)
9503 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
9504 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9507 if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9509 ueCb->state = UE_ACTIVE;
9510 ueCb->f1apMsgDb.dlRrcMsgCount++;
9511 rrcMsgType = setDlRRCMsgType(ueCb);
9512 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
9514 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9515 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9522 /****************************************************************
9523 * @brief Build And Send F1ResetAck
9527 * Function : FreeF1ResetAck
9530 * - Build And Send F1ResetRSP
9533 * @return ROK - success
9536 * ****************************************************************/
9537 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9540 ResetAcknowledge_t *f1ResetAck;
9544 if(f1apMsg->choice.successfulOutcome)
9546 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9548 if(f1ResetAck->protocolIEs.list.array)
9550 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9552 if(f1ResetAck->protocolIEs.list.array[idx])
9554 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9557 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9559 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9561 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9565 /****************************************************************
9566 * @brief Build And Send F1ResetAck
9570 * Function : BuildAndSendF1ResetAck
9573 * - Build And Send F1ResetRSP
9576 * @return ROK - success
9579 * ****************************************************************/
9581 uint8_t BuildAndSendF1ResetAck()
9584 uint8_t elementCnt = 0;
9585 uint8_t ret = RFAILED;
9586 F1AP_PDU_t *f1apMsg = NULL;
9587 ResetAcknowledge_t *f1ResetAck = NULLP;
9588 asn_enc_rval_t encRetVal;
9589 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9592 /* Allocate the memory for F1ResetRequest_t */
9593 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9594 if(f1apMsg == NULLP)
9596 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9600 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9602 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9603 if(f1apMsg->choice.successfulOutcome == NULLP)
9605 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9609 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9610 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9611 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9612 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9616 f1ResetAck->protocolIEs.list.count = elementCnt;
9617 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9619 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9620 if(f1ResetAck->protocolIEs.list.array == NULLP)
9622 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9626 for(idx=0; idx<elementCnt; idx++)
9628 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9629 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9636 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9637 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9638 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9639 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9641 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9643 /* Encode the F1SetupRequest type as UPER */
9644 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9646 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9648 /* Check encode results */
9649 if(encRetVal.encoded == ENCODE_FAIL)
9651 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9652 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9657 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9658 for(int i=0; i< encBufSize; i++)
9660 DU_LOG("%x",encBuf[i]);
9665 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9666 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9668 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9676 FreeF1ResetAck(f1apMsg);
9680 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9684 if(ulInfo->list.array)
9686 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9688 if(ulInfo->list.array[arrIdx])
9690 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9692 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9694 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9696 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9697 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9698 gTPTunnel->gTP_TEID.size);
9700 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9701 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9702 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9704 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9705 sizeof(GTPTunnel_t));
9707 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9710 CU_FREE(ulInfo->list.array,ulInfo->list.size);
9714 /*******************************************************************
9716 * @brief Deletes the EGTP tunnel
9720 * Function : deleteEgtpTunnel
9722 * Functionality: Deletes the EGTP tunnel
9724 * @params[in] uint8_t *buf
9726 * @return ROK - success
9729 * ****************************************************************/
9730 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
9735 teIdStringToInt(buf, &teId);
9736 if(teId > MAX_TEID || teId < MIN_TEID)
9738 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
9741 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9742 tnlEvt.action = EGTP_TNL_MGMT_DEL;
9743 tnlEvt.lclTeid = teId;
9744 tnlEvt.remTeid = teId;
9745 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
9747 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
9752 /*******************************************************************
9754 * @brief Builds the Uplink Tunnel Info
9758 * Function : BuildUlTnlInfoforSetupMod
9760 * Functionality: Constructs the UL TnlInfo For DRB list
9762 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
9764 * @return ROK - success
9767 * ****************************************************************/
9768 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
9774 ulInfo->list.count = ulCnt;
9775 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
9776 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
9777 if(ulInfo->list.array == NULLP)
9779 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9782 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
9784 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9785 if(ulInfo->list.array[arrIdx] == NULLP)
9787 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9793 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
9794 UPTransportLayerInformation_PR_gTPTunnel;
9797 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9798 sizeof(GTPTunnel_t));
9799 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
9801 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9804 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9805 transportLayerAddress.size = 4*sizeof(uint8_t);
9806 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9807 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9808 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9809 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9810 transportLayerAddress.buf == NULLP)
9812 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9816 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9817 transportLayerAddress.buf[0] = 192;
9818 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9819 transportLayerAddress.buf[1] = 168;
9820 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9821 transportLayerAddress.buf[2] = 130;
9822 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9823 transportLayerAddress.buf[3] = 82;
9824 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9825 transportLayerAddress.bits_unused = 0;
9827 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
9828 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
9829 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
9830 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
9833 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
9834 = 4 * sizeof(uint8_t);
9835 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9836 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9837 gTPTunnel->gTP_TEID.size);
9838 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
9841 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9844 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9845 gTP_TEID.buf[0] = 0;
9846 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9847 gTP_TEID.buf[1] = 0;
9848 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9849 gTP_TEID.buf[2] = 0;
9850 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
9852 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
9853 * fetched based on the Drb Id */
9855 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
9856 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
9857 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
9861 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9862 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
9865 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
9866 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
9867 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
9868 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
9870 }/*End of BuildULTnlInfo*/
9872 /*******************************************************************
9874 * @brief freeing the DRB item
9878 * Function : FreeDrbItem
9880 * Functionality: freeing the DRB item
9882 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9884 * @return ROK - success
9887 * ****************************************************************/
9889 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
9892 SNSSAI_t *snssai =NULLP;
9893 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
9895 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9896 switch(drbItem->qoSInformation.present)
9898 case QoSInformation_PR_NOTHING:
9900 case QoSInformation_PR_eUTRANQoS:
9902 if(drbItem->qoSInformation.choice.eUTRANQoS)
9904 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9908 case QoSInformation_PR_choice_extension:
9910 if(drbItem->qoSInformation.choice.choice_extension)
9912 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
9914 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
9917 CU_FREE(snssai->sST.buf,snssai->sST.size);
9923 CU_FREE(snssai->sD->buf,snssai->sD->size);
9925 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
9928 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
9929 if(flowMap->list.array)
9931 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
9933 if(flowMap->list.array[arrIdx] )
9935 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
9936 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
9939 CU_FREE(flowMap->list.array,flowMap->list.size);
9942 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
9948 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
9949 if(drbItem->uLConfiguration)
9951 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
9955 /*******************************************************************
9957 * @brief filling the DRB setup Mod item
9961 * Function : FillDrbItemToSetupMod
9963 * Functionality: filling the DRB setup Mod item
9966 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9968 * @return ROK - success
9971 * ****************************************************************/
9973 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
9978 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
9979 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
9982 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9984 switch(drbItem->qoSInformation.present)
9986 case QoSInformation_PR_NOTHING:
9990 case QoSInformation_PR_eUTRANQoS:
9993 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9994 if(drbItem->qoSInformation.choice.eUTRANQoS)
9996 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
9999 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10000 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10001 PriorityLevel_no_priority;
10003 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10004 Pre_emptionCapability_may_trigger_pre_emption;
10006 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10007 Pre_emptionVulnerability_pre_emptable;
10011 case QoSInformation_PR_choice_extension:
10013 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10014 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10016 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10020 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10021 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10022 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10023 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10024 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10027 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10032 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10033 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10036 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10040 /*Flows mapped to DRB List*/
10041 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10042 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10043 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10046 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10052 /*ULUPTNLInformation To Be Setup List*/
10053 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10054 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10057 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10062 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10063 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10069 /*******************************************************************
10071 * @brief Builds the DRB to be Setup Mod ItemIes
10075 * Function : FillDrbItemList
10077 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10079 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10081 * @return ROK - success
10082 * RFAILED - failure
10084 * ****************************************************************/
10086 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10088 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10089 drbItemIe->criticality = Criticality_reject;
10090 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10092 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10094 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10099 /*******************************************************************
10101 * @brief free the DRB to be Setup Mod list
10105 * Function : FreeDrbToBeSetupModList
10107 * Functionality: free the DRB to be Setup Mod list
10109 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10111 * @return ROK - success
10112 * RFAILED - failure
10114 * ****************************************************************/
10115 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10118 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10120 if(drbSet->list.array)
10122 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10124 if(drbSet->list.array[arrIdx] != NULLP)
10128 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10129 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10131 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10134 CU_FREE(drbSet->list.array, drbSet->list.size);
10139 /*******************************************************************
10141 * @brief Builds the DRB to be Setup Mod list
10145 * Function : BuildDrbToBeSetupList
10147 * Functionality: Constructs the DRB to be Setup Mod list
10149 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10151 * @return ROK - success
10152 * RFAILED - failure
10154 * ****************************************************************/
10156 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10162 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10163 drbSet->list.count = drbCnt;
10164 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10165 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10166 if(drbSet->list.array == NULLP)
10168 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10172 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10174 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10175 if(drbSet->list.array[arrIdx] == NULLP)
10177 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10181 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10184 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10191 /*******************************************************************
10193 * @brief Filling the DRB to be modified item
10197 * Function : FillDrbToBeModItem
10199 * Functionality: filling the DRB to be modified item
10201 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10203 * @return ROK - success
10204 * RFAILED - failure
10206 * ****************************************************************/
10208 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10212 DrbInfo *drbToBeMod;
10215 drbItem->dRBID = DRB2 + arrIdx;
10217 /* Search for DRB ID in CU databse */
10218 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10220 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10222 drbToBeMod = &ueCb->drbList[drbIdx];
10228 drbItem->qoSInformation = NULLP;
10229 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10230 if(drbItem->qoSInformation != NULLP)
10232 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10234 switch(drbItem->qoSInformation->present)
10236 case QoSInformation_PR_NOTHING:
10240 case QoSInformation_PR_eUTRANQoS:
10243 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10244 if(drbItem->qoSInformation->choice.eUTRANQoS)
10246 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10249 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10250 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10251 PriorityLevel_no_priority;
10253 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10254 Pre_emptionCapability_may_trigger_pre_emption;
10256 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10257 Pre_emptionVulnerability_pre_emptable;
10261 case QoSInformation_PR_choice_extension:
10263 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10264 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10266 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10270 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10271 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10272 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10273 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10274 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10277 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10282 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10283 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10286 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10290 /*Flows mapped to DRB List*/
10291 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10292 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10293 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10296 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10303 /*ULUPTNLInformation To Be Setup List*/
10304 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10305 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10308 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10314 /*******************************************************************
10316 * @brief Builds the DRB to be modified Item IE
10320 * Function : FillDrbToBeModItemList
10322 * Functionality: Constructs the DRB to be modified Mod Item Ies
10324 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10326 * @return ROK - success
10327 * RFAILED - failure
10329 * ****************************************************************/
10331 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10333 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10334 drbItemIe->criticality = Criticality_reject;
10335 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10336 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10338 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10345 /*******************************************************************
10347 * @brief Builds the DRB to be modified list
10351 * Function : BuildDrbToBeModList
10353 * Functionality: Constructs the DRB to be modified list
10355 * @params[in] DRBs_ToBeModified_List_t *drbSet
10357 * @return ROK - success
10358 * RFAILED - failure
10360 * ****************************************************************/
10362 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10368 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10369 drbSet->list.count = drbCnt;
10370 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10371 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10372 if(drbSet->list.array == NULLP)
10374 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10377 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10379 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10380 if(drbSet->list.array[arrIdx] == NULLP)
10382 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10386 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10389 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10396 /*******************************************************************
10398 * @brief freeing the DRB item
10402 * Function : FreeModifiedDrbItem
10404 * Functionality: freeing the DRB 2 item
10406 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10408 * @return ROK - success
10409 * RFAILED - failure
10411 * ****************************************************************/
10413 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10416 SNSSAI_t *snssai =NULLP;
10417 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10419 if(drbItem->qoSInformation != NULLP)
10421 switch(drbItem->qoSInformation->present)
10423 case QoSInformation_PR_NOTHING:
10425 case QoSInformation_PR_eUTRANQoS:
10427 if(drbItem->qoSInformation->choice.eUTRANQoS)
10429 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10433 case QoSInformation_PR_choice_extension:
10435 if(drbItem->qoSInformation->choice.choice_extension)
10437 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10439 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10440 if(snssai->sST.buf)
10442 CU_FREE(snssai->sST.buf,snssai->sST.size);
10446 if(snssai->sD->buf)
10448 CU_FREE(snssai->sD->buf,snssai->sD->size);
10450 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10453 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10454 if(flowMap->list.array)
10456 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10458 if(flowMap->list.array[arrIdx] )
10460 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10461 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10464 CU_FREE(flowMap->list.array,flowMap->list.size);
10467 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10473 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10474 if(drbItem->uLConfiguration)
10476 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10480 /*******************************************************************
10482 * @brief free the DRB to be modfified list
10486 * Function : FreeDrbToBeModifiedList
10488 * Functionality: free the DRB to be Setup Mod list
10490 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10492 * @return ROK - success
10493 * RFAILED - failure
10495 * ****************************************************************/
10496 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10499 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10501 if(drbSet->list.array)
10503 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10505 if(drbSet->list.array[arrIdx] != NULLP)
10507 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10508 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10509 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10512 CU_FREE(drbSet->list.array, drbSet->list.size);
10517 /*******************************************************************
10519 * @brief free the UeContextModification Request
10523 * Function : FreeUeContextModicationRequest
10525 * Functionality : deallocation of memory allocated in UeContextModiification
10528 * @params[in] F1AP_PDU_t *f1apMsg
10532 * ****************************************************************/
10533 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10535 uint8_t arrIdx =0 , ieId=0;
10536 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10540 if(f1apMsg->choice.initiatingMessage)
10542 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10543 if(ueContextModifyReq->protocolIEs.list.array)
10545 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10547 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10549 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10552 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10554 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10556 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10558 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10559 choice.DRBs_ToBeSetupMod_List);
10562 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10564 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10565 choice.DRBs_ToBeModified_List);
10568 case ProtocolIE_ID_id_TransmissionActionIndicator:
10570 case ProtocolIE_ID_id_RRCContainer:
10572 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10573 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10577 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10580 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10582 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10584 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10588 /*******************************************************************
10590 * @brief Builds the Ue Context Modification Req
10594 * Function : BuildAndSendUeContextModificationReq
10596 * Functionality: Constructs the Ue Context Modification Req
10600 * @return ROK - success
10601 * RFAILED - failure
10603 * ****************************************************************/
10604 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10607 uint8_t elementCnt = 0;
10608 uint8_t ret = RFAILED;
10609 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10610 F1AP_PDU_t *f1apMsg = NULLP;
10611 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10612 asn_enc_rval_t encRetVal;
10613 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10616 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10617 if(f1apMsg == NULLP)
10619 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10623 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10625 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10626 if(f1apMsg->choice.initiatingMessage == NULLP)
10628 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10631 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10632 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10633 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10635 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10637 if(action == MODIFY_UE)
10639 else if(action == QUERY_CONFIG)
10641 else if(action == RRC_RECONFIG_COMPLETE_IND)
10643 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10646 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10647 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10649 /* Initialize the UE context modification members */
10650 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10651 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10653 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10657 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10659 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10660 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10662 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10668 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10669 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10670 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10671 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10672 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10675 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10676 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10677 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10678 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10679 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10681 if(action == MODIFY_UE)
10683 /* DRB to be setup list */
10685 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10686 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10687 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10688 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10689 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10690 value.choice.DRBs_ToBeSetupMod_List));
10692 /* DRB to be modified list */
10694 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
10695 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10696 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10697 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
10698 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10699 value.choice.DRBs_ToBeModified_List));
10701 /* TODO: DRB to be release list */
10705 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
10709 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
10711 else if(action == QUERY_CONFIG)
10714 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
10715 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10716 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10717 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
10718 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
10720 else if(action == RRC_RECONFIG_COMPLETE_IND)
10723 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
10724 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10725 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10726 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
10727 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
10728 RRCReconfigurationCompleteIndicator_true;
10730 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10733 if(action == STOP_DATA_TX)
10735 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10736 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10737 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10738 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10739 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10740 TransmissionActionIndicator_stop;
10742 else if (action == RESTART_DATA_TX)
10744 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10745 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10746 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10747 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10748 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10749 TransmissionActionIndicator_restart;
10753 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10754 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10755 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10756 UEContextModificationRequestIEs__value_PR_RRCContainer;
10757 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
10759 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
10763 /* RRC delivery status request */
10765 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
10766 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10767 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
10768 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
10771 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10773 /* Encode the F1SetupRequest type as APER */
10774 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10776 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10778 /* Encode results */
10779 if(encRetVal.encoded == ENCODE_FAIL)
10781 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
10782 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10787 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
10789 /* This for loop was going into an infinite loop even though encBufSize
10790 * has a small value. Hence commented this
10792 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
10794 DU_LOG("%x",encBuf[ieIdx]);
10799 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10800 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
10802 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
10810 FreeUeContextModicationRequest(f1apMsg);
10814 /*****************************************************************i
10816 * @brief Free memory allocated for UE Context Release Command
10820 * Function : FreeUeContextReleaseCommand
10823 * - Free memory allocated for UE Context Release Command
10825 * @params[in] F1AP_PDU_t *f1apMsg
10828 * *************************************************************/
10829 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
10832 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
10836 if(f1apMsg->choice.initiatingMessage)
10838 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10839 if(ueReleaseCommand->protocolIEs.list.array)
10841 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
10843 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10845 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
10847 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10849 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10852 /*******************************************************************
10854 * @brief Builds the Ue Context Release Command
10858 * Function : BuildAndSendUeContextReleaseCommand
10860 * Functionality: Constructs the Ue Context Release Command
10864 * @return ROK - success
10865 * RFAILED - failure
10867 * ****************************************************************/
10868 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
10870 bool memAllocFailed = false;
10871 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
10874 F1AP_PDU_t *f1apMsg = NULLP;
10875 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
10877 asn_enc_rval_t encRetVal;
10878 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
10882 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10883 if(f1apMsg == NULLP)
10885 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
10889 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10891 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10892 if(f1apMsg->choice.initiatingMessage == NULLP)
10894 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
10897 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
10898 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10899 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
10901 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10903 SEARCH_DU_DB(duIdx, duId, duDb);
10904 ueCb = &duDb->ueCb[duUeF1apId-1];
10905 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
10910 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
10911 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
10913 /* Initialize the UE context modification members */
10914 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
10915 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
10917 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
10921 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10923 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10924 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
10926 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
10927 memAllocFailed = true;
10932 if(memAllocFailed == true)
10938 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10939 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10940 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10941 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
10942 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
10945 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10946 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10947 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10948 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
10949 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
10951 /* Cause of UE context release */
10953 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
10954 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10955 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10956 UEContextReleaseCommandIEs__value_PR_Cause;
10957 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10958 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
10959 CauseRadioNetwork_normal_release;
10960 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
10962 /* RRC Container for RRC release */
10964 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10965 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10966 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10967 UEContextReleaseCommandIEs__value_PR_RRCContainer;
10968 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
10970 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
10971 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
10972 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
10973 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
10975 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
10978 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
10979 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
10981 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10983 /* Encode the UE Context Release Command type as APER */
10984 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10986 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10989 /* Encode results */
10990 if(encRetVal.encoded == ENCODE_FAIL)
10992 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
10993 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10998 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
10999 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11001 DU_LOG("%x",encBuf[ieIdx]);
11005 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11006 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11008 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11016 FreeUeContextReleaseCommand(f1apMsg);
11019 /*******************************************************************
11021 * @brief process Ue context release request
11025 * Function : procUeContextReleaseReq
11028 * - process Ue context release request
11030 * @params[in] F1AP_PDU_t *f1apMsg
11031 * @return ROK - success
11032 * RFAILED - failure
11034 * ****************************************************************/
11035 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11037 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11039 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11040 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11042 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11044 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11046 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11048 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11051 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11053 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11061 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11063 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11068 /*******************************************************************
11070 * @brief processing of Gnb-DU config update
11074 * Function : procGnbDuUpdate
11077 * - processing of Gnb-DU config update
11079 * @params[in] F1AP_PDU_t *f1apMsg
11080 * @return ROK - success
11081 * RFAILED - failure
11083 * ****************************************************************/
11084 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11086 bool cellToBeDelete = false;
11087 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11091 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11093 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11094 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11096 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11098 case ProtocolIE_ID_id_TransactionID:
11100 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11102 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11104 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11105 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11106 Served_Cells_To_Delete_List.list.array[0];
11107 nrCellId = deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.buf[4] >>\
11108 deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.bits_unused;
11109 cellToBeDelete = true;
11112 case ProtocolIE_ID_id_gNB_DU_ID:
11116 if(BuildAndSendDUUpdateAck(duId) != ROK)
11118 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11122 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11123 * commented this trigger for now */
11125 if(cellToBeDelete == false)
11127 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11128 if(BuildAndSendF1ResetReq() != ROK)
11130 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11135 if(cellToBeDelete == true)
11137 SEARCH_DU_DB(duIdx, duId, duDb);
11138 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11139 if(cellCb->numUe == 0)
11141 memset(cellCb, 0, sizeof(CuCellCb));
11145 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11150 /*******************************************************************
11152 * @brief storing slice list in CU database
11156 * Function : buildSliceList
11159 * - storing slice list in CU database
11161 * @params[in] SliceSupportList_t *sliceSupportList
11162 * @return ROK - success
11163 * RFAILED - failure
11165 * ****************************************************************/
11166 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11168 uint8_t sliceListIdx = 0;
11170 if(sliceSupportList)
11172 if(sliceSupportList->list.array)
11174 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11175 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11177 if(sliceSupportList->list.array[sliceListIdx])
11179 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11180 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11182 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11185 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11187 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11188 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11190 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11192 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11193 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11194 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11203 /****************************************************************
11204 * @brief Function to process Srb Setup Mod List
11208 * Function : procSrbSetupModList
11211 * - Function to process SRB Setup Mod List
11214 * @return ROK - success
11215 * RFAILED - failure
11217 * ****************************************************************/
11218 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11220 uint8_t arrIdx = 0, srbIdx;
11221 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11223 if(srbSetupList != NULLP)
11225 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11227 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11228 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11230 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11232 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11234 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11246 /****************************************************************
11247 * @brief Function to process Drb Setup Mod List
11251 * Function : procDrbSetupModList
11254 * - Function to process DRB Setup Mod List
11257 * @return ROK - success
11258 * RFAILED - failure
11260 * ****************************************************************/
11261 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11263 uint8_t arrIdx = 0, drbIdx;
11265 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11267 if(drbSetupList != NULLP)
11269 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11271 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11272 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11274 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11276 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11278 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11279 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11284 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11286 /* extracting teId */
11287 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11290 if(addDrbTunnels(duId, teId)== ROK)
11292 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11304 /*******************************************************************
11306 * @brief processing of GNB_DU_Served_Cells Plmn list information
11310 * Function : procServedCellPlmnList
11313 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11316 * @params[in] F1AP_PDU_t *f1apMsg
11317 * @return ROK - success
11318 * RFAILED - failure
11320 * ****************************************************************/
11321 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11323 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11324 ProtocolExtensionContainer_4624P3_t **ieExtend;
11326 if(srvPlmn->list.array)
11328 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11330 if(srvPlmn->list.array[srvPlmnIdx])
11332 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11335 if((*ieExtend)->list.array)
11337 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11339 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11341 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11343 case ProtocolIE_ID_id_TAISliceSupportList:
11345 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11346 extensionValue.choice.SliceSupportList) != ROK)
11348 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11363 /****************************************************************
11364 * @brief Function to process Ue Context Modification Response
11368 * Function : procUeContextModificationResponse
11371 * - Function to process Ue Context Modification Response
11374 * @return ROK - success
11375 * RFAILED - failure
11377 * ****************************************************************/
11378 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11380 uint8_t idx=0, duIdx=0;
11381 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11382 DuDb *duDb = NULLP;
11383 CuUeCb *ueCb = NULLP;
11384 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11386 SEARCH_DU_DB(duIdx, duId, duDb);
11387 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11389 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11391 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11393 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11395 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11398 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11400 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11401 ueCb = &duDb->ueCb[duUeF1apId-1];
11404 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11406 /* Adding Tunnels for successful DRB */
11407 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11411 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11413 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11416 case ProtocolIE_ID_id_DUtoCURRCInformation:
11418 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11419 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11420 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11422 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11431 /* If UE is in handover and UE context is not yet created at target DU, then send
11432 * UE context setup request to target DU */
11433 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11436 DuDb *tgtDuDb = NULLP;
11437 CuUeCb *ueCbInTgtDu = NULLP;
11439 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11442 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11443 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11445 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11447 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11449 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11454 /* If UE context is not found in Target DU DU, send UE context setup
11456 if(ueCbInTgtDu == NULLP)
11458 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb, 0, NULLP)) != ROK)
11460 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11470 /*******************************************************************
11472 * @brief processing of F1 setup request
11476 * Function : procF1SetupReq
11479 * - processing of F1 setup request
11481 * @params[in] F1AP_PDU_t *f1apMsg
11482 * @return ROK - success
11483 * RFAILED - failure
11485 * ****************************************************************/
11486 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11488 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11489 uint32_t duId = 0, nrCellId = 0;
11490 DuDb *duDb = NULLP;
11491 CuCellCb *cellCb = NULLP;
11492 BIT_STRING_t nrcellIdentity;
11493 F1SetupRequest_t *f1SetupReq = NULLP;
11494 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11495 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11497 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11498 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11500 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11502 case ProtocolIE_ID_id_gNB_DU_ID:
11504 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11505 SEARCH_DU_DB(duIdx, duId, duDb);
11508 duDb = &cuCb.duInfo[cuCb.numDu];
11509 memset(duDb, 0, sizeof(DuDb));
11518 case ProtocolIE_ID_id_gNB_DU_Name:
11520 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11523 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11525 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11526 if(duServedCell->list.array)
11528 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11530 if(duServedCell->list.array[plmnidx])
11532 switch(duServedCell->list.array[plmnidx]->id)
11534 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11536 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11537 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11538 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11540 nrCellId = nrcellIdentity.buf[4] >> nrcellIdentity.bits_unused;
11541 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11542 if(cellCb == NULLP)
11544 cellCb = &duDb->cellCb[duDb->numCells];
11545 memset(cellCb, 0, sizeof(CuCellCb));
11546 cellCb->nrCellId = nrCellId;
11547 cellCb->cellStatus = CELL_ACTIVE;
11560 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11564 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11568 /****************************************************************
11570 * @brief processing of UE Context Release Complete
11574 * Function : procUeContextReleaseComplete
11577 * - processing of UE Context Release Complete
11579 * @params[in] F1AP_PDU_t *f1apMsg
11580 * @return ROK - success
11581 * RFAILED - failure
11583 * ****************************************************************/
11584 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11586 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0;
11587 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11588 DuDb *duDb = NULLP;
11589 CuUeCb *ueCb = NULLP;
11590 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11592 SEARCH_DU_DB(duIdx, duId, duDb);
11595 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11599 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11600 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11602 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11604 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11606 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11609 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11611 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11612 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11613 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11615 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11617 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11618 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11620 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11621 ueCb->cellCb->numUe--;
11622 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus = CELL_DELETION_IN_PROGRESS))
11624 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11631 memset(ueCb, 0, sizeof(CuUeCb));
11639 /*******************************************************************
11641 * @brief Builds the Paging cell list
11645 * Function : BuildPagingCellList
11647 * Functionality: Build the paging cell list
11649 * @params[in] PagingCell_list_t *pagingCelllist,
11651 * @return ROK - success
11652 * RFAILED - failure
11654 * ****************************************************************/
11655 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11657 uint8_t cellIdx =0;
11658 PagingCell_ItemIEs_t *pagingCellItemIes;
11659 PagingCell_Item_t *pagingCellItem;
11661 pagingCelllist->list.count = numCells;
11662 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11663 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11664 if(pagingCelllist->list.array == NULLP)
11666 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11670 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11672 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11673 if(pagingCelllist->list.array[cellIdx] == NULLP)
11675 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11680 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11682 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11683 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
11684 pagingCellItemIes->criticality = Criticality_ignore;
11685 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
11686 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11688 /* Fill NrCgi Information */
11689 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
11695 /*******************************************************************
11697 * @brief Deallocation of memory allocated in paging msg
11701 * Function :FreePagingMsg
11703 * Functionality: Deallocation of memory allocated in paging msg
11705 * @params[in] F1AP_PDU_t *f1apMsg
11709 * ****************************************************************/
11710 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
11712 uint8_t ieIdx, cellIdx;
11714 PagingCell_ItemIEs_t *pagingCellItemIes;
11715 PagingCell_Item_t *pagingCellItem;
11716 PagingCell_list_t *pagingCelllist;
11720 if(f1apMsg->choice.initiatingMessage)
11722 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11723 if(paging->protocolIEs.list.array)
11725 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
11727 if(paging->protocolIEs.list.array[ieIdx])
11729 switch(paging->protocolIEs.list.array[ieIdx]->id)
11731 case ProtocolIE_ID_id_UEIdentityIndexValue:
11733 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11734 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11738 case ProtocolIE_ID_id_PagingIdentity:
11740 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
11742 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11744 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
11746 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11747 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11749 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
11750 sizeof(struct CNUEPagingIdentity));
11756 case ProtocolIE_ID_id_PagingCell_List:
11758 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
11759 if(pagingCelllist->list.array)
11761 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11763 if(pagingCelllist->list.array[cellIdx])
11765 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11766 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
11768 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11769 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
11770 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
11772 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11775 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
11780 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11783 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11785 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11787 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11790 /*******************************************************************
11792 * @brief Builds and sends the paging message if UE is in idle mode
11796 * Function : BuildAndSendPagingMsg
11798 * Functionality: Builds and sends the paging message
11800 * @params[in] uint32_t duId, uint8_t gsTmsi
11802 * @return ROK - success
11803 * RFAILED - failure
11805 * ****************************************************************/
11806 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
11808 bool memAllocFailed = false;
11809 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
11810 uint16_t ueId = 0, duIdx = 0;
11812 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
11813 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
11814 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
11815 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
11817 F1AP_PDU_t *f1apMsg = NULLP;
11818 Paging_t *paging = NULLP;
11820 asn_enc_rval_t encRetVal;
11822 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
11824 SEARCH_DU_DB(duIdx, duId, duDb);
11827 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
11833 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11834 if(f1apMsg == NULLP)
11836 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
11840 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11842 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11843 if(f1apMsg->choice.initiatingMessage == NULLP)
11845 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
11848 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
11849 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11850 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
11852 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11855 paging->protocolIEs.list.count = elementCnt;
11856 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
11858 /* Initialize the Paging Message members */
11859 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11860 if(paging->protocolIEs.list.array == NULLP)
11862 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
11866 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11868 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11869 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
11871 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11872 memAllocFailed = true;
11877 if(memAllocFailed == true)
11882 /* UE Identity Index Value */
11884 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
11885 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11886 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
11887 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
11888 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
11889 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11890 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11891 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
11893 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11897 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
11898 ueId = gsTmsi % 1024;
11899 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
11901 /* Paging Identity */
11903 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
11904 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11905 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
11906 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
11907 PagingIdentity_PR_cNUEPagingIdentity;
11908 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
11909 sizeof(struct CNUEPagingIdentity));
11910 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11912 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11916 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
11917 CNUEPagingIdentity_PR_fiveG_S_TMSI;
11919 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
11920 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11921 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11922 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
11924 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11928 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
11929 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
11933 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
11934 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11935 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
11936 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
11938 /* Paging Priority */
11940 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
11941 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11942 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
11943 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
11945 /* Paging Cell List */
11947 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
11948 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11949 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
11950 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
11952 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
11956 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11958 /* Encode the UE Context Release Command type as APER */
11959 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11961 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11964 /* Encode results */
11965 if(encRetVal.encoded == ENCODE_FAIL)
11967 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11968 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11973 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
11974 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11976 DU_LOG("%x",encBuf[ieIdx]);
11980 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11982 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11991 FreePagingMsg(f1apMsg);
11995 /*******************************************************************
11997 * @brief Handles received F1AP message and sends back response
12001 * Function : F1APMsgHdlr
12004 * - Decodes received F1AP control message
12005 * - Prepares response message, encodes and sends to SCTP
12008 * @return ROK - success
12009 * RFAILED - failure
12011 * ****************************************************************/
12012 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12018 F1AP_PDU_t *f1apMsg = NULLP;
12019 asn_dec_rval_t rval; /* Decoder return value */
12020 F1AP_PDU_t f1apasnmsg ;
12022 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12023 ODU_PRINT_MSG(mBuf, 0,0);
12025 /* Copy mBuf into char array to decode it */
12026 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12027 CU_ALLOC(recvBuf, (Size)recvBufLen);
12029 if(recvBuf == NULLP)
12031 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12034 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12036 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12040 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12041 for(i=0; i< recvBufLen; i++)
12043 DU_LOG("%x",recvBuf[i]);
12046 /* Decoding flat buffer into F1AP messsage */
12047 f1apMsg = &f1apasnmsg;
12048 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12050 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12051 CU_FREE(recvBuf, (Size)recvBufLen);
12053 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12055 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12059 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12061 switch(f1apMsg->present)
12063 case F1AP_PDU_PR_initiatingMessage:
12065 switch(f1apMsg->choice.initiatingMessage->value.present)
12067 case InitiatingMessage__value_PR_Reset:
12069 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12070 BuildAndSendF1ResetAck();
12074 case InitiatingMessage__value_PR_F1SetupRequest:
12076 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12077 procF1SetupReq(duId, f1apMsg);
12081 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12083 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12084 procGnbDuUpdate(*duId, f1apMsg);
12087 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12089 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12090 procInitULRRCMsg(*duId, f1apMsg);
12093 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12095 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12096 procUlRrcMsg(*duId, f1apMsg);
12100 case InitiatingMessage__value_PR_RRCDeliveryReport:
12102 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12105 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12107 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12108 procUeContextReleaseReq(*duId, f1apMsg);
12113 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12114 f1apMsg->choice.initiatingMessage->value.present);
12117 }/* End of switch(initiatingMessage) */
12121 case F1AP_PDU_PR_successfulOutcome:
12123 switch(f1apMsg->choice.successfulOutcome->value.present)
12125 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12127 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12130 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12132 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12133 procUeContextSetupResponse(*duId, f1apMsg);
12136 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12138 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12139 procUeContextModificationResponse(*duId, f1apMsg);
12142 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12144 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12145 procUeContextReleaseComplete(*duId, f1apMsg);
12150 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12151 f1apMsg->choice.successfulOutcome->value.present);
12154 }/* End of switch(successfulOutcome) */
12159 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12162 }/* End of switch(f1apMsg->present) */
12164 } /* End of F1APMsgHdlr */
12166 /**********************************************************************
12168 **********************************************************************/