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 "cu_stub_sctp.h"
25 #include "cu_f1ap_msg_hdl.h"
26 /*header files needed for Ue Context Setup */
27 #include<ProtocolIE-Field.h>
28 #include "ProtocolExtensionField.h"
29 #include "ProtocolIE-SingleContainer.h"
31 #include "ModulationOrder.h"
33 #include "UE-CapabilityRAT-Container.h"
34 #include "UE-CapabilityRAT-ContainerList.h"
35 #include "UE-CapabilityRAT-ContainerListRRC.h"
36 #include "SupportedBandwidth.h"
37 #include "FeatureSetUplinkPerCC.h"
38 #include "FeatureSetDownlinkPerCC.h"
39 #include "FeatureSets.h"
40 #include "RF-Parameters.h"
41 #include "UE-NR-Capability.h"
42 #include "ProtocolExtensionContainer.h"
43 #include "CellGroupConfigRrc.h"
44 #include "MAC-CellGroupConfig.h"
45 #include "SchedulingRequestConfig.h"
46 #include "SchedulingRequestToAddMod.h"
47 #include "BSR-Config.h"
48 #include "TAG-Config.h"
50 #include "PHR-Config.h"
51 #include "RLC-Config.h"
52 #include "UL-AM-RLC.h"
53 #include "DL-AM-RLC.h"
54 #include "LogicalChannelConfig.h"
55 #include "RLC-BearerConfig.h"
56 #include "PhysicalCellGroupConfig.h"
57 #include "SpCellConfig.h"
58 #include "ServingCellConfig.h"
59 #include "ControlResourceSet.h"
60 #include "SearchSpace.h"
61 #include "PDCCH-Config.h"
62 #include "PDSCH-TimeDomainResourceAllocation.h"
63 #include "PDSCH-TimeDomainResourceAllocationList.h"
64 #include "DMRS-DownlinkConfig.h"
65 #include "PDSCH-Config.h"
66 #include "BWP-DownlinkDedicated.h"
67 #include "PUSCH-TimeDomainResourceAllocation.h"
68 #include "PUSCH-TimeDomainResourceAllocationList.h"
69 #include "DMRS-UplinkConfig.h"
70 #include "PUSCH-Config.h"
71 #include "SRS-ResourceId.h"
72 #include "SRS-Resource.h"
73 #include "SRS-ResourceSet.h"
74 #include "SRS-Config.h"
75 #include "PUCCH-Config.h"
76 #include "BWP-UplinkDedicated.h"
77 #include "PUSCH-ServingCellConfig.h"
78 #include "UplinkConfig.h"
79 #include "PDSCH-ServingCellConfig.h"
80 #include "EUTRANQoS.h"
81 #include "GBR-QosInformation.h"
82 #include "DRBs-ToBeSetupMod-List.h"
83 #include "DRBs-ToBeSetupMod-Item.h"
85 /* MACRO for CUtoDURRCInformation */
87 #define FREQ_DOM_RSRC_SIZE 6
88 #define CORESET0_END_PRB 48
89 #define CORESET1_NUM_PRB 24
90 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
91 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
92 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
93 #define PDCCH_SRCH_SPC_TWO_ID 2
95 #define SCRAMBLING_ID NR_PCI
96 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
97 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
98 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
99 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
100 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
101 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
102 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
103 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
104 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
106 /* MACRO Ddefine for PDSCH Configuration */
108 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
109 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
110 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
111 #define PDSCH_NUM_HARQ_PROC 5
112 #define PDSCH_MAPPING_TYPE_A 0
113 #define PDSCH_MAPPING_TYPE_B 1
115 /* MACRO Define for PUSCH Configuration */
116 #define PUSCH_K2_CFG1 3
117 #define PUSCH_K2_CFG2 4
119 #define PUSCH_MSG3_DELTA_PREAMBLE 0
120 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
121 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
122 #define PUSCH_MAX_MIMO_LAYERS 1
123 #define PUSCH_PROCESS_TYPE2_ENABLED false
124 #define PUSCH_MAPPING_TYPE_A 0
125 #define PUSCH_MAPPING_TYPE_B 1
127 /* MACRO defines for SRC config */
128 #define SRS_RSRC_ID 1
129 #define SRS_RSET_ID 1
130 #define SRS_COMB_OFFSET_N2 0
131 #define SRS_CYCLIC_SHIFT_N2 0
132 #define SRS_FREQ_DOM_POS 0
133 #define SRS_FREQ_DOM_SHIFT 0
138 #define APERIODIC_SRS_RESRC_TRIGGER 1
140 /* Macro definitions for DUtoCuRrcContainer */
141 #define CELL_GRP_ID 1
143 #define SR_PROHIBIT_TMR 5
144 #define SR_TRANS_MAX 2
145 #define PERIODIC_BSR_TMR 2
146 #define RETX_BSR_TMR 5
147 #define SR_DELAY_TMR 6
149 #define TIME_ALIGNMENT_TMR 7
150 #define PHR_PERIODIC_TMR 7
151 #define PHR_PROHIBHIT_TMR 0
152 #define PHR_PWR_FACTOR_CHANGE 3
153 #define PHR_MODE_OTHER_CG 0
156 #define SN_FIELD_LEN 0
157 #define T_POLL_RETRANSMIT 8
160 #define MAX_RETX_THRESHOLD 5
161 #define T_REASSEMBLY 8
162 #define T_STATUS_PROHIBHIT 7
163 #define MAC_LC_PRIORITY 1
164 #define PRIORTISIED_BIT_RATE 15
165 #define BUCKET_SIZE_DURATION 5
168 #define PDSCH_HARQ_ACK_CODEBOOK 1
169 #define SERV_CELL_IDX 0
170 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
171 #define ACTIVE_DL_BWP_ID 0
172 #define ACTIVE_UL_BWP_ID 0
173 #define SCRAMBLING_ID NR_PCI
174 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
175 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
176 #define FIVE_QI_VALUE 9 /*spec 23.501, Table 5.7.4-1*/
177 /*******************************************************************
179 * @brief Sends F1 msg over SCTP
183 * Function : SendF1APMsg
185 * Functionality: Sends F1 msg over SCTP
187 * @params[in] Region region
189 * @return ROK - success
192 * ****************************************************************/
193 S16 SendF1APMsg(Region region, Pool pool)
195 Buffer *mBuf = NULLP;
197 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
199 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
201 ODU_PRINT_MSG(mBuf, 0,0);
203 if(sctpSend(mBuf) != ROK)
205 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
206 ODU_PUT_MSG_BUF(mBuf);
212 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
213 ODU_PUT_MSG_BUF(mBuf);
216 ODU_PUT_MSG_BUF(mBuf);
220 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
227 /*******************************************************************
229 * @brief Builds NRCell ID
233 * Function : BuildNrCellId
235 * Functionality: Building the NR Cell ID
237 * @params[in] BIT_STRING_t *nrcell
238 * @return ROK - success
241 * ****************************************************************/
243 S16 BuildNrCellId(BIT_STRING_t *nrcell)
245 memset(nrcell->buf, 0, nrcell->size);
247 nrcell->bits_unused = 4;
248 nrcell->size = 5 * sizeof(uint8_t);
252 /********************************************************************
254 * @brief Builds and sends the F1SetupResponse
258 * Function : BuildAndSendF1SetupRsp
260 * Functionality: Constructs the F1SetupResponse message and sends
261 * it back to the DU through SCTP.
263 * @params[in] void **buf,Buffer to which encoded pattern is written into
264 * @params[in] int *size,size of buffer
266 * @return ROK - success
269 * ****************************************************************/
270 S16 BuildAndSendF1SetupRsp()
273 uint8_t elementCnt,cellCnt;
274 F1AP_PDU_t *f1apMsg = NULL;
275 F1SetupResponse_t *f1SetupRsp;
276 GNB_CU_Name_t *cuName;
277 Cells_to_be_Activated_List_t *cellToActivate;
278 RRC_Version_t *rrcVer;
279 asn_enc_rval_t encRetVal;
280 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
282 /* Allocate the memory for F1SetupRequest_t */
283 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
286 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
289 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
291 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
292 if(f1apMsg->choice.successfulOutcome == NULLP)
294 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
295 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
299 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
300 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
301 f1apMsg->choice.successfulOutcome->value.present = \
302 SuccessfulOutcome__value_PR_F1SetupResponse;
303 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
306 f1SetupRsp->protocolIEs.list.count = elementCnt;
307 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
309 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
310 elementCnt * sizeof(F1SetupResponseIEs_t *));
311 if(f1SetupRsp->protocolIEs.list.array == NULLP)
313 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
314 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
315 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
319 for(idx=0; idx<elementCnt; idx++)
321 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
322 sizeof(F1SetupResponseIEs_t));
323 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
325 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
326 elementCnt * sizeof(F1SetupResponseIEs_t *));
327 CU_FREE(f1apMsg->choice.successfulOutcome, \
328 sizeof(SuccessfulOutcome_t));
329 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
336 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
337 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
338 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
339 F1SetupResponseIEs__value_PR_TransactionID;
340 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
345 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
346 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
347 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
348 F1SetupResponseIEs__value_PR_GNB_CU_Name;
349 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
350 cuName->size = sizeof(cuCfgParams.cuName);
352 CU_ALLOC(cuName->buf, sizeof(cuName->size));
353 if(cuName->buf == NULLP)
355 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
357 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
358 sizeof(F1SetupResponseIEs_t));
360 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
361 elementCnt * sizeof(F1SetupResponseIEs_t *));
362 CU_FREE(f1apMsg->choice.successfulOutcome,\
363 sizeof(SuccessfulOutcome_t));
364 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
367 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
369 /*Cells to be activated list*/
371 f1SetupRsp->protocolIEs.list.array[idx]->id = \
372 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
373 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
374 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
375 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
376 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
377 Cells_to_be_Activated_List;
379 cellToActivate->list.count = cellCnt;
380 cellToActivate->list.size = \
381 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
382 CU_ALLOC(cellToActivate->list.array,\
383 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
384 if(cellToActivate->list.array == NULLP)
386 CU_FREE(cuName->buf, sizeof(cuName->size));
387 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
389 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
390 sizeof(F1SetupResponseIEs_t));
392 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
393 elementCnt * sizeof(F1SetupResponseIEs_t *));
394 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
395 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
398 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
400 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
401 if(cellToActivate->list.array[ieIdx] == NULLP)
403 CU_FREE(cellToActivate->list.array,\
404 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
405 CU_FREE(cuName->buf, sizeof(cuName->size));
406 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
408 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
409 sizeof(F1SetupResponseIEs_t));
411 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
412 elementCnt * sizeof(F1SetupResponseIEs_t *));
413 CU_FREE(f1apMsg->choice.successfulOutcome, \
414 sizeof(SuccessfulOutcome_t));
415 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
419 cellToActivate->list.array[0]->id = \
420 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
421 cellToActivate->list.array[0]->criticality = Criticality_ignore;
422 cellToActivate->list.array[0]->value.present = \
423 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
424 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
425 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
426 CU_ALLOC(cellToActivate->list.array[0]->\
427 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
429 if(cellToActivate->list.array[0]->value.choice.\
430 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
433 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
435 CU_FREE(cellToActivate->list.array[ieIdx],\
436 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
439 CU_FREE(cellToActivate->list.array,\
440 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
441 CU_FREE(cuName->buf, sizeof(cuName->size));
442 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
444 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
445 sizeof(F1SetupResponseIEs_t));
447 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
448 elementCnt * sizeof(F1SetupResponseIEs_t *));
449 CU_FREE(f1apMsg->choice.successfulOutcome, \
450 sizeof(SuccessfulOutcome_t));
451 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
454 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
455 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
456 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
457 nRCGI.nRCellIdentity.size = 5;
458 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
459 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
461 if(cellToActivate->list.array[0]->value.choice.\
462 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
464 CU_FREE(cellToActivate->list.array[0]->\
465 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
467 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
469 CU_FREE(cellToActivate->list.array[ieIdx],\
470 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
473 CU_FREE(cellToActivate->list.array,\
474 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
475 CU_FREE(cuName->buf, sizeof(cuName->size));
476 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
478 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
479 sizeof(F1SetupResponseIEs_t));
481 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
482 elementCnt * sizeof(F1SetupResponseIEs_t *));
483 CU_FREE(f1apMsg->choice.successfulOutcome, \
484 sizeof(SuccessfulOutcome_t));
485 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
488 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
491 f1SetupRsp->protocolIEs.list.array[idx]->id = \
492 ProtocolIE_ID_id_GNB_CU_RRC_Version;
493 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
494 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
495 F1SetupResponseIEs__value_PR_RRC_Version;
496 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
497 rrcVer->latest_RRC_Version.size = RRC_SIZE;
499 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
500 if(rrcVer->latest_RRC_Version.buf == NULLP)
502 CU_FREE(cuName->buf, sizeof(cuName->size));
503 for(ieIdx=0; ieIdx<elementCnt; idx++)
505 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
506 sizeof(F1SetupResponseIEs_t));
508 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
509 elementCnt * sizeof(F1SetupResponseIEs_t *));
510 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
511 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
515 /* Need to check RRC Version */
516 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
517 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
518 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
519 if(rrcVer->iE_Extensions == NULLP)
521 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
522 CU_FREE(cuName->buf, sizeof(cuName->size));
523 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
525 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
526 sizeof(F1SetupResponseIEs_t));
528 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
529 elementCnt * sizeof(F1SetupResponseIEs_t *));
530 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
531 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
534 rrcVer->iE_Extensions->list.count = 1;
535 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
536 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
537 sizeof(struct RRC_Version_ExtIEs *));
538 if(rrcVer->iE_Extensions->list.array == NULLP)
540 CU_FREE(rrcVer->iE_Extensions,\
541 sizeof(ProtocolExtensionContainer_4624P81_t));
542 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
543 CU_FREE(cuName->buf, sizeof(cuName->size));
544 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
546 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
547 sizeof(F1SetupResponseIEs_t));
549 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
550 elementCnt * sizeof(F1SetupResponseIEs_t *));
551 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
552 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
555 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
556 sizeof(struct RRC_Version_ExtIEs));
557 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
559 CU_FREE(rrcVer->iE_Extensions->list.array,\
560 sizeof(struct RRC_Version_ExtIEs *));
561 CU_FREE(rrcVer->iE_Extensions,\
562 sizeof(ProtocolExtensionContainer_4624P81_t));
563 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
564 CU_FREE(cuName->buf, sizeof(cuName->size));
565 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
567 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
568 sizeof(F1SetupResponseIEs_t));
570 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
571 elementCnt * sizeof(F1SetupResponseIEs_t *));
572 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
573 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
576 rrcVer->iE_Extensions->list.array[0]->id = \
577 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
578 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
579 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
580 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
581 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
582 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
583 CU_ALLOC(rrcVer->iE_Extensions->list.\
584 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
586 if(rrcVer->iE_Extensions->list.\
587 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
589 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
590 sizeof(struct RRC_Version_ExtIEs));
591 CU_FREE(rrcVer->iE_Extensions->list.array,\
592 sizeof(struct RRC_Version_ExtIEs *));
593 CU_FREE(rrcVer->iE_Extensions,\
594 sizeof(ProtocolExtensionContainer_4624P81_t));
595 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
596 CU_FREE(cuName->buf, sizeof(cuName->size));
597 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
599 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
600 sizeof(F1SetupResponseIEs_t));
602 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
603 elementCnt * sizeof(F1SetupResponseIEs_t *));
604 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
605 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
608 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
609 Latest_RRC_Version_Enhanced.buf[0] = 0;
610 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
611 Latest_RRC_Version_Enhanced.buf[1] = 5;
612 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
613 Latest_RRC_Version_Enhanced.buf[2] = 15;
615 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
617 /* Encode the F1SetupRequest type as UPER */
618 memset(encBuf, 0, ENC_BUF_MAX_LEN);
620 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
623 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
624 CU_FREE(cuName->buf, sizeof(cuName->size));
625 for(idx=0; idx<elementCnt; idx++)
627 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
629 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
630 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
631 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
633 /* Check encode results */
634 if(encRetVal.encoded == ENCODE_FAIL)
636 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
637 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
642 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
643 for(int i=0; i< encBufSize; i++)
645 DU_LOG("%x",encBuf[i]);
650 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
652 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
657 }/* End of BuildAndSendF1SetupRsp */
659 /*******************************************************************
661 * @brief Builds and sends the DUUpdateAcknowledge
665 * Function : BuildAndSendDUUpdateAck
667 * Functionality: Constructs the DU Update Acknowledge message and sends
668 * it to the DU through SCTP.
672 * @return ROK - success
675 * ****************************************************************/
677 S16 BuildAndSendDUUpdateAck()
681 F1AP_PDU_t *f1apMsg = NULL;
682 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
683 asn_enc_rval_t enRetVal; /* Encoder return value */
685 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
687 /* Allocate the memory for F1SetupRequest_t */
688 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
691 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
695 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
697 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
698 if(f1apMsg->choice.successfulOutcome == NULLP)
700 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
701 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
705 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
706 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
707 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
708 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
711 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
712 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
714 /* Initialize the F1Setup members */
715 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
716 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
718 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
719 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
720 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
724 for(idx=0; idx<elementCnt; idx++)
726 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
727 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
729 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
730 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
731 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
738 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
739 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
740 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
741 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
742 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
744 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
746 /* Encode the F1SetupRequest type as UPER */
747 memset(encBuf, 0, ENC_BUF_MAX_LEN);
749 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
752 for(idx=0; idx<elementCnt; idx++)
754 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
756 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
757 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
758 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
760 /* Checking encode results */
761 if(enRetVal.encoded == ENCODE_FAIL)
763 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
764 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
769 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
770 for(int i=0; i< encBufSize; i++)
772 DU_LOG("%x",encBuf[i]);
777 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
779 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
785 }/* End of BuildAndSendDUUpdateAck*/
786 /*******************************************************************
788 * @brief deallocating the memory of F1reset msg
792 * Function : FreeF1ResetReq
795 * - freeing memory of F1reset request msg
801 * ****************************************************************/
802 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
805 Reset_t *f1ResetMsg = NULLP;
809 if(f1apMsg->choice.initiatingMessage)
811 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
812 if(f1ResetMsg->protocolIEs.list.array)
814 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
816 if(f1ResetMsg->protocolIEs.list.array[idx])
818 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
821 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
823 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
825 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
828 /*******************************************************************
830 * @brief build ansld ans send f1reset msg
834 * Function : BuildAndSendF1ResetReq
836 * Functionality: build and send f1reset msg
838 * @return ROK - success
841 * ****************************************************************/
842 uint8_t BuildAndSendF1ResetReq()
844 uint8_t elementCnt=0;
846 uint8_t ret= RFAILED;
847 Reset_t *f1ResetMsg = NULLP;
848 F1AP_PDU_t *f1apMsg = NULLP;
849 asn_enc_rval_t encRetVal;
850 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
853 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
856 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
859 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
860 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
861 if(f1apMsg->choice.initiatingMessage == NULLP)
863 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
866 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
867 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
868 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
870 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
873 f1ResetMsg->protocolIEs.list.count = elementCnt;
874 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
876 /* Initialize the F1Reset members */
877 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
878 if(f1ResetMsg->protocolIEs.list.array == NULLP)
880 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
883 for(idx=0; idx<elementCnt; idx++)
885 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
886 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
888 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
895 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
896 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
897 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
898 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
902 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
903 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
904 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
905 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
906 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
910 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
911 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
912 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
913 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
914 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
916 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
918 /* Encode the F1SetupRequest type as APER */
919 memset(encBuf, 0, ENC_BUF_MAX_LEN);
921 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
925 if(encRetVal.encoded == ENCODE_FAIL)
927 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
928 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
933 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
934 for(idx=0; idx< encBufSize; idx++)
936 DU_LOG("%x",encBuf[idx]);
940 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
942 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
950 FreeF1ResetReq(f1apMsg);
954 /*******************************************************************
956 * @brief Fills Radio Bearer Config
960 * Function : fillSrbCfg
962 * Functionality: Fills Radio Bearer Config
964 * @params[in] SRB_ToAddModList *
966 * @return ROK - success
969 * ****************************************************************/
970 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
974 if(bearerCfg != NULLP)
977 bearerCfg->list.count = elementCnt;
978 bearerCfg->list.size =\
979 elementCnt * sizeof(SRB_ToAddMod_t *);
980 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
981 if(bearerCfg->list.array != NULLP)
983 for(idx = 0; idx < elementCnt; idx++)
985 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
986 if(bearerCfg->list.array[idx] == NULLP)
988 for(ieId = 0; ieId < idx; ieId++)
990 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
992 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1002 bearerCfg->list.array[idx]->srb_Identity = srbId;
1007 /*******************************************************************
1009 * @brief Fills Master CellGroup Info
1013 * Function : fillMasterCellGroup
1015 * Functionality: Fills Master Cell Group IE
1017 * @params[in] RRCSetup_IEs_t *
1019 * @return ROK - success
1022 * ****************************************************************/
1024 uint8_t fillMasterCellGroup(uint8_t ueId, OCTET_STRING_t *masterCellGroup)
1027 masterCellGroup->buf = NULLP;
1028 if(ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf)
1030 masterCellGroup->size = ueCb[ueId-1].f1apMsgDb.duToCuContainer.size;
1031 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1032 if(masterCellGroup->buf != NULLP)
1034 memcpy(masterCellGroup->buf, ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf,\
1035 masterCellGroup->size);
1049 /*******************************************************************
1051 * @brief Fills RRC setup IE
1055 * Function : fillRRCSetupIE
1057 * Functionality: Fills RRC Setup IE
1059 * @params[in] RRCSetup_IEs_t *
1061 * @return ROK - success
1064 * ****************************************************************/
1066 uint8_t fillRRCSetupIE(uint8_t ueId, RRCSetup_IEs_t *rrcSetupIE)
1071 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1072 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1074 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1078 ret = fillMasterCellGroup(ueId, &rrcSetupIE->masterCellGroup);
1082 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1088 /*******************************************************************
1090 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1094 * Function : fillDlCcchRrcMsg
1096 * Functionality: Fills DL DCCCH Message required for
1097 * DLRRCMessageTransfer
1099 * @params[in] RRCContainer_t *rrcContainer
1101 * @return ROK - success
1104 * ****************************************************************/
1106 uint8_t fillDlCcchRrcMsg(uint8_t ueId, RRCContainer_t *rrcContainer)
1110 DL_CCCH_Message_t dl_CCCH_Msg;
1111 asn_enc_rval_t encRetVal;
1113 if(rrcContainer != NULLP)
1115 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1117 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1118 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1120 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1121 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1122 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1124 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1125 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1126 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1127 /* Fill RRC Setup IE */
1128 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1129 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1130 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1131 criticalExtensions.choice.rrcSetup != NULLP)
1133 ret = fillRRCSetupIE(ueId, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1134 criticalExtensions.choice.rrcSetup);
1138 /* encode DL-CCCH message into RRC Container */
1139 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1140 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1142 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1143 /* Encode results */
1144 if(encRetVal.encoded == ENCODE_FAIL)
1146 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1147 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1152 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1153 for(int i = 0; i< encBufSize; i++)
1155 DU_LOG("%x",encBuf[i]);
1157 rrcContainer->size = encBufSize;
1158 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1159 if(rrcContainer->buf != NULLP)
1161 memset(rrcContainer->buf, 0, encBufSize);
1162 for(idx2 = 0; idx2 < encBufSize; idx2++)
1164 rrcContainer->buf[idx2] = encBuf[idx2];
1176 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1182 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1188 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1194 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1199 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1201 uint8_t idx, ied, elementCnt;
1204 qosFlow->list.count = elementCnt;
1205 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1206 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1207 if(qosFlow->list.array != NULLP)
1209 for(idx = 0; idx < elementCnt; idx++)
1211 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1212 if(qosFlow->list.array[idx] == NULLP)
1214 for(ied = 0; ied < idx; ied++)
1216 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1218 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1224 *qosFlow->list.array[idx] = 9;
1228 /*******************************************************************
1230 * @brief Fills CN Assoc for Drb to Add/Mod List
1234 * Function : fillCnAssoc
1236 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1238 * @params[in] struct DRB_ToAddMod__cnAssociation *
1240 * @return ROK - success
1243 * ****************************************************************/
1245 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1249 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1250 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1252 cnAssoc->choice.eps_BearerIdentity = 5;
1254 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1256 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1257 if(cnAssoc->choice.sdap_Config)
1259 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1260 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1261 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1262 cnAssoc->choice.sdap_Config->defaultDRB = true;
1263 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1264 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1265 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1266 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1267 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1269 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1273 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1274 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1280 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1287 /*******************************************************************
1289 * @brief Fills Radio Bearer Config for Drb
1293 * Function : fillDrbCfg
1295 * Functionality: Fills Radio Bearer Config for Drb
1297 * @params[in] drbId, DRB_ToAddModList *
1299 * @return ROK - success
1302 * ****************************************************************/
1303 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1305 uint8_t idx, ied, ret, elementCnt;
1311 drbCfg->list.count = elementCnt;
1312 drbCfg->list.size =\
1313 elementCnt * sizeof(DRB_ToAddMod_t *);
1314 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1315 if(drbCfg->list.array != NULLP)
1317 for(idx = 0; idx < elementCnt; idx++)
1319 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1320 if(drbCfg->list.array[idx] == NULLP)
1322 for(ied = 0; ied < idx; ied++)
1324 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1326 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1336 /* CN ASSOCIATION */
1337 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1338 if(drbCfg->list.array[idx]->cnAssociation)
1340 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1343 drbCfg->list.array[idx]->drb_Identity = drbId;
1348 /*******************************************************************
1350 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1354 * Function : fillRrcReconfigIE
1356 * Functionality: Fills RRC Reconfig Message required for
1357 * DLRRCMessageTransfer
1359 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1361 * @return ROK - success
1364 * ****************************************************************/
1366 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1369 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1370 if(rrcReconfigMsg->radioBearerConfig)
1372 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1373 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1375 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1380 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1381 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1383 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1386 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1387 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1388 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1394 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1395 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1401 /*******************************************************************
1403 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1407 * Function : fillDlDcchRrcMsg
1409 * Functionality: Fills DL DCCH Message required for
1410 * DLRRCMessageTransfer
1412 * @params[in] RRCContainer_t *rrcContainer
1414 * @return ROK - success
1417 * ****************************************************************/
1419 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1423 DL_DCCH_Message_t dl_DCCH_Msg;
1424 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1425 asn_enc_rval_t encRetVal;
1427 if(rrcContainer != NULLP)
1429 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1431 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1432 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1434 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1435 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1436 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1438 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1439 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1440 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1441 /* Fill RRC Reconfig IE */
1442 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1443 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1444 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1445 criticalExtensions.choice.rrcReconfiguration != NULLP)
1447 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1448 criticalExtensions.choice.rrcReconfiguration);
1452 /* encode DL-DCCH message into RRC Container */
1453 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1454 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1456 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1457 /* Encode results */
1458 if(encRetVal.encoded == ENCODE_FAIL)
1460 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1461 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1466 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1467 for(int i = 0; i< encBufSize; i++)
1469 DU_LOG("%x",encBuf[i]);
1471 rrcContainer->size = encBufSize;
1472 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1473 if(rrcContainer->buf != NULLP)
1475 memset(rrcContainer->buf, 0, encBufSize);
1476 for(idx2 = 0; idx2 < encBufSize; idx2++)
1478 rrcContainer->buf[idx2] = encBuf[idx2];
1485 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1490 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1496 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1502 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1508 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1514 /*******************************************************************
1516 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1520 * Function : BuildDLRRCContainer
1522 * Functionality: Builds RRC Container IE required for
1523 * DLRRCMessageTransfer
1527 * @return ROK - success
1530 * ****************************************************************/
1532 uint8_t BuildDLRRCContainer(uint8_t ueId, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1534 uint8_t ret, bufLen;
1537 if(rrcMsgType == RRC_SETUP)
1539 ret = fillDlCcchRrcMsg(ueId, rrcContainer);
1541 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1543 else if(rrcMsgType == REGISTRATION_ACCEPT)
1545 /*Hardcoded RRC Container from reference logs*/
1546 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1548 rrcContainer->size = bufLen;
1549 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1550 if(rrcContainer->buf != NULLP)
1552 memset(rrcContainer->buf, 0, bufLen);
1553 memcpy(rrcContainer->buf, buf, bufLen);
1556 else if(rrcMsgType == RRC_RECONFIG)
1558 /*Hardcoded RRC Container from reference logs*/
1560 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1561 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1562 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1563 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1564 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1565 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1566 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1567 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1568 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1569 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1570 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1571 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1572 0x00, 0x00, 0x00, 0x00};
1574 rrcContainer->size = bufLen;
1575 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1576 if(rrcContainer->buf != NULLP)
1578 memset(rrcContainer->buf, 0, bufLen);
1579 memcpy(rrcContainer->buf, buf, bufLen);
1586 /*******************************************************************
1588 * @brief Builds and sends the DLRRCMessageTransfer
1592 * Function : BuildAndSendDLRRCMessageTransfer
1594 * Functionality: Constructs the DL RRC Message Transfer and sends
1595 * it to the CU through SCTP.
1599 * @return ROK - success
1602 * ****************************************************************/
1603 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t ueId, uint8_t srbId, uint8_t rrcMsgType)
1605 uint8_t elementCnt = 0;
1608 F1AP_PDU_t *f1apMsg = NULLP;
1609 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1610 asn_enc_rval_t encRetVal; /* Encoder return value */
1612 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1614 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1615 if(f1apMsg == NULLP)
1617 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1621 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1622 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1623 sizeof(InitiatingMessage_t));
1624 if(f1apMsg->choice.initiatingMessage == NULLP)
1626 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1627 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1631 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1632 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1633 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1634 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1637 dlRRCMsg->protocolIEs.list.count = elementCnt;
1638 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1640 /* Initialize the F1Setup members */
1641 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1642 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1644 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1645 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1646 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1650 for(idx=0; idx<elementCnt; idx++)
1652 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1653 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1655 for(ieId=0; ieId<idx; ieId++)
1657 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1658 sizeof(DLRRCMessageTransferIEs_t));
1660 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1661 dlRRCMsg->protocolIEs.list.size);
1662 CU_FREE(f1apMsg->choice.initiatingMessage,\
1663 sizeof(InitiatingMessage_t));
1664 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1669 /* GNB CU UE F1AP ID */
1671 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1672 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1673 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1674 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1675 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
1677 /* GNB DU UE F1AP ID */
1679 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1680 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1681 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1682 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1683 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1684 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
1688 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1689 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1690 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1691 DLRRCMessageTransferIEs__value_PR_SRBID;
1692 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1696 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1697 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1698 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1699 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1700 BuildDLRRCContainer(ueId, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1702 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1704 /* Encode the F1SetupRequest type as APER */
1705 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1707 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1709 /* Encode results */
1710 if(encRetVal.encoded == ENCODE_FAIL)
1712 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1713 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1718 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1719 for(int i=0; i< encBufSize; i++)
1721 DU_LOG("%x",encBuf[i]);
1726 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1728 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1733 }/* End of BuildAndSendDLRRCMessageTransfer */
1735 /*******************************************************************
1737 * @brief Function to set the Dl RRC Msg Type
1741 * Function : setDlRRCMsgType
1743 * Functionality: Constructs the UE Setup Response and sends
1744 * it to the DU through SCTP.
1748 * @return ROK - success
1751 * ****************************************************************/
1753 uint8_t setDlRRCMsgType(uint8_t ueId)
1755 uint8_t rrcMsgType = 0;
1756 switch(ueCb[ueId -1].f1apMsgDb.dlRrcMsgCount)
1759 rrcMsgType = RRC_SETUP;
1761 case REGISTRATION_ACCEPT:
1762 rrcMsgType = REGISTRATION_ACCEPT;
1764 case UE_CONTEXT_SETUP_REQ:
1765 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1767 case SECURITY_MODE_COMPLETE:
1768 rrcMsgType = SECURITY_MODE_COMPLETE;
1771 rrcMsgType = RRC_RECONFIG;
1773 case UE_CONTEXT_MOD_REQ:
1774 rrcMsgType = UE_CONTEXT_MOD_REQ;
1782 /*******************************************************************
1784 * @brief Function to build Initial UL RRC Message
1788 * Function : procInitULRRCMsg
1790 * Functionality: Function to build Initial UL RRC Message
1794 * @return ROK - success
1797 * ****************************************************************/
1799 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1801 uint8_t idx, rrcMsgType, gnbDuUeF1apId;
1803 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1804 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1806 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1808 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1810 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1812 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1813 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
1815 case ProtocolIE_ID_id_NRCGI:
1817 case ProtocolIE_ID_id_C_RNTI:
1819 case ProtocolIE_ID_id_RRCContainer:
1821 case ProtocolIE_ID_id_DUtoCURRCContainer:
1823 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1824 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1825 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1827 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1828 ueCb[gnbDuUeF1apId-1].ueId = gnbDuUeF1apId;
1829 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1830 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1831 CU_ALLOC(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, \
1832 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size);
1833 if(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf != NULLP)
1835 memcpy(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1836 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, ueCb[gnbDuUeF1apId-1].f1apMsgDb\
1837 .duToCuContainer.size);
1842 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1848 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1854 ueCb[gnbDuUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
1855 rrcMsgType = setDlRRCMsgType(gnbDuUeF1apId);
1856 ret = BuildAndSendDLRRCMessageTransfer(gnbDuUeF1apId, SRB0, rrcMsgType);
1861 /*******************************************************************
1863 * @brief Builds Nrcgi
1867 * Function : BuildNrcgi
1869 * Functionality: Building the PLMN ID and NR Cell id
1871 * @params[in] NRCGI_t *nrcgi
1872 * @return ROK - success
1875 * ****************************************************************/
1876 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1879 uint8_t unused_bits = 4;
1880 uint8_t byteSize = 5;
1882 /* Allocate Buffer Memory */
1883 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1884 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1885 if(nrcgi->pLMN_Identity.buf == NULLP)
1889 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1895 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1896 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1897 if(nrcgi->nRCellIdentity.buf == NULLP)
1902 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1908 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1909 nrcgi->nRCellIdentity.buf[0] |= val;
1910 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1914 /*******************************************************************
1916 * @brief Builds Special cell list for UE Setup Request
1920 * Function : BuildSplCellList
1922 * Functionality: Constructs the Special Cell list for UESetReq
1924 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1926 * @return ROK - success
1929 * ****************************************************************/
1930 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1936 spCellLst->list.count = cellCnt;
1937 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1938 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1939 if(spCellLst->list.array == NULLP)
1943 for(idx=0; idx<cellCnt; idx++)
1945 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1946 if(spCellLst->list.array[idx] == NULLP)
1952 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1953 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1954 spCellLst->list.array[idx]->value.present =\
1955 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1956 /* Special Cell ID -NRCGI */
1957 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1962 /*Special Cell Index*/
1963 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1965 }/* End of BuildSplCellList*/
1967 /*******************************************************************
1969 * @brief Builds SRBS to be setup
1973 * Function : BuildSRBSetup
1975 * Functionality: Constructs the SRB's for UESetReq
1977 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1979 * @return ROK - success
1982 * ****************************************************************/
1983 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1988 srbSet->list.count = srbCnt;
1989 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1990 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1991 if(srbSet->list.array == NULLP)
1995 for(idx=0; idx<srbCnt; idx++)
1997 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1998 if(srbSet->list.array[idx] == NULLP)
2004 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2005 srbSet->list.array[idx]->criticality = Criticality_ignore;
2006 srbSet->list.array[idx]->value.present = \
2007 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2008 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2010 }/* End of BuildSRBSetup*/
2012 /*******************************************************************
2014 * @brief Builds QOS Info for DRB Setum Item
2018 * Function : BuildQOSInfo
2020 * Functionality: Constructs the QOS Info for DRB Setup Item
2022 * @params[in] QoSInformation_t *qosinfo
2024 * @return ROK - success
2027 * ****************************************************************/
2028 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2030 /* NonDynamic5QIDescriptor */
2031 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2032 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2033 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2038 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE;
2040 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2041 sizeof(AveragingWindow_t));
2042 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2047 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2048 /*MaxDataBurstVolume*/
2049 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2050 sizeof(MaxDataBurstVolume_t));
2051 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2056 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2058 /*nRGRAN Allocation Retention Priority*/
2059 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2060 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2061 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2064 }/*End of BuildQOSInfo*/
2066 /*******************************************************************
2068 * @brief Builds SNSSAI
2072 * Function : BuildSNSSAI
2074 * Functionality: Constructs the SNSSAI For DRB list
2076 * @params[in] SNSSAI_t *snssai
2078 * @return ROK - success
2081 * ****************************************************************/
2082 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2086 snssai->sST.size = sizeof(uint8_t);
2087 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2088 if(snssai->sST.buf == NULLP)
2092 snssai->sST.buf[0] = 3;
2094 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2095 if(snssai->sD == NULLP)
2099 snssai->sD->size = 3*sizeof(uint8_t);
2100 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2101 if(snssai->sD->buf == NULLP)
2105 snssai->sD->buf[0] = 3;
2106 snssai->sD->buf[1] = 6;
2107 snssai->sD->buf[2] = 9;
2109 }/*End of BuildSNSSAI*/
2111 /*******************************************************************
2113 * @brief Builds the flow map.
2117 * Function : BuildFlowsMap
2119 * Functionality: Constructs the flowmap For DRB list
2121 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2123 * @return ROK - success
2126 * ****************************************************************/
2127 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2133 flowMap->list.count = flowCnt;
2134 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2135 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2136 if(flowMap->list.array == NULLP)
2140 for(idx=0; idx<flowCnt; idx++)
2142 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2143 if(flowMap->list.array[idx] == NULLP)
2149 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2150 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2156 }/*End of BuildFlowsMap*/
2158 /*******************************************************************
2160 * @brief Builds the Uplink Tunnel Info
2164 * Function : BuildULTnlInfo
2166 * Functionality: Constructs the UL TnlInfo For DRB list
2168 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2170 * @return ROK - success
2173 * ****************************************************************/
2174 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2179 ulInfo->list.count = ulCnt;
2180 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2181 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2182 if(ulInfo->list.array == NULLP)
2186 for(idx=0; idx<ulCnt; idx++)
2188 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2189 if(ulInfo->list.array[idx] == NULLP)
2195 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2196 UPTransportLayerInformation_PR_gTPTunnel;
2198 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2199 sizeof(GTPTunnel_t));
2200 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2204 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2205 transportLayerAddress.size = 4*sizeof(uint8_t);
2206 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2207 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2208 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2209 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2210 transportLayerAddress.buf == NULLP)
2214 /* NOTE: Below IP address must be changed if running on different IP configuration */
2215 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2216 transportLayerAddress.buf[0] = 192;
2217 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2218 transportLayerAddress.buf[1] = 168;
2219 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2220 transportLayerAddress.buf[2] = 130;
2221 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2222 transportLayerAddress.buf[3] = 82;
2223 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2224 transportLayerAddress.bits_unused = 0;
2226 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2227 = 4 * sizeof(uint8_t);
2228 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2229 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2230 gTPTunnel->gTP_TEID.size);
2231 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2236 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2237 gTP_TEID.buf[0] = 0;
2238 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2239 gTP_TEID.buf[1] = 0;
2240 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2241 gTP_TEID.buf[2] = 0;
2242 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2243 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
2246 }/*End of BuildULTnlInfo*/
2248 /*******************************************************************
2250 * @brief Builds DRBS to be setup
2254 * Function : BuildDRBSetup
2256 * Functionality: Constructs the DRB's for UESetReq
2258 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2260 * @return ROK - success
2263 * ****************************************************************/
2264 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2266 uint8_t BuildQOSInforet;
2267 uint8_t BuildSNSSAIret;
2268 uint8_t BuildFlowsMapret;
2269 uint8_t BuildULTnlInforet;
2272 DRBs_ToBeSetup_Item_t *drbSetItem;
2274 drbSet->list.count = drbCnt;
2275 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2276 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2277 if(drbSet->list.array == NULLP)
2281 for(idx=0; idx<drbCnt; idx++)
2283 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2284 if(drbSet->list.array[idx] == NULLP)
2290 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2291 drbSet->list.array[idx]->criticality = Criticality_ignore;
2292 drbSet->list.array[idx]->value.present = \
2293 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2294 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2296 drbSetItem->dRBID = 1;
2298 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2299 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2300 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2304 drbSetItem->qoSInformation.choice.choice_extension->id = \
2305 ProtocolIE_ID_id_DRB_Information;
2306 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2308 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2309 QoSInformation_ExtIEs__value_PR_DRB_Information;
2310 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2311 choice_extension->value.choice.DRB_Information.dRB_QoS);
2312 if(BuildQOSInforet != ROK)
2317 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2318 choice_extension->value.choice.DRB_Information.sNSSAI);
2319 if(BuildSNSSAIret != ROK)
2323 /*Flows mapped to DRB List*/
2324 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2325 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2326 if(BuildFlowsMapret != ROK)
2330 /*ULUPTNLInformation To Be Setup List*/
2331 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2332 if(BuildULTnlInforet != ROK)
2337 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2339 /*UL Configuration*/
2340 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2341 if(drbSetItem->uLConfiguration == NULLP)
2345 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2347 }/* End of BuildDRBSetup*/
2349 /*******************************************************************
2351 * @brief Deallocating memory of function BuildAndSendUESetReq
2355 * Function : FreeNrcgi
2357 * Functionality: Deallocating memory for function BuildNrcgi
2359 * @params[in] NRCGI_t *nrcgi
2363 *******************************************************************/
2364 void FreeNrcgi(NRCGI_t *nrcgi)
2366 if(nrcgi->pLMN_Identity.buf != NULLP)
2368 if(nrcgi->nRCellIdentity.buf != NULLP)
2370 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2372 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2375 /*******************************************************************
2377 * @brief Deallocating memory of function BuildAndSendUESetReq
2381 * Function : FreeSplCellList
2383 * Functionality: Deallocating memory for function BuildSplCellList
2385 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2390 * *****************************************************************/
2391 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2394 if(spCellLst->list.array != NULLP)
2396 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2398 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2400 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2402 if(spCellLst->list.array[cellidx]!=NULLP)
2404 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2407 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2410 /*******************************************************************
2412 * @brief Deallocating memory of function BuildAndSendUESetReq
2416 * Function : FreeSRBSetup
2418 * Functionality: Deallocating memory for function BuildSRBSetup
2420 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2425 * ******************************************************************/
2426 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2429 if(srbSet->list.array != NULLP)
2431 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2433 if(srbSet->list.array[srbidx]!=NULLP)
2435 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2438 CU_FREE(srbSet->list.array,srbSet->list.size);
2441 /*******************************************************************
2443 * @brief Deallocating memory of function BuildAndSendUESetReq
2447 * Function : FreeQOSInfo
2449 * Functionality: Deallocating memory for function BuildQOSInfo
2451 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2455 * ****************************************************************/
2456 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2458 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2460 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2462 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2464 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2465 sizeof(MaxDataBurstVolume_t));
2467 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2468 sizeof(AveragingWindow_t));
2470 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2471 sizeof(NonDynamic5QIDescriptor_t));
2474 /*******************************************************************
2476 * @brief Deallocating memory of function BuildAndSendUESetReq
2480 * Function : FreeULTnlInfo
2482 * Functionality: Deallocating memory for function BuildULTnlInfo
2484 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2489 * ****************************************************************/
2490 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2493 if(ulInfo->list.array != NULLP)
2495 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2497 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2499 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2501 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2502 transportLayerAddress.buf != NULLP)
2504 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2507 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2508 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2509 gTPTunnel->gTP_TEID.size);
2511 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2512 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2513 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2515 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2516 sizeof(GTPTunnel_t));
2519 if(ulInfo->list.array[ulidx]!=NULLP)
2521 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2524 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2527 /*******************************************************************
2529 * @brief Deallocating memory for BuildAndSendUESetReq
2533 * Function : FreeDRBSetup
2535 * Functionality: Deallocating memory for BuildDRBSetup
2537 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2541 * ****************************************************************/
2542 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2544 DRBs_ToBeSetup_Item_t *drbSetItem;
2547 if(drbSet->list.array == NULLP)
2549 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2551 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2553 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2554 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2556 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2557 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2559 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2560 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2562 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2563 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2565 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2567 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2569 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2571 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2572 flows_Mapped_To_DRB_List.list.array != NULLP)
2574 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2575 flows_Mapped_To_DRB_List.list.count; flowidx++)
2577 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2578 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2580 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2581 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2582 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2584 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2585 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2586 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2588 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2589 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2590 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2592 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2593 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2595 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2596 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2597 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2598 sizeof(MaxDataBurstVolume_t));
2600 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2601 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2602 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2604 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2605 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2606 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2609 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2610 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2612 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2613 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2616 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2617 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2618 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2620 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2621 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2623 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2624 sizeof(OCTET_STRING_t));
2626 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2627 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2629 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2630 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2632 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2633 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2635 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2636 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2638 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2641 if(drbSet->list.array[drbidx]!=NULLP)
2643 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2646 CU_FREE(drbSet->list.array,drbSet->list.size);
2651 /*******************************************************************
2653 * @brief Free the UE Setup Request
2657 * Function : FreeUeContextSetupReq
2659 * Functionality: Deallocate the memory of BuildUESetReq
2661 * @params[in] F1AP_PDU_t *f1apMsg
2666 * ****************************************************************/
2667 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2670 UEContextSetupRequest_t *ueSetReq = NULLP;
2672 if(f1apMsg != NULLP)
2674 if(f1apMsg->choice.initiatingMessage != NULLP)
2676 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2677 if(ueSetReq->protocolIEs.list.array != NULLP)
2679 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2681 if(ueSetReq->protocolIEs.list.array[idx])
2683 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2685 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2687 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2689 case ProtocolIE_ID_id_SpCell_ID:
2690 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2692 case ProtocolIE_ID_id_ServCellIndex:
2694 case ProtocolIE_ID_id_SpCellULConfigured:
2696 case ProtocolIE_ID_id_CUtoDURRCInformation:
2697 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2699 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2700 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2702 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2703 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2705 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2706 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2708 case ProtocolIE_ID_id_RRCContainer:
2709 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2711 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2712 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2716 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2721 for(ieId=0; ieId<idx; ieId++)
2723 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2725 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2728 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2730 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2732 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2736 /**Filling cell group info **/
2737 /*******************************************************************
2739 * @brief Build Control resource set to add/modify list
2743 * Function : BuildControlRSetToAddModList
2745 * Functionality: Build Control resource set to add/modify list
2748 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2750 * @return ROK - success
2753 * ****************************************************************/
2754 uint8_t BuildControlRSetToAddModList
2756 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2761 uint8_t numBytes, bitsUnused;
2762 struct ControlResourceSet *controlRSet;
2763 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2764 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2767 controlRSetList->list.count = elementCnt;
2768 controlRSetList->list.size = \
2769 elementCnt * sizeof(struct ControlResourceSet *);
2771 controlRSetList->list.array = NULLP;
2772 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2773 if(!controlRSetList->list.array)
2775 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2779 for(idx = 0; idx < elementCnt; idx++)
2781 controlRSetList->list.array[idx] = NULLP;
2782 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2783 if(!controlRSetList->list.array[idx])
2785 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2791 controlRSet = controlRSetList->list.array[idx];
2792 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2794 /* Values harcoded according to our design:
2797 * Bit string stored ff0000000000
2801 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2802 controlRSet->frequencyDomainResources.buf = NULLP;
2803 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2804 controlRSet->frequencyDomainResources.size);
2805 if(!controlRSet->frequencyDomainResources.buf)
2807 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2811 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2812 coreset0EndPrb = CORESET0_END_PRB;
2813 coreset1StartPrb = coreset0EndPrb + 6;
2814 coreset1NumPrb = CORESET1_NUM_PRB;
2815 /* calculate the PRBs */
2816 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2817 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2818 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2820 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2821 controlRSet->cce_REG_MappingType.present = \
2822 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2824 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2825 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2826 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2827 controlRSet->tci_PresentInDCI = NULLP;
2829 uint8_t tciStateIdx;
2831 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2832 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2833 if(!controlRset->tci_StatesPDCCH_ToAddList)
2835 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2840 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2841 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2842 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2843 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2844 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2846 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2850 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2852 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2853 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2855 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2862 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2864 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2865 if(!controlRset->tci_PresentInDCI)
2867 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2871 *(controlRset->tci_PresentInDCI);
2874 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2875 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2876 if(!controlRSet->pdcch_DMRS_ScramblingID)
2878 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2881 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2884 } /* End BuildControlRSetToAddModList */
2886 /*******************************************************************
2888 * @brief Build search space to add/modify list
2892 * Function : BuildSearchSpcToAddModList
2894 * Functionality: Build search space to add/modify list
2897 * @return ROK - success
2900 * ****************************************************************/
2901 uint8_t BuildSearchSpcToAddModList
2903 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2911 struct SearchSpace *searchSpc;
2914 searchSpcList->list.count = elementCnt;
2915 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2917 searchSpcList->list.array = NULLP;
2918 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2919 if(!searchSpcList->list.array)
2921 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2925 for(idx = 0; idx < elementCnt; idx++)
2927 searchSpcList->list.array[idx] = NULLP;
2928 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2929 if(!searchSpcList->list.array[idx])
2931 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2937 searchSpc = searchSpcList->list.array[idx];
2939 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2941 searchSpc->controlResourceSetId = NULLP;
2942 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2943 if(!searchSpc->controlResourceSetId)
2945 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2948 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2950 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2951 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2952 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2953 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2955 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2958 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2959 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2961 searchSpc->duration = NULLP;
2962 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2963 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2964 if(!searchSpc->monitoringSymbolsWithinSlot)
2966 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2970 /* Values taken from reference logs :
2973 * Bit string stores 8000
2978 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2979 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2980 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2981 searchSpc->monitoringSymbolsWithinSlot->size);
2982 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2984 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2989 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2990 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2991 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2992 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2994 searchSpc->nrofCandidates = NULLP;
2995 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2996 if(!searchSpc->nrofCandidates)
2998 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3002 searchSpc->nrofCandidates->aggregationLevel1 = \
3003 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3004 searchSpc->nrofCandidates->aggregationLevel2 = \
3005 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3006 searchSpc->nrofCandidates->aggregationLevel4 = \
3007 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3008 searchSpc->nrofCandidates->aggregationLevel8 = \
3009 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3010 searchSpc->nrofCandidates->aggregationLevel16 = \
3011 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3013 searchSpc->searchSpaceType = NULLP;
3014 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3015 if(!searchSpc->searchSpaceType)
3017 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3021 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3023 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3024 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3025 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3026 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3028 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3031 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3032 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3035 }/* End BuildSearchSpcToAddModList */
3037 /*******************************************************************
3039 * @brief Builds BWP DL dedicated PDCCH config
3043 * Function : BuildBWPDlDedPdcchCfg
3045 * Functionality: Builds BWP DL dedicated PDCCH config
3047 * @params[in] struct PDCCH_Config *pdcchCfg
3049 * @return ROK - success
3052 * ****************************************************************/
3053 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3055 pdcchCfg->controlResourceSetToAddModList = NULLP;
3056 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3057 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3058 if(!pdcchCfg->controlResourceSetToAddModList)
3060 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3064 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3069 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3071 pdcchCfg->searchSpacesToAddModList = NULLP;
3072 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3073 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3074 if(!pdcchCfg->searchSpacesToAddModList)
3076 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3080 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3085 pdcchCfg->searchSpacesToReleaseList = NULLP;
3086 pdcchCfg->downlinkPreemption = NULLP;
3087 pdcchCfg->tpc_PUSCH = NULLP;
3088 pdcchCfg->tpc_PUCCH = NULLP;
3089 pdcchCfg->tpc_SRS = NULLP;
3094 /*******************************************************************
3096 * @brief Builds DMRS DL PDSCH Mapping type A
3100 * Function : BuildDMRSDLPdschMapTypeA
3102 * Functionality: Builds DMRS DL PDSCH Mapping type A
3105 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3106 * @return ROK - success
3109 * ****************************************************************/
3110 uint8_t BuildDMRSDLPdschMapTypeA
3112 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3115 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3116 dmrsDlCfg->choice.setup = NULLP;
3117 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3118 if(!dmrsDlCfg->choice.setup)
3120 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3124 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3125 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3126 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3127 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3129 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3132 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3134 dmrsDlCfg->choice.setup->maxLength = NULLP;
3135 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3136 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3137 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3142 /*******************************************************************
3144 * @brief Builds TCI states to add/modify list
3148 * Function : BuildTCIStatesToAddModList
3150 * Functionality:Builds TCI states to add/modify list
3153 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3155 * @return ROK - success
3158 * ****************************************************************/
3159 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3164 /*******************************************************************
3166 * @brief Builds PDSCH time domain allocation list
3170 * Function : BuildPdschTimeDomAllocList
3172 * Functionality: Builds PDSCH time domain allocation list
3175 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3177 * @return ROK - success
3180 * ****************************************************************/
3181 uint8_t BuildPdschTimeDomAllocList
3183 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3188 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3190 timeDomAllocList->present = \
3191 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3193 timeDomAllocList->choice.setup = NULLP;
3194 CU_ALLOC(timeDomAllocList->choice.setup, \
3195 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3196 if(!timeDomAllocList->choice.setup)
3198 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3203 timeDomAllocList->choice.setup->list.count = elementCnt;
3204 timeDomAllocList->choice.setup->list.size = \
3205 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3207 timeDomAllocList->choice.setup->list.array = NULLP;
3208 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3209 timeDomAllocList->choice.setup->list.size);
3210 if(!timeDomAllocList->choice.setup->list.array)
3212 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3216 for(idx = 0; idx < elementCnt; idx++)
3218 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3219 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3220 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3221 if(!timeDomAllocList->choice.setup->list.array[idx])
3223 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3229 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3230 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3231 if(!timeDomAlloc->k0)
3233 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3236 *(timeDomAlloc->k0) = 0;
3237 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3238 timeDomAlloc->startSymbolAndLength = 66;
3241 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3242 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3243 if(!timeDomAlloc->k0)
3245 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3248 *(timeDomAlloc->k0) = 1;
3249 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3250 timeDomAlloc->startSymbolAndLength = 66;
3255 /*******************************************************************
3257 * @brief Builds PDSCH PRB Bundling type
3261 * Function : BuildPdschPrbBundlingType
3263 * Functionality: Builds PDSCH PRB Bundling type
3266 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3268 * @return ROK - success
3271 * ****************************************************************/
3272 uint8_t BuildPdschPrbBundlingType
3274 struct PDSCH_Config__prb_BundlingType *prbBndlType
3277 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3279 prbBndlType->choice.staticBundling = NULLP;
3280 CU_ALLOC(prbBndlType->choice.staticBundling, \
3281 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3282 if(!prbBndlType->choice.staticBundling)
3284 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3287 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3292 /*******************************************************************
3294 * @brief Builds BWP DL dedicated PDSCH config
3298 * Function : BuildBWPDlDedPdschCfg
3300 * Functionality: Builds BWP DL dedicated PDSCH config
3302 * @params[in] struct PDSCH_Config *pdschCfg
3304 * @return ROK - success
3307 * ****************************************************************/
3308 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3310 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3312 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3313 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3314 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3315 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3317 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3321 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3326 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3327 pdschCfg->tci_StatesToAddModList = NULLP;
3328 pdschCfg->tci_StatesToReleaseList = NULLP;
3329 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3331 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3332 if(!pdschCfg->tci_StatesToAddModList)
3334 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3337 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3343 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3345 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3346 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3347 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3348 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3350 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3353 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3357 pdschCfg->pdsch_AggregationFactor = NULLP;
3358 pdschCfg->rateMatchPatternToAddModList = NULLP;
3359 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3360 pdschCfg->rateMatchPatternGroup1 = NULLP;
3361 pdschCfg->rateMatchPatternGroup2 = NULLP;
3362 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3363 pdschCfg->mcs_Table = NULLP;
3365 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3366 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3367 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3369 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3372 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3374 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3379 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3380 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3381 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3382 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3383 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3384 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3385 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3390 /*******************************************************************
3392 * @brief Builds intitial DL BWP
3395 * Function : BuildInitialDlBWP
3397 * Functionality: Builds intitial DL BWP in spCellCfgDed
3399 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3401 * @return ROK - success
3404 * ****************************************************************/
3405 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3407 dlBwp->pdcch_Config = NULLP;
3408 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3409 if(!dlBwp->pdcch_Config)
3411 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3414 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3416 dlBwp->pdcch_Config->choice.setup = NULLP;
3417 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3418 if(!dlBwp->pdcch_Config->choice.setup)
3420 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3423 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3428 dlBwp->pdsch_Config = NULLP;
3429 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3430 if(!dlBwp->pdsch_Config)
3432 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3435 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3437 dlBwp->pdsch_Config->choice.setup = NULLP;
3438 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3439 if(!dlBwp->pdsch_Config->choice.setup)
3441 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3445 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3450 dlBwp->sps_Config = NULLP;
3451 dlBwp->radioLinkMonitoringConfig = NULLP;
3455 /*******************************************************************
3457 * @brief Builds DMRS UL Pusch Mapping type A
3461 * Function : BuildDMRSULPuschMapTypeA
3463 * Functionality: Builds DMRS UL Pusch Mapping type A
3466 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3467 * @return ROK - success
3470 * ****************************************************************/
3471 uint8_t BuildDMRSULPuschMapTypeA
3473 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3476 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3477 dmrsUlCfg->choice.setup= NULLP;
3478 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3479 if(!dmrsUlCfg->choice.setup)
3481 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3485 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3486 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3487 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3488 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3490 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3493 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3495 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3496 dmrsUlCfg->choice.setup->maxLength = NULLP;
3497 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3498 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3499 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3500 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3502 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3506 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3507 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3509 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3511 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3514 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3516 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3517 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3521 /*******************************************************************
3523 * @brief Build PUSCH time domain allocation list
3527 * Function : BuildPuschTimeDomAllocList
3529 * Functionality: Build PUSCH time domain allocation list
3532 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3534 * @return ROK - success
3537 * ****************************************************************/
3538 uint8_t BuildPuschTimeDomAllocList
3540 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3545 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3547 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3548 timeDomAllocList->choice.setup = NULLP;
3549 CU_ALLOC(timeDomAllocList->choice.setup, \
3550 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3551 if(!timeDomAllocList->choice.setup)
3553 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3558 timeDomAllocList->choice.setup->list.count = elementCnt;
3559 timeDomAllocList->choice.setup->list.size = \
3560 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3561 timeDomAllocList->choice.setup->list.array = NULLP;
3562 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3563 timeDomAllocList->choice.setup->list.size);
3564 if(!timeDomAllocList->choice.setup->list.array)
3566 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3570 for(idx = 0; idx < elementCnt; idx++)
3572 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3573 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3574 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3575 if(!timeDomAllocList->choice.setup->list.array[idx])
3577 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3583 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3584 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3585 if(!timeDomAlloc->k2)
3587 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3590 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3591 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3592 timeDomAlloc->startSymbolAndLength = 66;
3595 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3596 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3597 if(!timeDomAlloc->k2)
3599 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3602 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3603 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3604 timeDomAlloc->startSymbolAndLength = 66;
3609 /*******************************************************************
3611 * @brief Builds BWP UL dedicated PUSCH Config
3615 * Function : BuildBWPUlDedPuschCfg
3618 * Builds BWP UL dedicated PUSCH Config
3620 * @params[in] : PUSCH_Config_t *puschCfg
3622 * @return ROK - success
3625 * ****************************************************************/
3626 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3628 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3629 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3630 if(!puschCfg->dataScramblingIdentityPUSCH)
3632 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3635 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3637 puschCfg->txConfig = NULLP;
3638 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3639 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3640 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3641 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3643 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3647 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3652 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3653 puschCfg->pusch_PowerControl = NULLP;
3654 puschCfg->frequencyHopping = NULLP;
3655 puschCfg->frequencyHoppingOffsetLists = NULLP;
3656 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3658 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3659 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3660 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3661 if(!puschCfg->pusch_TimeDomainAllocationList)
3663 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3667 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3672 puschCfg->pusch_AggregationFactor = NULLP;
3673 puschCfg->mcs_Table = NULLP;
3674 puschCfg->mcs_TableTransformPrecoder = NULLP;
3675 puschCfg->transformPrecoder = NULLP;
3676 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3677 if(!puschCfg->transformPrecoder)
3679 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3682 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3684 puschCfg->codebookSubset = NULLP;
3685 puschCfg->maxRank = NULLP;
3686 puschCfg->rbg_Size = NULLP;
3687 puschCfg->uci_OnPUSCH = NULLP;
3688 puschCfg->tp_pi2BPSK = NULLP;
3693 /*******************************************************************
3695 * @brief Builds BWP UL dedicated PUCCH Config
3699 * Function : BuildBWPUlDedPucchCfg
3702 * Builds BWP UL dedicated PUCCH Config
3704 * @params[in] : PUCCH_Config_t *pucchCfg
3706 * @return ROK - success
3709 * ****************************************************************/
3710 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3712 uint8_t arrIdx, elementCnt;
3714 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3715 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3717 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3722 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3723 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3724 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3725 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3727 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3731 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3733 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3734 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3736 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3742 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1;
3743 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2;
3748 /*******************************************************************
3750 * @brief Fills SRS resource to add/modify list
3754 * Function : BuildSrsRsrcAddModList
3756 * Functionality: Fills SRS resource to add/modify list
3759 * @return ROK - success
3762 * ****************************************************************/
3763 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3769 resourceList->list.count = elementCnt;
3770 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3771 resourceList->list.array = NULLP;
3772 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3773 if(!resourceList->list.array)
3775 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3779 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3781 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3782 if(!resourceList->list.array[rsrcIdx])
3784 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3790 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3791 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3792 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3794 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3795 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3796 sizeof(struct SRS_Resource__transmissionComb__n2));
3797 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3799 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3802 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3803 = SRS_COMB_OFFSET_N2;
3804 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3805 = SRS_CYCLIC_SHIFT_N2;
3807 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3809 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3810 SRS_Resource__resourceMapping__nrofSymbols_n1;
3811 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3812 SRS_Resource__resourceMapping__repetitionFactor_n1;
3814 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3815 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3816 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3817 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3818 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3819 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3820 SRS_Resource__groupOrSequenceHopping_neither;
3822 /* Setting resource type to aperiodic for intergration purposes */
3823 resourceList->list.array[rsrcIdx]->resourceType.present = \
3824 SRS_Resource__resourceType_PR_aperiodic;
3825 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3826 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3827 sizeof(struct SRS_Resource__resourceType__aperiodic));
3828 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3830 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3833 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3838 /*******************************************************************
3840 * @brief Build SRS resource set Add/mod list
3844 * Function : BuildSrsRsrcSetAddModList
3846 * Functionality: Build SRS resource set Add/mod list
3849 * @return ROK - success
3852 * ****************************************************************/
3853 uint8_t BuildSrsRsrcSetAddModList
3855 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3861 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3864 rsrcSetList->list.count = elementCnt;
3865 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3866 rsrcSetList->list.array = NULLP;
3867 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3868 if(!rsrcSetList->list.array)
3870 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3874 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3876 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3877 if(!rsrcSetList->list.array[rSetIdx])
3879 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3885 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3887 /* Fill Resource Id list in resource set */
3888 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3889 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3890 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3891 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3893 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
3898 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3899 rsrcIdList->list.count = elementCnt;
3900 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3901 rsrcIdList->list.array = NULLP;
3902 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3903 if(!rsrcIdList->list.array)
3905 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3909 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3911 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3912 if(!rsrcIdList->list.array[rsrcIdx])
3914 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3920 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3922 /* Fill resource type */
3923 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3924 SRS_ResourceSet__resourceType_PR_aperiodic;
3926 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3927 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3928 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3929 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3931 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3934 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3935 = APERIODIC_SRS_RESRC_TRIGGER;
3937 /* TODO : Fill values for below IEs as expected by Viavi */
3938 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3939 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3942 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3943 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3944 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3945 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3946 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3951 /*******************************************************************
3953 * @brief Builds BWP UL dedicated SRS Config
3957 * Function : BuildBWPUlDedSrsCfg
3959 * Functionality: Builds BWP UL dedicated SRS Config
3961 * @params[in] SRS Config
3962 * @return ROK - success
3965 * ****************************************************************/
3966 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3968 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3969 srsCfg->srs_ResourceSetToAddModList = NULLP;
3970 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3971 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3972 if(!srsCfg->srs_ResourceSetToAddModList)
3974 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3977 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3982 srsCfg->srs_ResourceToReleaseList = NULLP;
3984 /* Resource to Add/Modify list */
3985 srsCfg->srs_ResourceToAddModList = NULLP;
3986 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3987 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3988 if(!srsCfg->srs_ResourceToAddModList)
3990 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3994 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3999 srsCfg->tpc_Accumulation = NULLP;
4004 /*******************************************************************
4006 * @brief Builds inital UL BWP
4010 * Function : BuildInitialUlBWP
4012 * Functionality: Builds initial UL BWP
4014 * @params[in] BWP_UplinkDedicated_t *ulBwp
4015 * @return ROK - success
4018 * ****************************************************************/
4019 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4021 ulBwp->pucch_Config = NULLP;
4022 ulBwp->pucch_Config = NULLP;
4023 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4024 if(!ulBwp->pucch_Config)
4026 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4030 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4031 ulBwp->pucch_Config->choice.setup = NULLP;
4032 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4033 if(!ulBwp->pucch_Config->choice.setup)
4035 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4039 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4044 /* Fill BWP UL dedicated PUSCH config */
4045 ulBwp->pusch_Config = NULLP;
4046 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4047 if(!ulBwp->pusch_Config)
4049 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4053 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4054 ulBwp->pusch_Config->choice.setup = NULLP;
4055 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4056 if(!ulBwp->pusch_Config->choice.setup)
4058 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4062 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4067 ulBwp->configuredGrantConfig = NULLP;
4069 /* Fill BPW UL dedicated SRS config */
4070 ulBwp->srs_Config = NULLP;
4071 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4072 if(!ulBwp->srs_Config)
4074 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4078 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4079 ulBwp->srs_Config->choice.setup = NULLP;
4080 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4081 if(!ulBwp->srs_Config->choice.setup)
4083 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4087 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4092 ulBwp->beamFailureRecoveryConfig = NULLP;
4097 /*******************************************************************
4099 * @brief Builds Pusch Serving cell Config
4103 * Function : BuildPuschSrvCellCfg
4105 * Functionality: Builds Pusch Serving cell Config
4107 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4109 * @return ROK - success
4112 * ****************************************************************/
4113 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4115 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4116 puschCfg->choice.setup = NULLP;
4117 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4118 if(!puschCfg->choice.setup)
4120 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4124 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4125 puschCfg->choice.setup->rateMatching = NULLP;
4126 puschCfg->choice.setup->xOverhead = NULLP;
4127 puschCfg->choice.setup->ext1 = NULLP;
4128 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4129 if(!puschCfg->choice.setup->ext1)
4131 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4135 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4136 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4137 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4139 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4142 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4144 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4145 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4146 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4148 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4151 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4155 /*******************************************************************
4157 * @brief Builds UL config
4160 * Function : BuildUlCfg
4162 * Functionality: Builds UL config in spCellCfgDed
4164 * @params[in] UplinkConfig_t *ulCfg
4166 * @return ROK - success
4169 * ****************************************************************/
4170 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4172 ulCfg->initialUplinkBWP = NULLP;
4173 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4174 if(!ulCfg->initialUplinkBWP)
4176 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4180 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4185 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4186 ulCfg->uplinkBWP_ToAddModList = NULLP;
4187 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4188 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4189 if(!ulCfg->firstActiveUplinkBWP_Id)
4191 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4194 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4196 ulCfg->pusch_ServingCellConfig = NULLP;
4197 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4198 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4199 if(!ulCfg->pusch_ServingCellConfig)
4201 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4205 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4210 ulCfg->carrierSwitching = NULLP;
4211 ulCfg->ext1 = NULLP;
4215 /*******************************************************************
4217 * @brief Builds PDSCH serving cell config
4220 * Function : BuildPdschSrvCellCfg
4222 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4224 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4226 * @return ROK - success
4229 * ****************************************************************/
4230 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4232 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4233 pdschCfg->choice.setup = NULLP;
4234 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4235 if(!pdschCfg->choice.setup)
4237 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4241 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4242 pdschCfg->choice.setup->xOverhead = NULLP;
4243 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4244 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4245 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4247 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4250 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4251 pdschCfg->choice.setup->pucch_Cell = NULLP;
4252 pdschCfg->choice.setup->ext1 = NULLP;
4257 /*******************************************************************
4259 * @brief Builds CSI Meas config
4262 * Function : BuildCsiMeasCfg
4264 * Functionality: Builds CSI Meas config in spCellCfgDed
4266 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4268 * @return ROK - success
4271 * ****************************************************************/
4272 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4278 /*******************************************************************
4280 * @brief Builds Spcell config dedicated
4283 * Function : BuildSpCellCfgDed
4285 * Functionality: Builds sp cell config dedicated in spCellCfg
4287 * @params[in] ServingCellConfig_t srvCellCfg
4289 * @return ROK - success
4292 * ****************************************************************/
4293 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4295 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4297 srvCellCfg->initialDownlinkBWP = NULLP;
4298 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4299 if(!srvCellCfg->initialDownlinkBWP)
4301 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4305 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4307 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4310 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4311 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4313 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4314 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4315 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4317 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4320 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4322 srvCellCfg->bwp_InactivityTimer = NULLP;
4324 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4325 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4326 if(!srvCellCfg->defaultDownlinkBWP_Id)
4328 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4331 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4333 srvCellCfg->uplinkConfig = NULLP;
4334 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4335 if(!srvCellCfg->uplinkConfig)
4337 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4341 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4343 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4346 srvCellCfg->supplementaryUplink = NULLP;
4347 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4349 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4350 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4351 if(!srvCellCfg->pdsch_ServingCellConfig)
4353 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4357 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4359 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4363 srvCellCfg->csi_MeasConfig = NULLP;
4365 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4366 if(!srvCellCfg->csi_MeasConfig)
4368 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4372 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4374 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4378 srvCellCfg->sCellDeactivationTimer = NULLP;
4379 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4380 srvCellCfg->tag_Id = TAG_ID;
4381 srvCellCfg->dummy = NULLP;
4382 srvCellCfg->pathlossReferenceLinking = NULLP;
4383 srvCellCfg->servingCellMO = NULLP;
4384 srvCellCfg->ext1 = NULLP;
4388 /*******************************************************************
4390 * @brief Builds Spcell config
4394 * Function : BuildSpCellCfg
4396 * Functionality: Builds sp cell config in DuToCuRrcContainer
4398 * @params[in] SpCellConfig_t spCellCfg
4400 * @return ROK - success
4403 * ****************************************************************/
4404 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4407 spCellCfg->servCellIndex = NULLP;
4408 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4409 if(!spCellCfg->servCellIndex)
4411 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4414 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4416 spCellCfg->reconfigurationWithSync = NULLP;
4417 spCellCfg->rlf_TimersAndConstants = NULLP;
4418 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4419 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4420 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4422 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4425 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4427 spCellCfg->spCellConfigDedicated = NULLP;
4428 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4429 if(!spCellCfg->spCellConfigDedicated)
4431 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4434 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4436 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4441 /*******************************************************************
4443 * @brief Builds Phy cell group config
4447 * Function : BuildPhyCellGrpCfg
4449 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4451 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4453 * @return ROK - success
4456 * ****************************************************************/
4457 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4459 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4460 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4462 phyCellGrpCfg->p_NR_FR1 = NULLP;
4463 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4464 if(!phyCellGrpCfg->p_NR_FR1)
4466 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4469 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4470 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4471 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4472 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4473 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4474 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4475 phyCellGrpCfg->cs_RNTI = NULLP;
4476 phyCellGrpCfg->ext1 = NULLP;
4477 phyCellGrpCfg->ext2 = NULLP;
4482 /*******************************************************************
4484 * @brief Builds tag config
4488 * Function : BuildTagConfig
4490 * Functionality: Builds tag config in MacCellGroupConfig
4492 * @params[in] TAG_Config *tag_Config
4494 * @return ROK - success
4497 * ****************************************************************/
4498 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4500 struct TAG_Config__tag_ToAddModList *tagList;
4501 uint8_t idx, elementCnt;
4503 tagConfig->tag_ToReleaseList = NULLP;
4504 tagConfig->tag_ToAddModList = NULLP;
4505 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4506 if(!tagConfig->tag_ToAddModList)
4508 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4512 elementCnt = 1; //ODU_VALUE_ONE;
4513 tagList = tagConfig->tag_ToAddModList;
4514 tagList->list.count = elementCnt;
4515 tagList->list.size = elementCnt * sizeof(struct TAG *);
4517 tagList->list.array = NULLP;
4518 CU_ALLOC(tagList->list.array, tagList->list.size);
4519 if(!tagList->list.array)
4521 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4525 for(idx=0; idx<tagList->list.count; idx++)
4527 tagList->list.array[idx] = NULLP;
4528 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4529 if(!tagList->list.array[idx])
4531 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4537 tagList->list.array[idx]->tag_Id = TAG_ID;
4538 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4543 /*******************************************************************
4545 * @brief Builds PHR Config
4549 * Function : BuildPhrConfig
4551 * Functionality: Builds phrConfig in MacCellGroupConfig
4553 * @params[in] PHR Config *
4555 * @return ROK - success
4558 * ****************************************************************/
4559 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4562 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4563 phrConfig->choice.setup = NULLP;
4564 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4565 if(!phrConfig->choice.setup)
4567 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4571 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4572 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4573 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4574 phrConfig->choice.setup->multiplePHR = false;
4575 phrConfig->choice.setup->dummy = false;
4576 phrConfig->choice.setup->phr_Type2OtherCell = false;
4577 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4582 /*******************************************************************
4584 * @brief Builds BSR Config
4588 * Function : BuildBsrConfig
4590 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4592 * @params[in] BSR_Config *bsrConfig
4594 * @return ROK - success
4597 * ****************************************************************/
4598 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4600 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4601 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4602 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4607 /*******************************************************************
4609 * @brief Builds scheduling request config
4613 * Function : BuildSchedulingReqConfig
4615 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4617 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4619 * @return ROK - success
4622 * ****************************************************************/
4623 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4625 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4626 uint8_t idx, elementCnt;
4628 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4629 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4630 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4631 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4633 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4637 elementCnt = 1; //ODU_VALUE_ONE;
4638 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4639 schReqList->list.count = elementCnt;
4640 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4642 schReqList->list.array = NULLP;
4643 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4644 if(!schReqList->list.array)
4646 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4650 for(idx=0;idx<schReqList->list.count; idx++)
4652 schReqList->list.array[idx] = NULLP;
4653 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4654 if(!schReqList->list.array[idx])
4656 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4662 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4664 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4665 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4666 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4668 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4671 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4672 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4673 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4677 /*******************************************************************
4679 * @brief Builds Mac cell group config
4683 * Function : BuildMacCellGrpCfg
4685 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4687 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4689 * @return ROK - success
4692 * ****************************************************************/
4693 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4695 macCellGrpCfg->drx_Config = NULLP;
4696 macCellGrpCfg->schedulingRequestConfig = NULLP;
4697 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4698 if(!macCellGrpCfg->schedulingRequestConfig)
4700 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4704 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4706 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4710 macCellGrpCfg->bsr_Config = NULLP;
4711 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4712 if(!macCellGrpCfg->bsr_Config)
4714 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4718 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4720 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4724 macCellGrpCfg->tag_Config = NULLP;
4725 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4726 if(!macCellGrpCfg->tag_Config)
4728 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4732 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4734 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4738 macCellGrpCfg->phr_Config = NULLP;
4739 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4740 if(!macCellGrpCfg->phr_Config)
4742 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4746 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4748 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4752 macCellGrpCfg->skipUplinkTxDynamic = false;
4753 macCellGrpCfg->ext1 = NULLP;
4757 /*******************************************************************
4759 * @brief Frees memeory allocated for SearchSpcToAddModList
4763 * Function : FreeSearchSpcToAddModList
4765 * Functionality: Deallocating memory of SearchSpcToAddModList
4767 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4771 4221 * ****************************************************************/
4772 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4776 struct SearchSpace *searchSpc=NULLP;
4778 if(searchSpcList->list.array)
4780 if(searchSpcList->list.array[idx2])
4782 searchSpc = searchSpcList->list.array[idx2];
4783 if(searchSpc->controlResourceSetId)
4785 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4787 if(searchSpc->monitoringSymbolsWithinSlot)
4789 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4791 if(searchSpc->nrofCandidates)
4793 if(searchSpc->searchSpaceType)
4795 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4796 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4797 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4798 SearchSpace__searchSpaceType));
4800 CU_FREE(searchSpc->nrofCandidates,
4801 sizeof(struct SearchSpace__nrofCandidates));
4803 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4804 searchSpc->monitoringSymbolsWithinSlot->size);
4806 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4807 sizeof(BIT_STRING_t));
4809 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4810 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4812 CU_FREE(searchSpc->controlResourceSetId,
4813 sizeof(ControlResourceSetId_t));
4816 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4818 CU_FREE(searchSpcList->list.array[idx1],
4819 sizeof(struct SearchSpace));
4821 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4824 /*******************************************************************
4826 * @brief Frees memory allocated for PdschTimeDomAllocList
4830 * Function : FreePdschTimeDomAllocList
4832 * Functionality: Deallocating memory of PdschTimeDomAllocList
4834 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4838 4221 * ****************************************************************/
4839 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4843 if(timeDomAllocList->choice.setup)
4845 if(timeDomAllocList->choice.setup->list.array)
4847 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4849 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4850 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4852 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4853 timeDomAllocList->choice.setup->list.size);
4855 CU_FREE(timeDomAllocList->choice.setup,\
4856 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4859 /*******************************************************************
4861 * @brief Frees memory allocated for PuschTimeDomAllocList
4865 * Function : FreePuschTimeDomAllocList
4867 * Functionality: Deallocating memory of PuschTimeDomAllocList
4869 * @params[in] PUSCH_Config_t *puschCfg
4873 ***********************************************************************/
4874 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4878 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4880 if(puschCfg->pusch_TimeDomainAllocationList)
4882 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4883 if(timeDomAllocList_t->choice.setup)
4885 if(timeDomAllocList_t->choice.setup->list.array)
4887 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4888 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4890 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4891 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4893 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4894 timeDomAllocList_t->choice.setup->list.size);
4896 CU_FREE(timeDomAllocList_t->choice.setup, \
4897 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4899 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4900 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4901 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4905 /*******************************************************************
4907 * @brief Frees memory allocated for InitialUlBWP
4911 * Function : FreeInitialUlBWP
4913 * Functionality: Deallocating memory of InitialUlBWP
4915 * @params[in] BWP_UplinkDedicated_t *ulBwp
4919 * ****************************************************************/
4920 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4922 uint8_t rSetIdx, rsrcIdx;
4923 SRS_Config_t *srsCfg = NULLP;
4924 PUSCH_Config_t *puschCfg = NULLP;
4925 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4926 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4927 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4928 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4930 if(ulBwp->pusch_Config)
4932 if(ulBwp->pusch_Config->choice.setup)
4934 puschCfg=ulBwp->pusch_Config->choice.setup;
4935 if(puschCfg->dataScramblingIdentityPUSCH)
4937 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4939 FreePuschTimeDomAllocList(puschCfg);
4940 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4941 if(dmrsUlCfg->choice.setup)
4943 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4945 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4947 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4949 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4950 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4952 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4955 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4957 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4958 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4960 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4962 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4964 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4966 /* Free SRS-Config */
4967 if(ulBwp->srs_Config)
4969 if(ulBwp->srs_Config->choice.setup)
4971 srsCfg = ulBwp->srs_Config->choice.setup;
4973 /* Free Resource Set to add/mod list */
4974 if(srsCfg->srs_ResourceSetToAddModList)
4976 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4977 if(rsrcSetList->list.array)
4981 /* Free SRS resource Id list in this SRS resource set */
4982 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4984 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4986 if(rsrcIdList->list.array)
4988 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4990 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4992 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4994 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4995 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4998 /* Free resource type info for this SRS resource set */
4999 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5000 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5002 /* Free memory for each resource set */
5003 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5005 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5007 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5009 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5010 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5013 /* Free resource to add/modd list */
5014 if(srsCfg->srs_ResourceToAddModList)
5016 resourceList = srsCfg->srs_ResourceToAddModList;
5017 if(resourceList->list.array)
5020 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5021 sizeof(struct SRS_Resource__transmissionComb__n2));
5022 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5023 sizeof(struct SRS_Resource__resourceType__aperiodic));
5025 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5027 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5029 CU_FREE(resourceList->list.array, resourceList->list.size);
5031 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5032 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5035 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5037 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5041 /*******************************************************************
5043 * @brief Frees memory allocated for initialUplinkBWP
5047 * Function : FreeinitialUplinkBWP
5049 * Functionality: Deallocating memory of initialUplinkBWP
5051 * @params[in] UplinkConfig_t *ulCfg
5056 * ****************************************************************/
5057 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5059 BWP_UplinkDedicated_t *ulBwp=NULLP;
5060 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5062 if(ulCfg->initialUplinkBWP)
5064 ulBwp=ulCfg->initialUplinkBWP;
5065 if(ulCfg->firstActiveUplinkBWP_Id)
5067 if(ulCfg->pusch_ServingCellConfig)
5069 puschCfg=ulCfg->pusch_ServingCellConfig;
5070 if(puschCfg->choice.setup)
5072 if(puschCfg->choice.setup->ext1)
5074 CU_FREE(puschCfg->choice.setup->ext1->\
5075 processingType2Enabled,sizeof(BOOLEAN_t));
5076 CU_FREE(puschCfg->choice.setup->ext1->\
5077 maxMIMO_Layers,sizeof(long));
5078 CU_FREE(puschCfg->choice.setup->ext1, \
5079 sizeof(struct PUSCH_ServingCellConfig__ext1));
5081 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5083 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5085 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5087 FreeInitialUlBWP(ulBwp);
5088 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5091 /*******************************************************************
5093 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5097 * Function : FreeBWPDlDedPdschCfg
5099 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5101 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5106 * ****************************************************************/
5107 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5109 struct PDSCH_Config *pdschCfg=NULLP;
5110 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5111 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5112 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5114 if(dlBwp->pdsch_Config->choice.setup)
5116 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5117 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5119 if(pdschCfg->pdsch_TimeDomainAllocationList)
5121 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5122 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5124 prbBndlType=&pdschCfg->prb_BundlingType;
5125 CU_FREE(prbBndlType->choice.staticBundling,\
5126 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5127 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5129 FreePdschTimeDomAllocList(timeDomAllocList);
5130 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5131 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5133 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5134 if(dmrsDlCfg->choice.setup)
5136 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5138 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5140 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5141 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5143 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5146 /*******************************************************************
5148 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5152 * Function : FreeBWPDlDedPdcchCfg
5154 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5156 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5161 * ****************************************************************/
5162 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5166 struct PDCCH_Config *pdcchCfg=NULLP;
5167 struct ControlResourceSet *controlRSet=NULLP;
5168 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5170 if(dlBwp->pdcch_Config->choice.setup)
5172 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5173 if(pdcchCfg->controlResourceSetToAddModList)
5175 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5176 if(controlRSetList->list.array)
5178 controlRSet = controlRSetList->list.array[idx2];
5181 if(controlRSet->frequencyDomainResources.buf)
5183 if(controlRSet->pdcch_DMRS_ScramblingID)
5185 if(pdcchCfg->searchSpacesToAddModList)
5187 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5188 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5189 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5191 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5193 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5194 controlRSet->frequencyDomainResources.size);
5197 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5199 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5201 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5203 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5204 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5206 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5209 /*******************************************************************
5211 * @brief Builds RLC Config
5215 * Function : BuildRlcConfig
5217 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5219 * @params[in] RLC_Config *rlcConfig
5221 * @return ROK - success
5224 * ****************************************************************/
5225 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5228 rlcConfig->present = RLC_Config_PR_am;
5230 rlcConfig->choice.am = NULLP;
5231 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5232 if(!rlcConfig->choice.am)
5234 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5239 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5240 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5241 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5243 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5246 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5247 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5248 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5249 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5250 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5253 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5254 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5255 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5257 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5260 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5261 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5262 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5267 /*******************************************************************
5269 * @brief Builds MAC LC Config
5273 * Function : BuildMacLCConfig
5275 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5277 * @params[in] struct LogicalChannelConfig macLcConfig
5279 * @return ROK - success
5282 * ****************************************************************/
5283 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5286 macLcConfig->ul_SpecificParameters = NULLP;
5287 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5288 if(!macLcConfig->ul_SpecificParameters)
5290 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5294 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5295 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5296 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5297 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5298 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5299 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5300 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5302 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5303 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5304 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5306 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5309 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5311 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5312 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5313 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5315 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5318 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5320 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5321 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5322 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5326 /*******************************************************************
5328 * @brief Builds RLC Bearer to Add/Mod list
5332 * Function :BuildRlcBearerToAddModList
5334 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5336 * @params[in] rlc_BearerToAddModList
5338 * @return ROK - success
5341 * ****************************************************************/
5342 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5344 uint8_t idx, elementCnt;
5347 rlcBearerList->list.count = elementCnt;
5348 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5350 rlcBearerList->list.array = NULLP;
5351 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5352 if(!rlcBearerList->list.array)
5354 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5358 for(idx=0; idx<rlcBearerList->list.count; idx++)
5360 rlcBearerList->list.array[idx] = NULLP;
5361 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5362 if(!rlcBearerList->list.array[idx])
5364 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5370 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5372 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5373 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5375 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5379 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5380 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5382 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5383 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5384 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5385 if(!rlcBearerList->list.array[idx]->rlc_Config)
5387 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5391 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5393 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5397 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5398 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5399 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5401 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5405 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5407 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5414 /*******************************************************************
5416 * @brief Free memory allocated for CellGroupConfig
5420 * Function : FreeMemCellGrpCfg
5422 * Functionality: Deallocating memory of CellGroupConfig
5424 * @params[in] pointer to CellGroupConfigRrc_t
5426 * @return ROK - success
5429 ******************************************************************/
5430 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5433 SpCellConfig_t *spCellCfg=NULLP;
5434 ServingCellConfig_t *srvCellCfg=NULLP;
5435 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5436 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5437 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5438 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5439 struct RLC_Config *rlcConfig=NULLP;
5440 struct LogicalChannelConfig *macLcConfig=NULLP;
5441 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5442 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5443 struct TAG_Config *tagConfig=NULLP;
5444 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5445 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5446 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5448 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5451 if(rlcBearerList->list.array)
5453 for(idx=0; idx<rlcBearerList->list.count; idx++)
5455 if(rlcBearerList->list.array[idx])
5457 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5458 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5461 if(rlcConfig->choice.am)
5463 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5464 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5465 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5467 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5469 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5472 if(macLcConfig->ul_SpecificParameters)
5474 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5475 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5476 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5478 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5480 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5483 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5485 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5488 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5491 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5492 if(schedulingRequestConfig)
5494 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5497 if(schReqList->list.array)
5499 for(idx=0;idx<schReqList->list.count; idx++)
5501 if(schReqList->list.array[idx])
5503 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5504 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5507 CU_FREE(schReqList->list.array, schReqList->list.size);
5509 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5510 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5511 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5513 if(macCellGrpCfg->bsr_Config)
5515 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5517 tagConfig = macCellGrpCfg->tag_Config;
5520 tagList = tagConfig->tag_ToAddModList;
5523 if(tagList->list.array)
5525 for(idx=0; idx<tagList->list.count; idx++)
5527 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5529 CU_FREE(tagList->list.array, tagList->list.size);
5531 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5533 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5536 phrConfig = macCellGrpCfg->phr_Config;
5539 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5540 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5543 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5546 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5549 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5550 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5553 spCellCfg = cellGrpCfg->spCellConfig;
5556 if(spCellCfg->servCellIndex)
5558 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5560 if(spCellCfg->spCellConfigDedicated)
5562 srvCellCfg = spCellCfg->spCellConfigDedicated;
5563 if(srvCellCfg->initialDownlinkBWP)
5565 dlBwp = srvCellCfg->initialDownlinkBWP;
5566 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5568 if(srvCellCfg->defaultDownlinkBWP_Id)
5570 if(srvCellCfg->uplinkConfig)
5572 if(srvCellCfg->pdsch_ServingCellConfig)
5574 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5575 if(pdschCfg->choice.setup)
5577 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5578 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5580 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5581 ServingCellConfig__pdsch_ServingCellConfig));
5583 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5584 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5586 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5588 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5590 if(dlBwp->pdcch_Config)
5592 if(dlBwp->pdsch_Config)
5594 FreeBWPDlDedPdschCfg(dlBwp);
5595 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5597 FreeBWPDlDedPdcchCfg(dlBwp);
5598 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5600 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5602 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5604 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5606 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5608 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5613 /*******************************************************************
5615 * @brief Fills CellGroupConfig
5619 * Function : fillCellGrpCfg
5621 * Functionality: Fills CellGroupConfig
5623 * @params[in] pointer to CellGroupConfigRrc_t
5625 * @return ROK - success
5628 ******************************************************************/
5630 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5632 uint8_t ret = RFAILED;
5633 CellGroupConfigRrc_t cellGrpCfg;
5634 asn_enc_rval_t encRetVal;
5638 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5640 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5641 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5642 if(!cellGrpCfg.rlc_BearerToAddModList)
5644 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5647 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5649 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5653 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5654 cellGrpCfg.mac_CellGroupConfig = NULLP;
5655 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5656 if(!cellGrpCfg.mac_CellGroupConfig)
5658 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5661 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5663 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5668 cellGrpCfg.physicalCellGroupConfig = NULLP;
5669 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5670 if(!cellGrpCfg.physicalCellGroupConfig)
5672 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5675 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5677 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5681 cellGrpCfg.spCellConfig = NULLP;
5682 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5683 if(!cellGrpCfg.spCellConfig)
5685 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5688 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5690 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5694 cellGrpCfg.sCellToAddModList = NULLP;
5695 cellGrpCfg.sCellToReleaseList = NULLP;
5696 cellGrpCfg.ext1 = NULLP;
5698 /* encode cellGrpCfg into duToCuRrcContainer */
5699 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5700 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5702 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5703 /* Encode results */
5704 if(encRetVal.encoded == ENCODE_FAIL)
5706 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5707 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5712 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5713 for(int i=0; i< encBufSize; i++)
5715 DU_LOG("%x",encBuf[i]);
5719 cellGrp->size = encBufSize;
5720 CU_ALLOC(cellGrp->buf, cellGrp->size);
5723 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5726 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5730 FreeMemCellGrpCfg(&cellGrpCfg);
5734 /*******************************************************************
5736 * @brief Free UE Capability RAT container
5740 * Function : freeUeCapRatCont
5743 * Free UE Capability RAT conatiner
5746 * @return ROK - success
5749 * ****************************************************************/
5750 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5753 FeatureSets_t *featureSets;
5755 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5757 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5759 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5760 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5762 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5765 if(ueNrCap->featureSets)
5767 featureSets = ueNrCap->featureSets;
5768 if(featureSets->featureSetsDownlinkPerCC)
5770 if(featureSets->featureSetsDownlinkPerCC->list.array)
5772 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5774 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5775 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5776 sizeof(ModulationOrder_t));
5777 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5779 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5781 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5784 if(featureSets->featureSetsUplinkPerCC)
5786 if(featureSets->featureSetsUplinkPerCC->list.array)
5788 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5790 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5792 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5793 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5794 sizeof(ModulationOrder_t));
5795 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5798 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5800 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5802 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5806 /*******************************************************************
5808 * @brief Free UE capability RAT container list
5812 * Function : freeUeCapRatContList
5814 * Functionality: Free UE capability RAT container list
5817 * @return ROK - success
5820 * ****************************************************************/
5821 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5824 if(ueCapablityList->list.array)
5826 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5828 if(ueCapablityList->list.array[idx])
5829 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5831 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5835 /*******************************************************************
5837 * @brief Fill feature sets
5841 * Function : fillFeatureSets
5843 * Functionality: Fill feature sets
5846 * @return ROK - success
5849 * ****************************************************************/
5850 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5852 uint8_t idx, elementCnt;
5854 featureSets->featureSetsDownlink = NULLP;
5855 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5856 if(!featureSets->featureSetsDownlinkPerCC)
5858 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5863 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5864 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5865 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5866 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5868 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5872 for(idx = 0; idx < elementCnt; idx++)
5874 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5875 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5877 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5883 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5884 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5885 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5886 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5887 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5889 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5890 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5892 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5895 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5897 featureSets->featureSetsUplink = NULLP;
5898 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5899 if(!featureSets->featureSetsUplinkPerCC)
5901 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5906 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5907 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5908 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5909 if(!featureSets->featureSetsUplinkPerCC->list.array)
5911 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5915 for(idx = 0; idx < elementCnt; idx++)
5917 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5918 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5920 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5926 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5927 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5928 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5929 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5930 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5931 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5933 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5934 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5936 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5939 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5944 /*******************************************************************
5946 * @brief Fill UE capability RAT container
5950 * Function : fillUeCapRatCont
5952 * Functionality: Fill UE capability RAT container
5954 * @params[in] UE Capability RAT container buffer
5955 * @return ROK - success
5958 * ****************************************************************/
5959 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5962 uint8_t idx, elementCnt;
5963 asn_enc_rval_t encRetVal;
5964 UE_NR_Capability_t ueNrCap;
5968 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5970 /* Filling PDCP parameters */
5971 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5972 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5973 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5974 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5975 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5976 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5977 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5978 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5979 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5980 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5981 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5982 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5983 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5984 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5985 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5986 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5987 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5989 ueNrCap.rlc_Parameters = NULLP;
5990 ueNrCap.mac_Parameters = NULLP;
5992 /* Filling PHY parameters */
5993 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5994 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5995 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5996 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5997 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5999 /* Filling RF parameters */
6001 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6002 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6003 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6004 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6006 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6011 for(idx = 0; idx < elementCnt; idx++)
6013 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6014 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6024 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6025 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6026 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6028 ueNrCap.measAndMobParameters = NULLP;
6029 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6030 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6031 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6032 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6033 ueNrCap.featureSets = NULLP;
6035 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6036 if(!ueNrCap.featureSets)
6038 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6043 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6045 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6050 ueNrCap.featureSetCombinations = NULLP;
6051 ueNrCap.lateNonCriticalExtension = NULLP;
6052 ueNrCap.nonCriticalExtension = NULLP;
6054 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6055 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6056 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6058 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6060 /* Encode results */
6061 if(encRetVal.encoded == ENCODE_FAIL)
6063 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6064 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6069 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6070 for(int i=0; i< encBufSize; i++)
6072 DU_LOG("%x",encBuf[i]);
6076 ueCapRatContBuf->size = encBufSize;
6077 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6078 if(!ueCapRatContBuf->buf)
6080 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6083 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6087 freeUeCapRatCont(&ueNrCap);
6091 /*******************************************************************
6093 * @brief Fill UE Capability RAT container list
6097 * Function : fillUeCapRatContList
6099 * Functionality: Fill UE Capability RAT container list
6102 * @params[in] UE capability RAT container list buffer
6103 * @return ROK - success
6106 * ****************************************************************/
6107 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6109 uint8_t ret = RFAILED;
6110 uint8_t idx, elementCnt;
6111 asn_enc_rval_t encRetVal;
6112 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6117 ueCapablityList.list.count = elementCnt;
6118 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6120 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6121 if(!ueCapablityList.list.array)
6123 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6128 for(idx=0; idx<elementCnt; idx++)
6130 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6131 if(ueCapablityList.list.array[idx] == NULLP)
6133 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6139 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6140 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6142 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6143 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6144 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6146 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6147 &ueCapablityList, PrepFinalEncBuf, encBuf);
6149 /* Encode results */
6150 if(encRetVal.encoded == ENCODE_FAIL)
6152 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6153 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6158 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6159 for(int i=0; i< encBufSize; i++)
6161 DU_LOG("%x",encBuf[i]);
6165 ueCapablityListBuf->size = encBufSize;
6166 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6167 if(!ueCapablityListBuf->buf)
6169 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6172 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6176 freeUeCapRatContList(&ueCapablityList);
6180 /*******************************************************************
6182 * @brief Fills CuToDuContainer
6186 * Function : fillCuToDuContainer
6188 * Functionality: Fills CuToDuContainer
6190 * @params[in] pointer to CUtoDURRCInformation_t
6192 * @return ROK - success
6195 ******************************************************************/
6197 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6199 uint8_t elementCnt = 0;
6201 uint8_t idx, idx2, rrcBufLen;
6203 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6204 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6206 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6209 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6211 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6212 if(rrcMsg->iE_Extensions)
6215 rrcMsg->iE_Extensions->list.count = elementCnt;
6216 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6218 /* Initialize the CUtoDURRCInformation_ExtIEs */
6219 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6221 if(rrcMsg->iE_Extensions->list.array == NULLP)
6223 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6227 for(idx=0; idx<elementCnt; idx++)
6229 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6230 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6236 /* Filling CellGroupConfig_t IE */
6237 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6238 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6239 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6240 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6241 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6246 /*******************************************************************
6248 * @brief Free CuToDuContainer
6252 * Function : FreeCuToDuInfo
6254 * Functionality: Free CuToDuContainer
6256 * @params[in] pointer to CUtoDURRCInformation_t
6258 * @return ROK - success
6261 ******************************************************************/
6263 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6267 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6269 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6270 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6271 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6273 if(rrcMsg->iE_Extensions)
6275 if(rrcMsg->iE_Extensions->list.array)
6277 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6279 if(rrcMsg->iE_Extensions->list.array[idx])
6281 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6283 case ProtocolIE_ID_id_CellGroupConfig:
6284 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6286 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6287 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6292 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6293 rrcMsg->iE_Extensions->list.array[idx]->id);
6299 for(idx2 = 0; idx2 < idx; idx2++)
6301 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6303 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6307 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6310 /*******************************************************************
6312 * @brief Builds and sends the UE Setup Request
6316 * Function : BuildAndSendUeContextSetupReq
6318 * Functionality: Constructs the UE Setup Request and sends
6319 * it to the CU through SCTP.
6323 * @return ROK - success
6326 * ****************************************************************/
6327 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6328 uint16_t rrcContLen, uint8_t *rrcContainer)
6331 uint8_t SplCellListret;
6332 uint8_t SrbSetupret;
6334 uint8_t idx, bufLen;
6336 F1AP_PDU_t *f1apMsg = NULLP;
6337 UEContextSetupRequest_t *ueSetReq = NULLP;
6338 asn_enc_rval_t encRetVal; /* Encoder return value */
6339 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6340 uint8_t ret= RFAILED;
6344 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6346 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6347 if(f1apMsg == NULLP)
6349 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6353 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6354 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6355 if(f1apMsg->choice.initiatingMessage == NULLP)
6357 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6361 f1apMsg->choice.initiatingMessage->procedureCode = \
6362 ProcedureCode_id_UEContextSetup;
6363 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6364 f1apMsg->choice.initiatingMessage->value.present = \
6365 InitiatingMessage__value_PR_UEContextSetupRequest;
6367 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6370 ueSetReq->protocolIEs.list.count = elementCnt;
6371 ueSetReq->protocolIEs.list.size = \
6372 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6374 /* Initialize the UESetup members */
6375 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6377 if(ueSetReq->protocolIEs.list.array == NULLP)
6379 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6383 for(idx1=0; idx1<elementCnt; idx1++)
6385 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6386 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6394 /*GNB CU UE F1AP ID*/
6395 ueSetReq->protocolIEs.list.array[idx]->id = \
6396 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6397 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6398 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6399 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6400 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6402 /*GNB DU UE F1AP ID*/
6404 ueSetReq->protocolIEs.list.array[idx]->id = \
6405 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6406 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6407 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6408 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6409 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6413 ueSetReq->protocolIEs.list.array[idx]->id = \
6414 ProtocolIE_ID_id_SpCell_ID;
6415 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6416 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6417 UEContextSetupRequestIEs__value_PR_NRCGI;
6418 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6424 /*Served Cell Index*/
6426 ueSetReq->protocolIEs.list.array[idx]->id = \
6427 ProtocolIE_ID_id_ServCellIndex;
6428 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6429 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6430 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6431 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6434 /*CellULConfigured*/
6436 ueSetReq->protocolIEs.list.array[idx]->id = \
6437 ProtocolIE_ID_id_SpCellULConfigured;
6438 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6439 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6440 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6441 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6442 CellULConfigured_none;
6444 /*CUtoDURRCContainer*/
6446 ueSetReq->protocolIEs.list.array[idx]->id = \
6447 ProtocolIE_ID_id_CUtoDURRCInformation;
6448 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6449 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6450 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6451 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6456 /*Special Cells to be SetupList*/
6458 ueSetReq->protocolIEs.list.array[idx]->id = \
6459 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6460 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6461 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6462 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6463 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6464 if(SplCellListret != ROK)
6468 /*SRBs To Be Setup List*/
6470 ueSetReq->protocolIEs.list.array[idx]->id = \
6471 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6472 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6473 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6474 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6475 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6476 if(SrbSetupret != ROK)
6480 /*DRBs to Be Setup List*/
6482 ueSetReq->protocolIEs.list.array[idx]->id = \
6483 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6484 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6485 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6486 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6487 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6492 /* RRC Container for security mode */
6494 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6495 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6496 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6497 UEContextSetupRequestIEs__value_PR_RRCContainer;
6498 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6500 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6501 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6502 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6503 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6505 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6508 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6509 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6511 /* RRC delivery status request */
6513 ueSetReq->protocolIEs.list.array[idx]->id = \
6514 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6515 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6516 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6517 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6518 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6519 RRCDeliveryStatusRequest_true;
6521 /* Bit Rate hardcoded as in reference logs */
6523 ueSetReq->protocolIEs.list.array[idx]->id = \
6524 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6525 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6526 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6527 UEContextSetupRequestIEs__value_PR_BitRate;
6528 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6530 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6531 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6532 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6533 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6535 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6538 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6539 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6541 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6543 /* Encode the F1SetupRequest type as APER */
6544 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6546 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6548 /* Encode results */
6549 if(encRetVal.encoded == ENCODE_FAIL)
6551 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6552 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6557 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6558 for(int i=0; i< encBufSize; i++)
6560 DU_LOG("%x",encBuf[i]);
6565 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6567 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6573 FreeUeContextSetupReq(f1apMsg);
6576 }/* End of BuildAndSendUeContextSetupReq*/
6579 uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
6581 uint8_t idx, duUeF1apId;
6582 UEContextSetupResponse_t *ueCtxtSetupRsp;
6583 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
6585 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
6587 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
6589 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6591 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6596 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
6599 /****************************************************************
6600 * @brief Function to process Ul Rrc Msg received from DU
6604 * Function : procUlRrcMsg
6607 * - Function to process Ul Rrc Msg received from DU
6610 * @return ROK - success
6613 * ****************************************************************/
6615 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6617 uint8_t idx, ret, srbId, rrcMsgType;
6618 uint8_t cuUeF1apId, duUeF1apId;
6619 uint8_t *rrcContainer = NULLP;
6620 uint16_t rrcContLen;
6621 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6624 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6626 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6628 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6630 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6632 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6635 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6637 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6640 case ProtocolIE_ID_id_SRBID:
6641 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6643 case ProtocolIE_ID_id_RRCContainer:
6645 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6646 CU_ALLOC(rrcContainer, rrcContLen)
6649 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
6652 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6658 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6664 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
6665 rrcMsgType = setDlRRCMsgType(duUeF1apId);
6666 if(rrcMsgType == REGISTRATION_ACCEPT)
6668 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
6669 ret = BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
6671 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6673 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
6674 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6675 rrcContLen, rrcContainer);
6677 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6679 /* To trigger the DL RRC Msg for RRC Reconfig */
6680 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
6681 rrcMsgType = setDlRRCMsgType(duUeF1apId);
6682 if(rrcMsgType == RRC_RECONFIG)
6684 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
6685 BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
6688 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
6690 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
6691 BuildAndSendUeContextModificationReq(duUeF1apId);
6697 /****************************************************************
6698 * @brief Build And Send F1ResetAck
6702 * Function : FreeF1ResetAck
6705 * - Build And Send F1ResetRSP
6708 * @return ROK - success
6711 * ****************************************************************/
6712 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6715 ResetAcknowledge_t *f1ResetAck;
6719 if(f1apMsg->choice.successfulOutcome)
6721 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6723 if(f1ResetAck->protocolIEs.list.array)
6725 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6727 if(f1ResetAck->protocolIEs.list.array[idx])
6729 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6732 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6734 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6736 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6740 /****************************************************************
6741 * @brief Build And Send F1ResetAck
6745 * Function : BuildAndSendF1ResetAck
6748 * - Build And Send F1ResetRSP
6751 * @return ROK - success
6754 * ****************************************************************/
6756 uint8_t BuildAndSendF1ResetAck()
6759 uint8_t elementCnt = 0;
6760 uint8_t ret = RFAILED;
6761 F1AP_PDU_t *f1apMsg = NULL;
6762 ResetAcknowledge_t *f1ResetAck = NULLP;
6763 asn_enc_rval_t encRetVal;
6764 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
6767 /* Allocate the memory for F1ResetRequest_t */
6768 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6769 if(f1apMsg == NULLP)
6771 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6775 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6777 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6778 if(f1apMsg->choice.successfulOutcome == NULLP)
6780 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6784 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6785 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6786 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6787 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6791 f1ResetAck->protocolIEs.list.count = elementCnt;
6792 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6794 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6795 if(f1ResetAck->protocolIEs.list.array == NULLP)
6797 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
6801 for(idx=0; idx<elementCnt; idx++)
6803 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6804 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6811 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6812 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6813 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6814 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6816 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6818 /* Encode the F1SetupRequest type as UPER */
6819 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6821 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6823 /* Check encode results */
6824 if(encRetVal.encoded == ENCODE_FAIL)
6826 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
6827 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6832 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
6833 for(int i=0; i< encBufSize; i++)
6835 DU_LOG("%x",encBuf[i]);
6839 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6841 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
6849 FreeF1ResetAck(f1apMsg);
6852 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6856 if(ulInfo->list.array)
6858 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
6860 if(ulInfo->list.array[arrIdx])
6862 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
6864 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
6866 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
6868 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6869 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6870 gTPTunnel->gTP_TEID.size);
6872 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6873 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6874 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6876 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6877 sizeof(GTPTunnel_t));
6879 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6882 CU_FREE(ulInfo->list.array,ulInfo->list.size);
6885 /*******************************************************************
6887 * @brief Builds the Uplink Tunnel Info
6891 * Function : BuildUlTnlInfoforDrb2
6893 * Functionality: Constructs the UL TnlInfo For DRB list
6895 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
6897 * @return ROK - success
6900 * ****************************************************************/
6901 uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6907 ulInfo->list.count = ulCnt;
6908 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
6909 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
6910 if(ulInfo->list.array == NULLP)
6912 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6915 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
6917 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6918 if(ulInfo->list.array[arrIdx] == NULLP)
6920 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6926 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
6927 UPTransportLayerInformation_PR_gTPTunnel;
6930 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6931 sizeof(GTPTunnel_t));
6932 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
6934 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6937 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6938 transportLayerAddress.size = 4*sizeof(uint8_t);
6939 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6940 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6941 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6942 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6943 transportLayerAddress.buf == NULLP)
6945 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6949 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6950 transportLayerAddress.buf[0] = 192;
6951 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6952 transportLayerAddress.buf[1] = 168;
6953 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6954 transportLayerAddress.buf[2] = 130;
6955 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6956 transportLayerAddress.buf[3] = 82;
6957 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6958 transportLayerAddress.bits_unused = 0;
6961 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
6962 = 4 * sizeof(uint8_t);
6963 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6964 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6965 gTPTunnel->gTP_TEID.size);
6966 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
6969 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6972 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6973 gTP_TEID.buf[0] = 0;
6974 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6975 gTP_TEID.buf[1] = 0;
6976 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6977 gTP_TEID.buf[2] = 0;
6978 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6979 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
6982 }/*End of BuildULTnlInfo*/
6983 /*******************************************************************
6985 * @brief freeing the DRB 2 item
6989 * Function : FreeDrb2Item
6991 * Functionality: freeing the DRB 2 item
6993 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6995 * @return ROK - success
6998 * ****************************************************************/
7000 void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
7003 SNSSAI_t *snssai =NULLP;
7004 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7006 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7007 switch(drbItem->qoSInformation.present)
7009 case QoSInformation_PR_NOTHING:
7011 case QoSInformation_PR_eUTRANQoS:
7013 if(drbItem->qoSInformation.choice.eUTRANQoS)
7015 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7019 case QoSInformation_PR_choice_extension:
7021 if(drbItem->qoSInformation.choice.choice_extension)
7023 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7025 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7028 CU_FREE(snssai->sST.buf,snssai->sST.size);
7034 CU_FREE(snssai->sD->buf,snssai->sD->size);
7036 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7039 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7040 if(flowMap->list.array)
7042 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7044 if(flowMap->list.array[arrIdx] )
7046 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7047 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7050 CU_FREE(flowMap->list.array,flowMap->list.size);
7053 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7059 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7060 if(drbItem->uLConfiguration)
7062 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7065 /*******************************************************************
7067 * @brief filling the DRB 2 item
7071 * Function : FillDrb2Item
7073 * Functionality: filling the DRB 2 item
7075 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7077 * @return ROK - success
7080 * ****************************************************************/
7082 uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
7087 drbItem->dRBID = DRB2;
7090 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7092 switch(drbItem->qoSInformation.present)
7094 case QoSInformation_PR_NOTHING:
7098 case QoSInformation_PR_eUTRANQoS:
7101 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7102 if(drbItem->qoSInformation.choice.eUTRANQoS)
7104 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7107 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7108 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7109 PriorityLevel_no_priority;
7111 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7112 Pre_emptionCapability_may_trigger_pre_emption;
7114 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7115 Pre_emptionVulnerability_pre_emptable;
7119 case QoSInformation_PR_choice_extension:
7121 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7122 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7124 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7128 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7129 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7130 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7131 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7134 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7139 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7140 choice_extension->value.choice.DRB_Information.sNSSAI);
7143 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7147 /*Flows mapped to DRB List*/
7148 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7149 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
7152 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7158 /*ULUPTNLInformation To Be Setup List*/
7159 ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7162 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforDrb2 failed");
7167 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7169 /*UL Configuration*/
7170 CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7171 if(drbItem->uLConfiguration == NULLP)
7173 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7176 drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
7179 /*******************************************************************
7181 * @brief Builds the DRB to be Setup Mod ItemIes
7185 * Function : FillDrbItemList
7187 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7189 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7191 * @return ROK - success
7194 * ****************************************************************/
7196 uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7198 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7199 drbItemIe->criticality = Criticality_reject;
7200 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7202 if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
7204 DU_LOG("\nERROR --> F1AP : FillDrb2Item failed");
7209 /*******************************************************************
7211 * @brief free the DRB to be Setup Mod list
7215 * Function : FreeDrbToBeSetupModList
7217 * Functionality: free the DRB to be Setup Mod list
7219 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7221 * @return ROK - success
7224 * ****************************************************************/
7225 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7228 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7230 if(drbSet->list.array)
7232 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7234 if(drbSet->list.array[arrIdx] != NULLP)
7238 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7239 FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7241 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7244 CU_FREE(drbSet->list.array, drbSet->list.size);
7250 /*******************************************************************
7252 * @brief Builds the DRB to be Setup Mod list
7256 * Function : BuildDrbToBeSetupModList
7258 * Functionality: Constructs the DRB to be Setup Mod list
7260 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7262 * @return ROK - success
7265 * ****************************************************************/
7267 uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7274 drbSet->list.count = drbCnt;
7275 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7276 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7277 if(drbSet->list.array == NULLP)
7279 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7282 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7284 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7285 if(drbSet->list.array[arrIdx] == NULLP)
7287 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7293 ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7296 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7301 /*******************************************************************
7303 * @brief free the UeContextModification Request
7307 * Function : FreeUeContextModicationRequest
7309 * Functionality : deallocation of memory allocated in UeContextModiification
7312 * @params[in] F1AP_PDU_t *f1apMsg
7316 * ****************************************************************/
7317 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7319 uint8_t arrIdx =0 , ieId=0;
7320 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7324 if(f1apMsg->choice.initiatingMessage)
7326 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7327 if(UeContextModifyReq->protocolIEs.list.array)
7329 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7331 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7333 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7336 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7338 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7340 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7342 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7343 choice.DRBs_ToBeSetupMod_List);
7347 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7350 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7352 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7354 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7357 /*******************************************************************
7359 * @brief Builds the Ue Context Modification Req
7363 * Function : BuildAndSendUeContextModificationReq
7365 * Functionality: Constructs the Ue Context Modification Req
7369 * @return ROK - success
7372 * ****************************************************************/
7373 uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
7376 uint8_t elementCnt = 0;
7377 uint8_t ret = RFAILED;
7378 F1AP_PDU_t *f1apMsg = NULLP;
7379 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7381 asn_enc_rval_t encRetVal;
7382 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
7386 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7387 if(f1apMsg == NULLP)
7389 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7393 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7395 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7396 if(f1apMsg->choice.initiatingMessage == NULLP)
7398 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7401 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7402 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7403 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7405 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7408 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7409 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7411 /* Initialize the UE context modification members */
7412 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7413 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7415 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7419 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7421 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7422 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7424 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7431 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7432 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7433 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7434 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7435 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
7438 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7439 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7440 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7441 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7442 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
7445 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7446 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7447 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7448 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7449 ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7450 value.choice.DRBs_ToBeSetupMod_List));
7455 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7457 /* Encode the F1SetupRequest type as APER */
7458 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7460 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7463 /* Encode results */
7464 if(encRetVal.encoded == ENCODE_FAIL)
7466 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
7467 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7472 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
7473 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7475 DU_LOG("%x",encBuf[ieIdx]);
7479 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7481 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
7489 FreeUeContextModicationRequest(f1apMsg);
7492 /*****************************************************************i
7494 * @brief Free memory allocated for UE Context Release Command
7498 * Function : FreeUeContextReleaseCommand
7501 * - Free memory allocated for UE Context Release Command
7503 * @params[in] F1AP_PDU_t *f1apMsg
7506 * *************************************************************/
7507 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
7510 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
7514 if(f1apMsg->choice.initiatingMessage)
7516 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7517 if(ueReleaseCommand->protocolIEs.list.array)
7519 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
7521 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7523 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
7525 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7527 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7530 /*******************************************************************
7532 * @brief Builds the Ue Context Release Command
7536 * Function : BuildAndSendUeContextReleaseCommand
7538 * Functionality: Constructs the Ue Context Release Command
7542 * @return ROK - success
7545 * ****************************************************************/
7546 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
7548 bool memAllocFailed = false;
7549 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
7550 F1AP_PDU_t *f1apMsg = NULLP;
7551 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
7553 asn_enc_rval_t encRetVal;
7554 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
7558 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7559 if(f1apMsg == NULLP)
7561 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
7565 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7567 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7568 if(f1apMsg->choice.initiatingMessage == NULLP)
7570 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
7573 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
7574 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7575 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
7577 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7580 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
7581 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
7583 /* Initialize the UE context modification members */
7584 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
7585 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
7587 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
7591 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7593 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7594 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
7596 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
7597 memAllocFailed = true;
7602 if(memAllocFailed == true)
7607 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7608 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7609 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7610 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
7611 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
7614 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7615 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7616 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7617 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
7618 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
7621 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
7622 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7623 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7624 UEContextReleaseCommandIEs__value_PR_Cause;
7625 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
7626 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
7627 CauseRadioNetwork_normal_release;
7629 /* RRC Container for RRC release */
7631 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
7632 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7633 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7634 UEContextReleaseCommandIEs__value_PR_RRCContainer;
7635 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
7637 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
7638 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
7639 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
7640 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
7642 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
7645 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
7646 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
7648 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7650 /* Encode the UE Context Release Command type as APER */
7651 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7653 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7656 /* Encode results */
7657 if(encRetVal.encoded == ENCODE_FAIL)
7659 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
7660 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7665 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
7666 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7668 DU_LOG("%x",encBuf[ieIdx]);
7672 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7674 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
7682 FreeUeContextReleaseCommand(f1apMsg);
7685 /*******************************************************************
7687 * @brief process Ue context release request
7691 * Function : procUeContextReleaseReq
7694 * - process Ue context release request
7696 * @params[in] F1AP_PDU_t *f1apMsg
7697 * @return ROK - success
7700 * ****************************************************************/
7701 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
7703 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
7705 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
7706 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
7708 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
7710 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
7712 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7714 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
7717 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7719 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
7726 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
7728 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
7733 /*******************************************************************
7735 * @brief processing of Gnb-DU config update
7739 * Function : procGnbDuUpdate
7742 * - processing of Gnb-DU config update
7744 * @params[in] F1AP_PDU_t *f1apMsg
7745 * @return ROK - success
7748 * ****************************************************************/
7749 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
7751 bool cellToBeDelete = false;
7752 uint8_t ieIdx = 0, ueIdx = 0;
7753 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
7755 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
7756 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
7758 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
7760 case ProtocolIE_ID_id_TransactionID:
7762 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
7764 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
7766 cellToBeDelete = true;
7769 case ProtocolIE_ID_id_gNB_DU_ID:
7773 if(BuildAndSendDUUpdateAck() != ROK)
7775 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
7779 if(cellToBeDelete == false)
7781 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
7782 if(BuildAndSendF1ResetReq() != ROK)
7784 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
7790 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
7792 CU_FREE(ueCb[ueIdx].f1apMsgDb.duToCuContainer.buf, ueCb[ueIdx].f1apMsgDb.duToCuContainer.size);
7793 memset(&ueCb[ueIdx], 0, sizeof(UeCb));
7800 /*******************************************************************
7802 * @brief storing slice list in CU database
7806 * Function : buildSliceList
7809 * - storing slice list in CU database
7811 * @params[in] SliceSupportList_t *sliceSupportList
7812 * @return ROK - success
7815 * ****************************************************************/
7816 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
7818 uint8_t sliceListIdx = 0;
7820 if(sliceSupportList)
7822 if(sliceSupportList->list.array)
7824 cuCfgParams.numSnssaiSupported = sliceSupportList->list.count;
7825 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
7827 if(sliceSupportList->list.array[sliceListIdx])
7829 CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai));
7830 if(cuCfgParams.snssaiList[sliceListIdx] == NULLP)
7832 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
7835 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
7837 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
7838 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
7840 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
7842 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\
7843 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
7844 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
7853 /*******************************************************************
7855 * @brief processing of GNB_DU_Served_Cells Plmn list information
7859 * Function : procServedCellPlmnList
7862 * - processing of GNB_DU_Served_Cells Plmn list information for storing
7865 * @params[in] F1AP_PDU_t *f1apMsg
7866 * @return ROK - success
7869 * ****************************************************************/
7870 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
7872 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
7873 ProtocolExtensionContainer_4624P3_t **ieExtend;
7875 if(srvPlmn->list.array)
7877 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
7879 if(srvPlmn->list.array[srvPlmnIdx])
7881 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
7884 if((*ieExtend)->list.array)
7886 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
7888 if((*ieExtend)->list.array[ieExtensionsLstIdx])
7890 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
7892 case ProtocolIE_ID_id_TAISliceSupportList:
7894 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
7895 extensionValue.choice.SliceSupportList) != ROK)
7897 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
7911 /*******************************************************************
7913 * @brief processing of F1 setup request
7917 * Function : procF1SetupReq
7920 * - processing of F1 setup request
7922 * @params[in] F1AP_PDU_t *f1apMsg
7923 * @return ROK - success
7926 * ****************************************************************/
7927 void procF1SetupReq(F1AP_PDU_t *f1apMsg)
7929 uint8_t ieIdx = 0, plmnidx=0, ret=ROK;
7930 F1SetupRequest_t *f1SetupReq = NULLP;
7931 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
7932 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
7934 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
7935 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
7937 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
7939 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
7941 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
7942 if(duServedCell->list.array)
7944 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
7946 if(duServedCell->list.array[plmnidx])
7948 switch(duServedCell->list.array[plmnidx]->id)
7950 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
7952 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
7953 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
7964 BuildAndSendF1SetupRsp();
7968 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
7971 /*******************************************************************
7973 * @brief Handles received F1AP message and sends back response
7977 * Function : F1APMsgHdlr
7980 * - Decodes received F1AP control message
7981 * - Prepares response message, encodes and sends to SCTP
7984 * @return ROK - success
7987 * ****************************************************************/
7988 void F1APMsgHdlr(Buffer *mBuf)
7994 F1AP_PDU_t *f1apMsg = NULLP;
7995 asn_dec_rval_t rval; /* Decoder return value */
7996 F1AP_PDU_t f1apasnmsg ;
7998 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
7999 ODU_PRINT_MSG(mBuf, 0,0);
8001 /* Copy mBuf into char array to decode it */
8002 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8003 CU_ALLOC(recvBuf, (Size)recvBufLen);
8005 if(recvBuf == NULLP)
8007 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
8010 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8012 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
8016 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
8017 for(i=0; i< recvBufLen; i++)
8019 DU_LOG("%x",recvBuf[i]);
8022 /* Decoding flat buffer into F1AP messsage */
8023 f1apMsg = &f1apasnmsg;
8024 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
8026 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
8027 CU_FREE(recvBuf, (Size)recvBufLen);
8029 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8031 DU_LOG("\nERROR --> F1AP : ASN decode failed");
8035 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8037 switch(f1apMsg->present)
8039 case F1AP_PDU_PR_initiatingMessage:
8041 switch(f1apMsg->choice.initiatingMessage->value.present)
8043 case InitiatingMessage__value_PR_Reset:
8045 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
8046 BuildAndSendF1ResetAck();
8050 case InitiatingMessage__value_PR_F1SetupRequest:
8052 DU_LOG("\nINFO --> F1AP : F1 setup request received");
8053 procF1SetupReq(f1apMsg);
8057 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
8059 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
8060 procGnbDuUpdate(f1apMsg);
8063 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
8065 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
8066 procInitULRRCMsg(f1apMsg);
8069 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
8071 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
8072 procUlRrcMsg(f1apMsg);
8076 case InitiatingMessage__value_PR_RRCDeliveryReport:
8078 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
8081 case InitiatingMessage__value_PR_UEContextReleaseRequest:
8083 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
8084 procUeContextReleaseReq(f1apMsg);
8089 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
8090 f1apMsg->choice.initiatingMessage->value.present);
8093 }/* End of switch(initiatingMessage) */
8097 case F1AP_PDU_PR_successfulOutcome:
8099 switch(f1apMsg->choice.successfulOutcome->value.present)
8101 case SuccessfulOutcome__value_PR_ResetAcknowledge:
8103 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
8106 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
8108 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
8109 procUeContextSetupResponse(f1apMsg);
8112 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
8114 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
8117 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
8119 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
8124 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
8125 f1apMsg->choice.successfulOutcome->value.present);
8128 }/* End of switch(successfulOutcome) */
8133 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
8136 }/* End of switch(f1apMsg->present) */
8138 } /* End of F1APMsgHdlr */
8140 /**********************************************************************
8142 **********************************************************************/