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 */
118 #define PUSCH_MSG3_DELTA_PREAMBLE 0
119 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
120 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
121 #define PUSCH_MAX_MIMO_LAYERS 1
122 #define PUSCH_PROCESS_TYPE2_ENABLED false
123 #define PUSCH_MAPPING_TYPE_A 0
124 #define PUSCH_MAPPING_TYPE_B 1
126 /* MACRO defines for SRC config */
127 #define SRS_RSRC_ID 1
128 #define SRS_RSET_ID 1
129 #define SRS_COMB_OFFSET_N2 0
130 #define SRS_CYCLIC_SHIFT_N2 0
131 #define SRS_FREQ_DOM_POS 0
132 #define SRS_FREQ_DOM_SHIFT 0
137 #define APERIODIC_SRS_RESRC_TRIGGER 1
139 /* Macro definitions for DUtoCuRrcContainer */
140 #define CELL_GRP_ID 1
142 #define SR_PROHIBIT_TMR 5
143 #define SR_TRANS_MAX 2
144 #define PERIODIC_BSR_TMR 2
145 #define RETX_BSR_TMR 5
146 #define SR_DELAY_TMR 6
148 #define TIME_ALIGNMENT_TMR 7
149 #define PHR_PERIODIC_TMR 7
150 #define PHR_PROHIBHIT_TMR 0
151 #define PHR_PWR_FACTOR_CHANGE 3
152 #define PHR_MODE_OTHER_CG 0
155 #define SN_FIELD_LEN 0
156 #define T_POLL_RETRANSMIT 8
159 #define MAX_RETX_THRESHOLD 5
160 #define T_REASSEMBLY 8
161 #define T_STATUS_PROHIBHIT 7
162 #define MAC_LC_PRIORITY 1
163 #define PRIORTISIED_BIT_RATE 15
164 #define BUCKET_SIZE_DURATION 5
167 #define PDSCH_HARQ_ACK_CODEBOOK 1
168 #define SERV_CELL_IDX 0
169 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
170 #define ACTIVE_DL_BWP_ID 0
171 #define ACTIVE_UL_BWP_ID 0
172 #define SCRAMBLING_ID NR_PCI
173 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
174 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
175 #define FIVE_QI_VALUE 9 /*spec 23.501, Table 5.7.4-1*/
176 /*******************************************************************
178 * @brief Sends F1 msg over SCTP
182 * Function : SendF1APMsg
184 * Functionality: Sends F1 msg over SCTP
186 * @params[in] Region region
188 * @return ROK - success
191 * ****************************************************************/
192 S16 SendF1APMsg(Region region, Pool pool)
194 Buffer *mBuf = NULLP;
196 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
198 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
200 ODU_PRINT_MSG(mBuf, 0,0);
202 if(sctpSend(mBuf) != ROK)
204 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
205 ODU_PUT_MSG_BUF(mBuf);
211 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
212 ODU_PUT_MSG_BUF(mBuf);
215 ODU_PUT_MSG_BUF(mBuf);
219 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
226 /*******************************************************************
228 * @brief Builds NRCell ID
232 * Function : BuildNrCellId
234 * Functionality: Building the NR Cell ID
236 * @params[in] BIT_STRING_t *nrcell
237 * @return ROK - success
240 * ****************************************************************/
242 S16 BuildNrCellId(BIT_STRING_t *nrcell)
244 memset(nrcell->buf, 0, nrcell->size);
246 nrcell->bits_unused = 4;
247 nrcell->size = 5 * sizeof(uint8_t);
251 /********************************************************************
253 * @brief Builds and sends the F1SetupResponse
257 * Function : BuildAndSendF1SetupRsp
259 * Functionality: Constructs the F1SetupResponse message and sends
260 * it back to the DU through SCTP.
262 * @params[in] void **buf,Buffer to which encoded pattern is written into
263 * @params[in] int *size,size of buffer
265 * @return ROK - success
268 * ****************************************************************/
269 S16 BuildAndSendF1SetupRsp()
272 uint8_t elementCnt,cellCnt;
273 F1AP_PDU_t *f1apMsg = NULL;
274 F1SetupResponse_t *f1SetupRsp;
275 GNB_CU_Name_t *cuName;
276 Cells_to_be_Activated_List_t *cellToActivate;
277 RRC_Version_t *rrcVer;
278 asn_enc_rval_t encRetVal;
279 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
281 /* Allocate the memory for F1SetupRequest_t */
282 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
285 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
288 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
290 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
291 if(f1apMsg->choice.successfulOutcome == NULLP)
293 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
294 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
298 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
299 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
300 f1apMsg->choice.successfulOutcome->value.present = \
301 SuccessfulOutcome__value_PR_F1SetupResponse;
302 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
305 f1SetupRsp->protocolIEs.list.count = elementCnt;
306 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
308 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
309 elementCnt * sizeof(F1SetupResponseIEs_t *));
310 if(f1SetupRsp->protocolIEs.list.array == NULLP)
312 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
313 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
314 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
318 for(idx=0; idx<elementCnt; idx++)
320 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
321 sizeof(F1SetupResponseIEs_t));
322 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
324 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
325 elementCnt * sizeof(F1SetupResponseIEs_t *));
326 CU_FREE(f1apMsg->choice.successfulOutcome, \
327 sizeof(SuccessfulOutcome_t));
328 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
335 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
336 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
337 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
338 F1SetupResponseIEs__value_PR_TransactionID;
339 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
344 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
345 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
346 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
347 F1SetupResponseIEs__value_PR_GNB_CU_Name;
348 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
349 cuName->size = sizeof(cuCfgParams.cuName);
351 CU_ALLOC(cuName->buf, sizeof(cuName->size));
352 if(cuName->buf == NULLP)
354 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
356 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
357 sizeof(F1SetupResponseIEs_t));
359 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
360 elementCnt * sizeof(F1SetupResponseIEs_t *));
361 CU_FREE(f1apMsg->choice.successfulOutcome,\
362 sizeof(SuccessfulOutcome_t));
363 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
366 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
368 /*Cells to be activated list*/
370 f1SetupRsp->protocolIEs.list.array[idx]->id = \
371 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
372 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
373 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
374 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
375 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
376 Cells_to_be_Activated_List;
378 cellToActivate->list.count = cellCnt;
379 cellToActivate->list.size = \
380 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
381 CU_ALLOC(cellToActivate->list.array,\
382 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
383 if(cellToActivate->list.array == NULLP)
385 CU_FREE(cuName->buf, sizeof(cuName->size));
386 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
388 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
389 sizeof(F1SetupResponseIEs_t));
391 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
392 elementCnt * sizeof(F1SetupResponseIEs_t *));
393 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
394 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
397 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
399 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
400 if(cellToActivate->list.array[ieIdx] == NULLP)
402 CU_FREE(cellToActivate->list.array,\
403 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
404 CU_FREE(cuName->buf, sizeof(cuName->size));
405 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
407 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
408 sizeof(F1SetupResponseIEs_t));
410 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
411 elementCnt * sizeof(F1SetupResponseIEs_t *));
412 CU_FREE(f1apMsg->choice.successfulOutcome, \
413 sizeof(SuccessfulOutcome_t));
414 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
418 cellToActivate->list.array[0]->id = \
419 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
420 cellToActivate->list.array[0]->criticality = Criticality_ignore;
421 cellToActivate->list.array[0]->value.present = \
422 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
423 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
424 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
425 CU_ALLOC(cellToActivate->list.array[0]->\
426 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
428 if(cellToActivate->list.array[0]->value.choice.\
429 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
432 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
434 CU_FREE(cellToActivate->list.array[ieIdx],\
435 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
438 CU_FREE(cellToActivate->list.array,\
439 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
440 CU_FREE(cuName->buf, sizeof(cuName->size));
441 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
443 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
444 sizeof(F1SetupResponseIEs_t));
446 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
447 elementCnt * sizeof(F1SetupResponseIEs_t *));
448 CU_FREE(f1apMsg->choice.successfulOutcome, \
449 sizeof(SuccessfulOutcome_t));
450 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
453 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
454 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
455 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
456 nRCGI.nRCellIdentity.size = 5;
457 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
458 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
460 if(cellToActivate->list.array[0]->value.choice.\
461 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
463 CU_FREE(cellToActivate->list.array[0]->\
464 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
466 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
468 CU_FREE(cellToActivate->list.array[ieIdx],\
469 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
472 CU_FREE(cellToActivate->list.array,\
473 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
474 CU_FREE(cuName->buf, sizeof(cuName->size));
475 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
477 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
478 sizeof(F1SetupResponseIEs_t));
480 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
481 elementCnt * sizeof(F1SetupResponseIEs_t *));
482 CU_FREE(f1apMsg->choice.successfulOutcome, \
483 sizeof(SuccessfulOutcome_t));
484 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
487 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
490 f1SetupRsp->protocolIEs.list.array[idx]->id = \
491 ProtocolIE_ID_id_GNB_CU_RRC_Version;
492 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
493 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
494 F1SetupResponseIEs__value_PR_RRC_Version;
495 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
496 rrcVer->latest_RRC_Version.size = RRC_SIZE;
498 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
499 if(rrcVer->latest_RRC_Version.buf == NULLP)
501 CU_FREE(cuName->buf, sizeof(cuName->size));
502 for(ieIdx=0; ieIdx<elementCnt; idx++)
504 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
505 sizeof(F1SetupResponseIEs_t));
507 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
508 elementCnt * sizeof(F1SetupResponseIEs_t *));
509 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
510 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
514 /* Need to check RRC Version */
515 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
516 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
517 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
518 if(rrcVer->iE_Extensions == NULLP)
520 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
521 CU_FREE(cuName->buf, sizeof(cuName->size));
522 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
524 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
525 sizeof(F1SetupResponseIEs_t));
527 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
528 elementCnt * sizeof(F1SetupResponseIEs_t *));
529 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
530 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
533 rrcVer->iE_Extensions->list.count = 1;
534 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
535 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
536 sizeof(struct RRC_Version_ExtIEs *));
537 if(rrcVer->iE_Extensions->list.array == NULLP)
539 CU_FREE(rrcVer->iE_Extensions,\
540 sizeof(ProtocolExtensionContainer_4624P81_t));
541 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
542 CU_FREE(cuName->buf, sizeof(cuName->size));
543 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
545 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
546 sizeof(F1SetupResponseIEs_t));
548 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
549 elementCnt * sizeof(F1SetupResponseIEs_t *));
550 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
551 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
554 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
555 sizeof(struct RRC_Version_ExtIEs));
556 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
558 CU_FREE(rrcVer->iE_Extensions->list.array,\
559 sizeof(struct RRC_Version_ExtIEs *));
560 CU_FREE(rrcVer->iE_Extensions,\
561 sizeof(ProtocolExtensionContainer_4624P81_t));
562 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
563 CU_FREE(cuName->buf, sizeof(cuName->size));
564 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
566 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
567 sizeof(F1SetupResponseIEs_t));
569 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
570 elementCnt * sizeof(F1SetupResponseIEs_t *));
571 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
572 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
575 rrcVer->iE_Extensions->list.array[0]->id = \
576 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
577 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
578 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
579 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
580 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
581 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
582 CU_ALLOC(rrcVer->iE_Extensions->list.\
583 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
585 if(rrcVer->iE_Extensions->list.\
586 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
588 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
589 sizeof(struct RRC_Version_ExtIEs));
590 CU_FREE(rrcVer->iE_Extensions->list.array,\
591 sizeof(struct RRC_Version_ExtIEs *));
592 CU_FREE(rrcVer->iE_Extensions,\
593 sizeof(ProtocolExtensionContainer_4624P81_t));
594 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
595 CU_FREE(cuName->buf, sizeof(cuName->size));
596 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
598 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
599 sizeof(F1SetupResponseIEs_t));
601 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
602 elementCnt * sizeof(F1SetupResponseIEs_t *));
603 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
604 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
607 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
608 Latest_RRC_Version_Enhanced.buf[0] = 0;
609 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
610 Latest_RRC_Version_Enhanced.buf[1] = 5;
611 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
612 Latest_RRC_Version_Enhanced.buf[2] = 15;
614 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
616 /* Encode the F1SetupRequest type as UPER */
617 memset(encBuf, 0, ENC_BUF_MAX_LEN);
619 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
622 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
623 CU_FREE(cuName->buf, sizeof(cuName->size));
624 for(idx=0; idx<elementCnt; idx++)
626 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
628 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
629 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
630 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
632 /* Check encode results */
633 if(encRetVal.encoded == ENCODE_FAIL)
635 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
636 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
641 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
642 for(int i=0; i< encBufSize; i++)
644 DU_LOG("%x",encBuf[i]);
649 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
651 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
656 }/* End of BuildAndSendF1SetupRsp */
658 /*******************************************************************
660 * @brief Builds and sends the DUUpdateAcknowledge
664 * Function : BuildAndSendDUUpdateAck
666 * Functionality: Constructs the DU Update Acknowledge message and sends
667 * it to the DU through SCTP.
671 * @return ROK - success
674 * ****************************************************************/
676 S16 BuildAndSendDUUpdateAck()
680 F1AP_PDU_t *f1apMsg = NULL;
681 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
682 asn_enc_rval_t enRetVal; /* Encoder return value */
684 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
686 /* Allocate the memory for F1SetupRequest_t */
687 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
690 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
694 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
696 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
697 if(f1apMsg->choice.successfulOutcome == NULLP)
699 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
700 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
704 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
705 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
706 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
707 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
710 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
711 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
713 /* Initialize the F1Setup members */
714 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
715 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
717 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
718 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
719 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
723 for(idx=0; idx<elementCnt; idx++)
725 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
726 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
728 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
729 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
730 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
737 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
738 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
739 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
740 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
741 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
743 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
745 /* Encode the F1SetupRequest type as UPER */
746 memset(encBuf, 0, ENC_BUF_MAX_LEN);
748 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
751 for(idx=0; idx<elementCnt; idx++)
753 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
755 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
756 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
757 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
759 /* Checking encode results */
760 if(enRetVal.encoded == ENCODE_FAIL)
762 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
763 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
768 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
769 for(int i=0; i< encBufSize; i++)
771 DU_LOG("%x",encBuf[i]);
776 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
778 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
784 }/* End of BuildAndSendDUUpdateAck*/
785 /*******************************************************************
787 * @brief deallocating the memory of F1reset msg
791 * Function : FreeF1ResetReq
794 * - freeing memory of F1reset request msg
800 * ****************************************************************/
801 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
804 Reset_t *f1ResetMsg = NULLP;
808 if(f1apMsg->choice.initiatingMessage)
810 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
811 if(f1ResetMsg->protocolIEs.list.array)
813 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
815 if(f1ResetMsg->protocolIEs.list.array[idx])
817 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
820 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
822 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
824 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
827 /*******************************************************************
829 * @brief build ansld ans send f1reset msg
833 * Function : BuildAndSendF1ResetReq
835 * Functionality: build and send f1reset msg
837 * @return ROK - success
840 * ****************************************************************/
841 uint8_t BuildAndSendF1ResetReq()
843 uint8_t elementCnt=0;
845 uint8_t ret= RFAILED;
846 Reset_t *f1ResetMsg = NULLP;
847 F1AP_PDU_t *f1apMsg = NULLP;
848 asn_enc_rval_t encRetVal;
849 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
852 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
855 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
858 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
859 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
860 if(f1apMsg->choice.initiatingMessage == NULLP)
862 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
865 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
866 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
867 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
869 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
872 f1ResetMsg->protocolIEs.list.count = elementCnt;
873 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
875 /* Initialize the F1Reset members */
876 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
877 if(f1ResetMsg->protocolIEs.list.array == NULLP)
879 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
882 for(idx=0; idx<elementCnt; idx++)
884 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
885 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
887 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
894 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
895 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
896 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
897 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
901 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
902 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
903 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
904 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
905 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
909 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
910 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
911 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
912 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
913 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
915 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
917 /* Encode the F1SetupRequest type as APER */
918 memset(encBuf, 0, ENC_BUF_MAX_LEN);
920 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
924 if(encRetVal.encoded == ENCODE_FAIL)
926 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
927 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
932 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
933 for(idx=0; idx< encBufSize; idx++)
935 DU_LOG("%x",encBuf[idx]);
939 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
941 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
949 FreeF1ResetReq(f1apMsg);
953 /*******************************************************************
955 * @brief Fills Radio Bearer Config
959 * Function : fillSrbCfg
961 * Functionality: Fills Radio Bearer Config
963 * @params[in] SRB_ToAddModList *
965 * @return ROK - success
968 * ****************************************************************/
969 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
973 if(bearerCfg != NULLP)
976 bearerCfg->list.count = elementCnt;
977 bearerCfg->list.size =\
978 elementCnt * sizeof(SRB_ToAddMod_t *);
979 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
980 if(bearerCfg->list.array != NULLP)
982 for(idx = 0; idx < elementCnt; idx++)
984 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
985 if(bearerCfg->list.array[idx] == NULLP)
987 for(ieId = 0; ieId < idx; ieId++)
989 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
991 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1001 bearerCfg->list.array[idx]->srb_Identity = srbId;
1006 /*******************************************************************
1008 * @brief Fills Master CellGroup Info
1012 * Function : fillMasterCellGroup
1014 * Functionality: Fills Master Cell Group IE
1016 * @params[in] RRCSetup_IEs_t *
1018 * @return ROK - success
1021 * ****************************************************************/
1023 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
1026 masterCellGroup->buf = NULLP;
1027 if(f1apMsgDb.duToCuContainer.buf)
1029 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
1030 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1031 if(masterCellGroup->buf != NULLP)
1033 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
1034 masterCellGroup->size);
1048 /*******************************************************************
1050 * @brief Fills RRC setup IE
1054 * Function : fillRRCSetupIE
1056 * Functionality: Fills RRC Setup IE
1058 * @params[in] RRCSetup_IEs_t *
1060 * @return ROK - success
1063 * ****************************************************************/
1065 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
1070 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1071 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1073 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1077 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
1081 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1087 /*******************************************************************
1089 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1093 * Function : fillDlCcchRrcMsg
1095 * Functionality: Fills DL DCCCH Message required for
1096 * DLRRCMessageTransfer
1098 * @params[in] RRCContainer_t *rrcContainer
1100 * @return ROK - success
1103 * ****************************************************************/
1105 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
1109 DL_CCCH_Message_t dl_CCCH_Msg;
1110 asn_enc_rval_t encRetVal;
1112 if(rrcContainer != NULLP)
1114 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1116 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1117 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1119 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1120 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1121 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1123 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1124 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1125 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1126 /* Fill RRC Setup IE */
1127 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1128 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1129 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1130 criticalExtensions.choice.rrcSetup != NULLP)
1132 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1133 criticalExtensions.choice.rrcSetup);
1137 /* encode DL-CCCH message into RRC Container */
1138 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1139 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1141 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1142 /* Encode results */
1143 if(encRetVal.encoded == ENCODE_FAIL)
1145 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1146 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1151 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1152 for(int i = 0; i< encBufSize; i++)
1154 DU_LOG("%x",encBuf[i]);
1156 rrcContainer->size = encBufSize;
1157 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1158 if(rrcContainer->buf != NULLP)
1160 memset(rrcContainer->buf, 0, encBufSize);
1161 for(idx2 = 0; idx2 < encBufSize; idx2++)
1163 rrcContainer->buf[idx2] = encBuf[idx2];
1175 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1181 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1187 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1193 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1198 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1200 uint8_t idx, ied, elementCnt;
1203 qosFlow->list.count = elementCnt;
1204 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1205 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1206 if(qosFlow->list.array != NULLP)
1208 for(idx = 0; idx < elementCnt; idx++)
1210 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1211 if(qosFlow->list.array[idx] == NULLP)
1213 for(ied = 0; ied < idx; ied++)
1215 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1217 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1223 *qosFlow->list.array[idx] = 9;
1227 /*******************************************************************
1229 * @brief Fills CN Assoc for Drb to Add/Mod List
1233 * Function : fillCnAssoc
1235 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1237 * @params[in] struct DRB_ToAddMod__cnAssociation *
1239 * @return ROK - success
1242 * ****************************************************************/
1244 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1248 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1249 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1251 cnAssoc->choice.eps_BearerIdentity = 5;
1253 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1255 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1256 if(cnAssoc->choice.sdap_Config)
1258 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1259 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1260 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1261 cnAssoc->choice.sdap_Config->defaultDRB = true;
1262 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1263 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1264 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1265 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1266 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1268 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1272 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1273 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1279 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1286 /*******************************************************************
1288 * @brief Fills Radio Bearer Config for Drb
1292 * Function : fillDrbCfg
1294 * Functionality: Fills Radio Bearer Config for Drb
1296 * @params[in] drbId, DRB_ToAddModList *
1298 * @return ROK - success
1301 * ****************************************************************/
1302 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1304 uint8_t idx, ied, ret, elementCnt;
1310 drbCfg->list.count = elementCnt;
1311 drbCfg->list.size =\
1312 elementCnt * sizeof(DRB_ToAddMod_t *);
1313 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1314 if(drbCfg->list.array != NULLP)
1316 for(idx = 0; idx < elementCnt; idx++)
1318 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1319 if(drbCfg->list.array[idx] == NULLP)
1321 for(ied = 0; ied < idx; ied++)
1323 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1325 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1335 /* CN ASSOCIATION */
1336 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1337 if(drbCfg->list.array[idx]->cnAssociation)
1339 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1342 drbCfg->list.array[idx]->drb_Identity = drbId;
1347 /*******************************************************************
1349 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1353 * Function : fillRrcReconfigIE
1355 * Functionality: Fills RRC Reconfig Message required for
1356 * DLRRCMessageTransfer
1358 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1360 * @return ROK - success
1363 * ****************************************************************/
1365 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1368 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1369 if(rrcReconfigMsg->radioBearerConfig)
1371 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1372 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1374 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1379 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1380 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1382 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1385 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1386 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1387 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1393 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1394 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1400 /*******************************************************************
1402 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1406 * Function : fillDlDcchRrcMsg
1408 * Functionality: Fills DL DCCH Message required for
1409 * DLRRCMessageTransfer
1411 * @params[in] RRCContainer_t *rrcContainer
1413 * @return ROK - success
1416 * ****************************************************************/
1418 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1422 DL_DCCH_Message_t dl_DCCH_Msg;
1423 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1424 asn_enc_rval_t encRetVal;
1426 if(rrcContainer != NULLP)
1428 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1430 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1431 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1433 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1434 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1435 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1437 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1438 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1439 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1440 /* Fill RRC Reconfig IE */
1441 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1442 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1443 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1444 criticalExtensions.choice.rrcReconfiguration != NULLP)
1446 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1447 criticalExtensions.choice.rrcReconfiguration);
1451 /* encode DL-DCCH message into RRC Container */
1452 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1453 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1455 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1456 /* Encode results */
1457 if(encRetVal.encoded == ENCODE_FAIL)
1459 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1460 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1465 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1466 for(int i = 0; i< encBufSize; i++)
1468 DU_LOG("%x",encBuf[i]);
1470 rrcContainer->size = encBufSize;
1471 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1472 if(rrcContainer->buf != NULLP)
1474 memset(rrcContainer->buf, 0, encBufSize);
1475 for(idx2 = 0; idx2 < encBufSize; idx2++)
1477 rrcContainer->buf[idx2] = encBuf[idx2];
1484 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1489 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1495 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1501 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1507 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1513 /*******************************************************************
1515 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1519 * Function : BuildDLRRCContainer
1521 * Functionality: Builds RRC Container IE required for
1522 * DLRRCMessageTransfer
1526 * @return ROK - success
1529 * ****************************************************************/
1531 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1533 uint8_t ret, bufLen;
1536 if(rrcMsgType == RRC_SETUP)
1538 ret = fillDlCcchRrcMsg(rrcContainer);
1540 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1542 else if(rrcMsgType == REGISTRATION_ACCEPT)
1544 /*Hardcoded RRC Container from reference logs*/
1545 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1547 rrcContainer->size = bufLen;
1548 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1549 if(rrcContainer->buf != NULLP)
1551 memset(rrcContainer->buf, 0, bufLen);
1552 memcpy(rrcContainer->buf, buf, bufLen);
1555 else if(rrcMsgType == RRC_RECONFIG)
1557 /*Hardcoded RRC Container from reference logs*/
1559 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1560 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1561 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1562 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1563 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1564 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1565 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1566 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1567 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1568 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1569 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1570 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1571 0x00, 0x00, 0x00, 0x00};
1573 rrcContainer->size = bufLen;
1574 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1575 if(rrcContainer->buf != NULLP)
1577 memset(rrcContainer->buf, 0, bufLen);
1578 memcpy(rrcContainer->buf, buf, bufLen);
1585 /*******************************************************************
1587 * @brief Builds and sends the DLRRCMessageTransfer
1591 * Function : BuildAndSendDLRRCMessageTransfer
1593 * Functionality: Constructs the DL RRC Message Transfer and sends
1594 * it to the CU through SCTP.
1598 * @return ROK - success
1601 * ****************************************************************/
1602 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
1604 uint8_t elementCnt = 0;
1607 F1AP_PDU_t *f1apMsg = NULLP;
1608 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1609 asn_enc_rval_t encRetVal; /* Encoder return value */
1611 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1613 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1614 if(f1apMsg == NULLP)
1616 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1620 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1621 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1622 sizeof(InitiatingMessage_t));
1623 if(f1apMsg->choice.initiatingMessage == NULLP)
1625 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1626 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1630 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1631 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1632 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1633 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1636 dlRRCMsg->protocolIEs.list.count = elementCnt;
1637 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1639 /* Initialize the F1Setup members */
1640 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1641 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1643 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1644 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1645 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1649 for(idx=0; idx<elementCnt; idx++)
1651 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1652 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1654 for(ieId=0; ieId<idx; ieId++)
1656 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1657 sizeof(DLRRCMessageTransferIEs_t));
1659 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1660 dlRRCMsg->protocolIEs.list.size);
1661 CU_FREE(f1apMsg->choice.initiatingMessage,\
1662 sizeof(InitiatingMessage_t));
1663 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1668 /* GNB CU UE F1AP ID */
1670 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1671 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1672 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1673 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1674 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1676 /* GNB DU UE F1AP ID */
1678 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1679 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1680 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1681 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1682 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1683 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1687 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1688 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1689 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1690 DLRRCMessageTransferIEs__value_PR_SRBID;
1691 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1695 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1696 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1697 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1698 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1699 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1701 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1703 /* Encode the F1SetupRequest type as APER */
1704 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1706 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1708 /* Encode results */
1709 if(encRetVal.encoded == ENCODE_FAIL)
1711 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1712 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1717 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1718 for(int i=0; i< encBufSize; i++)
1720 DU_LOG("%x",encBuf[i]);
1725 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1727 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1732 }/* End of BuildAndSendDLRRCMessageTransfer */
1734 /*******************************************************************
1736 * @brief Function to set the Dl RRC Msg Type
1740 * Function : setDlRRCMsgType
1742 * Functionality: Constructs the UE Setup Response and sends
1743 * it to the DU through SCTP.
1747 * @return ROK - success
1750 * ****************************************************************/
1752 uint8_t setDlRRCMsgType()
1754 uint8_t rrcMsgType = 0;
1755 switch(f1apMsgDb.dlRrcMsgCount)
1758 rrcMsgType = RRC_SETUP;
1760 case REGISTRATION_ACCEPT:
1761 rrcMsgType = REGISTRATION_ACCEPT;
1763 case UE_CONTEXT_SETUP_REQ:
1764 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1766 case SECURITY_MODE_COMPLETE:
1767 rrcMsgType = SECURITY_MODE_COMPLETE;
1770 rrcMsgType = RRC_RECONFIG;
1772 case UE_CONTEXT_MOD_REQ:
1773 rrcMsgType = UE_CONTEXT_MOD_REQ;
1781 /*******************************************************************
1783 * @brief Function to build Initial UL RRC Message
1787 * Function : procInitULRRCMsg
1789 * Functionality: Function to build Initial UL RRC Message
1793 * @return ROK - success
1796 * ****************************************************************/
1798 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1800 uint8_t idx, rrcMsgType;
1802 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1803 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1805 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1807 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1809 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1811 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1813 case ProtocolIE_ID_id_NRCGI:
1815 case ProtocolIE_ID_id_C_RNTI:
1817 case ProtocolIE_ID_id_RRCContainer:
1819 case ProtocolIE_ID_id_DUtoCURRCContainer:
1821 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1822 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1823 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1825 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1826 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1827 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1828 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1829 f1apMsgDb.duToCuContainer.size);
1830 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1832 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1833 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1834 .duToCuContainer.size);
1839 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1845 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1851 f1apMsgDb.dlRrcMsgCount++;
1852 rrcMsgType = setDlRRCMsgType();
1853 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1858 /*******************************************************************
1860 * @brief Builds Nrcgi
1864 * Function : BuildNrcgi
1866 * Functionality: Building the PLMN ID and NR Cell id
1868 * @params[in] NRCGI_t *nrcgi
1869 * @return ROK - success
1872 * ****************************************************************/
1873 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1876 uint8_t unused_bits = 4;
1877 uint8_t byteSize = 5;
1879 /* Allocate Buffer Memory */
1880 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1881 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1882 if(nrcgi->pLMN_Identity.buf == NULLP)
1886 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1892 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1893 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1894 if(nrcgi->nRCellIdentity.buf == NULLP)
1899 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1905 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1906 nrcgi->nRCellIdentity.buf[0] |= val;
1907 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1911 /*******************************************************************
1913 * @brief Builds Special cell list for UE Setup Request
1917 * Function : BuildSplCellList
1919 * Functionality: Constructs the Special Cell list for UESetReq
1921 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1923 * @return ROK - success
1926 * ****************************************************************/
1927 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1933 spCellLst->list.count = cellCnt;
1934 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1935 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1936 if(spCellLst->list.array == NULLP)
1940 for(idx=0; idx<cellCnt; idx++)
1942 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1943 if(spCellLst->list.array[idx] == NULLP)
1949 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1950 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1951 spCellLst->list.array[idx]->value.present =\
1952 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1953 /* Special Cell ID -NRCGI */
1954 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1959 /*Special Cell Index*/
1960 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1962 }/* End of BuildSplCellList*/
1964 /*******************************************************************
1966 * @brief Builds SRBS to be setup
1970 * Function : BuildSRBSetup
1972 * Functionality: Constructs the SRB's for UESetReq
1974 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1976 * @return ROK - success
1979 * ****************************************************************/
1980 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1985 srbSet->list.count = srbCnt;
1986 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1987 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1988 if(srbSet->list.array == NULLP)
1992 for(idx=0; idx<srbCnt; idx++)
1994 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1995 if(srbSet->list.array[idx] == NULLP)
2001 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2002 srbSet->list.array[idx]->criticality = Criticality_ignore;
2003 srbSet->list.array[idx]->value.present = \
2004 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2005 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2007 }/* End of BuildSRBSetup*/
2009 /*******************************************************************
2011 * @brief Builds QOS Info for DRB Setum Item
2015 * Function : BuildQOSInfo
2017 * Functionality: Constructs the QOS Info for DRB Setup Item
2019 * @params[in] QoSInformation_t *qosinfo
2021 * @return ROK - success
2024 * ****************************************************************/
2025 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2027 /* NonDynamic5QIDescriptor */
2028 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2029 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2030 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2035 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE;
2037 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2038 sizeof(AveragingWindow_t));
2039 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2044 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2045 /*MaxDataBurstVolume*/
2046 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2047 sizeof(MaxDataBurstVolume_t));
2048 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2053 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2055 /*nRGRAN Allocation Retention Priority*/
2056 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2057 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2058 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2061 }/*End of BuildQOSInfo*/
2063 /*******************************************************************
2065 * @brief Builds SNSSAI
2069 * Function : BuildSNSSAI
2071 * Functionality: Constructs the SNSSAI For DRB list
2073 * @params[in] SNSSAI_t *snssai
2075 * @return ROK - success
2078 * ****************************************************************/
2079 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2083 snssai->sST.size = sizeof(uint8_t);
2084 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2085 if(snssai->sST.buf == NULLP)
2089 snssai->sST.buf[0] = 3;
2091 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2092 if(snssai->sD == NULLP)
2096 snssai->sD->size = 3*sizeof(uint8_t);
2097 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2098 if(snssai->sD->buf == NULLP)
2102 snssai->sD->buf[0] = 3;
2103 snssai->sD->buf[1] = 6;
2104 snssai->sD->buf[2] = 9;
2106 }/*End of BuildSNSSAI*/
2108 /*******************************************************************
2110 * @brief Builds the flow map.
2114 * Function : BuildFlowsMap
2116 * Functionality: Constructs the flowmap For DRB list
2118 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2120 * @return ROK - success
2123 * ****************************************************************/
2124 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2130 flowMap->list.count = flowCnt;
2131 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2132 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2133 if(flowMap->list.array == NULLP)
2137 for(idx=0; idx<flowCnt; idx++)
2139 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2140 if(flowMap->list.array[idx] == NULLP)
2146 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2147 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2153 }/*End of BuildFlowsMap*/
2155 /*******************************************************************
2157 * @brief Builds the Uplink Tunnel Info
2161 * Function : BuildULTnlInfo
2163 * Functionality: Constructs the UL TnlInfo For DRB list
2165 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2167 * @return ROK - success
2170 * ****************************************************************/
2171 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2176 ulInfo->list.count = ulCnt;
2177 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2178 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2179 if(ulInfo->list.array == NULLP)
2183 for(idx=0; idx<ulCnt; idx++)
2185 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2186 if(ulInfo->list.array[idx] == NULLP)
2192 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2193 UPTransportLayerInformation_PR_gTPTunnel;
2195 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2196 sizeof(GTPTunnel_t));
2197 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2201 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2202 transportLayerAddress.size = 4*sizeof(uint8_t);
2203 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2204 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2205 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2206 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2207 transportLayerAddress.buf == NULLP)
2211 /* NOTE: Below IP address must be changed if running on different IP configuration */
2212 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2213 transportLayerAddress.buf[0] = 192;
2214 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2215 transportLayerAddress.buf[1] = 168;
2216 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2217 transportLayerAddress.buf[2] = 130;
2218 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2219 transportLayerAddress.buf[3] = 82;
2220 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2221 transportLayerAddress.bits_unused = 0;
2223 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2224 = 4 * sizeof(uint8_t);
2225 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2226 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2227 gTPTunnel->gTP_TEID.size);
2228 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2233 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2234 gTP_TEID.buf[0] = 0;
2235 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2236 gTP_TEID.buf[1] = 0;
2237 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2238 gTP_TEID.buf[2] = 0;
2239 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2240 gTP_TEID.buf[3] = 1;
2243 }/*End of BuildULTnlInfo*/
2245 /*******************************************************************
2247 * @brief Builds DRBS to be setup
2251 * Function : BuildDRBSetup
2253 * Functionality: Constructs the DRB's for UESetReq
2255 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2257 * @return ROK - success
2260 * ****************************************************************/
2261 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2263 uint8_t BuildQOSInforet;
2264 uint8_t BuildSNSSAIret;
2265 uint8_t BuildFlowsMapret;
2266 uint8_t BuildULTnlInforet;
2269 DRBs_ToBeSetup_Item_t *drbSetItem;
2271 drbSet->list.count = drbCnt;
2272 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2273 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2274 if(drbSet->list.array == NULLP)
2278 for(idx=0; idx<drbCnt; idx++)
2280 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2281 if(drbSet->list.array[idx] == NULLP)
2287 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2288 drbSet->list.array[idx]->criticality = Criticality_ignore;
2289 drbSet->list.array[idx]->value.present = \
2290 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2291 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2293 drbSetItem->dRBID = 1;
2295 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2296 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2297 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2301 drbSetItem->qoSInformation.choice.choice_extension->id = \
2302 ProtocolIE_ID_id_DRB_Information;
2303 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2305 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2306 QoSInformation_ExtIEs__value_PR_DRB_Information;
2307 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2308 choice_extension->value.choice.DRB_Information.dRB_QoS);
2309 if(BuildQOSInforet != ROK)
2314 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2315 choice_extension->value.choice.DRB_Information.sNSSAI);
2316 if(BuildSNSSAIret != ROK)
2320 /*Flows mapped to DRB List*/
2321 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2322 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2323 if(BuildFlowsMapret != ROK)
2327 /*ULUPTNLInformation To Be Setup List*/
2328 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2329 if(BuildULTnlInforet != ROK)
2334 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2336 /*UL Configuration*/
2337 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2338 if(drbSetItem->uLConfiguration == NULLP)
2342 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2344 }/* End of BuildDRBSetup*/
2346 /*******************************************************************
2348 * @brief Deallocating memory of function BuildAndSendUESetReq
2352 * Function : FreeNrcgi
2354 * Functionality: Deallocating memory for function BuildNrcgi
2356 * @params[in] NRCGI_t *nrcgi
2360 *******************************************************************/
2361 void FreeNrcgi(NRCGI_t *nrcgi)
2363 if(nrcgi->pLMN_Identity.buf != NULLP)
2365 if(nrcgi->nRCellIdentity.buf != NULLP)
2367 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2369 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2372 /*******************************************************************
2374 * @brief Deallocating memory of function BuildAndSendUESetReq
2378 * Function : FreeSplCellList
2380 * Functionality: Deallocating memory for function BuildSplCellList
2382 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2387 * *****************************************************************/
2388 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2391 if(spCellLst->list.array != NULLP)
2393 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2395 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2397 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2399 if(spCellLst->list.array[cellidx]!=NULLP)
2401 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2404 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2407 /*******************************************************************
2409 * @brief Deallocating memory of function BuildAndSendUESetReq
2413 * Function : FreeSRBSetup
2415 * Functionality: Deallocating memory for function BuildSRBSetup
2417 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2422 * ******************************************************************/
2423 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2426 if(srbSet->list.array != NULLP)
2428 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2430 if(srbSet->list.array[srbidx]!=NULLP)
2432 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2435 CU_FREE(srbSet->list.array,srbSet->list.size);
2438 /*******************************************************************
2440 * @brief Deallocating memory of function BuildAndSendUESetReq
2444 * Function : FreeQOSInfo
2446 * Functionality: Deallocating memory for function BuildQOSInfo
2448 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2452 * ****************************************************************/
2453 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2455 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2457 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2459 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2461 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2462 sizeof(MaxDataBurstVolume_t));
2464 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2465 sizeof(AveragingWindow_t));
2467 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2468 sizeof(NonDynamic5QIDescriptor_t));
2471 /*******************************************************************
2473 * @brief Deallocating memory of function BuildAndSendUESetReq
2477 * Function : FreeULTnlInfo
2479 * Functionality: Deallocating memory for function BuildULTnlInfo
2481 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2486 * ****************************************************************/
2487 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2490 if(ulInfo->list.array != NULLP)
2492 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2494 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2496 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2498 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2499 transportLayerAddress.buf != NULLP)
2501 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2504 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2505 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2506 gTPTunnel->gTP_TEID.size);
2508 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2509 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2510 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2512 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2513 sizeof(GTPTunnel_t));
2516 if(ulInfo->list.array[ulidx]!=NULLP)
2518 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2521 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2524 /*******************************************************************
2526 * @brief Deallocating memory for BuildAndSendUESetReq
2530 * Function : FreeDRBSetup
2532 * Functionality: Deallocating memory for BuildDRBSetup
2534 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2538 * ****************************************************************/
2539 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2541 DRBs_ToBeSetup_Item_t *drbSetItem;
2544 if(drbSet->list.array == NULLP)
2546 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2548 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2550 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2551 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2553 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2554 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2556 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2557 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2559 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2560 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2562 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2564 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2566 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2568 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2569 flows_Mapped_To_DRB_List.list.array != NULLP)
2571 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2572 flows_Mapped_To_DRB_List.list.count; flowidx++)
2574 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2575 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2577 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2578 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2579 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2581 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2582 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2583 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2585 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2586 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2587 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2589 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2590 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2592 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2593 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2594 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2595 sizeof(MaxDataBurstVolume_t));
2597 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2598 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2599 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2601 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2602 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2603 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2606 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2607 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2609 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2610 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2613 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2614 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2615 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2617 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2618 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2620 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2621 sizeof(OCTET_STRING_t));
2623 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2624 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2626 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2627 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2629 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2630 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2632 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2633 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2635 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2638 if(drbSet->list.array[drbidx]!=NULLP)
2640 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2643 CU_FREE(drbSet->list.array,drbSet->list.size);
2648 /*******************************************************************
2650 * @brief Free the UE Setup Request
2654 * Function : FreeUeContextSetupReq
2656 * Functionality: Deallocate the memory of BuildUESetReq
2658 * @params[in] F1AP_PDU_t *f1apMsg
2663 * ****************************************************************/
2664 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2667 UEContextSetupRequest_t *ueSetReq = NULLP;
2669 if(f1apMsg != NULLP)
2671 if(f1apMsg->choice.initiatingMessage != NULLP)
2673 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2674 if(ueSetReq->protocolIEs.list.array != NULLP)
2676 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2678 if(ueSetReq->protocolIEs.list.array[idx])
2680 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2682 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2684 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2686 case ProtocolIE_ID_id_SpCell_ID:
2687 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2689 case ProtocolIE_ID_id_ServCellIndex:
2691 case ProtocolIE_ID_id_SpCellULConfigured:
2693 case ProtocolIE_ID_id_CUtoDURRCInformation:
2694 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2696 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2697 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2699 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2700 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2702 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2703 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2705 case ProtocolIE_ID_id_RRCContainer:
2706 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2708 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2709 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2713 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2718 for(ieId=0; ieId<idx; ieId++)
2720 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2722 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2725 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2727 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2729 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2733 /**Filling cell group info **/
2734 /*******************************************************************
2736 * @brief Build Control resource set to add/modify list
2740 * Function : BuildControlRSetToAddModList
2742 * Functionality: Build Control resource set to add/modify list
2745 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2747 * @return ROK - success
2750 * ****************************************************************/
2751 uint8_t BuildControlRSetToAddModList
2753 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2758 uint8_t numBytes, bitsUnused;
2759 struct ControlResourceSet *controlRSet;
2760 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2761 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2764 controlRSetList->list.count = elementCnt;
2765 controlRSetList->list.size = \
2766 elementCnt * sizeof(struct ControlResourceSet *);
2768 controlRSetList->list.array = NULLP;
2769 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2770 if(!controlRSetList->list.array)
2772 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2776 for(idx = 0; idx < elementCnt; idx++)
2778 controlRSetList->list.array[idx] = NULLP;
2779 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2780 if(!controlRSetList->list.array[idx])
2782 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2788 controlRSet = controlRSetList->list.array[idx];
2789 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2791 /* Values harcoded according to our design:
2794 * Bit string stored ff0000000000
2798 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2799 controlRSet->frequencyDomainResources.buf = NULLP;
2800 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2801 controlRSet->frequencyDomainResources.size);
2802 if(!controlRSet->frequencyDomainResources.buf)
2804 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2808 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2809 coreset0EndPrb = CORESET0_END_PRB;
2810 coreset1StartPrb = coreset0EndPrb + 6;
2811 coreset1NumPrb = CORESET1_NUM_PRB;
2812 /* calculate the PRBs */
2813 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2814 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2815 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2817 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2818 controlRSet->cce_REG_MappingType.present = \
2819 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2821 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2822 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2823 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2824 controlRSet->tci_PresentInDCI = NULLP;
2826 uint8_t tciStateIdx;
2828 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2829 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2830 if(!controlRset->tci_StatesPDCCH_ToAddList)
2832 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2837 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2838 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2839 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2840 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2841 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2843 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2847 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2849 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2850 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2852 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2859 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2861 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2862 if(!controlRset->tci_PresentInDCI)
2864 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2868 *(controlRset->tci_PresentInDCI);
2871 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2872 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2873 if(!controlRSet->pdcch_DMRS_ScramblingID)
2875 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2878 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2881 } /* End BuildControlRSetToAddModList */
2883 /*******************************************************************
2885 * @brief Build search space to add/modify list
2889 * Function : BuildSearchSpcToAddModList
2891 * Functionality: Build search space to add/modify list
2894 * @return ROK - success
2897 * ****************************************************************/
2898 uint8_t BuildSearchSpcToAddModList
2900 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2908 struct SearchSpace *searchSpc;
2911 searchSpcList->list.count = elementCnt;
2912 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2914 searchSpcList->list.array = NULLP;
2915 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2916 if(!searchSpcList->list.array)
2918 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2922 for(idx = 0; idx < elementCnt; idx++)
2924 searchSpcList->list.array[idx] = NULLP;
2925 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2926 if(!searchSpcList->list.array[idx])
2928 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2934 searchSpc = searchSpcList->list.array[idx];
2936 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2938 searchSpc->controlResourceSetId = NULLP;
2939 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2940 if(!searchSpc->controlResourceSetId)
2942 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2945 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2947 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2948 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2949 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2950 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2952 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2955 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2956 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2958 searchSpc->duration = NULLP;
2959 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2960 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2961 if(!searchSpc->monitoringSymbolsWithinSlot)
2963 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2967 /* Values taken from reference logs :
2970 * Bit string stores 8000
2975 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2976 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2977 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2978 searchSpc->monitoringSymbolsWithinSlot->size);
2979 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2981 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2986 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2987 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2988 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2989 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2991 searchSpc->nrofCandidates = NULLP;
2992 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2993 if(!searchSpc->nrofCandidates)
2995 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2999 searchSpc->nrofCandidates->aggregationLevel1 = \
3000 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3001 searchSpc->nrofCandidates->aggregationLevel2 = \
3002 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3003 searchSpc->nrofCandidates->aggregationLevel4 = \
3004 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3005 searchSpc->nrofCandidates->aggregationLevel8 = \
3006 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3007 searchSpc->nrofCandidates->aggregationLevel16 = \
3008 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3010 searchSpc->searchSpaceType = NULLP;
3011 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3012 if(!searchSpc->searchSpaceType)
3014 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3018 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3020 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3021 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3022 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3023 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3025 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3028 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3029 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3032 }/* End BuildSearchSpcToAddModList */
3034 /*******************************************************************
3036 * @brief Builds BWP DL dedicated PDCCH config
3040 * Function : BuildBWPDlDedPdcchCfg
3042 * Functionality: Builds BWP DL dedicated PDCCH config
3044 * @params[in] struct PDCCH_Config *pdcchCfg
3046 * @return ROK - success
3049 * ****************************************************************/
3050 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3052 pdcchCfg->controlResourceSetToAddModList = NULLP;
3053 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3054 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3055 if(!pdcchCfg->controlResourceSetToAddModList)
3057 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3061 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3066 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3068 pdcchCfg->searchSpacesToAddModList = NULLP;
3069 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3070 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3071 if(!pdcchCfg->searchSpacesToAddModList)
3073 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3077 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3082 pdcchCfg->searchSpacesToReleaseList = NULLP;
3083 pdcchCfg->downlinkPreemption = NULLP;
3084 pdcchCfg->tpc_PUSCH = NULLP;
3085 pdcchCfg->tpc_PUCCH = NULLP;
3086 pdcchCfg->tpc_SRS = NULLP;
3091 /*******************************************************************
3093 * @brief Builds DMRS DL PDSCH Mapping type A
3097 * Function : BuildDMRSDLPdschMapTypeA
3099 * Functionality: Builds DMRS DL PDSCH Mapping type A
3102 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3103 * @return ROK - success
3106 * ****************************************************************/
3107 uint8_t BuildDMRSDLPdschMapTypeA
3109 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3112 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3113 dmrsDlCfg->choice.setup = NULLP;
3114 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3115 if(!dmrsDlCfg->choice.setup)
3117 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3121 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3122 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3123 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3124 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3126 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3129 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3131 dmrsDlCfg->choice.setup->maxLength = NULLP;
3132 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3133 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3134 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3139 /*******************************************************************
3141 * @brief Builds TCI states to add/modify list
3145 * Function : BuildTCIStatesToAddModList
3147 * Functionality:Builds TCI states to add/modify list
3150 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3152 * @return ROK - success
3155 * ****************************************************************/
3156 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3161 /*******************************************************************
3163 * @brief Builds PDSCH time domain allocation list
3167 * Function : BuildPdschTimeDomAllocList
3169 * Functionality: Builds PDSCH time domain allocation list
3172 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3174 * @return ROK - success
3177 * ****************************************************************/
3178 uint8_t BuildPdschTimeDomAllocList
3180 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3185 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3187 timeDomAllocList->present = \
3188 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3190 timeDomAllocList->choice.setup = NULLP;
3191 CU_ALLOC(timeDomAllocList->choice.setup, \
3192 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3193 if(!timeDomAllocList->choice.setup)
3195 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3200 timeDomAllocList->choice.setup->list.count = elementCnt;
3201 timeDomAllocList->choice.setup->list.size = \
3202 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3204 timeDomAllocList->choice.setup->list.array = NULLP;
3205 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3206 timeDomAllocList->choice.setup->list.size);
3207 if(!timeDomAllocList->choice.setup->list.array)
3209 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3213 for(idx = 0; idx < elementCnt; idx++)
3215 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3216 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3217 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3218 if(!timeDomAllocList->choice.setup->list.array[idx])
3220 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3226 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3227 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3228 if(!timeDomAlloc->k0)
3230 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3233 *(timeDomAlloc->k0) = 0;
3234 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3235 timeDomAlloc->startSymbolAndLength = 66;
3238 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3239 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3240 if(!timeDomAlloc->k0)
3242 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3245 *(timeDomAlloc->k0) = 1;
3246 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3247 timeDomAlloc->startSymbolAndLength = 66;
3252 /*******************************************************************
3254 * @brief Builds PDSCH PRB Bundling type
3258 * Function : BuildPdschPrbBundlingType
3260 * Functionality: Builds PDSCH PRB Bundling type
3263 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3265 * @return ROK - success
3268 * ****************************************************************/
3269 uint8_t BuildPdschPrbBundlingType
3271 struct PDSCH_Config__prb_BundlingType *prbBndlType
3274 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3276 prbBndlType->choice.staticBundling = NULLP;
3277 CU_ALLOC(prbBndlType->choice.staticBundling, \
3278 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3279 if(!prbBndlType->choice.staticBundling)
3281 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3284 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3289 /*******************************************************************
3291 * @brief Builds BWP DL dedicated PDSCH config
3295 * Function : BuildBWPDlDedPdschCfg
3297 * Functionality: Builds BWP DL dedicated PDSCH config
3299 * @params[in] struct PDSCH_Config *pdschCfg
3301 * @return ROK - success
3304 * ****************************************************************/
3305 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3307 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3309 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3310 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3311 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3312 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3314 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3318 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3323 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3324 pdschCfg->tci_StatesToAddModList = NULLP;
3325 pdschCfg->tci_StatesToReleaseList = NULLP;
3326 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3328 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3329 if(!pdschCfg->tci_StatesToAddModList)
3331 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3334 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3340 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3342 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3343 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3344 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3345 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3347 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3350 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3354 pdschCfg->pdsch_AggregationFactor = NULLP;
3355 pdschCfg->rateMatchPatternToAddModList = NULLP;
3356 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3357 pdschCfg->rateMatchPatternGroup1 = NULLP;
3358 pdschCfg->rateMatchPatternGroup2 = NULLP;
3359 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3360 pdschCfg->mcs_Table = NULLP;
3362 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3363 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3364 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3366 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3369 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3371 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3376 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3377 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3378 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3379 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3380 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3381 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3382 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3387 /*******************************************************************
3389 * @brief Builds intitial DL BWP
3392 * Function : BuildInitialDlBWP
3394 * Functionality: Builds intitial DL BWP in spCellCfgDed
3396 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3398 * @return ROK - success
3401 * ****************************************************************/
3402 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3404 dlBwp->pdcch_Config = NULLP;
3405 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3406 if(!dlBwp->pdcch_Config)
3408 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3411 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3413 dlBwp->pdcch_Config->choice.setup = NULLP;
3414 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3415 if(!dlBwp->pdcch_Config->choice.setup)
3417 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3420 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3425 dlBwp->pdsch_Config = NULLP;
3426 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3427 if(!dlBwp->pdsch_Config)
3429 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3432 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3434 dlBwp->pdsch_Config->choice.setup = NULLP;
3435 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3436 if(!dlBwp->pdsch_Config->choice.setup)
3438 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3442 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3447 dlBwp->sps_Config = NULLP;
3448 dlBwp->radioLinkMonitoringConfig = NULLP;
3452 /*******************************************************************
3454 * @brief Builds DMRS UL Pusch Mapping type A
3458 * Function : BuildDMRSULPuschMapTypeA
3460 * Functionality: Builds DMRS UL Pusch Mapping type A
3463 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3464 * @return ROK - success
3467 * ****************************************************************/
3468 uint8_t BuildDMRSULPuschMapTypeA
3470 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3473 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3474 dmrsUlCfg->choice.setup= NULLP;
3475 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3476 if(!dmrsUlCfg->choice.setup)
3478 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3482 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3483 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3484 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3485 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3487 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3490 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3492 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3493 dmrsUlCfg->choice.setup->maxLength = NULLP;
3494 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3495 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3496 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3497 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3499 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3503 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3504 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3506 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3508 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3511 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3513 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3514 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3518 /*******************************************************************
3520 * @brief Build PUSCH time domain allocation list
3524 * Function : BuildPuschTimeDomAllocList
3526 * Functionality: Build PUSCH time domain allocation list
3529 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3531 * @return ROK - success
3534 * ****************************************************************/
3535 uint8_t BuildPuschTimeDomAllocList
3537 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3542 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3544 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3545 timeDomAllocList->choice.setup = NULLP;
3546 CU_ALLOC(timeDomAllocList->choice.setup, \
3547 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3548 if(!timeDomAllocList->choice.setup)
3550 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3555 timeDomAllocList->choice.setup->list.count = elementCnt;
3556 timeDomAllocList->choice.setup->list.size = \
3557 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3558 timeDomAllocList->choice.setup->list.array = NULLP;
3559 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3560 timeDomAllocList->choice.setup->list.size);
3561 if(!timeDomAllocList->choice.setup->list.array)
3563 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3567 for(idx = 0; idx < elementCnt; idx++)
3569 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3570 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3571 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3572 if(!timeDomAllocList->choice.setup->list.array[idx])
3574 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3580 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3581 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3582 if(!timeDomAlloc->k2)
3584 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3587 *(timeDomAlloc->k2) = PUSCH_K2;
3588 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3589 timeDomAlloc->startSymbolAndLength = 66;
3593 /*******************************************************************
3595 * @brief Builds BWP UL dedicated PUSCH Config
3599 * Function : BuildBWPUlDedPuschCfg
3602 * Builds BWP UL dedicated PUSCH Config
3604 * @params[in] : PUSCH_Config_t *puschCfg
3606 * @return ROK - success
3609 * ****************************************************************/
3610 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3612 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3613 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3614 if(!puschCfg->dataScramblingIdentityPUSCH)
3616 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3619 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3621 puschCfg->txConfig = NULLP;
3622 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3623 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3624 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3625 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3627 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3631 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3636 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3637 puschCfg->pusch_PowerControl = NULLP;
3638 puschCfg->frequencyHopping = NULLP;
3639 puschCfg->frequencyHoppingOffsetLists = NULLP;
3640 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3642 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3643 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3644 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3645 if(!puschCfg->pusch_TimeDomainAllocationList)
3647 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3651 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3656 puschCfg->pusch_AggregationFactor = NULLP;
3657 puschCfg->mcs_Table = NULLP;
3658 puschCfg->mcs_TableTransformPrecoder = NULLP;
3659 puschCfg->transformPrecoder = NULLP;
3660 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3661 if(!puschCfg->transformPrecoder)
3663 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3666 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3668 puschCfg->codebookSubset = NULLP;
3669 puschCfg->maxRank = NULLP;
3670 puschCfg->rbg_Size = NULLP;
3671 puschCfg->uci_OnPUSCH = NULLP;
3672 puschCfg->tp_pi2BPSK = NULLP;
3677 /*******************************************************************
3679 * @brief Builds BWP UL dedicated PUCCH Config
3683 * Function : BuildBWPUlDedPucchCfg
3686 * Builds BWP UL dedicated PUCCH Config
3688 * @params[in] : PUCCH_Config_t *pucchCfg
3690 * @return ROK - success
3693 * ****************************************************************/
3694 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3696 uint8_t arrIdx, elementCnt;
3698 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3699 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3701 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3706 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3707 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3708 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3709 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3711 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3715 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3717 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3718 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3720 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3726 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1;
3727 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2;
3732 /*******************************************************************
3734 * @brief Fills SRS resource to add/modify list
3738 * Function : BuildSrsRsrcAddModList
3740 * Functionality: Fills SRS resource to add/modify list
3743 * @return ROK - success
3746 * ****************************************************************/
3747 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3753 resourceList->list.count = elementCnt;
3754 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3755 resourceList->list.array = NULLP;
3756 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3757 if(!resourceList->list.array)
3759 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3763 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3765 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3766 if(!resourceList->list.array[rsrcIdx])
3768 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3774 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3775 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3776 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3778 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3779 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3780 sizeof(struct SRS_Resource__transmissionComb__n2));
3781 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3783 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3786 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3787 = SRS_COMB_OFFSET_N2;
3788 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3789 = SRS_CYCLIC_SHIFT_N2;
3791 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3793 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3794 SRS_Resource__resourceMapping__nrofSymbols_n1;
3795 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3796 SRS_Resource__resourceMapping__repetitionFactor_n1;
3798 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3799 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3800 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3801 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3802 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3803 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3804 SRS_Resource__groupOrSequenceHopping_neither;
3806 /* Setting resource type to aperiodic for intergration purposes */
3807 resourceList->list.array[rsrcIdx]->resourceType.present = \
3808 SRS_Resource__resourceType_PR_aperiodic;
3809 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3810 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3811 sizeof(struct SRS_Resource__resourceType__aperiodic));
3812 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3814 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3817 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3822 /*******************************************************************
3824 * @brief Build SRS resource set Add/mod list
3828 * Function : BuildSrsRsrcSetAddModList
3830 * Functionality: Build SRS resource set Add/mod list
3833 * @return ROK - success
3836 * ****************************************************************/
3837 uint8_t BuildSrsRsrcSetAddModList
3839 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3845 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3848 rsrcSetList->list.count = elementCnt;
3849 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3850 rsrcSetList->list.array = NULLP;
3851 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3852 if(!rsrcSetList->list.array)
3854 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3858 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3860 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3861 if(!rsrcSetList->list.array[rSetIdx])
3863 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3869 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3871 /* Fill Resource Id list in resource set */
3872 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3873 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3874 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3875 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3877 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
3882 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3883 rsrcIdList->list.count = elementCnt;
3884 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3885 rsrcIdList->list.array = NULLP;
3886 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3887 if(!rsrcIdList->list.array)
3889 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3893 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3895 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3896 if(!rsrcIdList->list.array[rsrcIdx])
3898 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3904 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3906 /* Fill resource type */
3907 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3908 SRS_ResourceSet__resourceType_PR_aperiodic;
3910 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3911 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3912 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3913 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3915 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3918 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3919 = APERIODIC_SRS_RESRC_TRIGGER;
3921 /* TODO : Fill values for below IEs as expected by Viavi */
3922 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3923 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3926 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3927 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3928 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3929 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3930 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3935 /*******************************************************************
3937 * @brief Builds BWP UL dedicated SRS Config
3941 * Function : BuildBWPUlDedSrsCfg
3943 * Functionality: Builds BWP UL dedicated SRS Config
3945 * @params[in] SRS Config
3946 * @return ROK - success
3949 * ****************************************************************/
3950 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3952 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3953 srsCfg->srs_ResourceSetToAddModList = NULLP;
3954 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3955 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3956 if(!srsCfg->srs_ResourceSetToAddModList)
3958 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3961 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3966 srsCfg->srs_ResourceToReleaseList = NULLP;
3968 /* Resource to Add/Modify list */
3969 srsCfg->srs_ResourceToAddModList = NULLP;
3970 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3971 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3972 if(!srsCfg->srs_ResourceToAddModList)
3974 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3978 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3983 srsCfg->tpc_Accumulation = NULLP;
3988 /*******************************************************************
3990 * @brief Builds inital UL BWP
3994 * Function : BuildInitialUlBWP
3996 * Functionality: Builds initial UL BWP
3998 * @params[in] BWP_UplinkDedicated_t *ulBwp
3999 * @return ROK - success
4002 * ****************************************************************/
4003 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4005 ulBwp->pucch_Config = NULLP;
4006 ulBwp->pucch_Config = NULLP;
4007 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4008 if(!ulBwp->pucch_Config)
4010 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4014 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4015 ulBwp->pucch_Config->choice.setup = NULLP;
4016 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4017 if(!ulBwp->pucch_Config->choice.setup)
4019 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4023 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4028 /* Fill BWP UL dedicated PUSCH config */
4029 ulBwp->pusch_Config = NULLP;
4030 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4031 if(!ulBwp->pusch_Config)
4033 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4037 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4038 ulBwp->pusch_Config->choice.setup = NULLP;
4039 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4040 if(!ulBwp->pusch_Config->choice.setup)
4042 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4046 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4051 ulBwp->configuredGrantConfig = NULLP;
4053 /* Fill BPW UL dedicated SRS config */
4054 ulBwp->srs_Config = NULLP;
4055 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4056 if(!ulBwp->srs_Config)
4058 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4062 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4063 ulBwp->srs_Config->choice.setup = NULLP;
4064 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4065 if(!ulBwp->srs_Config->choice.setup)
4067 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4071 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4076 ulBwp->beamFailureRecoveryConfig = NULLP;
4081 /*******************************************************************
4083 * @brief Builds Pusch Serving cell Config
4087 * Function : BuildPuschSrvCellCfg
4089 * Functionality: Builds Pusch Serving cell Config
4091 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4093 * @return ROK - success
4096 * ****************************************************************/
4097 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4099 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4100 puschCfg->choice.setup = NULLP;
4101 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4102 if(!puschCfg->choice.setup)
4104 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4108 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4109 puschCfg->choice.setup->rateMatching = NULLP;
4110 puschCfg->choice.setup->xOverhead = NULLP;
4111 puschCfg->choice.setup->ext1 = NULLP;
4112 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4113 if(!puschCfg->choice.setup->ext1)
4115 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4119 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4120 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4121 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4123 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4126 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4128 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4129 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4130 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4132 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4135 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4139 /*******************************************************************
4141 * @brief Builds UL config
4144 * Function : BuildUlCfg
4146 * Functionality: Builds UL config in spCellCfgDed
4148 * @params[in] UplinkConfig_t *ulCfg
4150 * @return ROK - success
4153 * ****************************************************************/
4154 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4156 ulCfg->initialUplinkBWP = NULLP;
4157 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4158 if(!ulCfg->initialUplinkBWP)
4160 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4164 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4169 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4170 ulCfg->uplinkBWP_ToAddModList = NULLP;
4171 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4172 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4173 if(!ulCfg->firstActiveUplinkBWP_Id)
4175 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4178 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4180 ulCfg->pusch_ServingCellConfig = NULLP;
4181 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4182 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4183 if(!ulCfg->pusch_ServingCellConfig)
4185 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4189 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4194 ulCfg->carrierSwitching = NULLP;
4195 ulCfg->ext1 = NULLP;
4199 /*******************************************************************
4201 * @brief Builds PDSCH serving cell config
4204 * Function : BuildPdschSrvCellCfg
4206 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4208 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4210 * @return ROK - success
4213 * ****************************************************************/
4214 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4216 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4217 pdschCfg->choice.setup = NULLP;
4218 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4219 if(!pdschCfg->choice.setup)
4221 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4225 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4226 pdschCfg->choice.setup->xOverhead = NULLP;
4227 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4228 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4229 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4231 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4234 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4235 pdschCfg->choice.setup->pucch_Cell = NULLP;
4236 pdschCfg->choice.setup->ext1 = NULLP;
4241 /*******************************************************************
4243 * @brief Builds CSI Meas config
4246 * Function : BuildCsiMeasCfg
4248 * Functionality: Builds CSI Meas config in spCellCfgDed
4250 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4252 * @return ROK - success
4255 * ****************************************************************/
4256 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4262 /*******************************************************************
4264 * @brief Builds Spcell config dedicated
4267 * Function : BuildSpCellCfgDed
4269 * Functionality: Builds sp cell config dedicated in spCellCfg
4271 * @params[in] ServingCellConfig_t srvCellCfg
4273 * @return ROK - success
4276 * ****************************************************************/
4277 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4279 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4281 srvCellCfg->initialDownlinkBWP = NULLP;
4282 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4283 if(!srvCellCfg->initialDownlinkBWP)
4285 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4289 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4291 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4294 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4295 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4297 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4298 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4299 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4301 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4304 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4306 srvCellCfg->bwp_InactivityTimer = NULLP;
4308 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4309 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4310 if(!srvCellCfg->defaultDownlinkBWP_Id)
4312 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4315 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4317 srvCellCfg->uplinkConfig = NULLP;
4318 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4319 if(!srvCellCfg->uplinkConfig)
4321 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4325 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4327 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4330 srvCellCfg->supplementaryUplink = NULLP;
4331 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4333 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4334 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4335 if(!srvCellCfg->pdsch_ServingCellConfig)
4337 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4341 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4343 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4347 srvCellCfg->csi_MeasConfig = NULLP;
4349 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4350 if(!srvCellCfg->csi_MeasConfig)
4352 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4356 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4358 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4362 srvCellCfg->sCellDeactivationTimer = NULLP;
4363 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4364 srvCellCfg->tag_Id = TAG_ID;
4365 srvCellCfg->dummy = NULLP;
4366 srvCellCfg->pathlossReferenceLinking = NULLP;
4367 srvCellCfg->servingCellMO = NULLP;
4368 srvCellCfg->ext1 = NULLP;
4372 /*******************************************************************
4374 * @brief Builds Spcell config
4378 * Function : BuildSpCellCfg
4380 * Functionality: Builds sp cell config in DuToCuRrcContainer
4382 * @params[in] SpCellConfig_t spCellCfg
4384 * @return ROK - success
4387 * ****************************************************************/
4388 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4391 spCellCfg->servCellIndex = NULLP;
4392 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4393 if(!spCellCfg->servCellIndex)
4395 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4398 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4400 spCellCfg->reconfigurationWithSync = NULLP;
4401 spCellCfg->rlf_TimersAndConstants = NULLP;
4402 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4403 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4404 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4406 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4409 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4411 spCellCfg->spCellConfigDedicated = NULLP;
4412 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4413 if(!spCellCfg->spCellConfigDedicated)
4415 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4418 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4420 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4425 /*******************************************************************
4427 * @brief Builds Phy cell group config
4431 * Function : BuildPhyCellGrpCfg
4433 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4435 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4437 * @return ROK - success
4440 * ****************************************************************/
4441 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4443 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4444 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4446 phyCellGrpCfg->p_NR_FR1 = NULLP;
4447 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4448 if(!phyCellGrpCfg->p_NR_FR1)
4450 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4453 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4454 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4455 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4456 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4457 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4458 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4459 phyCellGrpCfg->cs_RNTI = NULLP;
4460 phyCellGrpCfg->ext1 = NULLP;
4461 phyCellGrpCfg->ext2 = NULLP;
4466 /*******************************************************************
4468 * @brief Builds tag config
4472 * Function : BuildTagConfig
4474 * Functionality: Builds tag config in MacCellGroupConfig
4476 * @params[in] TAG_Config *tag_Config
4478 * @return ROK - success
4481 * ****************************************************************/
4482 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4484 struct TAG_Config__tag_ToAddModList *tagList;
4485 uint8_t idx, elementCnt;
4487 tagConfig->tag_ToReleaseList = NULLP;
4488 tagConfig->tag_ToAddModList = NULLP;
4489 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4490 if(!tagConfig->tag_ToAddModList)
4492 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4496 elementCnt = 1; //ODU_VALUE_ONE;
4497 tagList = tagConfig->tag_ToAddModList;
4498 tagList->list.count = elementCnt;
4499 tagList->list.size = elementCnt * sizeof(struct TAG *);
4501 tagList->list.array = NULLP;
4502 CU_ALLOC(tagList->list.array, tagList->list.size);
4503 if(!tagList->list.array)
4505 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4509 for(idx=0; idx<tagList->list.count; idx++)
4511 tagList->list.array[idx] = NULLP;
4512 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4513 if(!tagList->list.array[idx])
4515 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4521 tagList->list.array[idx]->tag_Id = TAG_ID;
4522 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4527 /*******************************************************************
4529 * @brief Builds PHR Config
4533 * Function : BuildPhrConfig
4535 * Functionality: Builds phrConfig in MacCellGroupConfig
4537 * @params[in] PHR Config *
4539 * @return ROK - success
4542 * ****************************************************************/
4543 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4546 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4547 phrConfig->choice.setup = NULLP;
4548 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4549 if(!phrConfig->choice.setup)
4551 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4555 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4556 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4557 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4558 phrConfig->choice.setup->multiplePHR = false;
4559 phrConfig->choice.setup->dummy = false;
4560 phrConfig->choice.setup->phr_Type2OtherCell = false;
4561 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4566 /*******************************************************************
4568 * @brief Builds BSR Config
4572 * Function : BuildBsrConfig
4574 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4576 * @params[in] BSR_Config *bsrConfig
4578 * @return ROK - success
4581 * ****************************************************************/
4582 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4584 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4585 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4586 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4591 /*******************************************************************
4593 * @brief Builds scheduling request config
4597 * Function : BuildSchedulingReqConfig
4599 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4601 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4603 * @return ROK - success
4606 * ****************************************************************/
4607 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4609 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4610 uint8_t idx, elementCnt;
4612 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4613 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4614 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4615 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4617 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4621 elementCnt = 1; //ODU_VALUE_ONE;
4622 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4623 schReqList->list.count = elementCnt;
4624 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4626 schReqList->list.array = NULLP;
4627 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4628 if(!schReqList->list.array)
4630 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4634 for(idx=0;idx<schReqList->list.count; idx++)
4636 schReqList->list.array[idx] = NULLP;
4637 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4638 if(!schReqList->list.array[idx])
4640 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4646 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4648 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4649 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4650 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4652 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4655 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4656 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4657 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4661 /*******************************************************************
4663 * @brief Builds Mac cell group config
4667 * Function : BuildMacCellGrpCfg
4669 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4671 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4673 * @return ROK - success
4676 * ****************************************************************/
4677 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4679 macCellGrpCfg->drx_Config = NULLP;
4680 macCellGrpCfg->schedulingRequestConfig = NULLP;
4681 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4682 if(!macCellGrpCfg->schedulingRequestConfig)
4684 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4688 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4690 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4694 macCellGrpCfg->bsr_Config = NULLP;
4695 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4696 if(!macCellGrpCfg->bsr_Config)
4698 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4702 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4704 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4708 macCellGrpCfg->tag_Config = NULLP;
4709 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4710 if(!macCellGrpCfg->tag_Config)
4712 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4716 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4718 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4722 macCellGrpCfg->phr_Config = NULLP;
4723 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4724 if(!macCellGrpCfg->phr_Config)
4726 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4730 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4732 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4736 macCellGrpCfg->skipUplinkTxDynamic = false;
4737 macCellGrpCfg->ext1 = NULLP;
4741 /*******************************************************************
4743 * @brief Frees memeory allocated for SearchSpcToAddModList
4747 * Function : FreeSearchSpcToAddModList
4749 * Functionality: Deallocating memory of SearchSpcToAddModList
4751 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4755 4221 * ****************************************************************/
4756 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4760 struct SearchSpace *searchSpc=NULLP;
4762 if(searchSpcList->list.array)
4764 if(searchSpcList->list.array[idx2])
4766 searchSpc = searchSpcList->list.array[idx2];
4767 if(searchSpc->controlResourceSetId)
4769 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4771 if(searchSpc->monitoringSymbolsWithinSlot)
4773 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4775 if(searchSpc->nrofCandidates)
4777 if(searchSpc->searchSpaceType)
4779 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4780 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4781 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4782 SearchSpace__searchSpaceType));
4784 CU_FREE(searchSpc->nrofCandidates,
4785 sizeof(struct SearchSpace__nrofCandidates));
4787 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4788 searchSpc->monitoringSymbolsWithinSlot->size);
4790 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4791 sizeof(BIT_STRING_t));
4793 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4794 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4796 CU_FREE(searchSpc->controlResourceSetId,
4797 sizeof(ControlResourceSetId_t));
4800 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4802 CU_FREE(searchSpcList->list.array[idx1],
4803 sizeof(struct SearchSpace));
4805 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4808 /*******************************************************************
4810 * @brief Frees memory allocated for PdschTimeDomAllocList
4814 * Function : FreePdschTimeDomAllocList
4816 * Functionality: Deallocating memory of PdschTimeDomAllocList
4818 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4822 4221 * ****************************************************************/
4823 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4827 if(timeDomAllocList->choice.setup)
4829 if(timeDomAllocList->choice.setup->list.array)
4831 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4833 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4834 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4836 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4837 timeDomAllocList->choice.setup->list.size);
4839 CU_FREE(timeDomAllocList->choice.setup,\
4840 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4843 /*******************************************************************
4845 * @brief Frees memory allocated for PuschTimeDomAllocList
4849 * Function : FreePuschTimeDomAllocList
4851 * Functionality: Deallocating memory of PuschTimeDomAllocList
4853 * @params[in] PUSCH_Config_t *puschCfg
4857 ***********************************************************************/
4858 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4862 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4864 if(puschCfg->pusch_TimeDomainAllocationList)
4866 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4867 if(timeDomAllocList_t->choice.setup)
4869 if(timeDomAllocList_t->choice.setup->list.array)
4871 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4872 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4874 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4875 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4877 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4878 timeDomAllocList_t->choice.setup->list.size);
4880 CU_FREE(timeDomAllocList_t->choice.setup, \
4881 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4883 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4884 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4885 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4889 /*******************************************************************
4891 * @brief Frees memory allocated for InitialUlBWP
4895 * Function : FreeInitialUlBWP
4897 * Functionality: Deallocating memory of InitialUlBWP
4899 * @params[in] BWP_UplinkDedicated_t *ulBwp
4903 * ****************************************************************/
4904 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4906 uint8_t rSetIdx, rsrcIdx;
4907 SRS_Config_t *srsCfg = NULLP;
4908 PUSCH_Config_t *puschCfg = NULLP;
4909 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4910 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4911 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4912 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4914 if(ulBwp->pusch_Config)
4916 if(ulBwp->pusch_Config->choice.setup)
4918 puschCfg=ulBwp->pusch_Config->choice.setup;
4919 if(puschCfg->dataScramblingIdentityPUSCH)
4921 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4923 FreePuschTimeDomAllocList(puschCfg);
4924 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4925 if(dmrsUlCfg->choice.setup)
4927 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4929 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4931 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4933 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4934 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4936 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4939 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4941 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4942 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4944 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4946 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4948 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4950 /* Free SRS-Config */
4951 if(ulBwp->srs_Config)
4953 if(ulBwp->srs_Config->choice.setup)
4955 srsCfg = ulBwp->srs_Config->choice.setup;
4957 /* Free Resource Set to add/mod list */
4958 if(srsCfg->srs_ResourceSetToAddModList)
4960 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4961 if(rsrcSetList->list.array)
4965 /* Free SRS resource Id list in this SRS resource set */
4966 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4968 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4970 if(rsrcIdList->list.array)
4972 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4974 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4976 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4978 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4979 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4982 /* Free resource type info for this SRS resource set */
4983 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4984 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4986 /* Free memory for each resource set */
4987 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4989 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4991 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4993 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4994 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4997 /* Free resource to add/modd list */
4998 if(srsCfg->srs_ResourceToAddModList)
5000 resourceList = srsCfg->srs_ResourceToAddModList;
5001 if(resourceList->list.array)
5004 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5005 sizeof(struct SRS_Resource__transmissionComb__n2));
5006 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5007 sizeof(struct SRS_Resource__resourceType__aperiodic));
5009 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5011 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5013 CU_FREE(resourceList->list.array, resourceList->list.size);
5015 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5016 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5019 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5021 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5025 /*******************************************************************
5027 * @brief Frees memory allocated for initialUplinkBWP
5031 * Function : FreeinitialUplinkBWP
5033 * Functionality: Deallocating memory of initialUplinkBWP
5035 * @params[in] UplinkConfig_t *ulCfg
5040 * ****************************************************************/
5041 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5043 BWP_UplinkDedicated_t *ulBwp=NULLP;
5044 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5046 if(ulCfg->initialUplinkBWP)
5048 ulBwp=ulCfg->initialUplinkBWP;
5049 if(ulCfg->firstActiveUplinkBWP_Id)
5051 if(ulCfg->pusch_ServingCellConfig)
5053 puschCfg=ulCfg->pusch_ServingCellConfig;
5054 if(puschCfg->choice.setup)
5056 if(puschCfg->choice.setup->ext1)
5058 CU_FREE(puschCfg->choice.setup->ext1->\
5059 processingType2Enabled,sizeof(BOOLEAN_t));
5060 CU_FREE(puschCfg->choice.setup->ext1->\
5061 maxMIMO_Layers,sizeof(long));
5062 CU_FREE(puschCfg->choice.setup->ext1, \
5063 sizeof(struct PUSCH_ServingCellConfig__ext1));
5065 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5067 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5069 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5071 FreeInitialUlBWP(ulBwp);
5072 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5075 /*******************************************************************
5077 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5081 * Function : FreeBWPDlDedPdschCfg
5083 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5085 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5090 * ****************************************************************/
5091 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5093 struct PDSCH_Config *pdschCfg=NULLP;
5094 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5095 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5096 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5098 if(dlBwp->pdsch_Config->choice.setup)
5100 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5101 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5103 if(pdschCfg->pdsch_TimeDomainAllocationList)
5105 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5106 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5108 prbBndlType=&pdschCfg->prb_BundlingType;
5109 CU_FREE(prbBndlType->choice.staticBundling,\
5110 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5111 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5113 FreePdschTimeDomAllocList(timeDomAllocList);
5114 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5115 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5117 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5118 if(dmrsDlCfg->choice.setup)
5120 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5122 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5124 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5125 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5127 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5130 /*******************************************************************
5132 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5136 * Function : FreeBWPDlDedPdcchCfg
5138 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5140 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5145 * ****************************************************************/
5146 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5150 struct PDCCH_Config *pdcchCfg=NULLP;
5151 struct ControlResourceSet *controlRSet=NULLP;
5152 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5154 if(dlBwp->pdcch_Config->choice.setup)
5156 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5157 if(pdcchCfg->controlResourceSetToAddModList)
5159 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5160 if(controlRSetList->list.array)
5162 controlRSet = controlRSetList->list.array[idx2];
5165 if(controlRSet->frequencyDomainResources.buf)
5167 if(controlRSet->pdcch_DMRS_ScramblingID)
5169 if(pdcchCfg->searchSpacesToAddModList)
5171 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5172 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5173 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5175 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5177 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5178 controlRSet->frequencyDomainResources.size);
5181 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5183 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5185 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5187 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5188 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5190 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5193 /*******************************************************************
5195 * @brief Builds RLC Config
5199 * Function : BuildRlcConfig
5201 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5203 * @params[in] RLC_Config *rlcConfig
5205 * @return ROK - success
5208 * ****************************************************************/
5209 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5212 rlcConfig->present = RLC_Config_PR_am;
5214 rlcConfig->choice.am = NULLP;
5215 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5216 if(!rlcConfig->choice.am)
5218 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5223 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5224 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5225 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5227 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5230 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5231 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5232 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5233 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5234 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5237 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5238 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5239 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5241 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5244 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5245 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5246 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5251 /*******************************************************************
5253 * @brief Builds MAC LC Config
5257 * Function : BuildMacLCConfig
5259 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5261 * @params[in] struct LogicalChannelConfig macLcConfig
5263 * @return ROK - success
5266 * ****************************************************************/
5267 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5270 macLcConfig->ul_SpecificParameters = NULLP;
5271 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5272 if(!macLcConfig->ul_SpecificParameters)
5274 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5278 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5279 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5280 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5281 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5282 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5283 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5284 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5286 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5287 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5288 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5290 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5293 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5295 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5296 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5297 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5299 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5302 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5304 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5305 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5306 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5310 /*******************************************************************
5312 * @brief Builds RLC Bearer to Add/Mod list
5316 * Function :BuildRlcBearerToAddModList
5318 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5320 * @params[in] rlc_BearerToAddModList
5322 * @return ROK - success
5325 * ****************************************************************/
5326 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5328 uint8_t idx, elementCnt;
5331 rlcBearerList->list.count = elementCnt;
5332 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5334 rlcBearerList->list.array = NULLP;
5335 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5336 if(!rlcBearerList->list.array)
5338 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5342 for(idx=0; idx<rlcBearerList->list.count; idx++)
5344 rlcBearerList->list.array[idx] = NULLP;
5345 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5346 if(!rlcBearerList->list.array[idx])
5348 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5354 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5356 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5357 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5359 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5363 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5364 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5366 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5367 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5368 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5369 if(!rlcBearerList->list.array[idx]->rlc_Config)
5371 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5375 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5377 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5381 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5382 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5383 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5385 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5389 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5391 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5398 /*******************************************************************
5400 * @brief Free memory allocated for CellGroupConfig
5404 * Function : FreeMemCellGrpCfg
5406 * Functionality: Deallocating memory of CellGroupConfig
5408 * @params[in] pointer to CellGroupConfigRrc_t
5410 * @return ROK - success
5413 ******************************************************************/
5414 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5417 SpCellConfig_t *spCellCfg=NULLP;
5418 ServingCellConfig_t *srvCellCfg=NULLP;
5419 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5420 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5421 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5422 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5423 struct RLC_Config *rlcConfig=NULLP;
5424 struct LogicalChannelConfig *macLcConfig=NULLP;
5425 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5426 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5427 struct TAG_Config *tagConfig=NULLP;
5428 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5429 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5430 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5432 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5435 if(rlcBearerList->list.array)
5437 for(idx=0; idx<rlcBearerList->list.count; idx++)
5439 if(rlcBearerList->list.array[idx])
5441 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5442 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5445 if(rlcConfig->choice.am)
5447 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5448 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5449 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5451 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5453 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5456 if(macLcConfig->ul_SpecificParameters)
5458 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5459 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5460 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5462 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5464 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5467 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5469 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5472 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5475 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5476 if(schedulingRequestConfig)
5478 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5481 if(schReqList->list.array)
5483 for(idx=0;idx<schReqList->list.count; idx++)
5485 if(schReqList->list.array[idx])
5487 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5488 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5491 CU_FREE(schReqList->list.array, schReqList->list.size);
5493 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5494 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5495 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5497 if(macCellGrpCfg->bsr_Config)
5499 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5501 tagConfig = macCellGrpCfg->tag_Config;
5504 tagList = tagConfig->tag_ToAddModList;
5507 if(tagList->list.array)
5509 for(idx=0; idx<tagList->list.count; idx++)
5511 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5513 CU_FREE(tagList->list.array, tagList->list.size);
5515 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5517 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5520 phrConfig = macCellGrpCfg->phr_Config;
5523 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5524 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5527 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5530 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5533 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5534 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5537 spCellCfg = cellGrpCfg->spCellConfig;
5540 if(spCellCfg->servCellIndex)
5542 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5544 if(spCellCfg->spCellConfigDedicated)
5546 srvCellCfg = spCellCfg->spCellConfigDedicated;
5547 if(srvCellCfg->initialDownlinkBWP)
5549 dlBwp = srvCellCfg->initialDownlinkBWP;
5550 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5552 if(srvCellCfg->defaultDownlinkBWP_Id)
5554 if(srvCellCfg->uplinkConfig)
5556 if(srvCellCfg->pdsch_ServingCellConfig)
5558 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5559 if(pdschCfg->choice.setup)
5561 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5562 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5564 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5565 ServingCellConfig__pdsch_ServingCellConfig));
5567 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5568 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5570 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5572 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5574 if(dlBwp->pdcch_Config)
5576 if(dlBwp->pdsch_Config)
5578 FreeBWPDlDedPdschCfg(dlBwp);
5579 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5581 FreeBWPDlDedPdcchCfg(dlBwp);
5582 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5584 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5586 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5588 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5590 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5592 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5597 /*******************************************************************
5599 * @brief Fills CellGroupConfig
5603 * Function : fillCellGrpCfg
5605 * Functionality: Fills CellGroupConfig
5607 * @params[in] pointer to CellGroupConfigRrc_t
5609 * @return ROK - success
5612 ******************************************************************/
5614 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5616 uint8_t ret = RFAILED;
5617 CellGroupConfigRrc_t cellGrpCfg;
5618 asn_enc_rval_t encRetVal;
5622 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5624 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5625 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5626 if(!cellGrpCfg.rlc_BearerToAddModList)
5628 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5631 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5633 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5637 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5638 cellGrpCfg.mac_CellGroupConfig = NULLP;
5639 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5640 if(!cellGrpCfg.mac_CellGroupConfig)
5642 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5645 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5647 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5652 cellGrpCfg.physicalCellGroupConfig = NULLP;
5653 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5654 if(!cellGrpCfg.physicalCellGroupConfig)
5656 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5659 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5661 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5665 cellGrpCfg.spCellConfig = NULLP;
5666 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5667 if(!cellGrpCfg.spCellConfig)
5669 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5672 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5674 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5678 cellGrpCfg.sCellToAddModList = NULLP;
5679 cellGrpCfg.sCellToReleaseList = NULLP;
5680 cellGrpCfg.ext1 = NULLP;
5682 /* encode cellGrpCfg into duToCuRrcContainer */
5683 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5684 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5686 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5687 /* Encode results */
5688 if(encRetVal.encoded == ENCODE_FAIL)
5690 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5691 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5696 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5697 for(int i=0; i< encBufSize; i++)
5699 DU_LOG("%x",encBuf[i]);
5703 cellGrp->size = encBufSize;
5704 CU_ALLOC(cellGrp->buf, cellGrp->size);
5707 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5710 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5714 FreeMemCellGrpCfg(&cellGrpCfg);
5718 /*******************************************************************
5720 * @brief Free UE Capability RAT container
5724 * Function : freeUeCapRatCont
5727 * Free UE Capability RAT conatiner
5730 * @return ROK - success
5733 * ****************************************************************/
5734 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5737 FeatureSets_t *featureSets;
5739 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5741 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5743 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5744 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5746 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5749 if(ueNrCap->featureSets)
5751 featureSets = ueNrCap->featureSets;
5752 if(featureSets->featureSetsDownlinkPerCC)
5754 if(featureSets->featureSetsDownlinkPerCC->list.array)
5756 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5758 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5759 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5760 sizeof(ModulationOrder_t));
5761 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5763 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5765 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5768 if(featureSets->featureSetsUplinkPerCC)
5770 if(featureSets->featureSetsUplinkPerCC->list.array)
5772 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5774 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5776 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5777 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5778 sizeof(ModulationOrder_t));
5779 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5782 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5784 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5786 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5790 /*******************************************************************
5792 * @brief Free UE capability RAT container list
5796 * Function : freeUeCapRatContList
5798 * Functionality: Free UE capability RAT container list
5801 * @return ROK - success
5804 * ****************************************************************/
5805 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5808 if(ueCapablityList->list.array)
5810 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5812 if(ueCapablityList->list.array[idx])
5813 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5815 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5819 /*******************************************************************
5821 * @brief Fill feature sets
5825 * Function : fillFeatureSets
5827 * Functionality: Fill feature sets
5830 * @return ROK - success
5833 * ****************************************************************/
5834 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5836 uint8_t idx, elementCnt;
5838 featureSets->featureSetsDownlink = NULLP;
5839 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5840 if(!featureSets->featureSetsDownlinkPerCC)
5842 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5847 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5848 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5849 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5850 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5852 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5856 for(idx = 0; idx < elementCnt; idx++)
5858 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5859 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5861 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5867 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5868 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5869 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5870 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5871 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5873 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5874 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5876 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5879 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5881 featureSets->featureSetsUplink = NULLP;
5882 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5883 if(!featureSets->featureSetsUplinkPerCC)
5885 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5890 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5891 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5892 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5893 if(!featureSets->featureSetsUplinkPerCC->list.array)
5895 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5899 for(idx = 0; idx < elementCnt; idx++)
5901 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5902 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5904 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5910 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5911 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5912 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5913 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5914 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5915 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5917 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5918 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5920 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5923 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5928 /*******************************************************************
5930 * @brief Fill UE capability RAT container
5934 * Function : fillUeCapRatCont
5936 * Functionality: Fill UE capability RAT container
5938 * @params[in] UE Capability RAT container buffer
5939 * @return ROK - success
5942 * ****************************************************************/
5943 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5946 uint8_t idx, elementCnt;
5947 asn_enc_rval_t encRetVal;
5948 UE_NR_Capability_t ueNrCap;
5952 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5954 /* Filling PDCP parameters */
5955 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5956 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5957 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5958 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5959 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5960 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5961 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5962 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5963 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5964 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5965 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5966 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5967 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5968 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5969 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5970 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5971 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5973 ueNrCap.rlc_Parameters = NULLP;
5974 ueNrCap.mac_Parameters = NULLP;
5976 /* Filling PHY parameters */
5977 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5978 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5979 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5980 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5981 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5983 /* Filling RF parameters */
5985 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
5986 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
5987 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
5988 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
5990 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
5995 for(idx = 0; idx < elementCnt; idx++)
5997 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5998 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6008 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6009 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6010 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6012 ueNrCap.measAndMobParameters = NULLP;
6013 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6014 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6015 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6016 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6017 ueNrCap.featureSets = NULLP;
6019 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6020 if(!ueNrCap.featureSets)
6022 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6027 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6029 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6034 ueNrCap.featureSetCombinations = NULLP;
6035 ueNrCap.lateNonCriticalExtension = NULLP;
6036 ueNrCap.nonCriticalExtension = NULLP;
6038 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6039 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6040 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6042 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6044 /* Encode results */
6045 if(encRetVal.encoded == ENCODE_FAIL)
6047 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6048 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6053 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6054 for(int i=0; i< encBufSize; i++)
6056 DU_LOG("%x",encBuf[i]);
6060 ueCapRatContBuf->size = encBufSize;
6061 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6062 if(!ueCapRatContBuf->buf)
6064 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6067 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6071 freeUeCapRatCont(&ueNrCap);
6075 /*******************************************************************
6077 * @brief Fill UE Capability RAT container list
6081 * Function : fillUeCapRatContList
6083 * Functionality: Fill UE Capability RAT container list
6086 * @params[in] UE capability RAT container list buffer
6087 * @return ROK - success
6090 * ****************************************************************/
6091 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6093 uint8_t ret = RFAILED;
6094 uint8_t idx, elementCnt;
6095 asn_enc_rval_t encRetVal;
6096 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6101 ueCapablityList.list.count = elementCnt;
6102 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6104 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6105 if(!ueCapablityList.list.array)
6107 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6112 for(idx=0; idx<elementCnt; idx++)
6114 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6115 if(ueCapablityList.list.array[idx] == NULLP)
6117 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6123 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6124 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6126 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6127 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6128 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6130 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6131 &ueCapablityList, PrepFinalEncBuf, encBuf);
6133 /* Encode results */
6134 if(encRetVal.encoded == ENCODE_FAIL)
6136 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6137 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6142 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6143 for(int i=0; i< encBufSize; i++)
6145 DU_LOG("%x",encBuf[i]);
6149 ueCapablityListBuf->size = encBufSize;
6150 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6151 if(!ueCapablityListBuf->buf)
6153 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6156 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6160 freeUeCapRatContList(&ueCapablityList);
6164 /*******************************************************************
6166 * @brief Fills CuToDuContainer
6170 * Function : fillCuToDuContainer
6172 * Functionality: Fills CuToDuContainer
6174 * @params[in] pointer to CUtoDURRCInformation_t
6176 * @return ROK - success
6179 ******************************************************************/
6181 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6183 uint8_t elementCnt = 0;
6185 uint8_t idx, idx2, rrcBufLen;
6187 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6188 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6190 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6193 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6195 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6196 if(rrcMsg->iE_Extensions)
6199 rrcMsg->iE_Extensions->list.count = elementCnt;
6200 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6202 /* Initialize the CUtoDURRCInformation_ExtIEs */
6203 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6205 if(rrcMsg->iE_Extensions->list.array == NULLP)
6207 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6211 for(idx=0; idx<elementCnt; idx++)
6213 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6214 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6220 /* Filling CellGroupConfig_t IE */
6221 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6222 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6223 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6224 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6225 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6230 /*******************************************************************
6232 * @brief Free CuToDuContainer
6236 * Function : FreeCuToDuInfo
6238 * Functionality: Free CuToDuContainer
6240 * @params[in] pointer to CUtoDURRCInformation_t
6242 * @return ROK - success
6245 ******************************************************************/
6247 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6251 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6253 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6254 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6255 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6257 if(rrcMsg->iE_Extensions)
6259 if(rrcMsg->iE_Extensions->list.array)
6261 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6263 if(rrcMsg->iE_Extensions->list.array[idx])
6265 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6267 case ProtocolIE_ID_id_CellGroupConfig:
6268 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6270 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6271 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6276 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6277 rrcMsg->iE_Extensions->list.array[idx]->id);
6283 for(idx2 = 0; idx2 < idx; idx2++)
6285 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6287 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6291 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6294 /*******************************************************************
6296 * @brief Builds and sends the UE Setup Request
6300 * Function : BuildAndSendUeContextSetupReq
6302 * Functionality: Constructs the UE Setup Request and sends
6303 * it to the CU through SCTP.
6307 * @return ROK - success
6310 * ****************************************************************/
6311 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6312 uint16_t rrcContLen, uint8_t *rrcContainer)
6315 uint8_t SplCellListret;
6316 uint8_t SrbSetupret;
6318 uint8_t idx, bufLen;
6320 F1AP_PDU_t *f1apMsg = NULLP;
6321 UEContextSetupRequest_t *ueSetReq = NULLP;
6322 asn_enc_rval_t encRetVal; /* Encoder return value */
6323 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6324 uint8_t ret= RFAILED;
6328 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6330 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6331 if(f1apMsg == NULLP)
6333 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6337 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6338 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6339 if(f1apMsg->choice.initiatingMessage == NULLP)
6341 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6345 f1apMsg->choice.initiatingMessage->procedureCode = \
6346 ProcedureCode_id_UEContextSetup;
6347 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6348 f1apMsg->choice.initiatingMessage->value.present = \
6349 InitiatingMessage__value_PR_UEContextSetupRequest;
6351 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6354 ueSetReq->protocolIEs.list.count = elementCnt;
6355 ueSetReq->protocolIEs.list.size = \
6356 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6358 /* Initialize the UESetup members */
6359 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6361 if(ueSetReq->protocolIEs.list.array == NULLP)
6363 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6367 for(idx1=0; idx1<elementCnt; idx1++)
6369 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6370 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6378 /*GNB CU UE F1AP ID*/
6379 ueSetReq->protocolIEs.list.array[idx]->id = \
6380 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6381 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6382 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6383 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6384 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6386 /*GNB DU UE F1AP ID*/
6388 ueSetReq->protocolIEs.list.array[idx]->id = \
6389 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6390 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6391 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6392 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6393 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6397 ueSetReq->protocolIEs.list.array[idx]->id = \
6398 ProtocolIE_ID_id_SpCell_ID;
6399 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6400 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6401 UEContextSetupRequestIEs__value_PR_NRCGI;
6402 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6408 /*Served Cell Index*/
6410 ueSetReq->protocolIEs.list.array[idx]->id = \
6411 ProtocolIE_ID_id_ServCellIndex;
6412 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6413 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6414 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6415 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6418 /*CellULConfigured*/
6420 ueSetReq->protocolIEs.list.array[idx]->id = \
6421 ProtocolIE_ID_id_SpCellULConfigured;
6422 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6423 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6424 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6425 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6426 CellULConfigured_none;
6428 /*CUtoDURRCContainer*/
6430 ueSetReq->protocolIEs.list.array[idx]->id = \
6431 ProtocolIE_ID_id_CUtoDURRCInformation;
6432 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6433 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6434 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6435 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6440 /*Special Cells to be SetupList*/
6442 ueSetReq->protocolIEs.list.array[idx]->id = \
6443 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6444 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6445 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6446 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6447 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6448 if(SplCellListret != ROK)
6452 /*SRBs To Be Setup List*/
6454 ueSetReq->protocolIEs.list.array[idx]->id = \
6455 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6456 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6457 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6458 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6459 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6460 if(SrbSetupret != ROK)
6464 /*DRBs to Be Setup List*/
6466 ueSetReq->protocolIEs.list.array[idx]->id = \
6467 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6468 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6469 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6470 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6471 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6476 /* RRC Container for security mode */
6478 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6479 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6480 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6481 UEContextSetupRequestIEs__value_PR_RRCContainer;
6482 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6484 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6485 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6486 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6487 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6489 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6492 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6493 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6495 /* RRC delivery status request */
6497 ueSetReq->protocolIEs.list.array[idx]->id = \
6498 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6499 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6500 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6501 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6502 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6503 RRCDeliveryStatusRequest_true;
6505 /* Bit Rate hardcoded as in reference logs */
6507 ueSetReq->protocolIEs.list.array[idx]->id = \
6508 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6509 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6510 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6511 UEContextSetupRequestIEs__value_PR_BitRate;
6512 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6514 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6515 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6516 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6517 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6519 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6522 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6523 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6525 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6527 /* Encode the F1SetupRequest type as APER */
6528 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6530 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6532 /* Encode results */
6533 if(encRetVal.encoded == ENCODE_FAIL)
6535 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6536 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6541 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6542 for(int i=0; i< encBufSize; i++)
6544 DU_LOG("%x",encBuf[i]);
6549 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6551 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6557 FreeUeContextSetupReq(f1apMsg);
6560 }/* End of BuildAndSendUeContextSetupReq*/
6562 /****************************************************************
6563 * @brief Function to process Ul Rrc Msg received from DU
6567 * Function : procUlRrcMsg
6570 * - Function to process Ul Rrc Msg received from DU
6573 * @return ROK - success
6576 * ****************************************************************/
6578 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6580 uint8_t idx, ret, srbId, rrcMsgType;
6581 uint8_t cuUeF1apId, duUeF1apId;
6582 uint8_t *rrcContainer = NULLP;
6583 uint16_t rrcContLen;
6584 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6587 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6589 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6591 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6593 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6595 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6598 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6600 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6603 case ProtocolIE_ID_id_SRBID:
6604 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6606 case ProtocolIE_ID_id_RRCContainer:
6608 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6609 CU_ALLOC(rrcContainer, rrcContLen)
6612 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
6615 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6621 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6627 f1apMsgDb.dlRrcMsgCount++;
6628 rrcMsgType = setDlRRCMsgType();
6629 if(rrcMsgType == REGISTRATION_ACCEPT)
6631 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
6632 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6634 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6636 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
6637 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6638 rrcContLen, rrcContainer);
6640 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6642 /* To trigger the DL RRC Msg for RRC Reconfig */
6643 f1apMsgDb.dlRrcMsgCount++;
6644 rrcMsgType = setDlRRCMsgType();
6645 if(rrcMsgType == RRC_RECONFIG)
6647 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
6648 BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6651 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
6653 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
6654 BuildAndSendUeContextModificationReq();
6660 /****************************************************************
6661 * @brief Build And Send F1ResetAck
6665 * Function : FreeF1ResetAck
6668 * - Build And Send F1ResetRSP
6671 * @return ROK - success
6674 * ****************************************************************/
6675 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6678 ResetAcknowledge_t *f1ResetAck;
6682 if(f1apMsg->choice.successfulOutcome)
6684 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6686 if(f1ResetAck->protocolIEs.list.array)
6688 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6690 if(f1ResetAck->protocolIEs.list.array[idx])
6692 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6695 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6697 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6699 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6703 /****************************************************************
6704 * @brief Build And Send F1ResetAck
6708 * Function : BuildAndSendF1ResetAck
6711 * - Build And Send F1ResetRSP
6714 * @return ROK - success
6717 * ****************************************************************/
6719 uint8_t BuildAndSendF1ResetAck()
6722 uint8_t elementCnt = 0;
6723 uint8_t ret = RFAILED;
6724 F1AP_PDU_t *f1apMsg = NULL;
6725 ResetAcknowledge_t *f1ResetAck = NULLP;
6726 asn_enc_rval_t encRetVal;
6727 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
6730 /* Allocate the memory for F1ResetRequest_t */
6731 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6732 if(f1apMsg == NULLP)
6734 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6738 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6740 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6741 if(f1apMsg->choice.successfulOutcome == NULLP)
6743 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6747 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6748 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6749 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6750 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6754 f1ResetAck->protocolIEs.list.count = elementCnt;
6755 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6757 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6758 if(f1ResetAck->protocolIEs.list.array == NULLP)
6760 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
6764 for(idx=0; idx<elementCnt; idx++)
6766 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6767 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6774 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6775 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6776 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6777 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6779 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6781 /* Encode the F1SetupRequest type as UPER */
6782 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6784 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6786 /* Check encode results */
6787 if(encRetVal.encoded == ENCODE_FAIL)
6789 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
6790 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6795 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
6796 for(int i=0; i< encBufSize; i++)
6798 DU_LOG("%x",encBuf[i]);
6802 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6804 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
6812 FreeF1ResetAck(f1apMsg);
6815 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6819 if(ulInfo->list.array)
6821 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
6823 if(ulInfo->list.array[arrIdx])
6825 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
6827 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
6829 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
6831 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6832 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6833 gTPTunnel->gTP_TEID.size);
6835 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6836 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6837 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6839 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6840 sizeof(GTPTunnel_t));
6842 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6845 CU_FREE(ulInfo->list.array,ulInfo->list.size);
6848 /*******************************************************************
6850 * @brief Builds the Uplink Tunnel Info
6854 * Function : BuildUlTnlInfoforDrb2
6856 * Functionality: Constructs the UL TnlInfo For DRB list
6858 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
6860 * @return ROK - success
6863 * ****************************************************************/
6864 uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6870 ulInfo->list.count = ulCnt;
6871 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
6872 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
6873 if(ulInfo->list.array == NULLP)
6875 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6878 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
6880 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6881 if(ulInfo->list.array[arrIdx] == NULLP)
6883 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6889 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
6890 UPTransportLayerInformation_PR_gTPTunnel;
6893 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6894 sizeof(GTPTunnel_t));
6895 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
6897 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6900 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6901 transportLayerAddress.size = 4*sizeof(uint8_t);
6902 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6903 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6904 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6905 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6906 transportLayerAddress.buf == NULLP)
6908 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6912 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6913 transportLayerAddress.buf[0] = 192;
6914 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6915 transportLayerAddress.buf[1] = 168;
6916 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6917 transportLayerAddress.buf[2] = 130;
6918 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6919 transportLayerAddress.buf[3] = 82;
6920 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6921 transportLayerAddress.bits_unused = 0;
6924 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
6925 = 4 * sizeof(uint8_t);
6926 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6927 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6928 gTPTunnel->gTP_TEID.size);
6929 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
6932 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6935 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6936 gTP_TEID.buf[0] = 0;
6937 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6938 gTP_TEID.buf[1] = 0;
6939 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6940 gTP_TEID.buf[2] = 0;
6941 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6942 gTP_TEID.buf[3] = 2;
6945 }/*End of BuildULTnlInfo*/
6946 /*******************************************************************
6948 * @brief freeing the DRB 2 item
6952 * Function : FreeDrb2Item
6954 * Functionality: freeing the DRB 2 item
6956 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6958 * @return ROK - success
6961 * ****************************************************************/
6963 void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6966 SNSSAI_t *snssai =NULLP;
6967 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
6969 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6970 switch(drbItem->qoSInformation.present)
6972 case QoSInformation_PR_NOTHING:
6974 case QoSInformation_PR_eUTRANQoS:
6976 if(drbItem->qoSInformation.choice.eUTRANQoS)
6978 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6982 case QoSInformation_PR_choice_extension:
6984 if(drbItem->qoSInformation.choice.choice_extension)
6986 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
6988 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
6991 CU_FREE(snssai->sST.buf,snssai->sST.size);
6997 CU_FREE(snssai->sD->buf,snssai->sD->size);
6999 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7002 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7003 if(flowMap->list.array)
7005 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7007 if(flowMap->list.array[arrIdx] )
7009 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7010 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7013 CU_FREE(flowMap->list.array,flowMap->list.size);
7016 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7022 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7023 if(drbItem->uLConfiguration)
7025 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7028 /*******************************************************************
7030 * @brief filling the DRB 2 item
7034 * Function : FillDrb2Item
7036 * Functionality: filling the DRB 2 item
7038 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7040 * @return ROK - success
7043 * ****************************************************************/
7045 uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
7050 drbItem->dRBID = DRB2;
7053 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7055 switch(drbItem->qoSInformation.present)
7057 case QoSInformation_PR_NOTHING:
7061 case QoSInformation_PR_eUTRANQoS:
7064 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7065 if(drbItem->qoSInformation.choice.eUTRANQoS)
7067 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7070 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7071 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7072 PriorityLevel_no_priority;
7074 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7075 Pre_emptionCapability_may_trigger_pre_emption;
7077 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7078 Pre_emptionVulnerability_pre_emptable;
7082 case QoSInformation_PR_choice_extension:
7084 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7085 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7087 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7091 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7092 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7093 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7094 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7097 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7102 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7103 choice_extension->value.choice.DRB_Information.sNSSAI);
7106 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7110 /*Flows mapped to DRB List*/
7111 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7112 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
7115 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7121 /*ULUPTNLInformation To Be Setup List*/
7122 ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7125 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforDrb2 failed");
7130 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7132 /*UL Configuration*/
7133 CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7134 if(drbItem->uLConfiguration == NULLP)
7136 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7139 drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
7142 /*******************************************************************
7144 * @brief Builds the DRB to be Setup Mod ItemIes
7148 * Function : FillDrbItemList
7150 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7152 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7154 * @return ROK - success
7157 * ****************************************************************/
7159 uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7161 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7162 drbItemIe->criticality = Criticality_reject;
7163 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7165 if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
7167 DU_LOG("\nERROR --> F1AP : FillDrb2Item failed");
7172 /*******************************************************************
7174 * @brief free the DRB to be Setup Mod list
7178 * Function : FreeDrbToBeSetupModList
7180 * Functionality: free the DRB to be Setup Mod list
7182 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7184 * @return ROK - success
7187 * ****************************************************************/
7188 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7191 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7193 if(drbSet->list.array)
7195 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7197 if(drbSet->list.array[arrIdx] != NULLP)
7201 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7202 FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7204 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7207 CU_FREE(drbSet->list.array, drbSet->list.size);
7213 /*******************************************************************
7215 * @brief Builds the DRB to be Setup Mod list
7219 * Function : BuildDrbToBeSetupModList
7221 * Functionality: Constructs the DRB to be Setup Mod list
7223 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7225 * @return ROK - success
7228 * ****************************************************************/
7230 uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7237 drbSet->list.count = drbCnt;
7238 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7239 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7240 if(drbSet->list.array == NULLP)
7242 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7245 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7247 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7248 if(drbSet->list.array[arrIdx] == NULLP)
7250 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7256 ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7259 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7264 /*******************************************************************
7266 * @brief free the UeContextModification Request
7270 * Function : FreeUeContextModicationRequest
7272 * Functionality : deallocation of memory allocated in UeContextModiification
7275 * @params[in] F1AP_PDU_t *f1apMsg
7279 * ****************************************************************/
7280 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7282 uint8_t arrIdx =0 , ieId=0;
7283 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7287 if(f1apMsg->choice.initiatingMessage)
7289 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7290 if(UeContextModifyReq->protocolIEs.list.array)
7292 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7294 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7296 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7299 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7301 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7303 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7305 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7306 choice.DRBs_ToBeSetupMod_List);
7310 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7313 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7315 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7317 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7320 /*******************************************************************
7322 * @brief Builds the Ue Context Modification Req
7326 * Function : BuildAndSendUeContextModificationReq
7328 * Functionality: Constructs the Ue Context Modification Req
7332 * @return ROK - success
7335 * ****************************************************************/
7336 uint8_t BuildAndSendUeContextModificationReq()
7339 uint8_t elementCnt = 0;
7340 uint8_t ret = RFAILED;
7341 F1AP_PDU_t *f1apMsg = NULLP;
7342 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7344 asn_enc_rval_t encRetVal;
7345 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
7349 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7350 if(f1apMsg == NULLP)
7352 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7356 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7358 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7359 if(f1apMsg->choice.initiatingMessage == NULLP)
7361 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7364 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7365 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7366 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7368 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7371 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7372 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7374 /* Initialize the UE context modification members */
7375 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7376 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7378 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7382 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7384 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7385 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7387 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7394 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7395 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7396 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7397 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7398 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =CU_ID;
7401 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7402 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7403 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7404 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7405 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =DU_ID;
7408 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7409 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7410 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7411 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7412 ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7413 value.choice.DRBs_ToBeSetupMod_List));
7418 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7420 /* Encode the F1SetupRequest type as APER */
7421 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7423 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7426 /* Encode results */
7427 if(encRetVal.encoded == ENCODE_FAIL)
7429 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
7430 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7435 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
7436 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7438 DU_LOG("%x",encBuf[ieIdx]);
7442 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7444 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
7452 FreeUeContextModicationRequest(f1apMsg);
7455 /*****************************************************************i
7457 * @brief Free memory allocated for UE Context Release Command
7461 * Function : FreeUeContextReleaseCommand
7464 * - Free memory allocated for UE Context Release Command
7466 * @params[in] F1AP_PDU_t *f1apMsg
7469 * *************************************************************/
7470 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
7473 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
7477 if(f1apMsg->choice.initiatingMessage)
7479 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7480 if(ueReleaseCommand->protocolIEs.list.array)
7482 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
7484 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7486 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
7488 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7490 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7493 /*******************************************************************
7495 * @brief Builds the Ue Context Release Command
7499 * Function : BuildAndSendUeContextReleaseCommand
7501 * Functionality: Constructs the Ue Context Release Command
7505 * @return ROK - success
7508 * ****************************************************************/
7509 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
7511 bool memAllocFailed = false;
7512 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
7513 F1AP_PDU_t *f1apMsg = NULLP;
7514 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
7516 asn_enc_rval_t encRetVal;
7517 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
7521 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7522 if(f1apMsg == NULLP)
7524 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
7528 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7530 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7531 if(f1apMsg->choice.initiatingMessage == NULLP)
7533 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
7536 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
7537 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7538 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
7540 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7543 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
7544 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
7546 /* Initialize the UE context modification members */
7547 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
7548 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
7550 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
7554 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7556 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7557 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
7559 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
7560 memAllocFailed = true;
7565 if(memAllocFailed == true)
7570 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7571 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7572 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7573 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
7574 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
7577 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7578 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7579 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7580 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
7581 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
7584 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
7585 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7586 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7587 UEContextReleaseCommandIEs__value_PR_Cause;
7588 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
7589 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
7590 CauseRadioNetwork_normal_release;
7592 /* RRC Container for RRC release */
7594 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
7595 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7596 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7597 UEContextReleaseCommandIEs__value_PR_RRCContainer;
7598 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
7600 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
7601 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
7602 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
7603 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
7605 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
7608 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
7609 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
7611 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7613 /* Encode the UE Context Release Command type as APER */
7614 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7616 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7619 /* Encode results */
7620 if(encRetVal.encoded == ENCODE_FAIL)
7622 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
7623 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7628 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
7629 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7631 DU_LOG("%x",encBuf[ieIdx]);
7635 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7637 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
7645 FreeUeContextReleaseCommand(f1apMsg);
7648 /*******************************************************************
7650 * @brief process Ue context release request
7654 * Function : procUeContextReleaseReq
7657 * - process Ue context release request
7659 * @params[in] F1AP_PDU_t *f1apMsg
7660 * @return ROK - success
7663 * ****************************************************************/
7664 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
7666 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
7668 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
7669 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
7671 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
7673 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
7675 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7677 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
7680 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7682 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
7689 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
7691 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
7696 /*******************************************************************
7698 * @brief processing of Gnb-DU config update
7702 * Function : procGnbDuUpdate
7705 * - processing of Gnb-DU config update
7707 * @params[in] F1AP_PDU_t *f1apMsg
7708 * @return ROK - success
7711 * ****************************************************************/
7712 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
7714 bool cellToBeDelete = false;
7716 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
7718 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
7720 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
7722 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
7724 case ProtocolIE_ID_id_TransactionID:
7726 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
7728 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
7730 cellToBeDelete = true;
7733 case ProtocolIE_ID_id_gNB_DU_ID:
7737 if(BuildAndSendDUUpdateAck() != ROK)
7739 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
7743 if(cellToBeDelete == false)
7745 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
7746 if(BuildAndSendF1ResetReq() != ROK)
7748 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
7754 memset(&f1apMsgDb, 0, sizeof(F1apMsgDb));
7759 /*******************************************************************
7761 * @brief Handles received F1AP message and sends back response
7765 * Function : F1APMsgHdlr
7768 * - Decodes received F1AP control message
7769 * - Prepares response message, encodes and sends to SCTP
7772 * @return ROK - success
7775 * ****************************************************************/
7776 void F1APMsgHdlr(Buffer *mBuf)
7782 F1AP_PDU_t *f1apMsg = NULLP;
7783 asn_dec_rval_t rval; /* Decoder return value */
7784 F1AP_PDU_t f1apasnmsg ;
7786 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
7787 ODU_PRINT_MSG(mBuf, 0,0);
7789 /* Copy mBuf into char array to decode it */
7790 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7791 CU_ALLOC(recvBuf, (Size)recvBufLen);
7793 if(recvBuf == NULLP)
7795 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
7798 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7800 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
7804 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
7805 for(i=0; i< recvBufLen; i++)
7807 DU_LOG("%x",recvBuf[i]);
7810 /* Decoding flat buffer into F1AP messsage */
7811 f1apMsg = &f1apasnmsg;
7812 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
7814 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
7815 CU_FREE(recvBuf, (Size)recvBufLen);
7817 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7819 DU_LOG("\nERROR --> F1AP : ASN decode failed");
7823 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7825 switch(f1apMsg->present)
7827 case F1AP_PDU_PR_initiatingMessage:
7829 switch(f1apMsg->choice.initiatingMessage->value.present)
7831 case InitiatingMessage__value_PR_Reset:
7833 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
7834 BuildAndSendF1ResetAck();
7838 case InitiatingMessage__value_PR_F1SetupRequest:
7840 DU_LOG("\nINFO --> F1AP : F1 setup request received");
7841 BuildAndSendF1SetupRsp();
7845 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
7847 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
7848 procGnbDuUpdate(f1apMsg);
7851 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
7853 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
7854 procInitULRRCMsg(f1apMsg);
7857 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
7859 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
7860 procUlRrcMsg(f1apMsg);
7864 case InitiatingMessage__value_PR_RRCDeliveryReport:
7866 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
7869 case InitiatingMessage__value_PR_UEContextReleaseRequest:
7871 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
7872 procUeContextReleaseReq(f1apMsg);
7877 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
7878 f1apMsg->choice.initiatingMessage->value.present);
7881 }/* End of switch(initiatingMessage) */
7885 case F1AP_PDU_PR_successfulOutcome:
7887 switch(f1apMsg->choice.successfulOutcome->value.present)
7889 case SuccessfulOutcome__value_PR_ResetAcknowledge:
7891 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
7894 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
7896 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
7897 f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7900 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
7902 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
7905 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
7907 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
7912 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
7913 f1apMsg->choice.successfulOutcome->value.present);
7916 }/* End of switch(successfulOutcome) */
7921 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
7924 }/* End of switch(f1apMsg->present) */
7926 } /* End of F1APMsgHdlr */
7928 /**********************************************************************
7930 **********************************************************************/