1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ProtocolIE-Field.h"
25 #include "ProtocolExtensionField.h"
26 #include "ProtocolIE-SingleContainer.h"
28 #include "ModulationOrder.h"
30 #include "UE-CapabilityRAT-Container.h"
31 #include "UE-CapabilityRAT-ContainerList.h"
32 #include "UE-CapabilityRAT-ContainerListRRC.h"
33 #include "HandoverPreparationInformationRrc-IEs.h"
34 #include "HandoverPreparationInformationRrc.h"
35 #include "SupportedBandwidth.h"
36 #include "FeatureSetUplinkPerCC.h"
37 #include "FeatureSetDownlinkPerCC.h"
38 #include "FeatureSets.h"
39 #include "RF-Parameters.h"
40 #include "UE-NR-Capability.h"
41 #include "ProtocolExtensionContainer.h"
42 #include "CellGroupConfigRrc.h"
43 #include "MAC-CellGroupConfig.h"
44 #include "SchedulingRequestConfig.h"
45 #include "SchedulingRequestToAddMod.h"
46 #include "BSR-Config.h"
47 #include "TAG-Config.h"
49 #include "PHR-Config.h"
50 #include "RLC-Config.h"
51 #include "UL-AM-RLC.h"
52 #include "DL-AM-RLC.h"
53 #include "LogicalChannelConfig.h"
54 #include "RLC-BearerConfig.h"
55 #include "PhysicalCellGroupConfig.h"
56 #include "SpCellConfig.h"
57 #include "ServingCellConfig.h"
58 #include "ControlResourceSet.h"
59 #include "SearchSpace.h"
60 #include "PDCCH-Config.h"
61 #include "PDSCH-TimeDomainResourceAllocation.h"
62 #include "PDSCH-TimeDomainResourceAllocationList.h"
63 #include "DMRS-DownlinkConfig.h"
64 #include "PDSCH-Config.h"
65 #include "BWP-DownlinkDedicated.h"
66 #include "PUSCH-TimeDomainResourceAllocation.h"
67 #include "PUSCH-TimeDomainResourceAllocationList.h"
68 #include "DMRS-UplinkConfig.h"
69 #include "PUSCH-Config.h"
70 #include "SRS-ResourceId.h"
71 #include "SRS-Resource.h"
72 #include "SRS-ResourceSet.h"
73 #include "SRS-Config.h"
74 #include "PUCCH-Config.h"
75 #include "PUCCH-ResourceSet.h"
76 #include "PUCCH-Resource.h"
77 #include "PUCCH-format1.h"
78 #include "PUCCH-FormatConfig.h"
79 #include "BWP-UplinkDedicated.h"
80 #include "PUSCH-ServingCellConfig.h"
81 #include "UplinkConfig.h"
82 #include "PDSCH-ServingCellConfig.h"
83 #include "EUTRANQoS.h"
84 #include "GBR-QosInformation.h"
85 #include "DRBs-ToBeSetupMod-List.h"
86 #include "DRBs-ToBeSetupMod-Item.h"
87 #include "DRBs-Setup-Item.h"
88 #include "DLUPTNLInformation-ToBeSetup-List.h"
89 #include "DLUPTNLInformation-ToBeSetup-Item.h"
90 #include "UPTransportLayerInformation.h"
91 #include "GTPTunnel.h"
92 #include "QoSInformation.h"
93 #include "Cells-to-be-Activated-List.h"
94 #include "DL-CCCH-Message.h"
95 #include "SRB-ToAddModList.h"
96 #include "SRB-ToAddMod.h"
97 #include "RRCSetup-IEs.h"
99 #include "DL-DCCH-Message.h"
100 #include "RRCReconfiguration-IEs.h"
101 #include "RRCReconfiguration.h"
102 #include "DRB-ToAddModList.h"
103 #include "DRB-ToAddMod.h"
104 #include "SDAP-Config.h"
106 #include "MeasTiming.h"
107 #include "MeasTimingList.h"
108 #include "MeasurementTimingConfigurationRrc-IEs.h"
109 #include "MeasurementTimingConfigurationRrc.h"
110 #include "PDCP-Config.h"
111 #include "RSRP-Range.h"
112 #include "RSRQ-Range.h"
113 #include "SINR-Range.h"
114 #include "ThresholdNR.h"
115 #include "MeasObjectToAddMod.h"
116 #include "MeasObjectNR.h"
117 #include "MeasObjectToAddModList.h"
118 #include "EventTriggerConfig.h"
119 #include "ReportConfigNR.h"
120 #include "ReportConfigToAddMod.h"
121 #include "ReportConfigToAddModList.h"
122 #include "MeasIdToAddMod.h"
123 #include "MeasIdToAddModList.h"
124 #include "FilterCoefficient.h"
125 #include "QuantityConfigNR.h"
126 #include "QuantityConfig.h"
127 #include "MeasConfigRrc.h"
128 #include "AS-Config.h"
129 #include "RRCReconfiguration-v1530-IEs.h"
130 #include "CNUEPagingIdentity.h"
131 #include "PagingCell-Item.h"
132 #include "UL-DCCH-Message.h"
134 #include "cu_stub_sctp.h"
135 #include "cu_stub_egtp.h"
136 #include "cu_f1ap_msg_hdl.h"
139 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg);
140 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg);
142 /*******************************************************************
144 * @brief Sends F1 msg over SCTP
148 * Function : SendF1APMsg
150 * Functionality: Sends F1 msg over SCTP
152 * @params[in] Region region
154 * @return ROK - success
157 * ****************************************************************/
158 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
160 Buffer *mBuf = NULLP;
162 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
164 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
166 ODU_PRINT_MSG(mBuf, 0,0);
168 if(sctpSend(duId, mBuf) != ROK)
170 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
171 ODU_PUT_MSG_BUF(mBuf);
177 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
178 ODU_PUT_MSG_BUF(mBuf);
181 ODU_PUT_MSG_BUF(mBuf);
185 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
192 /********************************************************************
194 * @brief Builds and sends the F1SetupResponse
198 * Function : BuildAndSendF1SetupRsp
200 * Functionality: Constructs the F1SetupResponse message and sends
201 * it back to the DU through SCTP.
203 * @params[in] void **buf,Buffer to which encoded pattern is written into
204 * @params[in] int *size,size of buffer
206 * @return ROK - success
209 * ****************************************************************/
210 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
213 uint8_t elementCnt,cellCnt;
214 F1AP_PDU_t *f1apMsg = NULL;
215 F1SetupResponse_t *f1SetupRsp;
216 GNB_CU_Name_t *cuName;
217 Cells_to_be_Activated_List_t *cellToActivate;
218 RRC_Version_t *rrcVer;
219 asn_enc_rval_t encRetVal;
220 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
222 /* Allocate the memory for F1SetupRequest_t */
223 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
226 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
229 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
231 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
232 if(f1apMsg->choice.successfulOutcome == NULLP)
234 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
235 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
239 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
240 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
241 f1apMsg->choice.successfulOutcome->value.present = \
242 SuccessfulOutcome__value_PR_F1SetupResponse;
243 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
246 f1SetupRsp->protocolIEs.list.count = elementCnt;
247 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
249 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
250 elementCnt * sizeof(F1SetupResponseIEs_t *));
251 if(f1SetupRsp->protocolIEs.list.array == NULLP)
253 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
254 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
255 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
259 for(idx=0; idx<elementCnt; idx++)
261 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
262 sizeof(F1SetupResponseIEs_t));
263 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
265 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
266 elementCnt * sizeof(F1SetupResponseIEs_t *));
267 CU_FREE(f1apMsg->choice.successfulOutcome, \
268 sizeof(SuccessfulOutcome_t));
269 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
276 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
277 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
278 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
279 F1SetupResponseIEs__value_PR_TransactionID;
280 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
285 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
286 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
287 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
288 F1SetupResponseIEs__value_PR_GNB_CU_Name;
289 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
290 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
292 CU_ALLOC(cuName->buf, sizeof(cuName->size));
293 if(cuName->buf == NULLP)
295 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
297 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
298 sizeof(F1SetupResponseIEs_t));
300 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
301 elementCnt * sizeof(F1SetupResponseIEs_t *));
302 CU_FREE(f1apMsg->choice.successfulOutcome,\
303 sizeof(SuccessfulOutcome_t));
304 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
307 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
309 /*Cells to be activated list*/
311 f1SetupRsp->protocolIEs.list.array[idx]->id = \
312 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
313 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
314 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
315 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
316 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
317 Cells_to_be_Activated_List;
319 cellToActivate->list.count = cellCnt;
320 cellToActivate->list.size = \
321 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
322 CU_ALLOC(cellToActivate->list.array,\
323 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
324 if(cellToActivate->list.array == NULLP)
326 CU_FREE(cuName->buf, sizeof(cuName->size));
327 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
329 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
330 sizeof(F1SetupResponseIEs_t));
332 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
333 elementCnt * sizeof(F1SetupResponseIEs_t *));
334 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
335 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
338 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
340 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
341 if(cellToActivate->list.array[ieIdx] == NULLP)
343 CU_FREE(cellToActivate->list.array,\
344 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
345 CU_FREE(cuName->buf, sizeof(cuName->size));
346 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
348 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
349 sizeof(F1SetupResponseIEs_t));
351 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
352 elementCnt * sizeof(F1SetupResponseIEs_t *));
353 CU_FREE(f1apMsg->choice.successfulOutcome, \
354 sizeof(SuccessfulOutcome_t));
355 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
359 cellToActivate->list.array[0]->id = \
360 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
361 cellToActivate->list.array[0]->criticality = Criticality_ignore;
362 cellToActivate->list.array[0]->value.present = \
363 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
364 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
365 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
366 CU_ALLOC(cellToActivate->list.array[0]->\
367 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
369 if(cellToActivate->list.array[0]->value.choice.\
370 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
373 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
375 CU_FREE(cellToActivate->list.array[ieIdx],\
376 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
379 CU_FREE(cellToActivate->list.array,\
380 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
381 CU_FREE(cuName->buf, sizeof(cuName->size));
382 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
384 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
385 sizeof(F1SetupResponseIEs_t));
387 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
388 elementCnt * sizeof(F1SetupResponseIEs_t *));
389 CU_FREE(f1apMsg->choice.successfulOutcome, \
390 sizeof(SuccessfulOutcome_t));
391 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
394 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
395 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
396 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
397 nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
398 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
399 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
400 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
401 nRCGI.nRCellIdentity.size);
402 if(cellToActivate->list.array[0]->value.choice.\
403 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
405 CU_FREE(cellToActivate->list.array[0]->\
406 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
408 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
410 CU_FREE(cellToActivate->list.array[ieIdx],\
411 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
414 CU_FREE(cellToActivate->list.array,\
415 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
416 CU_FREE(cuName->buf, sizeof(cuName->size));
417 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
419 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
420 sizeof(F1SetupResponseIEs_t));
422 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
423 elementCnt * sizeof(F1SetupResponseIEs_t *));
424 CU_FREE(f1apMsg->choice.successfulOutcome, \
425 sizeof(SuccessfulOutcome_t));
426 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
429 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
432 f1SetupRsp->protocolIEs.list.array[idx]->id = \
433 ProtocolIE_ID_id_GNB_CU_RRC_Version;
434 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
435 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
436 F1SetupResponseIEs__value_PR_RRC_Version;
437 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
438 rrcVer->latest_RRC_Version.size = RRC_SIZE;
440 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
441 if(rrcVer->latest_RRC_Version.buf == NULLP)
443 CU_FREE(cuName->buf, sizeof(cuName->size));
444 for(ieIdx=0; ieIdx<elementCnt; idx++)
446 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
447 sizeof(F1SetupResponseIEs_t));
449 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
450 elementCnt * sizeof(F1SetupResponseIEs_t *));
451 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
452 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
456 /* Need to check RRC Version */
457 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
458 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
459 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
460 if(rrcVer->iE_Extensions == NULLP)
462 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
463 CU_FREE(cuName->buf, sizeof(cuName->size));
464 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
466 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
467 sizeof(F1SetupResponseIEs_t));
469 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
470 elementCnt * sizeof(F1SetupResponseIEs_t *));
471 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
472 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
475 rrcVer->iE_Extensions->list.count = 1;
476 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
477 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
478 sizeof(struct RRC_Version_ExtIEs *));
479 if(rrcVer->iE_Extensions->list.array == NULLP)
481 CU_FREE(rrcVer->iE_Extensions,\
482 sizeof(ProtocolExtensionContainer_4624P81_t));
483 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
484 CU_FREE(cuName->buf, sizeof(cuName->size));
485 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
487 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
488 sizeof(F1SetupResponseIEs_t));
490 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
491 elementCnt * sizeof(F1SetupResponseIEs_t *));
492 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
493 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
496 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
497 sizeof(struct RRC_Version_ExtIEs));
498 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
500 CU_FREE(rrcVer->iE_Extensions->list.array,\
501 sizeof(struct RRC_Version_ExtIEs *));
502 CU_FREE(rrcVer->iE_Extensions,\
503 sizeof(ProtocolExtensionContainer_4624P81_t));
504 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
505 CU_FREE(cuName->buf, sizeof(cuName->size));
506 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
508 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
509 sizeof(F1SetupResponseIEs_t));
511 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
512 elementCnt * sizeof(F1SetupResponseIEs_t *));
513 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
514 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
517 rrcVer->iE_Extensions->list.array[0]->id = \
518 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
519 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
520 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
521 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
522 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
523 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
524 CU_ALLOC(rrcVer->iE_Extensions->list.\
525 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
527 if(rrcVer->iE_Extensions->list.\
528 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
530 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
531 sizeof(struct RRC_Version_ExtIEs));
532 CU_FREE(rrcVer->iE_Extensions->list.array,\
533 sizeof(struct RRC_Version_ExtIEs *));
534 CU_FREE(rrcVer->iE_Extensions,\
535 sizeof(ProtocolExtensionContainer_4624P81_t));
536 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
537 CU_FREE(cuName->buf, sizeof(cuName->size));
538 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
540 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
541 sizeof(F1SetupResponseIEs_t));
543 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
544 elementCnt * sizeof(F1SetupResponseIEs_t *));
545 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
546 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
549 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
550 Latest_RRC_Version_Enhanced.buf[0] = 0;
551 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
552 Latest_RRC_Version_Enhanced.buf[1] = 5;
553 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
554 Latest_RRC_Version_Enhanced.buf[2] = 15;
556 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
558 /* Encode the F1SetupRequest type as UPER */
559 memset(encBuf, 0, ENC_BUF_MAX_LEN);
561 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
564 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
565 CU_FREE(cuName->buf, sizeof(cuName->size));
566 for(idx=0; idx<elementCnt; idx++)
568 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
570 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
571 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
572 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
574 /* Check encode results */
575 if(encRetVal.encoded == ENCODE_FAIL)
577 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
578 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
583 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
584 for(int i=0; i< encBufSize; i++)
586 DU_LOG("%x",encBuf[i]);
591 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
593 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
598 }/* End of BuildAndSendF1SetupRsp */
600 /*******************************************************************
602 * @brief Builds and sends the DUUpdateAcknowledge
606 * Function : BuildAndSendDUUpdateAck
608 * Functionality: Constructs the DU Update Acknowledge message and sends
609 * it to the DU through SCTP.
613 * @return ROK - success
616 * ****************************************************************/
618 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
622 F1AP_PDU_t *f1apMsg = NULL;
623 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
624 asn_enc_rval_t enRetVal; /* Encoder return value */
626 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
628 /* Allocate the memory for F1SetupRequest_t */
629 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
632 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
636 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
638 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
639 if(f1apMsg->choice.successfulOutcome == NULLP)
641 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
642 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
646 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
647 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
648 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
649 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
652 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
653 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
655 /* Initialize the F1Setup members */
656 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
657 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
659 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
660 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
661 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
665 for(idx=0; idx<elementCnt; idx++)
667 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
668 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
670 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
671 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
672 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
679 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
680 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
681 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
682 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
683 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
685 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
687 /* Encode the F1SetupRequest type as UPER */
688 memset(encBuf, 0, ENC_BUF_MAX_LEN);
690 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
693 for(idx=0; idx<elementCnt; idx++)
695 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
697 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
698 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
699 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
701 /* Checking encode results */
702 if(enRetVal.encoded == ENCODE_FAIL)
704 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
705 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
710 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
711 for(int i=0; i< encBufSize; i++)
713 DU_LOG("%x",encBuf[i]);
718 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
719 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
721 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
727 }/* End of BuildAndSendDUUpdateAck*/
729 /*******************************************************************
731 * @brief deallocating the memory of F1reset msg
735 * Function : FreeF1ResetReq
738 * - freeing memory of F1reset request msg
744 * ****************************************************************/
745 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
748 Reset_t *f1ResetMsg = NULLP;
752 if(f1apMsg->choice.initiatingMessage)
754 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
755 if(f1ResetMsg->protocolIEs.list.array)
757 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
759 if(f1ResetMsg->protocolIEs.list.array[idx])
761 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
764 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
766 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
768 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
771 /*******************************************************************
773 * @brief build ansld ans send f1reset msg
777 * Function : BuildAndSendF1ResetReq
779 * Functionality: build and send f1reset msg
781 * @return ROK - success
784 * ****************************************************************/
785 uint8_t BuildAndSendF1ResetReq()
787 uint8_t elementCnt=0;
789 uint8_t ret= RFAILED;
790 Reset_t *f1ResetMsg = NULLP;
791 F1AP_PDU_t *f1apMsg = NULLP;
792 asn_enc_rval_t encRetVal;
793 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
796 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
799 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
802 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
803 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
804 if(f1apMsg->choice.initiatingMessage == NULLP)
806 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
809 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
810 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
811 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
813 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
816 f1ResetMsg->protocolIEs.list.count = elementCnt;
817 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
819 /* Initialize the F1Reset members */
820 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
821 if(f1ResetMsg->protocolIEs.list.array == NULLP)
823 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
826 for(idx=0; idx<elementCnt; idx++)
828 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
829 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
831 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
838 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
839 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
840 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
841 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
845 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
846 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
847 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
848 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
849 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
853 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
854 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
855 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
856 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
857 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
859 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
861 /* Encode the F1SetupRequest type as APER */
862 memset(encBuf, 0, ENC_BUF_MAX_LEN);
864 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
868 if(encRetVal.encoded == ENCODE_FAIL)
870 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
871 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
876 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
877 for(idx=0; idx< encBufSize; idx++)
879 DU_LOG("%x",encBuf[idx]);
883 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
884 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
886 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
894 FreeF1ResetReq(f1apMsg);
898 /*******************************************************************
900 * @brief Fills Radio Bearer Config
904 * Function : fillSrbCfg
906 * Functionality: Fills Radio Bearer Config
908 * @params[in] SRB_ToAddModList *
910 * @return ROK - success
913 * ****************************************************************/
914 uint8_t fillSrbCfg(CuUeCb *ueCb, SRB_ToAddModList_t *bearerCfg)
916 uint8_t elementCnt = 0;
917 uint8_t idx, ieId, srbIdx = 0;
919 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
921 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
925 if(bearerCfg != NULLP)
927 bearerCfg->list.count = elementCnt;
928 bearerCfg->list.size = elementCnt * sizeof(SRB_ToAddMod_t *);
929 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
930 if(bearerCfg->list.array != NULLP)
932 for(idx = 0; idx < elementCnt; idx++)
934 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
935 if(bearerCfg->list.array[idx] == NULLP)
937 for(ieId = 0; ieId < idx; ieId++)
939 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
941 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
948 DU_LOG("\nERROR --> F1AP : Memory allocation failed for bearer list arry in fillSrbCfg");
953 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
955 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
956 bearerCfg->list.array[idx++]->srb_Identity = ueCb->srbList[srbIdx].srbId;
962 /*******************************************************************
964 * @brief Fills Master CellGroup Info
968 * Function : fillMasterCellGroup
970 * Functionality: Fills Master Cell Group IE
972 * @params[in] RRCSetup_IEs_t *
974 * @return ROK - success
977 * ****************************************************************/
979 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
982 masterCellGroup->buf = NULLP;
983 if(ueCb->f1apMsgDb.duToCuContainer.buf)
985 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
986 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
987 if(masterCellGroup->buf != NULLP)
989 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
993 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1004 /*******************************************************************
1006 * @brief Fills RRC setup IE
1010 * Function : fillRRCSetupIE
1012 * Functionality: Fills RRC Setup IE
1014 * @params[in] RRCSetup_IEs_t *
1016 * @return ROK - success
1019 * ****************************************************************/
1021 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1023 uint8_t ret = ROK, srbIdx = 0;
1026 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1027 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1029 ret = fillSrbCfg(ueCb, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1033 ret = fillCellGrpCfg(ueCb, &rrcSetupIE->masterCellGroup, false);
1037 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1041 /* If SRB configuration are filled successfully in RRC Setup, mark these
1042 * configurartion as sent to UE */
1043 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1045 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1046 ueCb->srbList[srbIdx].cfgSentToUe = true;
1051 /*******************************************************************
1053 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1057 * Function : fillDlCcchRrcMsg
1059 * Functionality: Fills DL DCCCH Message required for
1060 * DLRRCMessageTransfer
1062 * @params[in] RRCContainer_t *rrcContainer
1064 * @return ROK - success
1067 * ****************************************************************/
1069 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1073 DL_CCCH_Message_t dl_CCCH_Msg;
1074 asn_enc_rval_t encRetVal;
1076 if(rrcContainer != NULLP)
1078 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1080 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1081 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1083 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1084 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1085 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1087 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1088 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1089 RRCSetup__criticalExtensions_PR_rrcSetup;
1091 /* Fill RRC Setup IE */
1092 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1093 sizeof(RRCSetup_IEs_t));
1094 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1096 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1100 /* encode DL-CCCH message into RRC Container */
1101 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1102 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1104 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1105 /* Encode results */
1106 if(encRetVal.encoded == ENCODE_FAIL)
1108 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1109 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1114 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1115 for(int i = 0; i< encBufSize; i++)
1117 DU_LOG("%x",encBuf[i]);
1119 rrcContainer->size = encBufSize;
1120 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1121 if(rrcContainer->buf != NULLP)
1123 memset(rrcContainer->buf, 0, encBufSize);
1124 for(idx2 = 0; idx2 < encBufSize; idx2++)
1126 rrcContainer->buf[idx2] = encBuf[idx2];
1138 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1144 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1150 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1156 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1161 /*******************************************************************
1163 * @brief Fills QOS flow configuration
1167 * Function : fillQosFlowsToAdd
1169 * Functionality: Fills QOS flow configuration
1171 * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
1173 * @return ROK - success
1176 * ****************************************************************/
1177 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1179 uint8_t idx, ied, elementCnt;
1182 qosFlow->list.count = elementCnt;
1183 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1184 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1185 if(qosFlow->list.array != NULLP)
1187 for(idx = 0; idx < elementCnt; idx++)
1189 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1190 if(qosFlow->list.array[idx] == NULLP)
1192 for(ied = 0; ied < idx; ied++)
1194 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1196 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1202 *qosFlow->list.array[idx] = 9;
1206 /*******************************************************************
1208 * @brief Fills CN Assoc for Drb to Add/Mod List
1212 * Function : fillCnAssoc
1214 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1216 * @params[in] struct DRB_ToAddMod__cnAssociation *
1218 * @return ROK - success
1221 * ****************************************************************/
1223 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1227 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1228 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1230 cnAssoc->choice.eps_BearerIdentity = 5;
1232 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1234 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1235 if(cnAssoc->choice.sdap_Config)
1237 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1238 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1239 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1240 cnAssoc->choice.sdap_Config->defaultDRB = true;
1241 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1242 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1243 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1244 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1245 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1247 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1251 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1252 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1258 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1265 /*******************************************************************
1267 * @brief Fills Radio Bearer Config for Drb
1271 * Function : fillDrbCfg
1273 * Functionality: Fills Radio Bearer Config for Drb
1275 * @params[in] drbId, DRB_ToAddModList *
1277 * @return ROK - success
1280 * ****************************************************************/
1281 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1283 uint8_t idx, ied, ret, elementCnt;
1289 drbCfg->list.count = elementCnt;
1290 drbCfg->list.size =\
1291 elementCnt * sizeof(DRB_ToAddMod_t *);
1292 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1293 if(drbCfg->list.array != NULLP)
1295 for(idx = 0; idx < elementCnt; idx++)
1297 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1298 if(drbCfg->list.array[idx] == NULLP)
1300 for(ied = 0; ied < idx; ied++)
1302 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1304 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1314 /* CN ASSOCIATION */
1315 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1316 if(drbCfg->list.array[idx]->cnAssociation)
1318 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1321 drbCfg->list.array[idx]->drb_Identity = drbId;
1326 /*******************************************************************
1328 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1332 * Function : fillRrcReconfigIE
1334 * Functionality: Fills RRC Reconfig Message required for
1335 * DLRRCMessageTransfer
1337 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1339 * @return ROK - success
1342 * ****************************************************************/
1344 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1347 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1348 if(rrcReconfigMsg->radioBearerConfig)
1350 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1351 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1353 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1358 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1359 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1361 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1364 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1365 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1366 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1372 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1373 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1379 /*******************************************************************
1381 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1385 * Function : fillDlDcchRrcMsg
1387 * Functionality: Fills DL DCCH Message required for
1388 * DLRRCMessageTransfer
1390 * @params[in] RRCContainer_t *rrcContainer
1392 * @return ROK - success
1395 * ****************************************************************/
1397 uint8_t fillDlDcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1400 uint16_t idx2 = 0, drbIdx = 0, srbIdx = 0;
1401 DL_DCCH_Message_t dl_DCCH_Msg;
1402 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1403 asn_enc_rval_t encRetVal;
1405 if(rrcContainer != NULLP)
1407 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1409 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1410 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1412 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1413 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1414 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1416 DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Reconfiguration Message ");
1417 fillRrcReconfig(ueCb, dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, false);
1420 /* If RB configuration are filled successfully in RRC Reconfiguration, mark these
1421 * configurartion as sent to UE */
1422 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
1424 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
1425 ueCb->srbList[srbIdx].cfgSentToUe = true;
1427 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
1429 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
1430 ueCb->drbList[drbIdx].cfgSentToUe = true;
1433 /* encode DL-DCCH message into RRC Container */
1434 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1435 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1437 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1438 /* Encode results */
1439 if(encRetVal.encoded == ENCODE_FAIL)
1441 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1442 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1447 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1448 for(int i = 0; i< encBufSize; i++)
1450 DU_LOG("%x",encBuf[i]);
1452 rrcContainer->size = encBufSize;
1453 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1454 if(rrcContainer->buf != NULLP)
1456 memset(rrcContainer->buf, 0, encBufSize);
1457 for(idx2 = 0; idx2 < encBufSize; idx2++)
1459 rrcContainer->buf[idx2] = encBuf[idx2];
1467 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1473 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1479 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1485 /*******************************************************************
1487 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1491 * Function : BuildDLRRCContainer
1493 * Functionality: Builds RRC Container IE required for
1494 * DLRRCMessageTransfer
1498 * @return ROK - success
1501 * ****************************************************************/
1503 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1505 uint8_t ret, bufLen;
1508 if(rrcMsgType == RRC_SETUP)
1510 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1512 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1514 else if(rrcMsgType == RRC_SETUP_COMPLETE)
1516 DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
1517 char secModeBuf[30]={0x00, 0x02, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0,
1518 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00};
1520 rrcContainer->size = bufLen;
1521 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1522 if(rrcContainer->buf != NULLP)
1524 memset(rrcContainer->buf, 0, bufLen);
1525 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1529 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1533 else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
1535 DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command");
1536 char secModeBuf[9]={0x00, 0x03, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
1538 rrcContainer->size = bufLen;
1539 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1540 if(rrcContainer->buf != NULLP)
1542 memset(rrcContainer->buf, 0, bufLen);
1543 memcpy(rrcContainer->buf, secModeBuf, bufLen);
1547 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1551 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
1553 /*Hardcoded RRC Container from reference logs*/
1554 DU_LOG("\nINFO --> F1AP : Sending Registration accept");
1555 char buf[14] ={0x00, 0x04, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1557 rrcContainer->size = bufLen;
1558 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1559 if(rrcContainer->buf != NULLP)
1561 memset(rrcContainer->buf, 0, bufLen);
1562 memcpy(rrcContainer->buf, buf, bufLen);
1566 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1570 else if(rrcMsgType == UE_CONTEXT_SETUP_RSP)
1572 DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration ");
1573 ret = fillDlDcchRrcMsg(ueCb, rrcContainer);
1575 DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration");
1581 /*******************************************************************
1583 * @brief Frees the DLRRCMessageTransfer
1587 * Function : freeDlRrcMessageTransfer
1589 * Functionality: Frees the DLRRCMessageTransfer
1593 * @return ROK - success
1596 * ****************************************************************/
1597 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1600 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1604 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1605 if(dlRRCMsg->protocolIEs.list.array)
1608 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1609 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1610 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1612 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1614 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1616 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1620 /*******************************************************************
1622 * @brief Builds and sends the DLRRCMessageTransfer
1626 * Function : BuildAndSendDLRRCMessageTransfer
1628 * Functionality: Constructs the DL RRC Message Transfer and sends
1629 * it to the CU through SCTP.
1633 * @return ROK - success
1636 * ****************************************************************/
1637 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1639 uint8_t elementCnt = 0;
1642 F1AP_PDU_t *f1apMsg = NULLP;
1643 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1644 asn_enc_rval_t encRetVal; /* Encoder return value */
1646 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1648 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1649 if(f1apMsg == NULLP)
1651 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1655 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1656 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1657 if(f1apMsg->choice.initiatingMessage == NULLP)
1659 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1660 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1664 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1665 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1666 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1667 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1670 dlRRCMsg->protocolIEs.list.count = elementCnt;
1671 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1673 /* Initialize the F1Setup members */
1674 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1675 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1677 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1678 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1679 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1683 for(idx=0; idx<elementCnt; idx++)
1685 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1686 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1688 for(ieId=0; ieId<idx; ieId++)
1690 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1692 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1693 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1694 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1699 /* GNB CU UE F1AP ID */
1701 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1702 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1703 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1704 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1706 /* GNB DU UE F1AP ID */
1708 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1709 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1710 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1711 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1715 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1716 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1717 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1718 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1722 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1723 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1724 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1725 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1727 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1729 /* Encode the F1SetupRequest type as APER */
1730 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1732 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1734 /* Encode results */
1735 if(encRetVal.encoded == ENCODE_FAIL)
1737 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1738 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1743 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1744 for(int i=0; i< encBufSize; i++)
1746 DU_LOG("%x",encBuf[i]);
1751 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1753 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1756 freeDlRrcMessageTransfer(f1apMsg);
1758 }/* End of BuildAndSendDLRRCMessageTransfer */
1760 /*******************************************************************
1762 * @brief Function to set the Dl RRC Msg Type
1766 * Function : setDlRRCMsgType
1768 * Functionality: Constructs the UE Setup Response and sends
1769 * it to the DU through SCTP.
1773 * @return ROK - success
1776 * ****************************************************************/
1778 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1780 uint8_t rrcMsgType = 0;
1781 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1784 rrcMsgType = RRC_SETUP;
1786 case RRC_SETUP_COMPLETE:
1787 rrcMsgType = RRC_SETUP_COMPLETE;
1789 case NAS_SECURITY_MODE_COMPLETE:
1790 rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
1792 case RRC_SECURITY_MODE_COMPLETE:
1793 rrcMsgType = RRC_SECURITY_MODE_COMPLETE;
1795 case REGISTRATION_COMPLETE:
1796 rrcMsgType = REGISTRATION_COMPLETE;
1798 case UE_CONTEXT_SETUP_RSP:
1799 rrcMsgType = UE_CONTEXT_SETUP_RSP;
1801 case RRC_RECONFIG_COMPLETE:
1802 rrcMsgType = RRC_RECONFIG_COMPLETE;
1810 /*******************************************************************
1812 * @brief Extract configuration from CellGroupConfig
1816 * Function : extractCellGroupConfig
1818 * Functionality: Extract configuration from CellGroupConfig
1819 * and store in local database
1821 * @params[in] UE control block
1824 * @return ROK - success
1827 * ****************************************************************/
1828 uint8_t extractCellGroupConfig(CuUeCb *ueCb, CellGroupConfigRrc_t *cellGrpCfg)
1830 uint8_t rbIdx, srbIdx, drbIdx;
1831 bool srbFound, drbFound;
1832 SrbInfo *srbCfgDb = NULLP;
1833 DrbInfo *drbCfgDb = NULLP;
1834 RlcLcCfg *rlcLcCfgDb = NULLP;
1835 MacLcCfg *macLcCfgDb = NULLP;
1836 RLC_BearerConfig_t *rlcCfg = NULLP;
1837 RLC_Config_t *rlcLcCfg = NULLP;
1838 LogicalChannelConfig_t *macLcCfg = NULLP;
1842 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): UE Cb is NULL");
1846 if(cellGrpCfg == NULLP)
1848 DU_LOG("\nERROR --> F1AP: extractCellGroupConfig(): cellGrpCfg is NULL");
1852 for(rbIdx = 0; rbIdx < cellGrpCfg->rlc_BearerToAddModList->list.count; rbIdx++)
1857 rlcCfg = cellGrpCfg->rlc_BearerToAddModList->list.array[rbIdx];
1859 /* Update SRB configuration in local DB */
1860 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
1862 /* Search if SRB entry is already present in DB */
1863 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
1865 if(ueCb->srbList[srbIdx].srbId == rlcCfg->servedRadioBearer->choice.srb_Identity)
1867 srbCfgDb = &ueCb->srbList[srbIdx];
1873 /* If not, add SRB to UE CB's SRB list */
1876 ueCb->srbList[ueCb->numSrb].srbId = rlcCfg->servedRadioBearer->choice.srb_Identity;
1877 srbCfgDb = &ueCb->srbList[ueCb->numSrb];
1881 srbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1882 srbCfgDb->cfgSentToUe = false;
1883 rlcLcCfgDb = &srbCfgDb->rlcLcCfg;
1884 macLcCfgDb = &srbCfgDb->macLcCfg;
1887 /* Update DRB configuration in local DB */
1888 if(rlcCfg->servedRadioBearer->present == RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
1890 /* Search if DRB entry is already present in DB */
1891 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
1893 if(ueCb->drbList[drbIdx].drbId == rlcCfg->servedRadioBearer->choice.drb_Identity)
1895 drbCfgDb = &ueCb->drbList[drbIdx];
1901 /* If not, add DRB to UE CB's SRB list */
1904 ueCb->drbList[ueCb->numDrb].drbId = rlcCfg->servedRadioBearer->choice.drb_Identity;
1905 drbCfgDb = &ueCb->drbList[ueCb->numDrb];
1909 drbCfgDb->lcId = rlcCfg->logicalChannelIdentity;
1910 drbCfgDb->cfgSentToUe = false;
1911 rlcLcCfgDb = &drbCfgDb->rlcLcCfg;
1912 macLcCfgDb = &drbCfgDb->macLcCfg;
1916 /* Update RLC configuration for this RB */
1917 rlcLcCfg = rlcCfg->rlc_Config;
1918 rlcLcCfgDb->rlcMode = rlcLcCfg->present;
1919 switch(rlcLcCfgDb->rlcMode)
1921 case RLC_Config_PR_am:
1923 rlcLcCfgDb->u.amCfg.ulAmCfg.snLenUl = *(rlcLcCfg->choice.am->ul_AM_RLC.sn_FieldLength);
1924 rlcLcCfgDb->u.amCfg.ulAmCfg.pollRetxTmr = rlcLcCfg->choice.am->ul_AM_RLC.t_PollRetransmit ;
1925 rlcLcCfgDb->u.amCfg.ulAmCfg.pollPdu = rlcLcCfg->choice.am->ul_AM_RLC.pollPDU ;
1926 rlcLcCfgDb->u.amCfg.ulAmCfg.pollByte = rlcLcCfg->choice.am->ul_AM_RLC.pollByte ;
1927 rlcLcCfgDb->u.amCfg.ulAmCfg.maxRetxTh = rlcLcCfg->choice.am->ul_AM_RLC.maxRetxThreshold ;
1929 rlcLcCfgDb->u.amCfg.dlAmCfg.snLenDl = *(rlcLcCfg->choice.am->dl_AM_RLC.sn_FieldLength);
1930 rlcLcCfgDb->u.amCfg.dlAmCfg.reAssemTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_Reassembly;
1931 rlcLcCfgDb->u.amCfg.dlAmCfg.statProhTmr = rlcLcCfg->choice.am->dl_AM_RLC.t_StatusProhibit;
1935 case RLC_Config_PR_um_Bi_Directional:
1937 rlcLcCfgDb->u.umBiDirCfg.ulUmCfg.snLenUlUm = *(rlcLcCfg->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
1939 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.snLenDlUm = *(rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
1940 rlcLcCfgDb->u.umBiDirCfg.dlUmCfg.reAssemTmr = rlcLcCfg->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
1945 /* Update MAC configuration for this LC */
1946 macLcCfg = rlcCfg->mac_LogicalChannelConfig;
1947 macLcCfgDb->priority = macLcCfg->ul_SpecificParameters->priority ;
1948 macLcCfgDb->lcGroup = *(macLcCfg->ul_SpecificParameters->logicalChannelGroup) ;
1949 macLcCfgDb->schReqId = *(macLcCfg->ul_SpecificParameters->schedulingRequestID) ;
1950 macLcCfgDb->pbr = macLcCfg->ul_SpecificParameters->prioritisedBitRate ;
1951 macLcCfgDb->bsd = macLcCfg->ul_SpecificParameters->bucketSizeDuration ;
1956 /*******************************************************************
1958 * @brief Function to decode DU to CU RRC container
1962 * Function : extractDuToCuRrcCont
1964 * Functionality: Function to decode DU to CU RRC container
1967 * RRC conatiner octect string to be decoded
1969 * @return ROK - success
1972 * ****************************************************************/
1973 uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont)
1975 CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
1976 asn_dec_rval_t rval; /* Decoder return value */
1978 /* Copy the received container to UeCb */
1979 memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
1981 /* Decoding DU to CU RRC container octet string to cell group config */
1982 cellGrpCfgMsg = &cellGrpCfg;
1983 memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
1985 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfgMsg, rrcCont.buf, rrcCont.size, 0, 0);
1987 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1989 DU_LOG("\nERROR --> F1AP : ASN decode failed");
1993 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfgMsg);
1995 if((extractCellGroupConfig(ueCb, cellGrpCfgMsg)) != ROK)
1997 DU_LOG("\nERROR --> F1AP : Failed to extract cell group config");
2004 /*******************************************************************
2006 * @brief Function to build Initial UL RRC Message
2010 * Function : procInitULRRCMsg
2012 * Functionality: Function to build Initial UL RRC Message
2016 * @return ROK - success
2019 * ****************************************************************/
2021 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
2023 uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0;
2025 uint16_t cellIdx=0, nrCellId = 0;
2030 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
2032 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
2034 SEARCH_DU_DB(duIdx, duId, duDb);
2035 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2037 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
2039 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
2041 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2042 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2045 case ProtocolIE_ID_id_NRCGI:
2046 bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
2047 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
2052 case ProtocolIE_ID_id_C_RNTI:
2053 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
2054 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
2056 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
2057 memset(ueCb, 0, sizeof(CuUeCb));
2058 ueCb->cellCb = cellCb;
2059 ueCb->crnti = crnti;
2060 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
2061 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
2062 ueCb->state = UE_ATTACH_IN_PROGRESS;
2065 cellCb->ueCb[cellCb->numUe] = ueCb;
2070 case ProtocolIE_ID_id_RRCContainer:
2073 case ProtocolIE_ID_id_DUtoCURRCContainer:
2075 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
2076 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
2078 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
2079 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
2080 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
2081 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
2083 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
2084 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
2085 ueCb->f1apMsgDb.duToCuContainer.size);
2087 if((extractDuToCuRrcCont(ueCb, initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer)) != ROK)
2089 DU_LOG("\nERROR --> F1AP : Failed to extract DU to CU RRC Container ");
2095 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
2102 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
2111 ueCb->f1apMsgDb.dlRrcMsgCount++;
2112 rrcMsgType = setDlRRCMsgType(ueCb);
2113 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
2118 /*******************************************************************
2120 * @brief Builds Nrcgi
2124 * Function : BuildNrcgi
2126 * Functionality: Building the PLMN ID and NR Cell id
2128 * @params[in] NRCGI_t *nrcgi
2129 * @return ROK - success
2132 * ****************************************************************/
2133 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
2136 uint8_t unused_bits = 4;
2137 uint8_t byteSize = 5;
2139 /* Allocate Buffer Memory */
2140 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
2141 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2142 if(nrcgi->pLMN_Identity.buf == NULLP)
2146 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
2152 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2153 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2154 if(nrcgi->nRCellIdentity.buf == NULLP)
2158 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
2162 /*******************************************************************
2164 * @brief Builds Special cell list for UE Setup Request
2168 * Function : BuildSplCellList
2170 * Functionality: Constructs the Special Cell list for UESetReq
2172 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2174 * @return ROK - success
2177 * ****************************************************************/
2178 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2184 spCellLst->list.count = cellCnt;
2185 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2186 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2187 if(spCellLst->list.array == NULLP)
2191 for(idx=0; idx<cellCnt; idx++)
2193 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2194 if(spCellLst->list.array[idx] == NULLP)
2200 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2201 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2202 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2204 /* Special Cell ID -NRCGI */
2205 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2210 /*Special Cell Index*/
2211 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2213 }/* End of BuildSplCellList*/
2215 /*******************************************************************
2217 * @brief Builds SRBS to be setup
2221 * Function : BuildSRBSetup
2223 * Functionality: Constructs the SRB's for UESetReq
2225 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2227 * @return ROK - success
2230 * ****************************************************************/
2231 uint8_t BuildSRBSetup(CuUeCb *ueCb, SRBs_ToBeSetup_List_t *srbSet)
2236 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2237 srbCnt = ueCb->numSrb;
2240 srbSet->list.count = srbCnt;
2241 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2242 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2243 if(srbSet->list.array == NULLP)
2245 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array");
2249 for(idx=0; idx<srbCnt; idx++)
2251 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2252 if(srbSet->list.array[idx] == NULLP)
2254 DU_LOG("\nERROR --> F1AP : BuildSRBSetup() : Memory allocation failed for SRB to be setup list's array element");
2259 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2262 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2263 srbSet->list.array[idx]->criticality = Criticality_ignore;
2264 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2265 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2266 ueCb->srbList[ueCb->numSrb].srbId = srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID;
2271 for(idx=0; idx<srbCnt; idx++)
2273 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2274 srbSet->list.array[idx]->criticality = Criticality_ignore;
2275 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2276 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = ueCb->srbList[idx].srbId;
2280 }/* End of BuildSRBSetup*/
2282 /*******************************************************************
2284 * @brief Builds QOS Info for DRB Setum Item
2288 * Function : BuildQOSInfo
2290 * Functionality: Constructs the QOS Info for DRB Setup Item
2292 * @params[in] QoSInformation_t *qosinfo
2293 * int16_t pduSessionID
2295 * @return ROK - success
2298 * ****************************************************************/
2299 uint8_t BuildQOSInfo(QosInfo *qosInfo, QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, int16_t pduSessionID, bool hoInProgress)
2301 uint8_t elementCnt = 0, qosCntIdx = 0;
2302 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2304 /* NonDynamic5QIDescriptor */
2305 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2306 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2307 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2313 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = qosInfo->nonDynFiveQI ;
2317 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2318 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2320 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2322 qosInfo->nonDynFiveQI = drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
2328 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow, sizeof(AveragingWindow_t));
2329 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == NULLP)
2333 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2334 qosInfo->avgWindow = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
2336 /*MaxDataBurstVolume*/
2337 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume, sizeof(MaxDataBurstVolume_t));
2338 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == NULLP)
2342 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2343 qosInfo->maxBurstDataVol = *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
2346 /*nRGRAN Allocation Retention Priority*/
2349 drbQos->nGRANallocationRetentionPriority.priorityLevel = qosInfo->priorityLevel;
2350 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = qosInfo->preemptionCapability;
2351 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = qosInfo->preemptionVulnerability;
2355 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2356 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2357 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2359 qosInfo->priorityLevel = PriorityLevel_lowest;
2360 qosInfo->preemptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2361 qosInfo->preemptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2364 /* PDU session ID */
2367 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2368 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2370 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2374 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2375 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2379 elementCnt = NUM_QOS_EXT;
2380 qosIeExt->list.count = elementCnt;
2381 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2383 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2384 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2386 if(qosIeExt->list.array == NULLP)
2388 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2392 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2394 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2395 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2397 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2400 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2401 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2402 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2403 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2404 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2405 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2406 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2407 qosInfo->pduSessionId = pduSessionID;
2412 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2417 }/*End of BuildQOSInfo*/
2419 /*******************************************************************
2421 * @brief Builds SNSSAI
2425 * Function : BuildSNSSAI
2427 * Functionality: Constructs the SNSSAI For DRB list
2429 * @params[in] SNSSAI_t *snssai
2430 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2432 * @return ROK - success
2435 * ****************************************************************/
2436 uint8_t BuildSNSSAI(DrbInfo *drbInfo, SNSSAI_t *snssai, Snssai *snssaiToCopy, bool hoInProgress)
2440 snssai->sST.size = sizeof(uint8_t);
2441 CU_ALLOC(snssai->sST.buf, snssai->sST.size);
2442 if(snssai->sST.buf == NULLP)
2447 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2449 memcpy(snssai->sST.buf, &drbInfo->snssai->sst, snssai->sST.size);
2452 CU_ALLOC(snssai->sD, sizeof(OCTET_STRING_t));
2453 if(snssai->sD == NULLP)
2457 snssai->sD->size = 3 * sizeof(uint8_t);
2458 CU_ALLOC(snssai->sD->buf, snssai->sD->size);
2459 if(snssai->sD->buf == NULLP)
2464 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2466 memcpy(snssai->sD->buf, drbInfo->snssai->sd, snssai->sD->size);
2469 drbInfo->snssai = snssaiToCopy;
2471 }/*End of BuildSNSSAI*/
2473 /*******************************************************************
2475 * @brief Builds the flow map.
2479 * Function : BuildFlowsMap
2481 * Functionality: Constructs the flowmap For DRB list
2483 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2485 * @return ROK - success
2488 * ****************************************************************/
2489 uint8_t BuildFlowsMap(DrbInfo *drbInfo, Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType, bool hoInProgress)
2491 uint8_t ret = ROK, idx = 0, flowCnt = 0, flowIdx = 0;
2492 FlowsMapped *qosFlow;
2497 flowCnt = drbInfo->numFlowMap;
2498 flowMap->list.count = flowCnt;
2499 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2500 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2501 if(flowMap->list.array == NULLP)
2503 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2506 for(idx=0; idx<flowCnt; idx++)
2508 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2509 if(flowMap->list.array[idx] == NULLP)
2511 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2517 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2518 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2520 for(flowIdx =0; flowIdx < drbInfo->numFlowMap; flowIdx++)
2522 if(drbInfo->flowMapList[flowIdx].qosFlowId == flowMap->list.array[idx]->qoSFlowIdentifier)
2524 qosFlow = &drbInfo->flowMapList[flowIdx];
2531 qosFlow = &drbInfo->flowMapList[drbInfo->numFlowMap];
2532 qosFlow->qosFlowId = flowMap->list.array[idx]->qoSFlowIdentifier;
2537 qosFlow = &drbInfo->flowMapList[idx];
2538 flowMap->list.array[idx]->qoSFlowIdentifier = qosFlow->qosFlowId;
2541 ret = BuildQOSInfo(&qosFlow->qos, &flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2542 actionType, INVALID_PDU_SESSION_ID, hoInProgress);
2545 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2549 if((!hoInProgress) && (actionType != ProtocolIE_ID_id_DRBs_ToBeModified_Item))
2550 drbInfo->numFlowMap++;
2553 }/*End of BuildFlowsMap*/
2555 /*******************************************************************
2557 * @brief Builds the Uplink Tunnel Info
2561 * Function : BuildULTnlInfo
2563 * Functionality: Constructs the UL TnlInfo For DRB list
2565 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2567 * @return ROK - success
2570 * ****************************************************************/
2571 uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
2577 ulInfo->list.count = ulCnt;
2578 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2579 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2580 if(ulInfo->list.array == NULLP)
2582 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2585 for(idx=0; idx<ulCnt; idx++)
2587 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2588 if(ulInfo->list.array[idx] == NULLP)
2590 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2595 ulInfo->list.array[idx]->uLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
2597 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
2598 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2600 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2603 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size = 4*sizeof(uint8_t);
2604 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf, \
2605 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2606 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf == NULLP)
2608 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2614 /* NOTE: Below IP address must be changed if running on different IP configuration */
2615 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = 192;
2616 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = 168;
2617 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = 130;
2618 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = 82;
2619 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2621 ulUpTnlInfo->address[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
2622 ulUpTnlInfo->address[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
2623 ulUpTnlInfo->address[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
2624 ulUpTnlInfo->address[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
2628 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0] = ulUpTnlInfo->address[0];
2629 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1] = ulUpTnlInfo->address[1];
2630 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2] = ulUpTnlInfo->address[2];
2631 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3] = ulUpTnlInfo->address[3];
2632 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
2636 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size = 4 * sizeof(uint8_t);
2637 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf, \
2638 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2639 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf == NULLP)
2641 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2647 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
2648 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
2649 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
2650 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2652 ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
2653 ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
2654 ulUpTnlInfo->teId[2] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
2655 ulUpTnlInfo->teId[3] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
2659 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = ulUpTnlInfo->teId[0];
2660 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = ulUpTnlInfo->teId[1];
2661 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = ulUpTnlInfo->teId[2];
2662 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = ulUpTnlInfo->teId[3];
2665 }/*End of BuildULTnlInfo*/
2667 /*******************************************************************
2669 * @brief Builds DRBS to be setup
2673 * Function : BuildDRBSetup
2675 * Functionality: Constructs the DRB's for UESetReq
2677 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2679 * @return ROK - success
2682 * ****************************************************************/
2683 uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
2685 uint16_t snssaiIdx=0;
2686 uint8_t idx = 0, extIeIdx = 0;
2687 uint8_t elementCnt = 0, drbCnt = 0;
2688 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0;
2689 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0;
2690 DRBs_ToBeSetup_Item_t *drbSetItem;
2691 ProtocolExtensionContainer_4624P33_t *drbToBeSetupExt;
2692 DRBs_ToBeSetup_ItemExtIEs_t *drbToBeSetupExtIe = NULLP;
2694 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2695 drbCnt = ueCb->numDrb;
2697 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2698 drbSet->list.count = drbCnt;
2700 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2701 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2702 if(drbSet->list.array == NULLP)
2704 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2708 for(idx=0; idx<drbCnt; idx++)
2710 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2711 if(drbSet->list.array[idx] == NULLP)
2713 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2717 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2718 drbSet->list.array[idx]->criticality = Criticality_ignore;
2719 drbSet->list.array[idx]->value.present = DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2720 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2722 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2724 drbSetItem->dRBID = idx + 1;
2725 ueCb->drbList[ueCb->numDrb].drbId = drbSetItem->dRBID;
2728 drbSetItem->dRBID = ueCb->drbList[idx].drbId;
2731 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2732 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2733 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2735 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2738 drbSetItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
2739 drbSetItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
2740 drbSetItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
2741 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2742 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbSetItem->qoSInformation.choice.\
2743 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, FALSE);
2745 BuildQOSInforet = BuildQOSInfo(&ueCb->drbList[idx].qos, &drbSetItem->qoSInformation.choice.\
2746 choice_extension->value.choice.DRB_Information.dRB_QoS, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1, TRUE);
2747 if(BuildQOSInforet != ROK)
2749 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2754 snssaiIdx = (idx% cuCb.numSnssaiSupported);
2755 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2756 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.\
2757 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[snssaiIdx], FALSE);
2759 BuildSNSSAIret = BuildSNSSAI(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.\
2760 choice_extension->value.choice.DRB_Information.sNSSAI, NULLP, TRUE);
2761 if(BuildSNSSAIret != ROK)
2763 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2767 /*Flows mapped to DRB List*/
2768 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2769 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbSetItem->qoSInformation.choice.choice_extension->\
2770 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, FALSE);
2772 BuildFlowsMapret = BuildFlowsMap(&ueCb->drbList[idx], &drbSetItem->qoSInformation.choice.choice_extension->\
2773 value.choice.DRB_Information.flows_Mapped_To_DRB_List, ProtocolIE_ID_id_DRBs_ToBeSetup_Item, TRUE);
2774 if(BuildFlowsMapret != ROK)
2776 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2780 /*ULUPTNLInformation To Be Setup List*/
2781 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2782 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2785 BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
2787 if(BuildULTnlInforet != ROK)
2789 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2794 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2796 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2797 ueCb->drbList[ueCb->numDrb].rlcMode = drbSetItem->rLCMode;
2800 drbSetItem->rLCMode = ueCb->drbList[idx].rlcMode;
2802 /* DL PDCP SN Length */
2803 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
2805 CU_ALLOC(drbToBeSetupExt, sizeof(ProtocolExtensionContainer_4624P33_t));
2806 if(!drbToBeSetupExt)
2808 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for extension IE list in BuildDRBSetup");
2813 drbToBeSetupExt->list.count = elementCnt;
2814 drbToBeSetupExt->list.size = drbToBeSetupExt->list.count * sizeof(DRBs_ToBeSetup_ItemExtIEs_t *);
2816 CU_ALLOC(drbToBeSetupExt->list.array, drbToBeSetupExt->list.size);
2817 if(!drbToBeSetupExt->list.array)
2819 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array in BuildDRBSetup");
2823 for(extIeIdx=0; extIeIdx < drbToBeSetupExt->list.count; extIeIdx++)
2825 CU_ALLOC(drbToBeSetupExt->list.array[extIeIdx], sizeof(DRBs_ToBeSetup_ItemExtIEs_t));
2826 if(!drbToBeSetupExt->list.array[extIeIdx])
2828 DU_LOG("\nERROR --> F1AP : Failed to allocated memory for extension array element in BuildDRBSetup");
2834 drbToBeSetupExtIe = drbToBeSetupExt->list.array[extIeIdx];
2836 drbToBeSetupExtIe->id = ProtocolIE_ID_id_DLPDCPSNLength;
2837 drbToBeSetupExtIe->criticality = Criticality_ignore;
2838 drbToBeSetupExtIe->extensionValue.present = DRBs_ToBeSetup_ItemExtIEs__extensionValue_PR_PDCPSNLength;
2839 drbToBeSetupExtIe->extensionValue.choice.PDCPSNLength = PDCPSNLength_twelve_bits;
2840 drbSetItem->iE_Extensions = drbToBeSetupExt;
2843 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
2847 }/* End of BuildDRBSetup*/
2849 /*******************************************************************
2851 * @brief Deallocating memory of function BuildAndSendUESetReq
2855 * Function : FreeNrcgi
2857 * Functionality: Deallocating memory for function BuildNrcgi
2859 * @params[in] NRCGI_t *nrcgi
2863 *******************************************************************/
2864 void FreeNrcgi(NRCGI_t *nrcgi)
2866 if(nrcgi->pLMN_Identity.buf != NULLP)
2868 if(nrcgi->nRCellIdentity.buf != NULLP)
2870 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2872 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2875 /*******************************************************************
2877 * @brief Deallocating memory of function BuildAndSendUESetReq
2881 * Function : FreeSplCellList
2883 * Functionality: Deallocating memory for function BuildSplCellList
2885 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2890 * *****************************************************************/
2891 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2894 if(spCellLst->list.array != NULLP)
2896 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2898 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2900 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2902 if(spCellLst->list.array[cellidx]!=NULLP)
2904 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2907 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2910 /*******************************************************************
2912 * @brief Deallocating memory of function BuildAndSendUESetReq
2916 * Function : FreeSRBSetup
2918 * Functionality: Deallocating memory for function BuildSRBSetup
2920 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2925 * ******************************************************************/
2926 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2929 if(srbSet->list.array != NULLP)
2931 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2933 if(srbSet->list.array[srbidx]!=NULLP)
2935 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2938 CU_FREE(srbSet->list.array,srbSet->list.size);
2941 /*******************************************************************
2943 * @brief Deallocating memory of function BuildAndSendUESetReq
2947 * Function : FreeQOSInfo
2949 * Functionality: Deallocating memory for function BuildQOSInfo
2951 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2955 * ****************************************************************/
2956 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2958 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2959 uint8_t qosCntIdx = 0;
2961 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2963 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2965 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2967 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2968 sizeof(MaxDataBurstVolume_t));
2970 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2971 sizeof(AveragingWindow_t));
2973 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2974 sizeof(NonDynamic5QIDescriptor_t));
2976 if(drbQos->iE_Extensions)
2978 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2979 if(qosIeExt->list.array != NULLP)
2981 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2983 if(qosIeExt->list.array[qosCntIdx])
2985 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2988 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2991 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2994 /*******************************************************************
2996 * @brief Deallocating memory of function BuildAndSendUESetReq
3000 * Function : FreeULTnlInfo
3002 * Functionality: Deallocating memory for function BuildULTnlInfo
3004 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3009 * ****************************************************************/
3010 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3013 if(ulInfo->list.array != NULLP)
3015 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3017 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3019 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3021 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3022 transportLayerAddress.buf != NULLP)
3024 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3027 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3028 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3029 gTPTunnel->gTP_TEID.size);
3031 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3032 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3033 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3035 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3036 sizeof(GTPTunnel_t));
3039 if(ulInfo->list.array[ulidx]!=NULLP)
3041 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3044 CU_FREE(ulInfo->list.array,ulInfo->list.size);
3047 /*******************************************************************
3049 * @brief Deallocating memory for BuildAndSendUESetReq
3053 * Function : FreeDRBSetup
3055 * Functionality: Deallocating memory for BuildDRBSetup
3057 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3061 * ****************************************************************/
3062 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3064 DRBs_ToBeSetup_Item_t *drbSetItem;
3065 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
3067 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
3069 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
3070 if(drbSet->list.array != NULLP)
3072 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3074 if(drbSet->list.array[drbidx] != NULLP)
3076 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3077 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3079 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3080 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3082 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3083 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3085 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3086 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3088 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3090 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3092 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3094 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3095 flows_Mapped_To_DRB_List.list.array != NULLP)
3097 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3098 flows_Mapped_To_DRB_List.list.count; flowidx++)
3100 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3101 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3103 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3104 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3105 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3107 if(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!=NULLP)
3111 if(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->maxDataBurstVolume!=NULLP)
3115 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3116 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3118 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3119 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3120 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3121 sizeof(MaxDataBurstVolume_t));
3123 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3124 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3125 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3127 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3128 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3129 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3132 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3133 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3135 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3136 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3139 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3140 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3141 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3143 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3144 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3146 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3147 sizeof(OCTET_STRING_t));
3149 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3150 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3152 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3153 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3155 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3156 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3158 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3159 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3161 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3162 iE_Extensions != NULLP)
3164 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
3165 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
3166 if(qosIeExt->list.array != NULLP)
3168 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
3170 if(qosIeExt->list.array[qosCntIdx] != NULLP)
3172 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
3175 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
3177 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3178 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
3181 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3183 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3186 CU_FREE(drbSet->list.array,drbSet->list.size);
3191 /*******************************************************************
3193 * @brief Free the UE Setup Request
3197 * Function : FreeUeContextSetupReq
3199 * Functionality: Deallocate the memory of BuildUESetReq
3201 * @params[in] F1AP_PDU_t *f1apMsg
3206 * ****************************************************************/
3207 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
3210 UEContextSetupRequest_t *ueSetReq = NULLP;
3212 if(f1apMsg != NULLP)
3214 if(f1apMsg->choice.initiatingMessage != NULLP)
3216 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3217 if(ueSetReq->protocolIEs.list.array != NULLP)
3219 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
3221 if(ueSetReq->protocolIEs.list.array[idx])
3223 switch(ueSetReq->protocolIEs.list.array[idx]->id)
3225 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
3227 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
3229 case ProtocolIE_ID_id_SpCell_ID:
3230 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3232 case ProtocolIE_ID_id_ServCellIndex:
3234 case ProtocolIE_ID_id_SpCellULConfigured:
3236 case ProtocolIE_ID_id_CUtoDURRCInformation:
3237 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
3239 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
3240 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3242 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
3243 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3245 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
3246 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3248 case ProtocolIE_ID_id_RRCContainer:
3249 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
3251 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
3252 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
3255 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
3256 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
3257 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
3260 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
3264 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
3266 for(ieId=0; ieId<idx; ieId++)
3268 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3270 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3273 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3275 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3277 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3281 /**Filling cell group info **/
3282 /*******************************************************************
3284 * @brief Build Control resource set to add/modify list
3288 * Function : BuildControlRSetToAddModList
3290 * Functionality: Build Control resource set to add/modify list
3293 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3295 * @return ROK - success
3298 * ****************************************************************/
3299 uint8_t BuildControlRSetToAddModList
3301 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3306 uint8_t numBytes, bitsUnused;
3307 struct ControlResourceSet *controlRSet;
3308 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3309 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3312 controlRSetList->list.count = elementCnt;
3313 controlRSetList->list.size = \
3314 elementCnt * sizeof(struct ControlResourceSet *);
3316 controlRSetList->list.array = NULLP;
3317 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3318 if(!controlRSetList->list.array)
3320 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3324 for(idx = 0; idx < elementCnt; idx++)
3326 controlRSetList->list.array[idx] = NULLP;
3327 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3328 if(!controlRSetList->list.array[idx])
3330 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3336 controlRSet = controlRSetList->list.array[idx];
3337 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3339 /* Values harcoded according to our design:
3342 * Bit string stored ff0000000000
3346 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3347 controlRSet->frequencyDomainResources.buf = NULLP;
3348 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3349 controlRSet->frequencyDomainResources.size);
3350 if(!controlRSet->frequencyDomainResources.buf)
3352 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3356 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3357 coreset0EndPrb = CORESET0_END_PRB;
3358 coreset1StartPrb = coreset0EndPrb + 6;
3359 coreset1NumPrb = CORESET1_NUM_PRB;
3360 /* calculate the PRBs */
3361 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3362 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3363 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3365 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3366 controlRSet->cce_REG_MappingType.present = \
3367 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3369 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3370 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3371 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3372 controlRSet->tci_PresentInDCI = NULLP;
3374 uint8_t tciStateIdx;
3376 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3377 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3378 if(!controlRset->tci_StatesPDCCH_ToAddList)
3380 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3385 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3386 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3387 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3388 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3389 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3391 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3395 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3397 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3398 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3400 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3407 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3409 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3410 if(!controlRset->tci_PresentInDCI)
3412 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3416 *(controlRset->tci_PresentInDCI);
3419 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3420 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3421 if(!controlRSet->pdcch_DMRS_ScramblingID)
3423 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3426 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3429 } /* End BuildControlRSetToAddModList */
3431 /*******************************************************************
3433 * @brief Build search space to add/modify list
3437 * Function : BuildSearchSpcToAddModList
3439 * Functionality: Build search space to add/modify list
3442 * @return ROK - success
3445 * ****************************************************************/
3446 uint8_t BuildSearchSpcToAddModList
3448 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3456 struct SearchSpace *searchSpc;
3459 searchSpcList->list.count = elementCnt;
3460 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3462 searchSpcList->list.array = NULLP;
3463 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3464 if(!searchSpcList->list.array)
3466 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3470 for(idx = 0; idx < elementCnt; idx++)
3472 searchSpcList->list.array[idx] = NULLP;
3473 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3474 if(!searchSpcList->list.array[idx])
3476 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3482 searchSpc = searchSpcList->list.array[idx];
3484 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3486 searchSpc->controlResourceSetId = NULLP;
3487 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3488 if(!searchSpc->controlResourceSetId)
3490 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3493 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3495 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3496 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3497 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3498 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3500 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3503 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3504 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3506 searchSpc->duration = NULLP;
3507 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3508 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3509 if(!searchSpc->monitoringSymbolsWithinSlot)
3511 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3515 /* Values taken from reference logs :
3518 * Bit string stores 8000
3523 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3524 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3525 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3526 searchSpc->monitoringSymbolsWithinSlot->size);
3527 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3529 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3534 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3535 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3536 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3537 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3539 searchSpc->nrofCandidates = NULLP;
3540 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3541 if(!searchSpc->nrofCandidates)
3543 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3547 searchSpc->nrofCandidates->aggregationLevel1 = \
3548 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3549 searchSpc->nrofCandidates->aggregationLevel2 = \
3550 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3551 searchSpc->nrofCandidates->aggregationLevel4 = \
3552 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3553 searchSpc->nrofCandidates->aggregationLevel8 = \
3554 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3555 searchSpc->nrofCandidates->aggregationLevel16 = \
3556 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3558 searchSpc->searchSpaceType = NULLP;
3559 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3560 if(!searchSpc->searchSpaceType)
3562 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3566 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3568 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3569 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3570 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3571 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3573 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3576 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3577 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3580 }/* End BuildSearchSpcToAddModList */
3582 /*******************************************************************
3584 * @brief Builds BWP DL dedicated PDCCH config
3588 * Function : BuildBWPDlDedPdcchCfg
3590 * Functionality: Builds BWP DL dedicated PDCCH config
3592 * @params[in] struct PDCCH_Config *pdcchCfg
3594 * @return ROK - success
3597 * ****************************************************************/
3598 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3600 pdcchCfg->controlResourceSetToAddModList = NULLP;
3601 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3602 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3603 if(!pdcchCfg->controlResourceSetToAddModList)
3605 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3609 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3614 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3616 pdcchCfg->searchSpacesToAddModList = NULLP;
3617 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3618 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3619 if(!pdcchCfg->searchSpacesToAddModList)
3621 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3625 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3630 pdcchCfg->searchSpacesToReleaseList = NULLP;
3631 pdcchCfg->downlinkPreemption = NULLP;
3632 pdcchCfg->tpc_PUSCH = NULLP;
3633 pdcchCfg->tpc_PUCCH = NULLP;
3634 pdcchCfg->tpc_SRS = NULLP;
3639 /*******************************************************************
3641 * @brief Builds DMRS DL PDSCH Mapping type A
3645 * Function : BuildDMRSDLPdschMapTypeA
3647 * Functionality: Builds DMRS DL PDSCH Mapping type A
3650 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3651 * @return ROK - success
3654 * ****************************************************************/
3655 uint8_t BuildDMRSDLPdschMapTypeA
3657 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3660 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3661 dmrsDlCfg->choice.setup = NULLP;
3662 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3663 if(!dmrsDlCfg->choice.setup)
3665 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3669 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3670 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3671 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3672 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3674 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3677 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3679 dmrsDlCfg->choice.setup->maxLength = NULLP;
3680 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3681 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3682 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3687 /*******************************************************************
3689 * @brief Builds TCI states to add/modify list
3693 * Function : BuildTCIStatesToAddModList
3695 * Functionality:Builds TCI states to add/modify list
3698 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3700 * @return ROK - success
3703 * ****************************************************************/
3704 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3709 /*******************************************************************
3711 * @brief Builds PDSCH time domain allocation list
3715 * Function : BuildPdschTimeDomAllocList
3717 * Functionality: Builds PDSCH time domain allocation list
3720 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3722 * @return ROK - success
3725 * ****************************************************************/
3726 uint8_t BuildPdschTimeDomAllocList
3728 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3733 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3735 timeDomAllocList->present = \
3736 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3738 timeDomAllocList->choice.setup = NULLP;
3739 CU_ALLOC(timeDomAllocList->choice.setup, \
3740 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3741 if(!timeDomAllocList->choice.setup)
3743 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3748 timeDomAllocList->choice.setup->list.count = elementCnt;
3749 timeDomAllocList->choice.setup->list.size = \
3750 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3752 timeDomAllocList->choice.setup->list.array = NULLP;
3753 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3754 timeDomAllocList->choice.setup->list.size);
3755 if(!timeDomAllocList->choice.setup->list.array)
3757 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3761 for(idx = 0; idx < elementCnt; idx++)
3763 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3764 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3765 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3766 if(!timeDomAllocList->choice.setup->list.array[idx])
3768 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3774 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3775 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3776 if(!timeDomAlloc->k0)
3778 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3781 *(timeDomAlloc->k0) = 0;
3782 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3783 timeDomAlloc->startSymbolAndLength = 66;
3786 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3787 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3788 if(!timeDomAlloc->k0)
3790 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3793 *(timeDomAlloc->k0) = 1;
3794 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3795 timeDomAlloc->startSymbolAndLength = 66;
3800 /*******************************************************************
3802 * @brief Builds PDSCH PRB Bundling type
3806 * Function : BuildPdschPrbBundlingType
3808 * Functionality: Builds PDSCH PRB Bundling type
3811 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3813 * @return ROK - success
3816 * ****************************************************************/
3817 uint8_t BuildPdschPrbBundlingType
3819 struct PDSCH_Config__prb_BundlingType *prbBndlType
3822 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3824 prbBndlType->choice.staticBundling = NULLP;
3825 CU_ALLOC(prbBndlType->choice.staticBundling, \
3826 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3827 if(!prbBndlType->choice.staticBundling)
3829 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3832 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3837 /*******************************************************************
3839 * @brief Builds BWP DL dedicated PDSCH config
3843 * Function : BuildBWPDlDedPdschCfg
3845 * Functionality: Builds BWP DL dedicated PDSCH config
3847 * @params[in] struct PDSCH_Config *pdschCfg
3849 * @return ROK - success
3852 * ****************************************************************/
3853 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3855 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3857 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3858 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3859 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3860 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3862 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3866 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3871 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3872 pdschCfg->tci_StatesToAddModList = NULLP;
3873 pdschCfg->tci_StatesToReleaseList = NULLP;
3874 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3876 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3877 if(!pdschCfg->tci_StatesToAddModList)
3879 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3882 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3888 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3890 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3891 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3892 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3893 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3895 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3898 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3902 pdschCfg->pdsch_AggregationFactor = NULLP;
3903 pdschCfg->rateMatchPatternToAddModList = NULLP;
3904 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3905 pdschCfg->rateMatchPatternGroup1 = NULLP;
3906 pdschCfg->rateMatchPatternGroup2 = NULLP;
3907 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3908 pdschCfg->mcs_Table = NULLP;
3910 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3911 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3912 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3914 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3917 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3919 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3924 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3925 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3926 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3927 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3928 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3929 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3930 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3935 /*******************************************************************
3937 * @brief Builds intitial DL BWP
3940 * Function : BuildInitialDlBWP
3942 * Functionality: Builds intitial DL BWP in spCellCfgDed
3944 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3946 * @return ROK - success
3949 * ****************************************************************/
3950 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3952 dlBwp->pdcch_Config = NULLP;
3953 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3954 if(!dlBwp->pdcch_Config)
3956 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3959 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3961 dlBwp->pdcch_Config->choice.setup = NULLP;
3962 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3963 if(!dlBwp->pdcch_Config->choice.setup)
3965 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3968 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3973 dlBwp->pdsch_Config = NULLP;
3974 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3975 if(!dlBwp->pdsch_Config)
3977 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3980 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3982 dlBwp->pdsch_Config->choice.setup = NULLP;
3983 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3984 if(!dlBwp->pdsch_Config->choice.setup)
3986 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3990 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3995 dlBwp->sps_Config = NULLP;
3996 dlBwp->radioLinkMonitoringConfig = NULLP;
4000 /*******************************************************************
4002 * @brief Builds DMRS UL Pusch Mapping type A
4006 * Function : BuildDMRSULPuschMapTypeA
4008 * Functionality: Builds DMRS UL Pusch Mapping type A
4011 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4012 * @return ROK - success
4015 * ****************************************************************/
4016 uint8_t BuildDMRSULPuschMapTypeA
4018 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4021 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4022 dmrsUlCfg->choice.setup= NULLP;
4023 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4024 if(!dmrsUlCfg->choice.setup)
4026 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4030 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4031 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4032 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4033 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4035 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4038 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4040 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4041 dmrsUlCfg->choice.setup->maxLength = NULLP;
4042 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4043 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4044 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4045 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4047 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4051 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4052 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4054 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4056 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4059 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4061 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4062 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4066 /*******************************************************************
4068 * @brief Build PUSCH time domain allocation list
4072 * Function : BuildPuschTimeDomAllocList
4074 * Functionality: Build PUSCH time domain allocation list
4077 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4079 * @return ROK - success
4082 * ****************************************************************/
4083 uint8_t BuildPuschTimeDomAllocList
4085 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4090 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4092 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4093 timeDomAllocList->choice.setup = NULLP;
4094 CU_ALLOC(timeDomAllocList->choice.setup, \
4095 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4096 if(!timeDomAllocList->choice.setup)
4098 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4103 timeDomAllocList->choice.setup->list.count = elementCnt;
4104 timeDomAllocList->choice.setup->list.size = \
4105 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4106 timeDomAllocList->choice.setup->list.array = NULLP;
4107 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4108 timeDomAllocList->choice.setup->list.size);
4109 if(!timeDomAllocList->choice.setup->list.array)
4111 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4115 for(idx = 0; idx < elementCnt; idx++)
4117 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4118 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4119 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4120 if(!timeDomAllocList->choice.setup->list.array[idx])
4122 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4128 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4129 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4130 if(!timeDomAlloc->k2)
4132 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4135 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4136 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4137 timeDomAlloc->startSymbolAndLength = 66;
4140 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4141 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
4142 if(!timeDomAlloc->k2)
4144 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4147 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4148 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4149 timeDomAlloc->startSymbolAndLength = 66;
4154 /*******************************************************************
4156 * @brief Builds BWP UL dedicated PUSCH Config
4160 * Function : BuildBWPUlDedPuschCfg
4163 * Builds BWP UL dedicated PUSCH Config
4165 * @params[in] : PUSCH_Config_t *puschCfg
4167 * @return ROK - success
4170 * ****************************************************************/
4171 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4173 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4174 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4175 if(!puschCfg->dataScramblingIdentityPUSCH)
4177 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4180 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4182 puschCfg->txConfig = NULLP;
4183 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4184 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4185 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4186 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4188 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4192 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4197 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4198 puschCfg->pusch_PowerControl = NULLP;
4199 puschCfg->frequencyHopping = NULLP;
4200 puschCfg->frequencyHoppingOffsetLists = NULLP;
4201 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4203 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4204 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4205 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4206 if(!puschCfg->pusch_TimeDomainAllocationList)
4208 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4212 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4217 puschCfg->pusch_AggregationFactor = NULLP;
4218 puschCfg->mcs_Table = NULLP;
4219 puschCfg->mcs_TableTransformPrecoder = NULLP;
4220 puschCfg->transformPrecoder = NULLP;
4221 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4222 if(!puschCfg->transformPrecoder)
4224 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4227 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4229 puschCfg->codebookSubset = NULLP;
4230 puschCfg->maxRank = NULLP;
4231 puschCfg->rbg_Size = NULLP;
4232 puschCfg->uci_OnPUSCH = NULLP;
4233 puschCfg->tp_pi2BPSK = NULLP;
4238 /*******************************************************************
4240 * @brief Builds BWP UL dedicated PUCCH Config
4244 * Function : BuildBWPUlDedPucchCfg
4247 * Builds BWP UL dedicated PUCCH Config
4249 * @params[in] : PUCCH_Config_t *pucchCfg
4251 * @return ROK - success
4254 * ****************************************************************/
4255 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4257 uint8_t arrIdx, elementCnt;
4258 uint8_t rsrcIdx, rsrcSetIdx;
4259 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4260 PUCCH_Resource_t *rsrc = NULLP;
4264 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
4265 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
4266 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4267 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
4268 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
4270 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4273 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
4274 rsrcSet->pucch_ResourceSetId = 1;
4276 rsrcSet->resourceList.list.count = elementCnt;
4277 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4278 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4279 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4281 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4284 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4288 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
4289 pucchCfg->resourceToAddModList->list.count = elementCnt;
4290 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4291 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
4292 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
4294 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4297 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
4298 rsrc->pucch_ResourceId = 1;
4299 rsrc->startingPRB = 0;
4300 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4301 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4302 rsrc->format.choice.format1->initialCyclicShift = 0;
4303 rsrc->format.choice.format1->nrofSymbols = 4;
4304 rsrc->format.choice.format1->startingSymbolIndex = 0;
4305 rsrc->format.choice.format1->timeDomainOCC = 0;
4308 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
4309 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
4310 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
4311 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
4312 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4315 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4316 if(pucchCfg->dl_DataToUL_ACK == NULLP)
4318 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4323 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4324 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4325 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4326 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4328 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4332 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4334 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4335 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4337 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4343 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
4344 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4349 /*******************************************************************
4351 * @brief Fills SRS resource to add/modify list
4355 * Function : BuildSrsRsrcAddModList
4357 * Functionality: Fills SRS resource to add/modify list
4360 * @return ROK - success
4363 * ****************************************************************/
4364 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4370 resourceList->list.count = elementCnt;
4371 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4372 resourceList->list.array = NULLP;
4373 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4374 if(!resourceList->list.array)
4376 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4380 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4382 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4383 if(!resourceList->list.array[rsrcIdx])
4385 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4391 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4392 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4393 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4395 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4396 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4397 sizeof(struct SRS_Resource__transmissionComb__n2));
4398 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4400 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4403 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4404 = SRS_COMB_OFFSET_N2;
4405 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4406 = SRS_CYCLIC_SHIFT_N2;
4408 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4409 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4410 SRS_Resource__resourceMapping__nrofSymbols_n1;
4411 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4412 SRS_Resource__resourceMapping__repetitionFactor_n1;
4414 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4415 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4416 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4417 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4418 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4419 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4420 SRS_Resource__groupOrSequenceHopping_neither;
4422 /* Setting resource type to aperiodic for intergration purposes */
4423 resourceList->list.array[rsrcIdx]->resourceType.present = \
4424 SRS_Resource__resourceType_PR_aperiodic;
4425 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4426 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4427 sizeof(struct SRS_Resource__resourceType__aperiodic));
4428 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4430 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4433 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4438 /*******************************************************************
4440 * @brief Build SRS resource set Add/mod list
4444 * Function : BuildSrsRsrcSetAddModList
4446 * Functionality: Build SRS resource set Add/mod list
4449 * @return ROK - success
4452 * ****************************************************************/
4453 uint8_t BuildSrsRsrcSetAddModList
4455 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4461 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4464 rsrcSetList->list.count = elementCnt;
4465 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4466 rsrcSetList->list.array = NULLP;
4467 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4468 if(!rsrcSetList->list.array)
4470 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4474 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4476 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4477 if(!rsrcSetList->list.array[rSetIdx])
4479 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4485 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4487 /* Fill Resource Id list in resource set */
4488 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4489 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4490 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4491 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4493 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4498 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4499 rsrcIdList->list.count = elementCnt;
4500 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4501 rsrcIdList->list.array = NULLP;
4502 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4503 if(!rsrcIdList->list.array)
4505 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4509 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4511 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4512 if(!rsrcIdList->list.array[rsrcIdx])
4514 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4520 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4522 /* Fill resource type */
4523 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4524 SRS_ResourceSet__resourceType_PR_aperiodic;
4526 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4527 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4528 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4529 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4531 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4534 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4535 = APERIODIC_SRS_RESRC_TRIGGER;
4537 /* TODO : Fill values for below IEs as expected by Viavi */
4538 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4539 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4542 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4543 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4544 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4545 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4546 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4551 /*******************************************************************
4553 * @brief Builds BWP UL dedicated SRS Config
4557 * Function : BuildBWPUlDedSrsCfg
4559 * Functionality: Builds BWP UL dedicated SRS Config
4561 * @params[in] SRS Config
4562 * @return ROK - success
4565 * ****************************************************************/
4566 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4568 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4569 srsCfg->srs_ResourceSetToAddModList = NULLP;
4570 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4571 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4572 if(!srsCfg->srs_ResourceSetToAddModList)
4574 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4577 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4582 srsCfg->srs_ResourceToReleaseList = NULLP;
4584 /* Resource to Add/Modify list */
4585 srsCfg->srs_ResourceToAddModList = NULLP;
4586 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4587 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4588 if(!srsCfg->srs_ResourceToAddModList)
4590 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4594 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4599 srsCfg->tpc_Accumulation = NULLP;
4604 /*******************************************************************
4606 * @brief Builds inital UL BWP
4610 * Function : BuildInitialUlBWP
4612 * Functionality: Builds initial UL BWP
4614 * @params[in] BWP_UplinkDedicated_t *ulBwp
4615 * @return ROK - success
4618 * ****************************************************************/
4619 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4621 ulBwp->pucch_Config = NULLP;
4622 ulBwp->pucch_Config = NULLP;
4623 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4624 if(!ulBwp->pucch_Config)
4626 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4630 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4631 ulBwp->pucch_Config->choice.setup = NULLP;
4632 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4633 if(!ulBwp->pucch_Config->choice.setup)
4635 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4639 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4644 /* Fill BWP UL dedicated PUSCH config */
4645 ulBwp->pusch_Config = NULLP;
4646 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4647 if(!ulBwp->pusch_Config)
4649 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4653 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4654 ulBwp->pusch_Config->choice.setup = NULLP;
4655 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4656 if(!ulBwp->pusch_Config->choice.setup)
4658 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4662 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4667 ulBwp->configuredGrantConfig = NULLP;
4669 /* Fill BPW UL dedicated SRS config */
4670 ulBwp->srs_Config = NULLP;
4671 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4672 if(!ulBwp->srs_Config)
4674 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4678 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4679 ulBwp->srs_Config->choice.setup = NULLP;
4680 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4681 if(!ulBwp->srs_Config->choice.setup)
4683 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4687 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4692 ulBwp->beamFailureRecoveryConfig = NULLP;
4697 /*******************************************************************
4699 * @brief Builds Pusch Serving cell Config
4703 * Function : BuildPuschSrvCellCfg
4705 * Functionality: Builds Pusch Serving cell Config
4707 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4709 * @return ROK - success
4712 * ****************************************************************/
4713 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4715 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4716 puschCfg->choice.setup = NULLP;
4717 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4718 if(!puschCfg->choice.setup)
4720 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4724 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4725 puschCfg->choice.setup->rateMatching = NULLP;
4726 puschCfg->choice.setup->xOverhead = NULLP;
4727 puschCfg->choice.setup->ext1 = NULLP;
4728 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4729 if(!puschCfg->choice.setup->ext1)
4731 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4735 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4736 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4737 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4739 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4742 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4744 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4745 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4746 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4748 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4751 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4755 /*******************************************************************
4757 * @brief Builds UL config
4760 * Function : BuildUlCfg
4762 * Functionality: Builds UL config in spCellCfgDed
4764 * @params[in] UplinkConfig_t *ulCfg
4766 * @return ROK - success
4769 * ****************************************************************/
4770 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4772 ulCfg->initialUplinkBWP = NULLP;
4773 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4774 if(!ulCfg->initialUplinkBWP)
4776 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4780 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4785 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4786 ulCfg->uplinkBWP_ToAddModList = NULLP;
4787 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4788 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4789 if(!ulCfg->firstActiveUplinkBWP_Id)
4791 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4794 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4796 ulCfg->pusch_ServingCellConfig = NULLP;
4797 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4798 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4799 if(!ulCfg->pusch_ServingCellConfig)
4801 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4805 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4810 ulCfg->carrierSwitching = NULLP;
4811 ulCfg->ext1 = NULLP;
4815 /*******************************************************************
4817 * @brief Builds PDSCH serving cell config
4820 * Function : BuildPdschSrvCellCfg
4822 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4824 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4826 * @return ROK - success
4829 * ****************************************************************/
4830 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4832 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4833 pdschCfg->choice.setup = NULLP;
4834 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4835 if(!pdschCfg->choice.setup)
4837 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4841 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4842 pdschCfg->choice.setup->xOverhead = NULLP;
4843 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4844 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4845 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4847 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4850 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4851 pdschCfg->choice.setup->pucch_Cell = NULLP;
4852 pdschCfg->choice.setup->ext1 = NULLP;
4857 /*******************************************************************
4859 * @brief Builds CSI Meas config
4862 * Function : BuildCsiMeasCfg
4864 * Functionality: Builds CSI Meas config in spCellCfgDed
4866 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4868 * @return ROK - success
4871 * ****************************************************************/
4872 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4878 /*******************************************************************
4880 * @brief Builds Spcell config dedicated
4883 * Function : BuildSpCellCfgDed
4885 * Functionality: Builds sp cell config dedicated in spCellCfg
4887 * @params[in] ServingCellConfig_t srvCellCfg
4889 * @return ROK - success
4892 * ****************************************************************/
4893 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4895 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4897 srvCellCfg->initialDownlinkBWP = NULLP;
4898 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4899 if(!srvCellCfg->initialDownlinkBWP)
4901 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4905 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4907 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4910 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4911 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4913 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4914 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4915 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4917 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4920 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4922 srvCellCfg->bwp_InactivityTimer = NULLP;
4924 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4925 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4926 if(!srvCellCfg->defaultDownlinkBWP_Id)
4928 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4931 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4933 srvCellCfg->uplinkConfig = NULLP;
4934 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4935 if(!srvCellCfg->uplinkConfig)
4937 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4941 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4943 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4946 srvCellCfg->supplementaryUplink = NULLP;
4947 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4949 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4950 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4951 if(!srvCellCfg->pdsch_ServingCellConfig)
4953 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4957 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4959 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4963 srvCellCfg->csi_MeasConfig = NULLP;
4965 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4966 if(!srvCellCfg->csi_MeasConfig)
4968 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4972 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4974 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4978 srvCellCfg->sCellDeactivationTimer = NULLP;
4979 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4980 srvCellCfg->tag_Id = TAG_ID;
4981 srvCellCfg->dummy = NULLP;
4982 srvCellCfg->pathlossReferenceLinking = NULLP;
4983 srvCellCfg->servingCellMO = NULLP;
4984 srvCellCfg->ext1 = NULLP;
4988 /*******************************************************************
4990 * @brief Builds Spcell config
4994 * Function : BuildSpCellCfg
4996 * Functionality: Builds sp cell config in DuToCuRrcContainer
4998 * @params[in] SpCellConfig_t spCellCfg
5000 * @return ROK - success
5003 * ****************************************************************/
5004 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
5007 spCellCfg->servCellIndex = NULLP;
5008 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
5009 if(!spCellCfg->servCellIndex)
5011 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5014 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
5016 spCellCfg->reconfigurationWithSync = NULLP;
5017 spCellCfg->rlf_TimersAndConstants = NULLP;
5018 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
5019 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5020 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
5022 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5025 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
5027 spCellCfg->spCellConfigDedicated = NULLP;
5028 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5029 if(!spCellCfg->spCellConfigDedicated)
5031 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
5034 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
5036 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
5041 /*******************************************************************
5043 * @brief Builds Phy cell group config
5047 * Function : BuildPhyCellGrpCfg
5049 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
5051 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
5053 * @return ROK - success
5056 * ****************************************************************/
5057 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5059 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5060 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5062 phyCellGrpCfg->p_NR_FR1 = NULLP;
5063 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5064 if(!phyCellGrpCfg->p_NR_FR1)
5066 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5069 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
5070 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5071 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5072 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5073 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5074 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5075 phyCellGrpCfg->cs_RNTI = NULLP;
5076 phyCellGrpCfg->ext1 = NULLP;
5077 phyCellGrpCfg->ext2 = NULLP;
5082 /*******************************************************************
5084 * @brief Builds tag config
5088 * Function : BuildTagConfig
5090 * Functionality: Builds tag config in MacCellGroupConfig
5092 * @params[in] TAG_Config *tag_Config
5094 * @return ROK - success
5097 * ****************************************************************/
5098 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
5100 struct TAG_Config__tag_ToAddModList *tagList;
5101 uint8_t idx, elementCnt;
5103 tagConfig->tag_ToReleaseList = NULLP;
5104 tagConfig->tag_ToAddModList = NULLP;
5105 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5106 if(!tagConfig->tag_ToAddModList)
5108 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5112 elementCnt = 1; //ODU_VALUE_ONE;
5113 tagList = tagConfig->tag_ToAddModList;
5114 tagList->list.count = elementCnt;
5115 tagList->list.size = elementCnt * sizeof(struct TAG *);
5117 tagList->list.array = NULLP;
5118 CU_ALLOC(tagList->list.array, tagList->list.size);
5119 if(!tagList->list.array)
5121 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5125 for(idx=0; idx<tagList->list.count; idx++)
5127 tagList->list.array[idx] = NULLP;
5128 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
5129 if(!tagList->list.array[idx])
5131 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
5137 tagList->list.array[idx]->tag_Id = TAG_ID;
5138 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
5143 /*******************************************************************
5145 * @brief Builds PHR Config
5149 * Function : BuildPhrConfig
5151 * Functionality: Builds phrConfig in MacCellGroupConfig
5153 * @params[in] PHR Config *
5155 * @return ROK - success
5158 * ****************************************************************/
5159 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
5162 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
5163 phrConfig->choice.setup = NULLP;
5164 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
5165 if(!phrConfig->choice.setup)
5167 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
5171 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
5172 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
5173 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
5174 phrConfig->choice.setup->multiplePHR = false;
5175 phrConfig->choice.setup->dummy = false;
5176 phrConfig->choice.setup->phr_Type2OtherCell = false;
5177 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
5182 /*******************************************************************
5184 * @brief Builds BSR Config
5188 * Function : BuildBsrConfig
5190 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
5192 * @params[in] BSR_Config *bsrConfig
5194 * @return ROK - success
5197 * ****************************************************************/
5198 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
5200 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
5201 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
5202 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
5207 /*******************************************************************
5209 * @brief Builds scheduling request config
5213 * Function : BuildSchedulingReqConfig
5215 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
5217 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
5219 * @return ROK - success
5222 * ****************************************************************/
5223 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
5225 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
5226 uint8_t idx, elementCnt;
5228 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
5229 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
5230 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
5231 if(!schedulingRequestConfig->schedulingRequestToAddModList)
5233 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5237 elementCnt = 1; //ODU_VALUE_ONE;
5238 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5239 schReqList->list.count = elementCnt;
5240 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
5242 schReqList->list.array = NULLP;
5243 CU_ALLOC(schReqList->list.array, schReqList->list.size);
5244 if(!schReqList->list.array)
5246 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5250 for(idx=0;idx<schReqList->list.count; idx++)
5252 schReqList->list.array[idx] = NULLP;
5253 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5254 if(!schReqList->list.array[idx])
5256 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5262 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
5264 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
5265 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5266 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
5268 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
5271 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
5272 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
5273 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
5277 /*******************************************************************
5279 * @brief Builds Mac cell group config
5283 * Function : BuildMacCellGrpCfg
5285 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
5287 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5289 * @return ROK - success
5292 * ****************************************************************/
5293 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5295 macCellGrpCfg->drx_ConfigRrc = NULLP;
5296 macCellGrpCfg->schedulingRequestConfig = NULLP;
5297 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5298 if(!macCellGrpCfg->schedulingRequestConfig)
5300 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5304 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5306 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
5310 macCellGrpCfg->bsr_Config = NULLP;
5311 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5312 if(!macCellGrpCfg->bsr_Config)
5314 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5318 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5320 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
5324 macCellGrpCfg->tag_Config = NULLP;
5325 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5326 if(!macCellGrpCfg->tag_Config)
5328 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5332 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5334 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
5338 macCellGrpCfg->phr_Config = NULLP;
5339 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5340 if(!macCellGrpCfg->phr_Config)
5342 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5346 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5348 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5352 macCellGrpCfg->skipUplinkTxDynamic = false;
5353 macCellGrpCfg->ext1 = NULLP;
5357 /*******************************************************************
5359 * @brief Frees memeory allocated for SearchSpcToAddModList
5363 * Function : FreeSearchSpcToAddModList
5365 * Functionality: Deallocating memory of SearchSpcToAddModList
5367 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5371 4221 * ****************************************************************/
5372 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5376 struct SearchSpace *searchSpc=NULLP;
5378 if(searchSpcList->list.array)
5380 if(searchSpcList->list.array[idx2])
5382 searchSpc = searchSpcList->list.array[idx2];
5383 if(searchSpc->controlResourceSetId)
5385 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5387 if(searchSpc->monitoringSymbolsWithinSlot)
5389 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5391 if(searchSpc->nrofCandidates)
5393 if(searchSpc->searchSpaceType)
5395 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5396 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5397 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5398 SearchSpace__searchSpaceType));
5400 CU_FREE(searchSpc->nrofCandidates,
5401 sizeof(struct SearchSpace__nrofCandidates));
5403 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5404 searchSpc->monitoringSymbolsWithinSlot->size);
5406 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5407 sizeof(BIT_STRING_t));
5409 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5410 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5412 CU_FREE(searchSpc->controlResourceSetId,
5413 sizeof(ControlResourceSetId_t));
5416 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5418 CU_FREE(searchSpcList->list.array[idx1],
5419 sizeof(struct SearchSpace));
5421 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5424 /*******************************************************************
5426 * @brief Frees memory allocated for PdschTimeDomAllocList
5430 * Function : FreePdschTimeDomAllocList
5432 * Functionality: Deallocating memory of PdschTimeDomAllocList
5434 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5438 4221 * ****************************************************************/
5439 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5443 if(timeDomAllocList->choice.setup)
5445 if(timeDomAllocList->choice.setup->list.array)
5447 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5449 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5450 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5452 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5453 timeDomAllocList->choice.setup->list.size);
5455 CU_FREE(timeDomAllocList->choice.setup,\
5456 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5459 /*******************************************************************
5461 * @brief Frees memory allocated for PuschTimeDomAllocList
5465 * Function : FreePuschTimeDomAllocList
5467 * Functionality: Deallocating memory of PuschTimeDomAllocList
5469 * @params[in] PUSCH_Config_t *puschCfg
5473 ***********************************************************************/
5474 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5478 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5480 if(puschCfg->pusch_TimeDomainAllocationList)
5482 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5483 if(timeDomAllocList_t->choice.setup)
5485 if(timeDomAllocList_t->choice.setup->list.array)
5487 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5488 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5490 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5491 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5493 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5494 timeDomAllocList_t->choice.setup->list.size);
5496 CU_FREE(timeDomAllocList_t->choice.setup, \
5497 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5499 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5500 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5501 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5506 /*******************************************************************
5508 * @brief Frees memory allocated for Dedicated PUCCH config
5512 * Function : FreeBWPUlDedPucchCfg
5514 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5516 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5520 * ****************************************************************/
5521 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5523 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5524 PUCCH_Config_t *pucchCfg = NULLP;
5525 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5526 PUCCH_Resource_t *rsrc = NULLP;
5530 if(ulBwpPucchCfg->choice.setup)
5532 pucchCfg = ulBwpPucchCfg->choice.setup;
5534 //Free resource set list
5535 if(pucchCfg->resourceSetToAddModList)
5537 if(pucchCfg->resourceSetToAddModList->list.array)
5539 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5541 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5542 if(rsrcSet->resourceList.list.array)
5544 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5546 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5548 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5550 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5552 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5554 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5557 //Free resource list
5558 if(pucchCfg->resourceToAddModList)
5560 if(pucchCfg->resourceToAddModList->list.array)
5562 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5564 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5565 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5566 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5568 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5570 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5574 if(pucchCfg->format1)
5576 if(pucchCfg->format1->choice.setup)
5578 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5579 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5581 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5585 if(pucchCfg->dl_DataToUL_ACK)
5587 if(pucchCfg->dl_DataToUL_ACK->list.array)
5589 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5591 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5593 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5595 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5598 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5600 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5604 /*******************************************************************
5606 * @brief Frees memory allocated for InitialUlBWP
5610 * Function : FreeInitialUlBWP
5612 * Functionality: Deallocating memory of InitialUlBWP
5614 * @params[in] BWP_UplinkDedicated_t *ulBwp
5618 * ****************************************************************/
5619 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5621 uint8_t rSetIdx, rsrcIdx;
5622 SRS_Config_t *srsCfg = NULLP;
5623 PUSCH_Config_t *puschCfg = NULLP;
5624 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5625 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5626 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5627 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5629 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5631 if(ulBwp->pusch_Config)
5633 if(ulBwp->pusch_Config->choice.setup)
5635 puschCfg=ulBwp->pusch_Config->choice.setup;
5636 if(puschCfg->dataScramblingIdentityPUSCH)
5638 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5640 FreePuschTimeDomAllocList(puschCfg);
5641 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5642 if(dmrsUlCfg->choice.setup)
5644 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5646 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5648 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5650 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5651 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5653 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5656 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5658 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5659 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5661 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5663 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5665 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5667 /* Free SRS-Config */
5668 if(ulBwp->srs_Config)
5670 if(ulBwp->srs_Config->choice.setup)
5672 srsCfg = ulBwp->srs_Config->choice.setup;
5674 /* Free Resource Set to add/mod list */
5675 if(srsCfg->srs_ResourceSetToAddModList)
5677 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5678 if(rsrcSetList->list.array)
5682 /* Free SRS resource Id list in this SRS resource set */
5683 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5685 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5687 if(rsrcIdList->list.array)
5689 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5691 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5693 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5695 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5696 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5699 /* Free resource type info for this SRS resource set */
5700 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5701 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5703 /* Free memory for each resource set */
5704 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5706 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5708 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5710 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5711 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5714 /* Free resource to add/modd list */
5715 if(srsCfg->srs_ResourceToAddModList)
5717 resourceList = srsCfg->srs_ResourceToAddModList;
5718 if(resourceList->list.array)
5721 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5722 sizeof(struct SRS_Resource__transmissionComb__n2));
5723 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5724 sizeof(struct SRS_Resource__resourceType__aperiodic));
5726 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5728 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5730 CU_FREE(resourceList->list.array, resourceList->list.size);
5732 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5733 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5736 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5738 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5742 /*******************************************************************
5744 * @brief Frees memory allocated for initialUplinkBWP
5748 * Function : FreeinitialUplinkBWP
5750 * Functionality: Deallocating memory of initialUplinkBWP
5752 * @params[in] UplinkConfig_t *ulCfg
5757 * ****************************************************************/
5758 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5760 BWP_UplinkDedicated_t *ulBwp=NULLP;
5761 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5763 if(ulCfg->initialUplinkBWP)
5765 ulBwp=ulCfg->initialUplinkBWP;
5766 if(ulCfg->firstActiveUplinkBWP_Id)
5768 if(ulCfg->pusch_ServingCellConfig)
5770 puschCfg=ulCfg->pusch_ServingCellConfig;
5771 if(puschCfg->choice.setup)
5773 if(puschCfg->choice.setup->ext1)
5775 CU_FREE(puschCfg->choice.setup->ext1->\
5776 processingType2Enabled,sizeof(BOOLEAN_t));
5777 CU_FREE(puschCfg->choice.setup->ext1->\
5778 maxMIMO_Layers,sizeof(long));
5779 CU_FREE(puschCfg->choice.setup->ext1, \
5780 sizeof(struct PUSCH_ServingCellConfig__ext1));
5782 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5784 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5786 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5788 FreeInitialUlBWP(ulBwp);
5789 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5792 /*******************************************************************
5794 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5798 * Function : FreeBWPDlDedPdschCfg
5800 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5802 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5807 * ****************************************************************/
5808 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5810 struct PDSCH_Config *pdschCfg=NULLP;
5811 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5812 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5813 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5815 if(dlBwp->pdsch_Config->choice.setup)
5817 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5818 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5820 if(pdschCfg->pdsch_TimeDomainAllocationList)
5822 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5823 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5825 prbBndlType=&pdschCfg->prb_BundlingType;
5826 CU_FREE(prbBndlType->choice.staticBundling,\
5827 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5828 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5830 FreePdschTimeDomAllocList(timeDomAllocList);
5831 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5832 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5834 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5835 if(dmrsDlCfg->choice.setup)
5837 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5839 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5841 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5842 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5844 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5847 /*******************************************************************
5849 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5853 * Function : FreeBWPDlDedPdcchCfg
5855 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5857 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5862 * ****************************************************************/
5863 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5867 struct PDCCH_Config *pdcchCfg=NULLP;
5868 struct ControlResourceSet *controlRSet=NULLP;
5869 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5871 if(dlBwp->pdcch_Config->choice.setup)
5873 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5874 if(pdcchCfg->controlResourceSetToAddModList)
5876 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5877 if(controlRSetList->list.array)
5879 controlRSet = controlRSetList->list.array[idx2];
5882 if(controlRSet->frequencyDomainResources.buf)
5884 if(controlRSet->pdcch_DMRS_ScramblingID)
5886 if(pdcchCfg->searchSpacesToAddModList)
5888 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5889 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5890 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5892 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5894 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5895 controlRSet->frequencyDomainResources.size);
5898 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5900 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5902 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5904 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5905 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5907 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5910 /*******************************************************************
5912 * @brief Builds RLC Config
5916 * Function : BuildRlcConfig
5918 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5920 * @params[in] RLC_Config *rlcConfig
5922 * @return ROK - success
5925 * ****************************************************************/
5926 uint8_t BuildRlcConfig(RlcLcCfg rlcLcCfgDb, struct RLC_Config *rlcConfig)
5928 rlcConfig->present = rlcLcCfgDb.rlcMode;
5930 switch(rlcConfig->present)
5932 case RLC_Config_PR_am:
5934 rlcConfig->choice.am = NULLP;
5935 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5936 if(!rlcConfig->choice.am)
5938 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5943 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5944 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5945 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5947 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5950 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.ulAmCfg.snLenUl;
5951 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = rlcLcCfgDb.u.amCfg.ulAmCfg.pollRetxTmr;
5952 rlcConfig->choice.am->ul_AM_RLC.pollPDU = rlcLcCfgDb.u.amCfg.ulAmCfg.pollPdu;
5953 rlcConfig->choice.am->ul_AM_RLC.pollByte = rlcLcCfgDb.u.amCfg.ulAmCfg.pollByte;
5954 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = rlcLcCfgDb.u.amCfg.ulAmCfg.maxRetxTh;
5957 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5958 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5959 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5961 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5964 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = rlcLcCfgDb.u.amCfg.dlAmCfg.snLenDl;
5965 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = rlcLcCfgDb.u.amCfg.dlAmCfg.reAssemTmr;
5966 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = rlcLcCfgDb.u.amCfg.dlAmCfg.statProhTmr;
5971 case RLC_Config_PR_um_Bi_Directional:
5973 rlcConfig->choice.um_Bi_Directional = NULLP;
5974 CU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
5975 if(!rlcConfig->choice.um_Bi_Directional)
5977 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5982 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
5983 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5984 if(!rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)
5986 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5989 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.ulUmCfg.snLenUlUm;
5992 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
5993 CU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
5994 if(!rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)
5996 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5999 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.snLenDlUm;
6000 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = rlcLcCfgDb.u.umBiDirCfg.dlUmCfg.reAssemTmr;
6007 /*******************************************************************
6009 * @brief Builds MAC LC Config
6013 * Function : BuildMacLCConfig
6015 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
6017 * @params[in] struct LogicalChannelConfig macLcConfig
6019 * @return ROK - success
6022 * ****************************************************************/
6023 uint8_t BuildMacLCConfig(MacLcCfg macLcCfgDb, struct LogicalChannelConfig *macLcConfig)
6026 macLcConfig->ul_SpecificParameters = NULLP;
6027 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6028 if(!macLcConfig->ul_SpecificParameters)
6030 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6034 macLcConfig->ul_SpecificParameters->priority = macLcCfgDb.priority;
6035 macLcConfig->ul_SpecificParameters->prioritisedBitRate = macLcCfgDb.pbr;
6036 macLcConfig->ul_SpecificParameters->bucketSizeDuration = macLcCfgDb.bsd;
6037 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
6038 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
6039 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
6040 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
6042 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
6043 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6044 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
6046 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6049 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = macLcCfgDb.lcGroup;
6051 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
6052 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6053 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
6055 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
6058 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = macLcCfgDb.schReqId;
6060 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
6061 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
6062 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
6066 /*******************************************************************
6068 * @brief Builds RLC Bearer to Add/Mod list
6072 * Function :BuildRlcBearerToAddModList
6074 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
6076 * @params[in] rlc_BearerToAddModList
6078 * @return ROK - success
6081 * ****************************************************************/
6082 uint8_t BuildRlcBearerToAddModList(CuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList, bool updateAllRbCfg)
6084 uint8_t idx, srbIdx = 0, drbIdx = 0, elementCnt=0;
6087 elementCnt = ueCb->numSrb + ueCb->numDrb;
6090 for(srbIdx = 0; srbIdx< ueCb->numSrb; srbIdx++)
6092 if(ueCb->srbList[srbIdx].cfgSentToUe == false)
6096 for(drbIdx = 0; drbIdx< ueCb->numDrb; drbIdx++)
6098 if(ueCb->drbList[drbIdx].cfgSentToUe == false)
6105 DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
6108 CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6111 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6114 rlcBearerList->list.count = elementCnt;
6115 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
6117 rlcBearerList->list.array = NULLP;
6118 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
6119 if(!rlcBearerList->list.array)
6121 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6125 for(idx=0; idx<rlcBearerList->list.count; idx++)
6127 rlcBearerList->list.array[idx] = NULLP;
6128 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6129 if(!rlcBearerList->list.array[idx])
6131 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6138 for(srbIdx=0; srbIdx < ueCb->numSrb; srbIdx++)
6140 if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
6143 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->srbList[srbIdx].lcId;
6145 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6146 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6148 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6152 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
6153 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->srbList[srbIdx].srbId;
6155 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6156 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6157 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6158 if(!rlcBearerList->list.array[idx]->rlc_Config)
6160 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6164 if(BuildRlcConfig(ueCb->srbList[srbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6166 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6170 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6171 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6172 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6174 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6178 if(BuildMacLCConfig(ueCb->srbList[srbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6180 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6186 for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
6188 if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
6191 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
6193 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6194 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
6196 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6200 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
6201 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->drbList[drbIdx].drbId;
6203 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
6204 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
6205 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
6206 if(!rlcBearerList->list.array[idx]->rlc_Config)
6208 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6212 if(BuildRlcConfig(ueCb->drbList[drbIdx].rlcLcCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
6214 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
6218 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
6219 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6220 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
6222 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
6226 if(BuildMacLCConfig(ueCb->drbList[drbIdx].macLcCfg, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
6228 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
6236 /*******************************************************************
6238 * @brief Free memory allocated for CellGroupConfig
6242 * Function : FreeMemCellGrpCfg
6244 * Functionality: Deallocating memory of CellGroupConfig
6246 * @params[in] pointer to CellGroupConfigRrc_t
6248 * @return ROK - success
6251 ******************************************************************/
6252 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
6255 SpCellConfig_t *spCellCfg=NULLP;
6256 ServingCellConfig_t *srvCellCfg=NULLP;
6257 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6258 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6259 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6260 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6261 struct RLC_Config *rlcConfig=NULLP;
6262 struct LogicalChannelConfig *macLcConfig=NULLP;
6263 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6264 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6265 struct TAG_Config *tagConfig=NULLP;
6266 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6267 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6268 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6270 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6273 if(rlcBearerList->list.array)
6275 for(idx=0; idx<rlcBearerList->list.count; idx++)
6277 if(rlcBearerList->list.array[idx])
6279 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6280 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6283 if(rlcConfig->choice.am)
6285 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6286 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6287 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6289 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
6291 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6294 if(macLcConfig->ul_SpecificParameters)
6296 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6297 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6298 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6300 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
6302 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
6305 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
6307 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
6310 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6313 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6314 if(schedulingRequestConfig)
6316 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6319 if(schReqList->list.array)
6321 for(idx=0;idx<schReqList->list.count; idx++)
6323 if(schReqList->list.array[idx])
6325 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
6326 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
6329 CU_FREE(schReqList->list.array, schReqList->list.size);
6331 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
6332 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
6333 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6335 if(macCellGrpCfg->bsr_Config)
6337 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6339 tagConfig = macCellGrpCfg->tag_Config;
6342 tagList = tagConfig->tag_ToAddModList;
6345 if(tagList->list.array)
6347 for(idx=0; idx<tagList->list.count; idx++)
6349 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
6351 CU_FREE(tagList->list.array, tagList->list.size);
6353 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
6355 CU_FREE(tagConfig, sizeof(struct TAG_Config));
6358 phrConfig = macCellGrpCfg->phr_Config;
6361 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
6362 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
6365 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
6368 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6371 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6372 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
6375 spCellCfg = cellGrpCfg->spCellConfig;
6378 if(spCellCfg->servCellIndex)
6380 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6382 if(spCellCfg->spCellConfigDedicated)
6384 srvCellCfg = spCellCfg->spCellConfigDedicated;
6385 if(srvCellCfg->initialDownlinkBWP)
6387 dlBwp = srvCellCfg->initialDownlinkBWP;
6388 if(srvCellCfg->firstActiveDownlinkBWP_Id)
6390 if(srvCellCfg->defaultDownlinkBWP_Id)
6392 if(srvCellCfg->uplinkConfig)
6394 if(srvCellCfg->pdsch_ServingCellConfig)
6396 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
6397 if(pdschCfg->choice.setup)
6399 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
6400 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
6402 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
6403 ServingCellConfig__pdsch_ServingCellConfig));
6405 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
6406 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6408 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6410 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6412 if(dlBwp->pdcch_Config)
6414 if(dlBwp->pdsch_Config)
6416 FreeBWPDlDedPdschCfg(dlBwp);
6417 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
6419 FreeBWPDlDedPdcchCfg(dlBwp);
6420 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
6422 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6424 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6426 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6428 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
6430 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
6435 /*******************************************************************
6437 * @brief Fills CellGroupConfig
6441 * Function : fillCellGrpCfg
6443 * Functionality: Fills CellGroupConfig
6445 * @params[in] pointer to CellGroupConfigRrc_t
6447 * @return ROK - success
6450 ******************************************************************/
6452 uint8_t fillCellGrpCfg(CuUeCb *ueCb, OCTET_STRING_t *cellGrp, bool updateAllRbCfg)
6454 uint8_t ret = RFAILED;
6455 CellGroupConfigRrc_t cellGrpCfg;
6456 asn_enc_rval_t encRetVal;
6460 cellGrpCfg.cellGroupId = CELL_GRP_ID;
6462 cellGrpCfg.rlc_BearerToAddModList = NULLP;
6464 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
6466 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6470 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6471 cellGrpCfg.mac_CellGroupConfig = NULLP;
6472 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6473 if(!cellGrpCfg.mac_CellGroupConfig)
6475 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6478 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6480 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6484 cellGrpCfg.physicalCellGroupConfig = NULLP;
6485 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6486 if(!cellGrpCfg.physicalCellGroupConfig)
6488 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6491 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6493 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6497 cellGrpCfg.spCellConfig = NULLP;
6498 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6499 if(!cellGrpCfg.spCellConfig)
6501 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6504 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6506 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6510 cellGrpCfg.sCellToAddModList = NULLP;
6511 cellGrpCfg.sCellToReleaseList = NULLP;
6512 cellGrpCfg.ext1 = NULLP;
6514 /* encode cellGrpCfg into duToCuRrcContainer */
6515 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6516 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6518 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6519 /* Encode results */
6520 if(encRetVal.encoded == ENCODE_FAIL)
6522 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6523 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6528 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6529 for(int i=0; i< encBufSize; i++)
6531 DU_LOG("%x",encBuf[i]);
6535 cellGrp->size = encBufSize;
6536 CU_ALLOC(cellGrp->buf, cellGrp->size);
6539 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6542 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6546 FreeMemCellGrpCfg(&cellGrpCfg);
6550 /*******************************************************************
6552 * @brief Free UE Capability RAT container
6556 * Function : freeUeCapRatCont
6559 * Free UE Capability RAT conatiner
6562 * @return ROK - success
6565 * ****************************************************************/
6566 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6569 FeatureSets_t *featureSets;
6571 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6573 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6575 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6576 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6578 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6581 if(ueNrCap->featureSets)
6583 featureSets = ueNrCap->featureSets;
6584 if(featureSets->featureSetsDownlinkPerCC)
6586 if(featureSets->featureSetsDownlinkPerCC->list.array)
6588 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6590 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6591 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6592 sizeof(ModulationOrder_t));
6593 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6595 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6597 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6600 if(featureSets->featureSetsUplinkPerCC)
6602 if(featureSets->featureSetsUplinkPerCC->list.array)
6604 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6606 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6608 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6609 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6610 sizeof(ModulationOrder_t));
6611 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6614 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6616 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6618 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6622 /*******************************************************************
6624 * @brief Free UE capability RAT container list
6628 * Function : freeUeCapRatContList
6630 * Functionality: Free UE capability RAT container list
6633 * @return ROK - success
6636 * ****************************************************************/
6637 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6640 if(ueCapablityList->list.array)
6642 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6644 if(ueCapablityList->list.array[idx])
6645 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6647 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6651 /*******************************************************************
6653 * @brief Free Handover preparation information
6657 * Function : freeHOPreparationInfo
6659 * Functionality: Free Handover preparation information
6662 * @return ROK - success
6665 * ****************************************************************/
6666 void freeHOPreparationInfo(HandoverPreparationInformationRrc_t *hoPrep)
6668 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
6670 if(hoPrep->criticalExtensions.choice.c1)
6672 if(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation)
6674 hoPrepInfoIe = hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation;
6675 freeUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
6676 CU_FREE(hoPrep->criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
6677 sizeof(HandoverPreparationInformationRrc_IEs_t));
6679 CU_FREE(hoPrep->criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
6683 /*******************************************************************
6685 * @brief Fill feature sets
6689 * Function : fillFeatureSets
6691 * Functionality: Fill feature sets
6694 * @return ROK - success
6697 * ****************************************************************/
6698 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6700 uint8_t idx, elementCnt;
6702 featureSets->featureSetsDownlink = NULLP;
6703 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6704 if(!featureSets->featureSetsDownlinkPerCC)
6706 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6711 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6712 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6713 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6714 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6716 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6720 for(idx = 0; idx < elementCnt; idx++)
6722 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6723 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6725 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6731 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6732 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6733 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6734 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6735 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6737 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6738 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6740 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6743 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6745 featureSets->featureSetsUplink = NULLP;
6746 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6747 if(!featureSets->featureSetsUplinkPerCC)
6749 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6754 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6755 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6756 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6757 if(!featureSets->featureSetsUplinkPerCC->list.array)
6759 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6763 for(idx = 0; idx < elementCnt; idx++)
6765 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6766 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6768 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6774 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6775 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6776 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6777 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6778 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6779 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6781 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6782 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6784 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6787 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6792 /*******************************************************************
6794 * @brief Fill UE capability RAT container
6798 * Function : fillUeCapRatCont
6800 * Functionality: Fill UE capability RAT container
6802 * @params[in] UE Capability RAT container buffer
6803 * @return ROK - success
6806 * ****************************************************************/
6807 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6810 uint8_t idx, elementCnt;
6811 asn_enc_rval_t encRetVal;
6812 UE_NR_Capability_t ueNrCap;
6816 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6818 /* Filling PDCP parameters */
6819 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6820 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6821 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6822 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6823 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6824 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6825 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6826 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6827 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6828 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6829 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6830 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6831 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6832 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6833 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6834 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6835 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6837 ueNrCap.rlc_Parameters = NULLP;
6838 ueNrCap.mac_Parameters = NULLP;
6840 /* Filling PHY parameters */
6841 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6842 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6843 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6844 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6845 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6847 /* Filling RF parameters */
6849 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6850 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6851 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6852 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6854 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6859 for(idx = 0; idx < elementCnt; idx++)
6861 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6862 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6872 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6873 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6874 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6876 ueNrCap.measAndMobParameters = NULLP;
6877 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6878 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6879 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6880 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6881 ueNrCap.featureSets = NULLP;
6883 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6884 if(!ueNrCap.featureSets)
6886 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6891 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6893 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6898 ueNrCap.featureSetCombinations = NULLP;
6899 ueNrCap.lateNonCriticalExtension = NULLP;
6900 ueNrCap.nonCriticalExtension = NULLP;
6902 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6903 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6904 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6906 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6908 /* Encode results */
6909 if(encRetVal.encoded == ENCODE_FAIL)
6911 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6912 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6917 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6918 for(int i=0; i< encBufSize; i++)
6920 DU_LOG("%x",encBuf[i]);
6924 ueCapRatContBuf->size = encBufSize;
6925 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6926 if(!ueCapRatContBuf->buf)
6928 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6931 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6935 freeUeCapRatCont(&ueNrCap);
6939 /*******************************************************************
6941 * @brief Fill UE Capability RAT container list
6945 * Function : fillUeCapRatContList
6947 * Functionality: Fill UE Capability RAT container list
6950 * @params[in] UE capability RAT container list
6951 * @return ROK - success
6954 * ****************************************************************/
6955 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6957 uint8_t ret = RFAILED;
6958 uint8_t idx, elementCnt;
6963 ueCapablityList->list.count = elementCnt;
6964 ueCapablityList->list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6966 CU_ALLOC(ueCapablityList->list.array, ueCapablityList->list.size);
6967 if(!ueCapablityList->list.array)
6969 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6974 for(idx=0; idx<elementCnt; idx++)
6976 CU_ALLOC(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6977 if(ueCapablityList->list.array[idx] == NULLP)
6979 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6985 ueCapablityList->list.array[idx]->rat_Type = RAT_Type_nr;
6986 if(fillUeCapRatCont(&ueCapablityList->list.array[idx]->ue_CapabilityRAT_Container) != ROK)
6988 DU_LOG("\nERROR --> F1AP : Failed to fill UE capability RAT Conatiner");
6999 /*******************************************************************
7001 * @brief Fill UE Capability RAT container list octet string
7005 * Function : fillUeCapRatContListBuf
7007 * Functionality: Fill UE Capability RAT container list octet string
7010 * @params[in] UE capability RAT container list buffer
7011 * @return ROK - success
7014 * ****************************************************************/
7015 uint8_t fillUeCapRatContListBuf(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
7017 uint8_t ret = RFAILED;
7018 asn_enc_rval_t encRetVal;
7019 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
7023 ret = fillUeCapRatContList(&ueCapablityList);
7026 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
7030 /* encode UE Capability RAT Container List into duToCuRrcContainer */
7031 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
7032 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7034 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
7035 &ueCapablityList, PrepFinalEncBuf, encBuf);
7037 /* Encode results */
7038 if(encRetVal.encoded == ENCODE_FAIL)
7040 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
7041 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7046 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
7047 for(int i=0; i< encBufSize; i++)
7049 DU_LOG("%x",encBuf[i]);
7053 ueCapablityListBuf->size = encBufSize;
7054 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
7055 if(!ueCapablityListBuf->buf)
7057 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
7060 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
7064 freeUeCapRatContList(&ueCapablityList);
7068 /*******************************************************************
7070 * @brief Free Measurement Timing Configuration
7074 * Function : freeMeasuementTimingConfig
7076 * Functionality: Free Measurement Timing Configuration
7078 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7081 * ****************************************************************/
7082 void freeMeasuementTimingConfig(MeasurementTimingConfigurationRrc_t measTimingConfig)
7085 MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg = NULLP;
7086 MeasTiming_t *measTiming = NULLP;
7088 if(measTimingConfig.criticalExtensions.choice.c1)
7090 if(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7092 measTimingCfg = measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf;
7093 if(measTimingCfg->measTiming)
7095 if(measTimingCfg->measTiming->list.array)
7097 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7099 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7100 CU_FREE(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7101 CU_FREE(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7103 CU_FREE(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7105 CU_FREE(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7107 CU_FREE(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7109 CU_FREE(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7113 /*******************************************************************
7115 * @brief Fill Measurement Timing Configuration
7119 * Function : fillMeasTimingCfg
7121 * Functionality: Fill Measurement Timing Configuration
7123 * @params[in] MeasurementTimingConfiguration_IEs_t measTimingCfg
7124 * @return ROK - success
7127 * ****************************************************************/
7128 uint8_t fillMeasTimingCfg(MeasurementTimingConfigurationRrc_IEs_t *measTimingCfg)
7130 uint8_t elementCnt = 0;
7131 uint8_t measCfgIdx = 0;
7132 MeasTiming_t *measTiming;
7135 CU_ALLOC(measTimingCfg->measTiming, sizeof(MeasTimingList_t));
7136 if(!measTimingCfg->measTiming)
7138 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming in fillMeasTimingCfg");
7143 measTimingCfg->measTiming->list.count = elementCnt;
7144 measTimingCfg->measTiming->list.size = measTimingCfg->measTiming->list.count * sizeof(MeasTiming_t *);
7145 CU_ALLOC(measTimingCfg->measTiming->list.array, measTimingCfg->measTiming->list.size);
7146 if(!measTimingCfg->measTiming->list.array)
7148 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array in fillMeasTimingCfg");
7152 for(measCfgIdx = 0; measCfgIdx < measTimingCfg->measTiming->list.count; measCfgIdx++)
7154 CU_ALLOC(measTimingCfg->measTiming->list.array[measCfgIdx], sizeof(MeasTiming_t));
7155 if(!measTimingCfg->measTiming->list.array[measCfgIdx])
7157 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measTiming array element in fillMeasTimingCfg");
7163 measTiming = measTimingCfg->measTiming->list.array[measCfgIdx];
7164 CU_ALLOC(measTiming->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
7165 if(!measTiming->frequencyAndTiming)
7167 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for frequency and timing IE in fillMeasTimingCfg");
7171 measTiming->frequencyAndTiming->carrierFreq = 623800; /* This is a randomly chosen value since ARFCN configured in DU is 623400 */
7172 measTiming->frequencyAndTiming->ssbSubcarrierSpacing = SubcarrierSpacing_kHz15;
7174 smtc = &measTiming->frequencyAndTiming->ssb_MeasurementTimingConfiguration;
7175 smtc->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7176 smtc->periodicityAndOffset.choice.sf20 = 0;
7177 smtc->duration = SSB_MTC__duration_sf1;
7181 /*******************************************************************
7183 * @brief Fill Measurement Timing Configuration Octet string
7187 * Function : fillMeasConfigBuf
7189 * Functionality: Fill Measurement Timing Configuration Octet string
7192 * @params[in] MeasConfig_t *measConfgBuf
7193 * @return ROK - success
7196 * ****************************************************************/
7197 uint8_t fillMeasTimingConfigBuf(MeasConfig_t *measTimingConfigBuf)
7199 uint8_t ret = RFAILED;
7200 asn_enc_rval_t encRetVal;
7201 MeasurementTimingConfigurationRrc_t measTimingConfig;
7205 measTimingConfig.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
7206 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
7207 if(!measTimingConfig.criticalExtensions.choice.c1)
7209 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement configuration extension");
7212 measTimingConfig.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
7214 CU_ALLOC(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(struct MeasurementTimingConfigurationRrc_IEs));
7215 if(!measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf)
7217 DU_LOG( "\nERROR --> F1AP : Failed to allocated memory for measurement timing configuration IE");
7221 ret = fillMeasTimingCfg(measTimingConfig.criticalExtensions.choice.c1->choice.measTimingConf);
7224 DU_LOG( "\nERROR --> F1AP : Failed to fill measurement timing configuration IE");
7228 /* Encode measurement timing configuration into octet string */
7229 xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfig);
7230 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7232 encRetVal = aper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfig, PrepFinalEncBuf, encBuf);
7234 /* Encode results */
7235 if(encRetVal.encoded == ENCODE_FAIL)
7237 DU_LOG( "\nERROR --> F1AP : Could not encode Measurement Timing Configuration (at %s)\n",\
7238 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7243 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for Measurement timing configuration\n");
7244 for(int i=0; i< encBufSize; i++)
7246 DU_LOG("%x",encBuf[i]);
7250 measTimingConfigBuf->size = encBufSize;
7251 CU_ALLOC(measTimingConfigBuf->buf, measTimingConfigBuf->size);
7252 if(!measTimingConfigBuf->buf)
7254 DU_LOG("\nERROR --> F1AP : Memory allocation failed fillMeasTimingConfigBuf");
7257 memcpy(measTimingConfigBuf->buf, encBuf, measTimingConfigBuf->size);
7261 freeMeasuementTimingConfig(measTimingConfig);
7265 /******************************************************************
7267 * @brief Free RRC reconfiguration non-critical extension
7271 * Function : freeRrcReconfigNonCriticalExt
7273 * Functionality: Free RRC reconfiguration non-critical extension
7275 * @params[in] RRC reconfiguration IE
7278 * ****************************************************************/
7279 void freeRrcReconfigNonCriticalExt(RRCReconfiguration_v1530_IEs_t *rrcRecfg)
7281 if(rrcRecfg->masterCellGroup)
7283 CU_FREE(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
7287 /******************************************************************
7289 * @brief Free measurement object addmod list
7293 * Function : freeMeasObjToAddModList
7295 * Functionality: Free measurement object add mod list
7297 * @params[in] Measurement object add/mod list
7300 * ****************************************************************/
7301 void freeMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7304 MeasObjectNR_t *measObject;
7306 if(measObjList->list.array)
7308 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7310 if(measObjList->list.array[objIdx])
7312 if(measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7314 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7315 CU_FREE(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7316 CU_FREE(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7317 CU_FREE(measObject->smtc1 , sizeof(SSB_MTC_t));
7318 if(measObject->absThreshSS_BlocksConsolidation)
7320 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7321 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
7322 CU_FREE(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
7323 CU_FREE(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7325 CU_FREE(measObject->nrofSS_BlocksToAverage, sizeof(long));
7326 CU_FREE(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
7327 CU_FREE(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
7328 CU_FREE(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
7329 CU_FREE(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7331 CU_FREE(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7334 CU_FREE(measObjList->list.array, measObjList->list.size);
7338 /******************************************************************
7340 * @brief Free report config add mod list
7344 * Function : freeReportCfgToAddModList
7346 * Functionality: Free report config add mod list
7348 * @params[in] Report config list
7351 * ****************************************************************/
7352 void freeReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
7354 uint8_t reportCfgIdx;
7355 ReportConfigToAddMod_t *reportCfg;
7356 ReportConfigNR_t *reportCfgNr;
7357 EventTriggerConfig_t *eventTriggCfg;
7359 if(reportCfgList->list.array)
7361 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
7363 if(reportCfgList->list.array[reportCfgIdx])
7365 reportCfg = reportCfgList->list.array[reportCfgIdx];
7366 if(reportCfg->reportConfig.choice.reportConfigNR)
7368 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
7369 if(reportCfgNr->reportType.choice.eventTriggered)
7371 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
7372 CU_FREE(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
7373 CU_FREE(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
7374 CU_FREE(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
7375 CU_FREE(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
7379 CU_FREE(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
7381 CU_FREE(reportCfgList->list.array, reportCfgList->list.size);
7385 /******************************************************************
7387 * @brief Free measurement id to add mod list
7391 * Function : freeMeasIdToAddModList
7393 * Functionality: Free measurement id to add mod list
7395 * @params[in] Measurement id to add mod list
7398 * ****************************************************************/
7399 void freeMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
7402 if(measIdList->list.array)
7404 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
7406 CU_FREE(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
7408 CU_FREE(measIdList->list.array, measIdList->list.size);
7412 /*******************************************************************
7414 * @brief Free quantity config
7418 * Function : freeQunatityConfig
7420 * Functionality: Free quantity config
7422 * @params[in] Quantity Config
7425 * ****************************************************************/
7426 void freeQuantityConfig(QuantityConfig_t *quantityCfg)
7429 QuantityConfigNR_t *quantityCfgNr;
7431 if(quantityCfg->quantityConfigNR_List)
7433 if(quantityCfg->quantityConfigNR_List->list.array)
7435 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
7437 if(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
7439 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
7440 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7441 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7442 CU_FREE(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7443 if(quantityCfgNr->quantityConfigRS_Index)
7445 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
7446 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
7447 CU_FREE(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
7448 CU_FREE(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
7450 CU_FREE(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
7453 CU_FREE(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
7455 CU_FREE(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
7459 /******************************************************************
7461 * @brief Free measurement Config
7465 * Function : freeMeasConfig
7467 * Functionality: Free measurement config
7469 * @params[in] Measurement config
7472 * ****************************************************************/
7473 void freeMeasConfig(MeasConfigRrc_t *measConfig)
7475 if(measConfig->measObjectToAddModList)
7477 freeMeasObjToAddModList(measConfig->measObjectToAddModList);
7478 CU_FREE(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
7480 if(measConfig->reportConfigToAddModList)
7482 freeReportCfgToAddModList(measConfig->reportConfigToAddModList);
7483 CU_FREE(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
7485 if(measConfig->measIdToAddModList)
7487 freeMeasIdToAddModList(measConfig->measIdToAddModList);
7488 CU_FREE(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
7490 if(measConfig->s_MeasureConfig)
7492 CU_FREE(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
7494 if(measConfig->quantityConfig)
7496 freeQuantityConfig(measConfig->quantityConfig);
7497 CU_FREE(measConfig->quantityConfig, sizeof(QuantityConfig_t));
7500 /******************************************************************
7502 * @brief Free DRB to AddMod List
7506 * Function : freeDrbToAddModList
7508 * Functionality: Free SRB to AddMod List
7510 * @params[in] SBR to add/mod list
7513 * ****************************************************************/
7514 void freeDrbToAddModList(DRB_ToAddModList_t *drbToAddList)
7517 if(drbToAddList->list.array)
7519 for(drbIdx = 0; drbIdx < drbToAddList->list.count; drbIdx++)
7521 if(drbToAddList->list.array[drbIdx]->pdcp_Config)
7523 if(drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7525 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7526 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7527 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7528 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7530 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7531 CU_FREE(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7533 CU_FREE(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7535 CU_FREE(drbToAddList->list.array, drbToAddList->list.size);
7539 /******************************************************************
7541 * @brief Free SRB to AddMod List
7545 * Function : freeSrbToAddModList
7547 * Functionality: Free SRB to AddMod List
7549 * @params[in] SBR to add/mod list
7552 * ****************************************************************/
7553 void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList)
7556 if(srbToAddList->list.array)
7558 for(srbIdx = 0; srbIdx < srbToAddList->list.count; srbIdx++)
7560 CU_FREE(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7561 if(srbToAddList->list.array[srbIdx]->pdcp_Config)
7563 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7564 CU_FREE(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7567 CU_FREE(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7569 CU_FREE(srbToAddList->list.array, srbToAddList->list.size);
7573 /******************************************************************
7575 * @brief Free Radio Bearer Config
7579 * Function : freeRadioBearerConfig
7581 * Functionality: Free Radio Bearer config
7583 * @params[in] Radio bearer config
7586 * ****************************************************************/
7587 void freeRadioBearerConfig(RadioBearerConfig_t *radioBearerConfig)
7589 if(radioBearerConfig->srb_ToAddModList)
7591 freeSrbToAddModList(radioBearerConfig->srb_ToAddModList);
7592 CU_FREE(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7594 if(radioBearerConfig->drb_ToAddModList)
7596 freeDrbToAddModList(radioBearerConfig->drb_ToAddModList);
7597 CU_FREE(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7601 /******************************************************************
7603 * @brief Free reconfiguration message
7607 * Function : freeRrcReconfig
7609 * Functionality: Free reconfiguration message
7611 * @params[in] RRC Reconfiguration message
7614 * ****************************************************************/
7615 void freeRrcReconfig(RRCReconfiguration_t *rrcReconfig)
7617 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
7619 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
7621 freeRadioBearerConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
7622 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
7624 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
7626 freeMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig);
7627 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
7629 if(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
7631 freeRrcReconfigNonCriticalExt(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension);
7632 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
7634 CU_FREE(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
7638 /******************************************************************
7640 * @brief Fill SRB To Add Mod list
7644 * Function : fillSrbToAddModList
7646 * Functionality: fill SRB to Add Mod list
7648 * @params[in] UE control block
7649 * SRB to Add/Mod list
7650 * @return ROK - success
7653 * ****************************************************************/
7654 uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
7656 uint8_t srbIdx, srbDbIdx, elementCnt = 0;
7659 elementCnt = ueCb->numSrb;
7662 for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7664 if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
7671 DU_LOG("INFO --> F1AP : No SRB available to add or modify");
7675 srbToAddList->list.count = elementCnt;
7676 srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
7678 CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
7679 if(!srbToAddList->list.array)
7681 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list array in fillSrbToAddModList");
7686 for(srbDbIdx = 0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
7688 if(!updateAllRbCfg && ueCb->srbList[srbDbIdx].cfgSentToUe)
7691 CU_ALLOC(srbToAddList->list.array[srbIdx], sizeof(SRB_ToAddMod_t));
7692 if(!srbToAddList->list.array[srbIdx])
7694 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod list element in fillSrbToAddModList");
7698 srbToAddList->list.array[srbIdx]->srb_Identity = ueCb->srbList[srbDbIdx].srbId;
7700 /* Reestablish PDCP */
7701 CU_ALLOC(srbToAddList->list.array[srbIdx]->reestablishPDCP, sizeof(long));
7702 if(!srbToAddList->list.array[srbIdx]->reestablishPDCP)
7704 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reestablish PDCP IE in fillSrbToAddModList");
7707 *(srbToAddList->list.array[srbIdx]->reestablishPDCP) = SRB_ToAddMod__reestablishPDCP_true;
7709 /* PDCP configuration */
7710 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7711 if(!srbToAddList->list.array[srbIdx]->pdcp_Config)
7713 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillSrbToAddModList");
7717 /* Reordering timer */
7718 CU_ALLOC(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7719 if(!srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering)
7721 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillSrbToAddModList");
7724 *(srbToAddList->list.array[srbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7731 /******************************************************************
7733 * @biief Fill DRBeTo Add Mod list
7737 * Function : fillDrbToAddModList
7739 * Functionality: fill DRB to Add Mod list
7741 * @params[in] UE control block
7742 * DRB to Add/Mod list
7743 * @return ROK - success
7746 * ****************************************************************/
7747 uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
7749 uint8_t drbIdx, drbDbIdx, elementCnt = 0;
7752 elementCnt = ueCb->numDrb;
7755 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7757 if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
7764 DU_LOG("INFO --> F1AP : No DRB available to add or modify");
7769 drbToAddList->list.count = elementCnt;
7770 drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
7772 CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
7773 if(!drbToAddList->list.array)
7775 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list array in fillDrbToAddModList");
7780 for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
7782 if(!updateAllRbCfg && ueCb->drbList[drbDbIdx].cfgSentToUe)
7785 CU_ALLOC(drbToAddList->list.array[drbIdx], sizeof(DRB_ToAddMod_t));
7786 if(!drbToAddList->list.array[drbIdx])
7788 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod list elements in fillDrbToAddModList");
7793 drbToAddList->list.array[drbIdx]->drb_Identity = ueCb->drbList[drbDbIdx].drbId;
7796 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config, sizeof(PDCP_Config_t));
7797 if(!drbToAddList->list.array[drbIdx]->pdcp_Config)
7799 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config IE in fillDrbToAddModList");
7803 /* PDCP Config -> DRB */
7804 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb, sizeof(struct PDCP_Config__drb));
7805 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb)
7807 DU_LOG("\nERROR --> F1AP: Memory allocation failed for PDCP config drb in fillDrbToAddModList");
7811 /* DRB -> Discard Timer */
7812 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer, sizeof(long));
7813 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer)
7815 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB discard timer in fillDrbToAddModList");
7818 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->discardTimer) = PDCP_Config__drb__discardTimer_infinity;
7820 /* UL PDCP SN length */
7821 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL, sizeof(long));
7822 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL)
7824 DU_LOG("\nERROR --> F1AP: Memory allocation failed for UL SN length in fillDrbToAddModList");
7827 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeUL) = PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
7829 /* DL PDCP SN length */
7830 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL, sizeof(long));
7831 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL)
7833 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DL SN length in fillDrbToAddModList");
7836 *(drbToAddList->list.array[drbIdx]->pdcp_Config->drb->pdcp_SN_SizeDL) = PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
7838 /* Header Compression */
7839 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.present = PDCP_Config__drb__headerCompression_PR_notUsed;
7840 drbToAddList->list.array[drbIdx]->pdcp_Config->drb->headerCompression.choice.notUsed = NULLP;
7842 /* Reordering timer */
7843 CU_ALLOC(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering, sizeof(long));
7844 if(!drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering)
7846 DU_LOG("\nERROR --> F1AP: Memory allocation failed for reordering timer in fillDrbToAddModList");
7849 *(drbToAddList->list.array[drbIdx]->pdcp_Config->t_Reordering) = PDCP_Config__t_Reordering_ms40;
7857 /******************************************************************
7859 * @brief Fill Radio bearer configuration
7863 * Function : fillRadioBearerConfig
7865 * Functionality: Fill Radio bearer configuration
7867 * @params[in] UE control block
7868 * Radio bearer config pointer
7869 * @return ROK - success
7872 * ****************************************************************/
7873 uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
7875 /* SRB To Add/Mod List */
7876 CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
7877 if(!radioBearerConfig->srb_ToAddModList)
7879 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
7882 if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
7884 DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List");
7888 /* DRB To Add/Mod List */
7889 CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
7890 if(!radioBearerConfig->drb_ToAddModList)
7892 DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
7895 if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
7897 DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List ");
7904 /*******************************************************************
7906 * @brief Fill measurement object to add/mod list
7910 * Function : fillMeasObjToAddModList
7912 * Functionality: Fill measurement object to add/mod list
7914 * @params[in] Measurement object to add/mod list
7915 * @return ROK - success
7918 * ****************************************************************/
7919 uint8_t fillMeasObjToAddModList(MeasObjectToAddModList_t *measObjList)
7921 uint8_t elementCnt, objIdx;
7922 MeasObjectNR_t *measObject;
7925 measObjList->list.count = elementCnt;
7926 measObjList->list.size = measObjList->list.count * sizeof(MeasObjectToAddMod_t *);
7928 CU_ALLOC(measObjList->list.array, measObjList->list.size);
7929 if(!measObjList->list.array)
7931 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array");
7935 for(objIdx = 0; objIdx < measObjList->list.size; objIdx++)
7937 CU_ALLOC(measObjList->list.array[objIdx], sizeof(MeasObjectToAddMod_t));
7938 if(!measObjList->list.array[objIdx])
7940 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list's array element");
7946 measObjList->list.array[objIdx]->measObjectId = 1;
7947 measObjList->list.array[objIdx]->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectNR;
7948 CU_ALLOC(measObjList->list.array[objIdx]->measObject.choice.measObjectNR, sizeof(MeasObjectNR_t));
7949 if(!measObjList->list.array[objIdx]->measObject.choice.measObjectNR)
7951 DU_LOG("\nERROR --> F1AP: Memory allocation failed for mesurement object NR");
7955 measObject = measObjList->list.array[objIdx]->measObject.choice.measObjectNR;
7958 CU_ALLOC(measObject->ssbFrequency, sizeof(ARFCN_ValueNR_t));
7959 if(!measObject->ssbFrequency)
7961 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB frequency in fillMeasObjToAddModList");
7964 *(measObject->ssbFrequency) = 620736; /* Value picked from reference PCAP logs */
7966 /* Subcarrier spacing */
7967 CU_ALLOC(measObject->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
7968 if(!measObject->ssbSubcarrierSpacing)
7970 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB subcarrier spacing in fillMeasObjToAddModList");
7973 *(measObject->ssbSubcarrierSpacing) = SubcarrierSpacing_kHz15;
7976 CU_ALLOC(measObject->smtc1 , sizeof(SSB_MTC_t));
7977 if(!measObject->smtc1)
7979 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SMTC1 in fillMeasObjToAddModList");
7982 measObject->smtc1->duration = SSB_MTC__duration_sf1;
7983 measObject->smtc1->periodicityAndOffset.present = SSB_MTC__periodicityAndOffset_PR_sf20;
7984 measObject->smtc1->periodicityAndOffset.choice.sf20 = 0;
7986 /* Absoulute threshold SSB consolidation */
7987 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation, sizeof(ThresholdNR_t));
7988 if(!measObject->absThreshSS_BlocksConsolidation)
7990 DU_LOG("\nERROR --> F1AP: Memory allocation failed for absolute threshold SSB consolidation in fillMeasObjToAddModList");
7994 /* RSRP threshold */
7995 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP, sizeof(RSRP_Range_t));
7996 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRP)
7998 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRP in fillMeasObjToAddModList");
8001 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRP) = 1;
8003 /* RSRQ threshold */
8004 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ, sizeof(RSRQ_Range_t));
8005 if(!measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ)
8007 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold RSRQ in fillMeasObjToAddModList");
8010 *(measObject->absThreshSS_BlocksConsolidation->thresholdRSRQ) = 1;
8012 /* SINR threshold */
8013 CU_ALLOC(measObject->absThreshSS_BlocksConsolidation->thresholdSINR, sizeof(SINR_Range_t));
8014 if(!measObject->absThreshSS_BlocksConsolidation->thresholdSINR)
8016 DU_LOG("\nERROR --> F1AP: Memory allocation failed for threshold SINR in fillMeasObjToAddModList");
8019 *(measObject->absThreshSS_BlocksConsolidation->thresholdSINR) = 1;
8021 /* Number of SSBs to average */
8022 CU_ALLOC(measObject->nrofSS_BlocksToAverage, sizeof(long));
8023 if(!measObject->nrofSS_BlocksToAverage)
8025 DU_LOG("\nERROR --> F1AP: Memory allocation failed for number of SSB to average in fillMeasObjToAddModList");
8028 *(measObject->nrofSS_BlocksToAverage) = 2;
8030 /* Quantity Config index */
8031 measObject->quantityConfigIndex = 1;
8034 /* RSRP offset for SSB */
8035 CU_ALLOC(measObject->offsetMO.rsrpOffsetSSB, sizeof(Q_OffsetRange_t));
8036 if(!measObject->offsetMO.rsrpOffsetSSB)
8038 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRP offset in fillMeasObjToAddModList");
8041 *(measObject->offsetMO.rsrpOffsetSSB) = Q_OffsetRange_dB0;
8043 /* RSRQ offset for SSB */
8044 CU_ALLOC(measObject->offsetMO.rsrqOffsetSSB, sizeof(Q_OffsetRange_t));
8045 if(!measObject->offsetMO.rsrpOffsetSSB)
8047 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB RSRQ offset in fillMeasObjToAddModList");
8050 *(measObject->offsetMO.rsrqOffsetSSB) = Q_OffsetRange_dB0;
8052 /* SINR offset for SSB */
8053 CU_ALLOC(measObject->offsetMO.sinrOffsetSSB, sizeof(Q_OffsetRange_t));
8054 if(!measObject->offsetMO.sinrOffsetSSB)
8056 DU_LOG("\nERROR --> F1AP: Memory allocation failed for SSB SINR offset in fillMeasObjToAddModList");
8059 *(measObject->offsetMO.sinrOffsetSSB) = Q_OffsetRange_dB0;
8064 /*******************************************************************
8066 * @brief Fill Report configuration to Add/mod list
8070 * Function : fillReportCfgToAddModList
8072 * Functionality: Fill Report configuration to Add/mod list
8074 * @params[in] Report Config To Add/Mod List
8075 * @return ROK - success
8078 * ****************************************************************/
8079 uint8_t fillReportCfgToAddModList(ReportConfigToAddModList_t *reportCfgList)
8082 uint8_t reportCfgIdx;
8083 ReportConfigToAddMod_t *reportCfg;
8084 ReportConfigNR_t *reportCfgNr;
8085 EventTriggerConfig_t *eventTriggCfg;
8088 reportCfgList->list.count = elementCnt;
8089 reportCfgList->list.size = reportCfgList->list.count * sizeof(ReportConfigToAddMod_t *);
8091 CU_ALLOC(reportCfgList->list.array, reportCfgList->list.size);
8092 if(!reportCfgList->list.array)
8094 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList() :Memory allocation failed for report config list's array");
8098 for(reportCfgIdx=0; reportCfgIdx < reportCfgList->list.count; reportCfgIdx++)
8100 CU_ALLOC(reportCfgList->list.array[reportCfgIdx], sizeof(ReportConfigToAddMod_t));
8101 if(!reportCfgList->list.array[reportCfgIdx])
8103 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config list's array element");
8109 reportCfg = reportCfgList->list.array[reportCfgIdx];
8110 reportCfg->reportConfigId = 1;
8111 reportCfg->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigNR;
8113 /* Report Configuration for NR */
8114 CU_ALLOC(reportCfg->reportConfig.choice.reportConfigNR, sizeof(ReportConfigNR_t));
8115 if(!reportCfg->reportConfig.choice.reportConfigNR)
8117 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report config NR");
8120 reportCfgNr = reportCfg->reportConfig.choice.reportConfigNR;
8123 reportCfgNr->reportType.present = ReportConfigNR__reportType_PR_eventTriggered;
8124 CU_ALLOC(reportCfgNr->reportType.choice.eventTriggered, sizeof(EventTriggerConfig_t));
8125 if(!reportCfgNr->reportType.choice.eventTriggered)
8127 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event triggerred");
8130 eventTriggCfg = reportCfgNr->reportType.choice.eventTriggered;
8133 eventTriggCfg->eventId.present = EventTriggerConfig__eventId_PR_eventA3;
8134 CU_ALLOC(eventTriggCfg->eventId.choice.eventA3, sizeof(struct EventTriggerConfig__eventId__eventA3));
8135 if(!eventTriggCfg->eventId.choice.eventA3)
8137 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for event A3");
8141 eventTriggCfg->eventId.choice.eventA3->a3_Offset.present = MeasTriggerQuantityOffset_PR_rsrp;
8142 eventTriggCfg->eventId.choice.eventA3->a3_Offset.choice.rsrp = 6; /* i.e. 3.0db . From Reference pcap log */
8143 eventTriggCfg->eventId.choice.eventA3->reportOnLeave = false;
8144 eventTriggCfg->eventId.choice.eventA3->hysteresis = 0;
8145 eventTriggCfg->eventId.choice.eventA3->timeToTrigger = TimeToTrigger_ms40;
8146 eventTriggCfg->eventId.choice.eventA3->useWhiteCellList = false;
8148 /* Reference Signal Type */
8149 eventTriggCfg->rsType = NR_RS_Type_ssb;
8151 /* Report Interval */
8152 eventTriggCfg->reportInterval = ReportInterval_ms1024;
8155 eventTriggCfg->reportAmount = EventTriggerConfig__reportAmount_r8;
8157 /* Report Quantity cell */
8158 eventTriggCfg->reportQuantityCell.rsrp = true;
8159 eventTriggCfg->reportQuantityCell.rsrq = false;
8160 eventTriggCfg->reportQuantityCell.sinr = false;
8162 /* Maximum reported cells */
8163 eventTriggCfg->maxReportCells = 3;
8165 /* Report qunatity RS Indexes */
8166 CU_ALLOC(eventTriggCfg->reportQuantityRS_Indexes, sizeof(MeasReportQuantity_t));
8167 if(!eventTriggCfg->reportQuantityRS_Indexes)
8169 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for report qunatity RS indexes");
8172 eventTriggCfg->reportQuantityRS_Indexes->rsrp = true;
8173 eventTriggCfg->reportQuantityRS_Indexes->rsrq = false;
8174 eventTriggCfg->reportQuantityRS_Indexes->sinr = false;
8176 /* Maximum number of RS indexes to report */
8177 CU_ALLOC(eventTriggCfg->maxNrofRS_IndexesToReport, sizeof(long));
8178 if(!eventTriggCfg->maxNrofRS_IndexesToReport)
8180 DU_LOG("\nERROR --> F1AP: fillReportCfgToAddModList(): Memory allocation failed for max number of RS indexes to report");
8183 *(eventTriggCfg->maxNrofRS_IndexesToReport) = 1;
8185 /* Include Beam measurement */
8186 eventTriggCfg->includeBeamMeasurements = false;
8191 /*******************************************************************
8193 * @brief Fill measurement Id to add/mod list
8197 * Function : fillMeasIdToAddModList
8199 * Functionality: Fill measurement Id to add/mod list
8201 * @params[in] Measurement Id to add/mod list
8202 * @return ROK - success
8205 * ****************************************************************/
8206 uint8_t fillMeasIdToAddModList(MeasIdToAddModList_t *measIdList)
8212 measIdList->list.count = elementCnt;
8213 measIdList->list.size = measIdList->list.count *sizeof(MeasIdToAddMod_t *);
8215 CU_ALLOC(measIdList->list.array, measIdList->list.size);
8216 if(!measIdList->list.array)
8221 for(measIdIdx=0; measIdIdx < measIdList->list.count; measIdIdx++)
8223 CU_ALLOC(measIdList->list.array[measIdIdx], sizeof(MeasIdToAddMod_t));
8224 if(!measIdList->list.array[measIdIdx])
8230 measIdList->list.array[measIdIdx]->measId = 1;
8231 measIdList->list.array[measIdIdx]->measObjectId = 1;
8232 measIdList->list.array[measIdIdx]->reportConfigId = 1;
8237 /*******************************************************************
8239 * @brief Fill s-measurement configuration
8243 * Function : fillSMeasConfig
8245 * Functionality: Fill s-measurement configuration
8247 * @params[in] s-Measurement config
8248 * @return ROK - success
8251 * ****************************************************************/
8252 uint8_t fillSMeasConfig(struct MeasConfigRrc__s_MeasureConfig *sMeasCfg)
8254 sMeasCfg->present = MeasConfigRrc__s_MeasureConfig_PR_ssb_RSRP;
8255 sMeasCfg->choice.ssb_RSRP = 100; /* Value taken from reference PCAP log */
8260 /*******************************************************************
8262 * @brief Fill quantity config
8266 * Function : fillQunatityConfig
8268 * Functionality: Fill quantity config
8270 * @params[in] Quantity Config
8271 * @return ROK - success
8274 * ****************************************************************/
8275 uint8_t fillQuantityConfig(QuantityConfig_t *quantityCfg)
8277 uint8_t elementCnt = 0;
8278 uint8_t quanCfgIdx = 0;
8279 QuantityConfigNR_t *quantityCfgNr;
8281 CU_ALLOC(quantityCfg->quantityConfigNR_List, sizeof(struct QuantityConfig__quantityConfigNR_List));
8282 if(!quantityCfg->quantityConfigNR_List)
8288 quantityCfg->quantityConfigNR_List->list.count = elementCnt;
8289 quantityCfg->quantityConfigNR_List->list.size = elementCnt * sizeof(QuantityConfigNR_t *);
8291 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array, quantityCfg->quantityConfigNR_List->list.size);
8292 if(!quantityCfg->quantityConfigNR_List->list.array)
8297 for(quanCfgIdx = 0; quanCfgIdx < quantityCfg->quantityConfigNR_List->list.count; quanCfgIdx++)
8299 CU_ALLOC(quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx], sizeof(QuantityConfigNR_t));
8300 if(!quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx])
8307 quantityCfgNr = quantityCfg->quantityConfigNR_List->list.array[quanCfgIdx];
8309 /* Quantity Config of Reference signal */
8310 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8311 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP)
8315 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8317 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8318 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ)
8322 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8324 CU_ALLOC(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8325 if(!quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR)
8329 *(quantityCfgNr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8331 /* Quantity Config RS index */
8332 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index, sizeof(QuantityConfigRS_t));
8333 if(!quantityCfgNr->quantityConfigRS_Index)
8338 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP, sizeof(FilterCoefficient_t));
8339 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP)
8343 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRP) = FilterCoefficient_fc4;
8345 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ, sizeof(FilterCoefficient_t));
8346 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ)
8350 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRSRQ) = FilterCoefficient_fc4;
8352 CU_ALLOC(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR, sizeof(FilterCoefficient_t));
8353 if(!quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR)
8357 *(quantityCfgNr->quantityConfigRS_Index->ssb_FilterConfig.filterCoefficientRS_SINR) = FilterCoefficient_fc4;
8362 /*******************************************************************
8364 * @brief Fill measurement configuration
8368 * Function : fillMeasConfig
8370 * Functionality: Fill measurement configuration
8372 * @params[in] Measurement config
8373 * @return ROK - success
8376 * ****************************************************************/
8377 uint8_t fillMeasConfig(MeasConfigRrc_t *measConfig)
8379 /* Measurement object to add/mod list */
8380 CU_ALLOC(measConfig->measObjectToAddModList, sizeof(MeasObjectToAddModList_t));
8381 if(!measConfig->measObjectToAddModList)
8383 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measurement object list in fillMeasConfig");
8386 if(fillMeasObjToAddModList(measConfig->measObjectToAddModList) != ROK)
8388 DU_LOG("\nERROR --> F1AP: Failure in fillMeasObjToAddModList");
8392 /* Report Config To add/mod list */
8393 CU_ALLOC(measConfig->reportConfigToAddModList, sizeof(ReportConfigToAddModList_t));
8394 if(!measConfig->reportConfigToAddModList)
8396 DU_LOG("\nERROR --> F1AP: Memory allocation failed for report config list in fillMeasConfig");
8399 if(fillReportCfgToAddModList(measConfig->reportConfigToAddModList) != ROK)
8401 DU_LOG("\nERROR --> F1AP: Failure in fillReportCfgToAddModList");
8405 /* Measurement Id to add/mod list */
8406 CU_ALLOC(measConfig->measIdToAddModList, sizeof(MeasIdToAddModList_t));
8407 if(!measConfig->measIdToAddModList)
8409 DU_LOG("\nERROR --> F1AP: Memory allocation failed for measuerment id list in fillMeasConfig");
8412 if(fillMeasIdToAddModList(measConfig->measIdToAddModList) != ROK)
8414 DU_LOG("\nERROR --> F1AP: Failure in fillMeasIdToAddModList");
8418 /* S-Measurement config */
8419 CU_ALLOC(measConfig->s_MeasureConfig, sizeof(struct MeasConfigRrc__s_MeasureConfig));
8420 if(!measConfig->s_MeasureConfig)
8422 DU_LOG("\nERROR --> F1AP: Memory allocation failed for s measuerment config in fillMeasConfig");
8425 if(fillSMeasConfig(measConfig->s_MeasureConfig) != ROK)
8427 DU_LOG("\nERROR --> F1AP: Failure in fillSMeasConfig");
8431 /* Qunatity Config */
8432 CU_ALLOC(measConfig->quantityConfig, sizeof(QuantityConfig_t));
8433 if(!measConfig->quantityConfig)
8435 DU_LOG("\nERROR --> F1AP: Memory allocation failed for quantity config in fillMeasConfig");
8438 if(fillQuantityConfig(measConfig->quantityConfig) != ROK)
8440 DU_LOG("\nERROR --> F1AP: Failure in fillQuantityConfig");
8447 /*******************************************************************
8449 * @brief Fill RRC reconfiguration non-critical extension IE
8453 * Function : fillRrcReconfigNonCriticalExt
8455 * Functionality: Fill RRC reconfiguration non-critical extension
8457 * @params[in] RRC Reconfig Non-critical extension
8458 * @return ROK - success
8461 * ****************************************************************/
8462 uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs_t *rrcRecfg, bool updateAllRbCfg)
8464 CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
8465 if(!rrcRecfg->masterCellGroup)
8467 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8471 rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
8472 CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
8473 if(!rrcRecfg->masterCellGroup->buf)
8475 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
8478 memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
8481 /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
8482 * received from DU */
8483 if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
8485 DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
8493 /*******************************************************************
8495 * @brief Fill RRC reconfiguration structure
8499 * Function : fillRrcReconfig
8501 * Functionality: Fill RRC reconfiguration
8505 * RRC reconfiguration structure
8506 * @return ROK - success
8509 * ****************************************************************/
8510 uint8_t fillRrcReconfig(CuUeCb *ueCb, RRCReconfiguration_t *rrcReconfig, bool updateAllRbCfg)
8512 memset(rrcReconfig, 0, sizeof(RRCReconfiguration_t));
8514 rrcReconfig->rrc_TransactionIdentifier = 1;
8515 rrcReconfig->criticalExtensions.present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
8517 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
8518 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration)
8520 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for RRC reconfiguration IE in fillRrcReconfig");
8524 /* Radio Bearer Configuration */
8525 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, sizeof(RadioBearerConfig_t));
8526 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig)
8528 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for radio bearer config in fillRrcReconfig");
8531 if(fillRadioBearerConfig(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig, updateAllRbCfg) != ROK)
8533 DU_LOG("\nERROR --> F1AP : Failed to fill radio bearer config in fillRrcReconfig");
8537 /* Measurement Configuration */
8538 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig, sizeof(MeasConfigRrc_t));
8539 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig)
8541 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for Measurement config IE in fillRrcReconfig");
8544 if(fillMeasConfig(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->measConfig) != ROK)
8546 DU_LOG("\nERROR --> F1AP : Failed to fill measurement config in fillRrcReconfig");
8550 /* Non Critical extension */
8551 CU_ALLOC(rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, sizeof(struct RRCReconfiguration_v1530_IEs));
8552 if(!rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension)
8554 DU_LOG("\nERROR --> F1AP : Memormy allocation failed for non critical extension IE in fillRrcReconfig");
8557 if(fillRrcReconfigNonCriticalExt(ueCb, rrcReconfig->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension, updateAllRbCfg) != ROK)
8559 DU_LOG("\nERROR --> F1AP : Failed to fill non critical extension in fillRrcReconfig");
8565 /*******************************************************************
8567 * @brief Fill RRC reconfiguration Octet string
8571 * Function : fillRrcReconfigBuf
8573 * Functionality: Fill RRC reconfiguration octet string
8576 * @params[in] OCTET_STRING_t buffer
8577 * @return ROK - success
8580 * ****************************************************************/
8581 uint8_t fillRrcReconfigBuf(CuUeCb *ueCb, OCTET_STRING_t *rrcReconfigBuf, bool updateAllRbCfg)
8583 uint8_t ret = RFAILED;
8584 asn_enc_rval_t encRetVal;
8585 RRCReconfiguration_t rrcRecfg, *rrcReconfig = NULLP;
8586 rrcReconfig = &rrcRecfg;
8590 if(fillRrcReconfig(ueCb, rrcReconfig, updateAllRbCfg) != ROK)
8592 DU_LOG( "\nERROR --> F1AP : Failed to fill RRC Reconfiguration in fillRrcReconfigBuf");
8596 /* Encode RRC Reconfiguration */
8597 xer_fprint(stdout, &asn_DEF_RRCReconfiguration, rrcReconfig);
8598 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8600 encRetVal = aper_encode(&asn_DEF_RRCReconfiguration, 0, rrcReconfig, PrepFinalEncBuf, encBuf);
8602 /* Encode results */
8603 if(encRetVal.encoded == ENCODE_FAIL)
8605 DU_LOG( "\nERROR --> F1AP : Could not encode RRC Reconfiguration (at %s)\n",\
8606 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8611 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Reconfiguration\n");
8612 for(int i=0; i< encBufSize; i++)
8614 DU_LOG("%x",encBuf[i]);
8618 rrcReconfigBuf->size = encBufSize;
8619 CU_ALLOC(rrcReconfigBuf->buf, rrcReconfigBuf->size);
8620 if(!rrcReconfigBuf->buf)
8622 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigBuf");
8625 memcpy(rrcReconfigBuf->buf, encBuf, rrcReconfigBuf->size);
8630 freeRrcReconfig(rrcReconfig);
8634 /*******************************************************************
8636 * @brief Fill HO preparation information Octet string
8640 * Function : fillHOPreparationInfoBuf
8642 * Functionality: Fill HO preparation information Octet string
8645 * @params[in] HandoverPreparationInformation_t buffer
8646 * @return ROK - success
8649 * ****************************************************************/
8650 uint8_t fillHOPreparationInfoBuf(CuUeCb *ueCb, HandoverPreparationInformation_t *hoPrepInfoBuf)
8652 uint8_t ret = RFAILED;
8653 asn_enc_rval_t encRetVal;
8654 HandoverPreparationInformationRrc_t hoPrepInfo;
8655 HandoverPreparationInformationRrc_IEs_t *hoPrepInfoIe;
8660 hoPrepInfo.criticalExtensions.present = HandoverPreparationInformationRrc__criticalExtensions_PR_c1;
8661 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1, sizeof(struct HandoverPreparationInformationRrc__criticalExtensions__c1));
8662 if(!hoPrepInfo.criticalExtensions.choice.c1)
8664 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for c1 in fillHOPreparationInfo");
8667 hoPrepInfo.criticalExtensions.choice.c1->present = \
8668 HandoverPreparationInformationRrc__criticalExtensions__c1_PR_handoverPreparationInformation;
8670 CU_ALLOC(hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation , \
8671 sizeof(HandoverPreparationInformationRrc_IEs_t));
8672 if(!hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation)
8674 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for handover preparation information IE in fillHOPreparationInfo");
8677 hoPrepInfoIe = hoPrepInfo.criticalExtensions.choice.c1->choice.handoverPreparationInformation;
8679 /* Fill UE Capability RAT container list */
8680 ret = fillUeCapRatContList(&hoPrepInfoIe->ue_CapabilityRAT_List);
8683 DU_LOG( "\nERROR --> F1AP : Failed to fill UE Capability RAT container list");
8687 /* Fill Source config */
8688 hoPrepInfoIe->sourceConfig = NULLP;
8689 CU_ALLOC(hoPrepInfoIe->sourceConfig, sizeof(AS_Config_t));
8690 if(!hoPrepInfoIe->sourceConfig)
8692 DU_LOG( "\nERROR --> F1AP : Failed to allocate memory for source config in fillHOPreparationInfo");
8695 ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
8699 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
8703 hoPrepInfoIe->rrm_Config = NULLP;
8704 hoPrepInfoIe->as_Context = NULLP;
8705 hoPrepInfoIe->nonCriticalExtension = NULLP;
8707 /* encode UE Capability RAT Container List into duToCuRrcContainer */
8708 xer_fprint(stdout, &asn_DEF_HandoverPreparationInformationRrc, &hoPrepInfo);
8709 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
8711 encRetVal = aper_encode(&asn_DEF_HandoverPreparationInformationRrc, 0, \
8712 &hoPrepInfo, PrepFinalEncBuf, encBuf);
8714 /* Encode results */
8715 if(encRetVal.encoded == ENCODE_FAIL)
8717 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
8718 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8723 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
8724 for(int i=0; i< encBufSize; i++)
8726 DU_LOG("%x",encBuf[i]);
8730 hoPrepInfoBuf->size = encBufSize;
8731 CU_ALLOC(hoPrepInfoBuf->buf, hoPrepInfoBuf->size);
8732 if(!hoPrepInfoBuf->buf)
8734 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
8737 memcpy(hoPrepInfoBuf->buf, encBuf, hoPrepInfoBuf->size);
8741 freeHOPreparationInfo(&hoPrepInfo);
8745 /*******************************************************************
8747 * @brief Fills CuToDuContainer
8751 * Function : fillCuToDuContainer
8753 * Functionality: Fills CuToDuContainer
8755 * @params[in] pointer to CUtoDURRCInformation_t
8757 * @return ROK - success
8760 ******************************************************************/
8762 uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
8764 uint8_t elementCnt = 0;
8768 /* UE Capabulity RAT Container List */
8769 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8770 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
8772 DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed");
8775 ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
8777 CU_ALLOC(rrcMsg->measConfig, sizeof(MeasConfig_t));
8778 if(!rrcMsg->measConfig)
8780 DU_LOG("\nERROR --> F1AP : Memory allocation for measurement configuration failed");
8783 ret = fillMeasTimingConfigBuf(rrcMsg->measConfig);
8785 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8788 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8789 if(rrcMsg->iE_Extensions)
8792 rrcMsg->iE_Extensions->list.count = elementCnt;
8793 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t *);
8795 /* Initialize the CUtoDURRCInformation_ExtIEs */
8796 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8798 if(rrcMsg->iE_Extensions->list.array == NULLP)
8800 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
8804 for(idx=0; idx<elementCnt; idx++)
8806 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
8807 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
8809 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
8816 /* Cell Group Configuration */
8817 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
8818 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8819 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
8820 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
8821 ret = fillCellGrpCfg(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig, true);
8824 /* Handover Preparation Information */
8825 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_HandoverPreparationInformation;
8826 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
8827 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present = \
8828 CUtoDURRCInformation_ExtIEs__extensionValue_PR_HandoverPreparationInformation;
8829 ret = fillHOPreparationInfoBuf(ueCb, &rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.HandoverPreparationInformation);
8835 /*******************************************************************
8837 * @brief Free CuToDuContainer
8841 * Function : FreeCuToDuInfo
8843 * Functionality: Free CuToDuContainer
8845 * @params[in] pointer to CUtoDURRCInformation_t
8847 * @return ROK - success
8850 ******************************************************************/
8852 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8856 if(rrcMsg->uE_CapabilityRAT_ContainerList)
8858 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8859 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
8860 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
8862 if(rrcMsg->iE_Extensions)
8864 if(rrcMsg->iE_Extensions->list.array)
8866 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
8868 if(rrcMsg->iE_Extensions->list.array[idx])
8870 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
8872 case ProtocolIE_ID_id_CellGroupConfig:
8873 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8875 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
8876 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
8881 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8882 rrcMsg->iE_Extensions->list.array[idx]->id);
8888 for(idx2 = 0; idx2 < idx; idx2++)
8890 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
8892 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
8896 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
8899 /*******************************************************************
8901 * @brief Builds and sends the UE Setup Request
8905 * Function : BuildAndSendUeContextSetupReq
8907 * Functionality: Constructs the UE Setup Request and sends
8908 * it to the CU through SCTP.
8912 * @return ROK - success
8915 * ****************************************************************/
8916 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
8918 uint8_t Nrcgiret, SplCellListret, SrbSetupret;
8919 uint8_t ret= RFAILED, ret1;
8921 uint8_t idx, idx1, bufLen, duIdx;
8923 DuDb *targetDuDb = NULLP;
8924 F1AP_PDU_t *f1apMsg = NULLP;
8925 UEContextSetupRequest_t *ueSetReq = NULLP;
8926 asn_enc_rval_t encRetVal; /* Encoder return value */
8927 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
8931 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
8933 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8934 if(f1apMsg == NULLP)
8936 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8940 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8941 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8942 if(f1apMsg->choice.initiatingMessage == NULLP)
8944 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
8948 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
8949 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8950 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
8952 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
8954 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8958 ueSetReq->protocolIEs.list.count = elementCnt;
8959 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
8961 /* Initialize the UESetup members */
8962 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
8964 if(ueSetReq->protocolIEs.list.array == NULLP)
8966 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
8970 for(idx1=0; idx1<elementCnt; idx1++)
8972 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
8973 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
8981 /*GNB CU UE F1AP ID*/
8982 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8983 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8984 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8985 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
8987 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
8989 /*GNB DU UE F1AP ID*/
8991 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8992 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8993 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8994 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
8999 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
9000 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9001 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
9002 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9004 /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
9005 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
9006 /* Since we are supporting only one cell per DU, accessing 0th index to
9007 * get target cell info */
9008 spCellId = targetDuDb->cellCb[0].nrCellId;
9011 spCellId = ueCb->cellCb->nrCellId;
9012 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, spCellId);
9018 /*Served Cell Index*/
9020 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
9021 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9022 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
9023 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
9025 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9027 /*CellULConfigured*/
9029 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
9030 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9031 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
9032 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
9035 /*CUtoDURRCContainer*/
9037 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
9038 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9039 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
9040 if(fillCuToDuContainer(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
9045 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9047 /*Special Cells to be SetupList*/
9049 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
9050 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9051 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
9052 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
9053 if(SplCellListret != ROK)
9059 /*SRBs To Be Setup List*/
9061 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
9062 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9063 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
9064 SrbSetupret = BuildSRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
9065 if(SrbSetupret != ROK)
9070 /*DRBs to Be Setup List*/
9072 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
9073 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9074 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
9075 ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
9081 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
9083 /* RRC delivery status request */
9085 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
9086 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9087 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
9088 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
9091 /* GNB-DU UE Aggregate Maximum Bit Rate hardcoded as in reference logs */
9093 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
9094 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
9095 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
9097 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
9099 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
9100 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
9101 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
9102 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
9104 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
9107 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
9108 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
9110 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9112 /* Encode the F1SetupRequest type as APER */
9113 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9115 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9117 /* Encode results */
9118 if(encRetVal.encoded == ENCODE_FAIL)
9120 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
9121 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9126 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
9127 for(int i=0; i< encBufSize; i++)
9129 DU_LOG("%x",encBuf[i]);
9134 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
9136 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
9142 FreeUeContextSetupReq(f1apMsg);
9145 }/* End of BuildAndSendUeContextSetupReq*/
9147 /**********************************************************************
9148 * @brief Function to extractTeId received in UE context setup Response
9152 * Function : extractTeId
9155 * - Function to extract TeId
9158 * @return ROK - success
9161 **********************************************************************/
9162 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
9166 GTPTunnel_t *gtpDl = NULLP;
9168 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
9170 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
9172 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
9174 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
9175 if(gtpDl->gTP_TEID.size > 0)
9177 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
9180 DU_LOG("\nERROR --> EGTP: No TeId received");
9188 /****************************************************************
9189 * @brief Function to add Drb tunnels
9193 * Function : addDrbTunnels
9196 * - Function to add Drb tunnels
9199 * @return ROK - success
9202 * ****************************************************************/
9203 uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
9208 if(teId > MAX_TEID || teId < MIN_TEID)
9210 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
9212 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9213 tnlEvt.action = EGTP_TNL_MGMT_ADD;
9214 tnlEvt.lclTeid = teId;
9215 tnlEvt.remTeid = teId;
9216 ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
9219 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
9224 /****************************************************************
9225 * @brief Function to process Drb Setup List
9229 * Function : procDrbSetupList
9232 * - Function to process DRB Setup List
9235 * @return ROK - success
9238 * ****************************************************************/
9239 uint8_t procDrbSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_Setup_List_t *drbSetupList)
9241 uint8_t arrIdx = 0, drbIdx = 0;
9243 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9245 if(drbSetupList != NULLP)
9247 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9249 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9250 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
9252 /* extracting teId */
9253 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9256 if(addDrbTunnels(duId, teId)== ROK)
9258 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
9260 /* As per Spec 38.473, in UE COntext Response, Tunnel information
9261 * are sent to CU for setting up of Tunnels in DL direction.
9262 * Search for DRB ID in CU databse */
9263 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
9265 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_Setup_Item.dRBID)
9267 fillTeIdString(3, teId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
9280 /****************************************************************
9281 * @brief Function to process Ue Context Setup Response
9285 * Function : procUeContextSetupResponse
9288 * - Function to process Ue Context Setup Response
9291 * @return ROK - success
9294 * ****************************************************************/
9295 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
9297 uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0;
9298 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
9300 CuUeCb *ueCb = NULLP;
9301 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
9302 OCTET_STRING_t *duToCuRrcContainer;
9304 SEARCH_DU_DB(duIdx, duId, duDb);
9305 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9307 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
9309 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
9311 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9313 cuUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9316 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9318 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9319 ueCb = &duDb->ueCb[duUeF1apId-1];
9320 /* If ue context is not present in du db, then create UE context
9321 * here. This flow is hit in case of UE handover where UE
9322 * context is created before UE performs RACH on target DU */
9323 if(ueCb->gnbDuUeF1apId == 0)
9325 /* Creating UE context in target DU */
9326 memset(ueCb, 0, sizeof(CuUeCb));
9327 ueCb->cellCb = &duDb->cellCb[0];
9328 ueCb->gnbDuUeF1apId = duUeF1apId;
9329 ueCb->gnbCuUeF1apId = cuUeF1apId;
9330 ueCb->state = UE_HANDOVER_IN_PROGRESS;
9331 ueCb->hoInfo.targetDuId = duId;
9334 ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
9335 ueCb->cellCb->numUe++;
9339 case ProtocolIE_ID_id_C_RNTI:
9341 ueCb->crnti = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI;
9344 case ProtocolIE_ID_id_DRBs_Setup_List:
9346 /* Adding Tunnels for successful DRB */
9347 procDrbSetupList(duId, ueCb, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
9350 case ProtocolIE_ID_id_DUtoCURRCInformation:
9352 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
9353 duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9354 DUtoCURRCInformation.cellGroupConfig;
9355 if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
9356 DUtoCURRCInformation.cellGroupConfig)) != ROK)
9358 DU_LOG("\nERROR --> F1AP: Failed to extract Du to Cu RRC Information ");
9366 /* If the UE is in handover, UE context modification request is to be sent to
9367 * source DU once UE context setup response is received from target DU */
9368 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
9370 DuDb *srcDuDb = NULLP;
9371 CuUeCb *ueCbInSrcDu = NULLP;
9373 /* Since Source DU Id and DU UE F1AP ID assigned to UE by source DU is not known here, we
9374 * need to find Source DU and UE CB in source DU using CU UE F1AP ID */
9375 for(duIdx=0; duIdx < cuCb.numDu; duIdx++)
9377 /* UE context setup response is received from target DU. Search all
9378 * DUs to find source DU except this target DU Id.*/
9379 if(cuCb.duInfo[duIdx].duId != duId)
9381 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9384 * 1. CU UE F1AP ID in srcDU->ueCb should be same as cuUeF1apId
9385 * received in UE context setup response since CU UE F1AP ID does not
9386 * change for UE in handover.
9387 * 2. srcDU->UeCb->uestate should be UE_HANDOVER_IN_PROGRESS
9389 if((cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) &&
9390 (cuCb.duInfo[duIdx].ueCb[ueIdx].state == UE_HANDOVER_IN_PROGRESS))
9392 srcDuDb = &cuCb.duInfo[duIdx];
9393 ueCbInSrcDu = &cuCb.duInfo[duIdx].ueCb[ueIdx];
9395 /* Store source DU info in the new UE context created in
9397 ueCb->hoInfo.sourceDuId = srcDuDb->duId;
9399 /* Copy the received container to UeCb */
9400 memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
9402 if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
9404 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
9411 if(srcDuDb && ueCbInSrcDu)
9417 ueCb->f1apMsgDb.dlRrcMsgCount++;
9418 rrcMsgType = setDlRRCMsgType(ueCb);
9420 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration");
9421 if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK)
9423 DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration");
9431 /****************************************************************
9432 * @brief Function to process Ul Rrc Msg received from DU
9436 * Function : procUlRrcMsg
9439 * - Function to process Ul Rrc Msg received from DU
9442 * @return ROK - success
9445 * ****************************************************************/
9447 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
9449 uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0;
9450 uint8_t *rrcContainer = NULLP;
9451 uint16_t rrcContLen = 0;
9452 uint32_t cuUeF1apId = 0, duUeF1apId = 0;
9454 CuUeCb *ueCb = NULLP;
9455 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
9458 SEARCH_DU_DB(duIdx, duId, duDb);
9459 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
9461 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
9463 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
9465 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9467 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
9470 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9472 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
9475 case ProtocolIE_ID_id_SRBID:
9476 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
9479 case ProtocolIE_ID_id_RRCContainer:
9481 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
9482 CU_ALLOC(rrcContainer, rrcContLen);
9485 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
9488 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
9490 if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
9493 uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
9494 DuDb *srcDuDb = NULLP;
9496 /* In target DU DB, mark UE as active and delete HO info */
9497 duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
9498 memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
9500 /* Release UE context in source DU because the UE is now
9501 * attached to target DU */
9502 SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
9503 for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
9505 if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
9507 ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId);
9510 DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
9521 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
9528 ueCb = &duDb->ueCb[duUeF1apId-1];
9529 ueCb->f1apMsgDb.dlRrcMsgCount++;
9530 rrcMsgType = setDlRRCMsgType(ueCb);
9531 if(rrcMsgType == RRC_SETUP_COMPLETE)
9533 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for NAS Security Mode Command");
9534 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9536 if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
9538 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Security Mode Command");
9539 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9541 else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
9543 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
9544 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
9546 else if(rrcMsgType == REGISTRATION_COMPLETE)
9548 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request");
9549 ret = BuildAndSendUeContextSetupReq(duId, ueCb);
9551 else if(rrcMsgType == RRC_RECONFIG_COMPLETE)
9553 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
9554 BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
9560 /****************************************************************
9561 * @brief Build And Send F1ResetAck
9565 * Function : FreeF1ResetAck
9568 * - Build And Send F1ResetRSP
9571 * @return ROK - success
9574 * ****************************************************************/
9575 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
9578 ResetAcknowledge_t *f1ResetAck;
9582 if(f1apMsg->choice.successfulOutcome)
9584 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9586 if(f1ResetAck->protocolIEs.list.array)
9588 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
9590 if(f1ResetAck->protocolIEs.list.array[idx])
9592 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9595 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9597 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9599 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9603 /****************************************************************
9604 * @brief Build And Send F1ResetAck
9608 * Function : BuildAndSendF1ResetAck
9611 * - Build And Send F1ResetRSP
9614 * @return ROK - success
9617 * ****************************************************************/
9619 uint8_t BuildAndSendF1ResetAck()
9622 uint8_t elementCnt = 0;
9623 uint8_t ret = RFAILED;
9624 F1AP_PDU_t *f1apMsg = NULL;
9625 ResetAcknowledge_t *f1ResetAck = NULLP;
9626 asn_enc_rval_t encRetVal;
9627 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
9630 /* Allocate the memory for F1ResetRequest_t */
9631 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9632 if(f1apMsg == NULLP)
9634 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9638 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9640 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9641 if(f1apMsg->choice.successfulOutcome == NULLP)
9643 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
9647 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
9648 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9649 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
9650 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
9654 f1ResetAck->protocolIEs.list.count = elementCnt;
9655 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
9657 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
9658 if(f1ResetAck->protocolIEs.list.array == NULLP)
9660 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
9664 for(idx=0; idx<elementCnt; idx++)
9666 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
9667 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
9674 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
9675 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9676 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
9677 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
9679 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9681 /* Encode the F1SetupRequest type as UPER */
9682 memset(encBuf, 0, ENC_BUF_MAX_LEN);
9684 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
9686 /* Check encode results */
9687 if(encRetVal.encoded == ENCODE_FAIL)
9689 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
9690 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9695 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
9696 for(int i=0; i< encBufSize; i++)
9698 DU_LOG("%x",encBuf[i]);
9703 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
9704 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
9706 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
9714 FreeF1ResetAck(f1apMsg);
9718 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9722 if(ulInfo->list.array)
9724 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
9726 if(ulInfo->list.array[arrIdx])
9728 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
9730 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
9732 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
9734 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9735 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9736 gTPTunnel->gTP_TEID.size);
9738 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9739 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9740 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9742 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9743 sizeof(GTPTunnel_t));
9745 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9748 CU_FREE(ulInfo->list.array,ulInfo->list.size);
9752 /*******************************************************************
9754 * @brief Deletes the EGTP tunnel
9758 * Function : deleteEgtpTunnel
9760 * Functionality: Deletes the EGTP tunnel
9762 * @params[in] uint8_t *buf
9764 * @return ROK - success
9767 * ****************************************************************/
9768 uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
9773 teIdStringToInt(buf, &teId);
9774 if(teId > MAX_TEID || teId < MIN_TEID)
9776 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
9779 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
9780 tnlEvt.action = EGTP_TNL_MGMT_DEL;
9781 tnlEvt.lclTeid = teId;
9782 tnlEvt.remTeid = teId;
9783 if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
9785 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
9790 /*******************************************************************
9792 * @brief Builds the Uplink Tunnel Info
9796 * Function : BuildUlTnlInfoforSetupMod
9798 * Functionality: Constructs the UL TnlInfo For DRB list
9800 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
9802 * @return ROK - success
9805 * ****************************************************************/
9806 uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
9812 ulInfo->list.count = ulCnt;
9813 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
9814 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
9815 if(ulInfo->list.array == NULLP)
9817 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9820 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
9822 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
9823 if(ulInfo->list.array[arrIdx] == NULLP)
9825 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9831 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
9832 UPTransportLayerInformation_PR_gTPTunnel;
9835 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
9836 sizeof(GTPTunnel_t));
9837 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
9839 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9842 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9843 transportLayerAddress.size = 4*sizeof(uint8_t);
9844 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9845 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
9846 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
9847 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9848 transportLayerAddress.buf == NULLP)
9850 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9854 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9855 transportLayerAddress.buf[0] = 192;
9856 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9857 transportLayerAddress.buf[1] = 168;
9858 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9859 transportLayerAddress.buf[2] = 130;
9860 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9861 transportLayerAddress.buf[3] = 82;
9862 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9863 transportLayerAddress.bits_unused = 0;
9865 ulTnlInfo->address[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[0];
9866 ulTnlInfo->address[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[1];
9867 ulTnlInfo->address[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[2];
9868 ulTnlInfo->address[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf[3];
9871 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
9872 = 4 * sizeof(uint8_t);
9873 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9874 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
9875 gTPTunnel->gTP_TEID.size);
9876 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
9879 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
9882 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9883 gTP_TEID.buf[0] = 0;
9884 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9885 gTP_TEID.buf[1] = 0;
9886 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9887 gTP_TEID.buf[2] = 0;
9888 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
9890 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
9891 * fetched based on the Drb Id */
9893 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
9894 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
9895 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
9899 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9900 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
9903 ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
9904 ulTnlInfo->teId[1] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
9905 ulTnlInfo->teId[2] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2];
9906 ulTnlInfo->teId[3] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3];
9908 }/*End of BuildULTnlInfo*/
9910 /*******************************************************************
9912 * @brief freeing the DRB item
9916 * Function : FreeDrbItem
9918 * Functionality: freeing the DRB item
9920 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
9922 * @return ROK - success
9925 * ****************************************************************/
9927 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
9930 SNSSAI_t *snssai =NULLP;
9931 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
9933 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
9934 switch(drbItem->qoSInformation.present)
9936 case QoSInformation_PR_NOTHING:
9938 case QoSInformation_PR_eUTRANQoS:
9940 if(drbItem->qoSInformation.choice.eUTRANQoS)
9942 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
9946 case QoSInformation_PR_choice_extension:
9948 if(drbItem->qoSInformation.choice.choice_extension)
9950 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
9952 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
9955 CU_FREE(snssai->sST.buf,snssai->sST.size);
9961 CU_FREE(snssai->sD->buf,snssai->sD->size);
9963 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
9966 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
9967 if(flowMap->list.array)
9969 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
9971 if(flowMap->list.array[arrIdx] )
9973 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
9974 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
9977 CU_FREE(flowMap->list.array,flowMap->list.size);
9980 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
9986 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
9987 if(drbItem->uLConfiguration)
9989 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
9993 /*******************************************************************
9995 * @brief filling the DRB setup Mod item
9999 * Function : FillDrbItemToSetupMod
10001 * Functionality: filling the DRB setup Mod item
10004 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10006 * @return ROK - success
10007 * RFAILED - failure
10009 * ****************************************************************/
10011 uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
10016 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
10017 ueCb->drbList[ueCb->numDrb].drbId = drbItem->dRBID;
10020 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
10022 switch(drbItem->qoSInformation.present)
10024 case QoSInformation_PR_NOTHING:
10028 case QoSInformation_PR_eUTRANQoS:
10031 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10032 if(drbItem->qoSInformation.choice.eUTRANQoS)
10034 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10037 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
10038 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10039 PriorityLevel_no_priority;
10041 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10042 Pre_emptionCapability_may_trigger_pre_emption;
10044 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10045 Pre_emptionVulnerability_pre_emptable;
10049 case QoSInformation_PR_choice_extension:
10051 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10052 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
10054 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10058 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10059 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
10060 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10061 ret = BuildQOSInfo(&ueCb->drbList[ueCb->numDrb].qos, &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10062 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2, FALSE);
10065 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10070 ret = BuildSNSSAI(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10071 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1], FALSE);
10074 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10078 /*Flows mapped to DRB List*/
10079 ret = BuildFlowsMap(&ueCb->drbList[ueCb->numDrb], &drbItem->qoSInformation.choice.\
10080 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10081 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, FALSE);
10084 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10090 /*ULUPTNLInformation To Be Setup List*/
10091 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
10092 &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
10095 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10100 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
10101 ueCb->drbList[ueCb->numDrb].rlcMode = drbItem->rLCMode;
10107 /*******************************************************************
10109 * @brief Builds the DRB to be Setup Mod ItemIes
10113 * Function : FillDrbItemList
10115 * Functionality: Constructs the DRB to be Setup Mod Item Ies
10117 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
10119 * @return ROK - success
10120 * RFAILED - failure
10122 * ****************************************************************/
10124 uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
10126 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
10127 drbItemIe->criticality = Criticality_reject;
10128 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
10130 if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
10132 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
10137 /*******************************************************************
10139 * @brief free the DRB to be Setup Mod list
10143 * Function : FreeDrbToBeSetupModList
10145 * Functionality: free the DRB to be Setup Mod list
10147 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10149 * @return ROK - success
10150 * RFAILED - failure
10152 * ****************************************************************/
10153 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
10156 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
10158 if(drbSet->list.array)
10160 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10162 if(drbSet->list.array[arrIdx] != NULLP)
10166 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
10167 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
10169 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10172 CU_FREE(drbSet->list.array, drbSet->list.size);
10177 /*******************************************************************
10179 * @brief Builds the DRB to be Setup Mod list
10183 * Function : BuildDrbToBeSetupList
10185 * Functionality: Constructs the DRB to be Setup Mod list
10187 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
10189 * @return ROK - success
10190 * RFAILED - failure
10192 * ****************************************************************/
10194 uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
10200 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
10201 drbSet->list.count = drbCnt;
10202 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
10203 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10204 if(drbSet->list.array == NULLP)
10206 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10210 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10212 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
10213 if(drbSet->list.array[arrIdx] == NULLP)
10215 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
10219 ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
10222 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
10229 /*******************************************************************
10231 * @brief Filling the DRB to be modified item
10235 * Function : FillDrbToBeModItem
10237 * Functionality: filling the DRB to be modified item
10239 * @params[in] DRBs_ToBeModified_Item_t *drbItem
10241 * @return ROK - success
10242 * RFAILED - failure
10244 * ****************************************************************/
10246 uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
10250 DrbInfo *drbToBeMod;
10253 drbItem->dRBID = DRB2 + arrIdx;
10255 /* Search for DRB ID in CU databse */
10256 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
10258 if(ueCb->drbList[drbIdx].drbId == drbItem->dRBID)
10260 drbToBeMod = &ueCb->drbList[drbIdx];
10266 drbItem->qoSInformation = NULLP;
10267 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
10268 if(drbItem->qoSInformation != NULLP)
10270 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
10272 switch(drbItem->qoSInformation->present)
10274 case QoSInformation_PR_NOTHING:
10278 case QoSInformation_PR_eUTRANQoS:
10281 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10282 if(drbItem->qoSInformation->choice.eUTRANQoS)
10284 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
10287 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
10288 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
10289 PriorityLevel_no_priority;
10291 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
10292 Pre_emptionCapability_may_trigger_pre_emption;
10294 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
10295 Pre_emptionVulnerability_pre_emptable;
10299 case QoSInformation_PR_choice_extension:
10301 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10302 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
10304 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
10308 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
10309 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
10310 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
10311 ret = BuildQOSInfo(&drbToBeMod->qos, &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
10312 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID, FALSE);
10315 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
10320 ret = BuildSNSSAI(drbToBeMod, &drbItem->qoSInformation->choice.\
10321 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0], FALSE);
10324 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
10328 /*Flows mapped to DRB List*/
10329 ret = BuildFlowsMap(drbToBeMod, &drbItem->qoSInformation->choice.\
10330 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
10331 ProtocolIE_ID_id_DRBs_ToBeModified_Item, FALSE);
10334 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
10341 /*ULUPTNLInformation To Be Setup List*/
10342 ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
10343 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
10346 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
10352 /*******************************************************************
10354 * @brief Builds the DRB to be modified Item IE
10358 * Function : FillDrbToBeModItemList
10360 * Functionality: Constructs the DRB to be modified Mod Item Ies
10362 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
10364 * @return ROK - success
10365 * RFAILED - failure
10367 * ****************************************************************/
10369 uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
10371 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
10372 drbItemIe->criticality = Criticality_reject;
10373 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
10374 if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
10376 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
10383 /*******************************************************************
10385 * @brief Builds the DRB to be modified list
10389 * Function : BuildDrbToBeModList
10391 * Functionality: Constructs the DRB to be modified list
10393 * @params[in] DRBs_ToBeModified_List_t *drbSet
10395 * @return ROK - success
10396 * RFAILED - failure
10398 * ****************************************************************/
10400 uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
10406 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
10407 drbSet->list.count = drbCnt;
10408 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
10409 CU_ALLOC(drbSet->list.array, drbSet->list.size);
10410 if(drbSet->list.array == NULLP)
10412 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
10415 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
10417 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10418 if(drbSet->list.array[arrIdx] == NULLP)
10420 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
10424 ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
10427 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
10434 /*******************************************************************
10436 * @brief freeing the DRB item
10440 * Function : FreeModifiedDrbItem
10442 * Functionality: freeing the DRB 2 item
10444 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
10446 * @return ROK - success
10447 * RFAILED - failure
10449 * ****************************************************************/
10451 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
10454 SNSSAI_t *snssai =NULLP;
10455 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
10457 if(drbItem->qoSInformation != NULLP)
10459 switch(drbItem->qoSInformation->present)
10461 case QoSInformation_PR_NOTHING:
10463 case QoSInformation_PR_eUTRANQoS:
10465 if(drbItem->qoSInformation->choice.eUTRANQoS)
10467 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
10471 case QoSInformation_PR_choice_extension:
10473 if(drbItem->qoSInformation->choice.choice_extension)
10475 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
10477 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
10478 if(snssai->sST.buf)
10480 CU_FREE(snssai->sST.buf,snssai->sST.size);
10484 if(snssai->sD->buf)
10486 CU_FREE(snssai->sD->buf,snssai->sD->size);
10488 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
10491 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
10492 if(flowMap->list.array)
10494 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
10496 if(flowMap->list.array[arrIdx] )
10498 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
10499 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
10502 CU_FREE(flowMap->list.array,flowMap->list.size);
10505 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
10511 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
10512 if(drbItem->uLConfiguration)
10514 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
10518 /*******************************************************************
10520 * @brief free the DRB to be modfified list
10524 * Function : FreeDrbToBeModifiedList
10526 * Functionality: free the DRB to be Setup Mod list
10528 * @params[in] FreeDrbToBeModifiedList_t *drbSet
10530 * @return ROK - success
10531 * RFAILED - failure
10533 * ****************************************************************/
10534 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
10537 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
10539 if(drbSet->list.array)
10541 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
10543 if(drbSet->list.array[arrIdx] != NULLP)
10545 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
10546 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
10547 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
10550 CU_FREE(drbSet->list.array, drbSet->list.size);
10555 /*******************************************************************
10557 * @brief free the UeContextModification Request
10561 * Function : FreeUeContextModicationRequest
10563 * Functionality : deallocation of memory allocated in UeContextModiification
10566 * @params[in] F1AP_PDU_t *f1apMsg
10570 * ****************************************************************/
10571 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
10573 uint8_t arrIdx =0 , ieId=0;
10574 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10578 if(f1apMsg->choice.initiatingMessage)
10580 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10581 if(ueContextModifyReq->protocolIEs.list.array)
10583 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
10585 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
10587 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
10590 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10592 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10594 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
10596 FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10597 choice.DRBs_ToBeSetupMod_List);
10600 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
10602 FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
10603 choice.DRBs_ToBeModified_List);
10606 case ProtocolIE_ID_id_TransmissionActionIndicator:
10608 case ProtocolIE_ID_id_RRCContainer:
10610 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
10611 ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
10615 CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
10618 CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10620 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10622 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10626 /*******************************************************************
10628 * @brief Builds the Ue Context Modification Req
10632 * Function : BuildAndSendUeContextModificationReq
10634 * Functionality: Constructs the Ue Context Modification Req
10638 * @return ROK - success
10639 * RFAILED - failure
10641 * ****************************************************************/
10642 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
10645 uint8_t elementCnt = 0;
10646 uint8_t ret = RFAILED;
10647 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
10648 F1AP_PDU_t *f1apMsg = NULLP;
10649 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
10650 asn_enc_rval_t encRetVal;
10651 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
10654 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10655 if(f1apMsg == NULLP)
10657 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10661 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10663 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10664 if(f1apMsg->choice.initiatingMessage == NULLP)
10666 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
10669 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
10670 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10671 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
10673 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
10675 if(action == MODIFY_UE)
10677 else if(action == QUERY_CONFIG)
10679 else if(action == RRC_RECONFIG_COMPLETE_IND)
10681 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10684 ueContextModifyReq->protocolIEs.list.count = elementCnt;
10685 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
10687 /* Initialize the UE context modification members */
10688 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
10689 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
10691 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10695 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10697 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
10698 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
10700 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
10706 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10707 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10708 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10709 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
10710 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
10713 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10714 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10715 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
10716 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
10717 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
10719 if(action == MODIFY_UE)
10721 /* DRB to be setup list */
10723 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
10724 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10725 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10726 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
10727 ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10728 value.choice.DRBs_ToBeSetupMod_List));
10730 /* DRB to be modified list */
10732 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
10733 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10734 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
10735 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
10736 ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
10737 value.choice.DRBs_ToBeModified_List));
10739 /* TODO: DRB to be release list */
10743 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
10747 /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
10749 else if(action == QUERY_CONFIG)
10752 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
10753 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10754 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10755 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
10756 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
10758 else if(action == RRC_RECONFIG_COMPLETE_IND)
10761 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
10762 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10763 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10764 UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
10765 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
10766 RRCReconfigurationCompleteIndicator_true;
10768 else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
10771 if(action == STOP_DATA_TX)
10773 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10774 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10775 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10776 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10777 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10778 TransmissionActionIndicator_stop;
10780 else if (action == RESTART_DATA_TX)
10782 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
10783 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10784 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10785 UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
10786 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
10787 TransmissionActionIndicator_restart;
10791 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
10792 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10793 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
10794 UEContextModificationRequestIEs__value_PR_RRCContainer;
10795 if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
10797 DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
10801 /* RRC delivery status request */
10803 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
10804 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10805 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
10806 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
10809 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10811 /* Encode the F1SetupRequest type as APER */
10812 memset(encBuf, 0, ENC_BUF_MAX_LEN);
10814 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10816 /* Encode results */
10817 if(encRetVal.encoded == ENCODE_FAIL)
10819 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
10820 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10825 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
10827 /* This for loop was going into an infinite loop even though encBufSize
10828 * has a small value. Hence commented this
10830 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
10832 DU_LOG("%x",encBuf[ieIdx]);
10837 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
10838 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
10840 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
10848 FreeUeContextModicationRequest(f1apMsg);
10852 /*****************************************************************i
10854 * @brief Free memory allocated for UE Context Release Command
10858 * Function : FreeUeContextReleaseCommand
10861 * - Free memory allocated for UE Context Release Command
10863 * @params[in] F1AP_PDU_t *f1apMsg
10866 * *************************************************************/
10867 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
10870 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
10874 if(f1apMsg->choice.initiatingMessage)
10876 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10877 if(ueReleaseCommand->protocolIEs.list.array)
10879 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
10881 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10883 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
10885 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10887 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10890 /*******************************************************************
10892 * @brief Builds the Ue Context Release Command
10896 * Function : BuildAndSendUeContextReleaseCommand
10898 * Functionality: Constructs the Ue Context Release Command
10902 * @return ROK - success
10903 * RFAILED - failure
10905 * ****************************************************************/
10906 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
10908 bool memAllocFailed = false;
10909 uint8_t duIdx = 0, ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
10912 F1AP_PDU_t *f1apMsg = NULLP;
10913 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
10915 asn_enc_rval_t encRetVal;
10916 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
10920 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10921 if(f1apMsg == NULLP)
10923 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
10927 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10929 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10930 if(f1apMsg->choice.initiatingMessage == NULLP)
10932 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
10935 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
10936 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10937 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
10939 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
10941 SEARCH_DU_DB(duIdx, duId, duDb);
10942 ueCb = &duDb->ueCb[duUeF1apId-1];
10943 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
10948 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
10949 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
10951 /* Initialize the UE context modification members */
10952 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
10953 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
10955 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
10959 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
10961 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
10962 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
10964 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
10965 memAllocFailed = true;
10970 if(memAllocFailed == true)
10976 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10977 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10978 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
10979 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
10980 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
10983 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10984 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
10985 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10986 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
10987 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
10989 /* Cause of UE context release */
10991 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
10992 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
10993 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
10994 UEContextReleaseCommandIEs__value_PR_Cause;
10995 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10996 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
10997 CauseRadioNetwork_normal_release;
10998 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11000 /* RRC Container for RRC release */
11002 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
11003 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11004 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
11005 UEContextReleaseCommandIEs__value_PR_RRCContainer;
11006 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
11008 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
11009 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
11010 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
11011 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
11013 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
11016 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
11017 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
11019 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11021 /* Encode the UE Context Release Command type as APER */
11022 memset(encBuf, 0, ENC_BUF_MAX_LEN);
11024 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11027 /* Encode results */
11028 if(encRetVal.encoded == ENCODE_FAIL)
11030 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
11031 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11036 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
11037 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
11039 DU_LOG("%x",encBuf[ieIdx]);
11043 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
11044 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
11046 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
11054 FreeUeContextReleaseCommand(f1apMsg);
11057 /*******************************************************************
11059 * @brief process Ue context release request
11063 * Function : procUeContextReleaseReq
11066 * - process Ue context release request
11068 * @params[in] F1AP_PDU_t *f1apMsg
11069 * @return ROK - success
11070 * RFAILED - failure
11072 * ****************************************************************/
11073 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
11075 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
11077 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
11078 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
11080 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
11082 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
11084 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11086 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11089 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11091 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11099 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
11101 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
11106 /*******************************************************************
11108 * @brief processing of Gnb-DU config update
11112 * Function : procGnbDuUpdate
11115 * - processing of Gnb-DU config update
11117 * @params[in] F1AP_PDU_t *f1apMsg
11118 * @return ROK - success
11119 * RFAILED - failure
11121 * ****************************************************************/
11122 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
11124 bool cellToBeDelete = false;
11125 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
11129 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
11131 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11132 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
11134 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
11136 case ProtocolIE_ID_id_TransactionID:
11138 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
11140 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11142 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
11143 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11144 Served_Cells_To_Delete_List.list.array[0];
11145 bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId);
11146 cellToBeDelete = true;
11149 case ProtocolIE_ID_id_gNB_DU_ID:
11153 if(BuildAndSendDUUpdateAck(duId) != ROK)
11155 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
11159 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
11160 * commented this trigger for now */
11162 if(cellToBeDelete == false)
11164 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
11165 if(BuildAndSendF1ResetReq() != ROK)
11167 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
11172 if(cellToBeDelete == true)
11174 SEARCH_DU_DB(duIdx, duId, duDb);
11175 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11176 if(cellCb->numUe == 0)
11178 memset(cellCb, 0, sizeof(CuCellCb));
11182 cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
11187 /*******************************************************************
11189 * @brief storing slice list in CU database
11193 * Function : buildSliceList
11196 * - storing slice list in CU database
11198 * @params[in] SliceSupportList_t *sliceSupportList
11199 * @return ROK - success
11200 * RFAILED - failure
11202 * ****************************************************************/
11203 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
11205 uint8_t sliceListIdx = 0;
11207 if(sliceSupportList)
11209 if(sliceSupportList->list.array)
11211 cuCb.numSnssaiSupported = sliceSupportList->list.count;
11212 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
11214 if(sliceSupportList->list.array[sliceListIdx])
11216 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
11217 if(cuCb.snssaiList[sliceListIdx] == NULLP)
11219 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
11222 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
11224 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
11225 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
11227 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
11229 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
11230 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
11231 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
11240 /****************************************************************
11241 * @brief Function to process Srb Setup Mod List
11245 * Function : procSrbSetupModList
11248 * - Function to process SRB Setup Mod List
11251 * @return ROK - success
11252 * RFAILED - failure
11254 * ****************************************************************/
11255 uint8_t procSrbSetupModList(CuUeCb *ueCb, SRBs_SetupMod_List_t *srbSetupList)
11257 uint8_t arrIdx = 0, srbIdx;
11258 struct SRBs_SetupMod_ItemIEs *srbItemIe = NULLP;
11260 if(srbSetupList != NULLP)
11262 for(arrIdx = 0; arrIdx < srbSetupList->list.count; arrIdx++)
11264 srbItemIe = ((struct SRBs_SetupMod_ItemIEs *)srbSetupList->list.array[arrIdx]);
11265 if(srbItemIe->value.present == SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item)
11267 for(srbIdx = 0; srbIdx < ueCb->numSrb; srbIdx++)
11269 if(ueCb->srbList[srbIdx].srbId == srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID)
11271 ueCb->srbList[srbIdx].lcId = srbItemIe->value.choice.SRBs_SetupMod_Item.lCID;
11283 /****************************************************************
11284 * @brief Function to process Drb Setup Mod List
11288 * Function : procDrbSetupModList
11291 * - Function to process DRB Setup Mod List
11294 * @return ROK - success
11295 * RFAILED - failure
11297 * ****************************************************************/
11298 uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
11300 uint8_t arrIdx = 0, drbIdx;
11302 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
11304 if(drbSetupList != NULLP)
11306 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
11308 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
11309 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
11311 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11313 if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID)
11315 if(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID)
11316 ueCb->drbList[drbIdx].lcId = *(drbItemIe->value.choice.DRBs_SetupMod_Item.lCID);
11321 if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
11323 /* extracting teId */
11324 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
11327 if(addDrbTunnels(duId, teId)== ROK)
11329 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
11341 /*******************************************************************
11343 * @brief processing of GNB_DU_Served_Cells Plmn list information
11347 * Function : procServedCellPlmnList
11350 * - processing of GNB_DU_Served_Cells Plmn list information for storing
11353 * @params[in] F1AP_PDU_t *f1apMsg
11354 * @return ROK - success
11355 * RFAILED - failure
11357 * ****************************************************************/
11358 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
11360 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
11361 ProtocolExtensionContainer_4624P3_t **ieExtend;
11363 if(srvPlmn->list.array)
11365 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
11367 if(srvPlmn->list.array[srvPlmnIdx])
11369 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
11372 if((*ieExtend)->list.array)
11374 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
11376 if((*ieExtend)->list.array[ieExtensionsLstIdx])
11378 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
11380 case ProtocolIE_ID_id_TAISliceSupportList:
11382 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
11383 extensionValue.choice.SliceSupportList) != ROK)
11385 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
11400 /****************************************************************
11401 * @brief Function to process Ue Context Modification Response
11405 * Function : procUeContextModificationResponse
11408 * - Function to process Ue Context Modification Response
11411 * @return ROK - success
11412 * RFAILED - failure
11414 * ****************************************************************/
11415 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
11417 uint8_t idx=0, duIdx=0;
11418 uint8_t duUeF1apId = 0, cuUeF1apId = 0;
11419 DuDb *duDb = NULLP;
11420 CuUeCb *ueCb = NULLP;
11421 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
11423 SEARCH_DU_DB(duIdx, duId, duDb);
11424 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
11426 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
11428 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
11430 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11432 cuUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11435 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11437 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11438 ueCb = &duDb->ueCb[duUeF1apId-1];
11441 case ProtocolIE_ID_id_DRBs_SetupMod_List:
11443 /* Adding Tunnels for successful DRB */
11444 procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
11448 case ProtocolIE_ID_id_SRBs_SetupMod_List:
11450 procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
11453 case ProtocolIE_ID_id_DUtoCURRCInformation:
11455 DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
11456 if((extractDuToCuRrcCont(ueCb, ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.\
11457 DUtoCURRCInformation.cellGroupConfig)) != ROK)
11459 DU_LOG("\nERROR --> F1AP : Failed to extract Du to Cu RRC Information");
11468 /* If UE is in handover and UE context is not yet created at target DU, then send
11469 * UE context setup request to target DU */
11470 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
11473 DuDb *tgtDuDb = NULLP;
11474 CuUeCb *ueCbInTgtDu = NULLP;
11476 SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
11479 /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
11480 * not known here, using CU UE F1AP ID to search for UE Cb in target DU
11482 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11484 if(tgtDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
11486 ueCbInTgtDu = &tgtDuDb->ueCb[ueIdx];
11491 /* If UE context is not found in Target DU DU, send UE context setup
11493 if(ueCbInTgtDu == NULLP)
11495 if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
11497 DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq");
11507 /*******************************************************************
11509 * @brief processing of F1 setup request
11513 * Function : procF1SetupReq
11516 * - processing of F1 setup request
11518 * @params[in] F1AP_PDU_t *f1apMsg
11519 * @return ROK - success
11520 * RFAILED - failure
11522 * ****************************************************************/
11523 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
11525 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
11527 uint64_t nrCellId = 0;
11528 DuDb *duDb = NULLP;
11529 CuCellCb *cellCb = NULLP;
11530 BIT_STRING_t nrcellIdentity;
11531 F1SetupRequest_t *f1SetupReq = NULLP;
11532 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
11533 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
11535 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
11536 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
11538 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
11540 case ProtocolIE_ID_id_gNB_DU_ID:
11542 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
11543 SEARCH_DU_DB(duIdx, duId, duDb);
11546 duDb = &cuCb.duInfo[cuCb.numDu];
11549 memset(duDb, 0, sizeof(DuDb));
11554 case ProtocolIE_ID_id_gNB_DU_Name:
11556 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
11559 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
11561 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
11562 if(duServedCell->list.array)
11564 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
11566 if(duServedCell->list.array[plmnidx])
11568 switch(duServedCell->list.array[plmnidx]->id)
11570 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
11572 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
11573 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
11574 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
11576 bitStringToInt(&nrcellIdentity, &nrCellId);
11577 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
11578 if(cellCb == NULLP)
11580 cellCb = &duDb->cellCb[duDb->numCells];
11581 memset(cellCb, 0, sizeof(CuCellCb));
11582 cellCb->nrCellId = nrCellId;
11583 cellCb->cellStatus = CELL_ACTIVE;
11596 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
11600 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
11604 /****************************************************************
11606 * @brief processing of UE Context Release Complete
11610 * Function : procUeContextReleaseComplete
11613 * - processing of UE Context Release Complete
11615 * @params[in] F1AP_PDU_t *f1apMsg
11616 * @return ROK - success
11617 * RFAILED - failure
11619 * ****************************************************************/
11620 void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg)
11622 uint8_t duIdx = 0, ieIdx = 0, ueIdx = 0, drbIdx = 0;
11623 uint8_t gnbDuUeF1apId = 0, gnbCuUeF1apId = 0;
11624 DuDb *duDb = NULLP;
11625 CuUeCb *ueCb = NULLP;
11626 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
11628 SEARCH_DU_DB(duIdx, duId, duDb);
11631 DU_LOG("\nERROR --> F1AP : No entry found for DU ID [%d]", duId);
11635 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
11636 for(ieIdx=0; ieIdx < ueReleaseComplete->protocolIEs.list.count; ieIdx++)
11638 switch(ueReleaseComplete->protocolIEs.list.array[ieIdx]->id)
11640 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11642 gnbCuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11645 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11647 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11648 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
11649 for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
11651 if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
11653 if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
11654 (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
11656 for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
11658 deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
11660 ueCb->cellCb->ueCb[ueIdx] = NULLP;
11661 ueCb->cellCb->numUe--;
11662 if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS))
11664 memset(ueCb->cellCb, 0, sizeof(CuCellCb));
11671 memset(ueCb, 0, sizeof(CuUeCb));
11679 /*******************************************************************
11681 * @brief Builds the Paging cell list
11685 * Function : BuildPagingCellList
11687 * Functionality: Build the paging cell list
11689 * @params[in] PagingCell_list_t *pagingCelllist,
11691 * @return ROK - success
11692 * RFAILED - failure
11694 * ****************************************************************/
11695 uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
11697 uint8_t cellIdx =0;
11698 PagingCell_ItemIEs_t *pagingCellItemIes;
11699 PagingCell_Item_t *pagingCellItem;
11701 pagingCelllist->list.count = numCells;
11702 pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
11703 CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
11704 if(pagingCelllist->list.array == NULLP)
11706 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11710 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11712 CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11713 if(pagingCelllist->list.array[cellIdx] == NULLP)
11715 DU_LOG("\nERROR --> F1AP : BuildPagingCellList(): Memory allocation failed ");
11720 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11722 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11723 pagingCellItemIes->id = ProtocolIE_ID_id_PagingCell_Item;
11724 pagingCellItemIes->criticality = Criticality_ignore;
11725 pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item;
11726 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11728 /* Fill NrCgi Information */
11729 BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
11735 /*******************************************************************
11737 * @brief Deallocation of memory allocated in paging msg
11741 * Function :FreePagingMsg
11743 * Functionality: Deallocation of memory allocated in paging msg
11745 * @params[in] F1AP_PDU_t *f1apMsg
11749 * ****************************************************************/
11750 void FreePagingMsg(F1AP_PDU_t *f1apMsg)
11752 uint8_t ieIdx, cellIdx;
11754 PagingCell_ItemIEs_t *pagingCellItemIes;
11755 PagingCell_Item_t *pagingCellItem;
11756 PagingCell_list_t *pagingCelllist;
11760 if(f1apMsg->choice.initiatingMessage)
11762 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11763 if(paging->protocolIEs.list.array)
11765 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
11767 if(paging->protocolIEs.list.array[ieIdx])
11769 switch(paging->protocolIEs.list.array[ieIdx]->id)
11771 case ProtocolIE_ID_id_UEIdentityIndexValue:
11773 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11774 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11778 case ProtocolIE_ID_id_PagingIdentity:
11780 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
11782 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11784 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
11786 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11787 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11789 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
11790 sizeof(struct CNUEPagingIdentity));
11796 case ProtocolIE_ID_id_PagingCell_List:
11798 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
11799 if(pagingCelllist->list.array)
11801 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
11803 if(pagingCelllist->list.array[cellIdx])
11805 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
11806 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
11808 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
11809 CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
11810 CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
11812 CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
11815 CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
11820 CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11823 CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11825 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11827 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11830 /*******************************************************************
11832 * @brief Builds and sends the paging message if UE is in idle mode
11836 * Function : BuildAndSendPagingMsg
11838 * Functionality: Builds and sends the paging message
11840 * @params[in] uint32_t duId, uint8_t gsTmsi
11842 * @return ROK - success
11843 * RFAILED - failure
11845 * ****************************************************************/
11846 uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
11848 bool memAllocFailed = false;
11849 uint8_t ieIdx = 0, elementCnt = 0, ret = RFAILED;
11850 uint16_t ueId = 0, duIdx = 0;
11852 /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
11853 *5G-S-TMSI :48 Bits >> 6 Bytes and 0 UnusedBits */
11854 uint8_t totalByteInUeId = 2, totalByteInTmsi = 6;
11855 uint8_t unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
11857 F1AP_PDU_t *f1apMsg = NULLP;
11858 Paging_t *paging = NULLP;
11860 asn_enc_rval_t encRetVal;
11862 DU_LOG("\nINFO --> F1AP : Building PAGING Message command\n");
11864 SEARCH_DU_DB(duIdx, duId, duDb);
11867 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): DuDb is empty");
11873 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11874 if(f1apMsg == NULLP)
11876 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
11880 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11882 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11883 if(f1apMsg->choice.initiatingMessage == NULLP)
11885 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
11888 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
11889 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11890 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
11892 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
11895 paging->protocolIEs.list.count = elementCnt;
11896 paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
11898 /* Initialize the Paging Message members */
11899 CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
11900 if(paging->protocolIEs.list.array == NULLP)
11902 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg():Memory allocation failed");
11906 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
11908 CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
11909 if(paging->protocolIEs.list.array[ieIdx] == NULLP)
11911 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11912 memAllocFailed = true;
11917 if(memAllocFailed == true)
11922 /* UE Identity Index Value */
11924 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
11925 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11926 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
11927 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
11928 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
11929 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
11930 paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
11931 if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
11933 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11937 /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
11938 ueId = gsTmsi % 1024;
11939 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
11941 /* Paging Identity */
11943 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
11944 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
11945 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
11946 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
11947 PagingIdentity_PR_cNUEPagingIdentity;
11948 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
11949 sizeof(struct CNUEPagingIdentity));
11950 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
11952 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11956 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
11957 CNUEPagingIdentity_PR_fiveG_S_TMSI;
11959 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
11960 CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
11961 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
11962 if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
11964 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
11968 fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
11969 unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
11973 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
11974 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11975 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
11976 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
11978 /* Paging Priority */
11980 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
11981 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11982 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
11983 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
11985 /* Paging Cell List */
11987 paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
11988 paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
11989 paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
11990 if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
11992 DU_LOG("\nERROR --> F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list ");
11996 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11998 /* Encode the UE Context Release Command type as APER */
11999 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12001 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12004 /* Encode results */
12005 if(encRetVal.encoded == ENCODE_FAIL)
12007 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
12008 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12013 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Paging\n");
12014 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12016 DU_LOG("%x",encBuf[ieIdx]);
12020 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
12022 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
12031 FreePagingMsg(f1apMsg);
12035 /*******************************************************************
12037 * @brief Handles received F1AP message and sends back response
12041 * Function : F1APMsgHdlr
12044 * - Decodes received F1AP control message
12045 * - Prepares response message, encodes and sends to SCTP
12048 * @return ROK - success
12049 * RFAILED - failure
12051 * ****************************************************************/
12052 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
12058 F1AP_PDU_t *f1apMsg = NULLP;
12059 asn_dec_rval_t rval; /* Decoder return value */
12060 F1AP_PDU_t f1apasnmsg ;
12062 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
12063 ODU_PRINT_MSG(mBuf, 0,0);
12065 /* Copy mBuf into char array to decode it */
12066 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
12067 CU_ALLOC(recvBuf, (Size)recvBufLen);
12069 if(recvBuf == NULLP)
12071 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
12074 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
12076 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
12080 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
12081 for(i=0; i< recvBufLen; i++)
12083 DU_LOG("%x",recvBuf[i]);
12086 /* Decoding flat buffer into F1AP messsage */
12087 f1apMsg = &f1apasnmsg;
12088 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
12090 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
12091 CU_FREE(recvBuf, (Size)recvBufLen);
12093 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
12095 DU_LOG("\nERROR --> F1AP : ASN decode failed");
12099 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12101 switch(f1apMsg->present)
12103 case F1AP_PDU_PR_initiatingMessage:
12105 switch(f1apMsg->choice.initiatingMessage->value.present)
12107 case InitiatingMessage__value_PR_Reset:
12109 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
12110 BuildAndSendF1ResetAck();
12114 case InitiatingMessage__value_PR_F1SetupRequest:
12116 DU_LOG("\nINFO --> F1AP : F1 setup request received");
12117 procF1SetupReq(duId, f1apMsg);
12121 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
12123 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
12124 procGnbDuUpdate(*duId, f1apMsg);
12127 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
12129 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
12130 procInitULRRCMsg(*duId, f1apMsg);
12133 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
12135 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
12136 procUlRrcMsg(*duId, f1apMsg);
12140 case InitiatingMessage__value_PR_RRCDeliveryReport:
12142 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
12145 case InitiatingMessage__value_PR_UEContextReleaseRequest:
12147 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
12148 procUeContextReleaseReq(*duId, f1apMsg);
12153 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
12154 f1apMsg->choice.initiatingMessage->value.present);
12157 }/* End of switch(initiatingMessage) */
12161 case F1AP_PDU_PR_successfulOutcome:
12163 switch(f1apMsg->choice.successfulOutcome->value.present)
12165 case SuccessfulOutcome__value_PR_ResetAcknowledge:
12167 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
12170 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
12172 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
12173 procUeContextSetupResponse(*duId, f1apMsg);
12176 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
12178 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
12179 procUeContextModificationResponse(*duId, f1apMsg);
12182 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
12184 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
12185 procUeContextReleaseComplete(*duId, f1apMsg);
12190 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
12191 f1apMsg->choice.successfulOutcome->value.present);
12194 }/* End of switch(successfulOutcome) */
12199 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
12202 }/* End of switch(f1apMsg->present) */
12204 } /* End of F1APMsgHdlr */
12206 /**********************************************************************
12208 **********************************************************************/